diff --git a/gui/objects.hpp b/gui/objects.hpp
index ff5429a..8f6f9bb 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -39,124 +39,123 @@
 class RenderObject
 {
 public:
-    enum Placement {
-        TOP_LEFT = 0,
-        TOP_RIGHT = 1,
-        BOTTOM_LEFT = 2,
-        BOTTOM_RIGHT = 3,
-        CENTER = 4,
+	enum Placement {
+		TOP_LEFT = 0,
+		TOP_RIGHT = 1,
+		BOTTOM_LEFT = 2,
+		BOTTOM_RIGHT = 3,
+		CENTER = 4,
 		CENTER_X_ONLY = 5,
-    };
+	};
 
 public:
-    RenderObject()              { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
-    virtual ~RenderObject()     {}
+	RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
+	virtual ~RenderObject() {}
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void) = 0;
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void) = 0;
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void)        { return 0; }
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void) { return 0; }
 
-    // GetRenderPos - Returns the current position of the object
-    virtual int GetRenderPos(int& x, int& y, int& w, int& h)        { x = mRenderX; y = mRenderY; w = mRenderW; h = mRenderH; return 0; }
+	// GetRenderPos - Returns the current position of the object
+	virtual int GetRenderPos(int& x, int& y, int& w, int& h) { x = mRenderX; y = mRenderY; w = mRenderW; h = mRenderH; return 0; }
 
-    // SetRenderPos - Update the position of the object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0)    { mRenderX = x; mRenderY = y; if (w || h) { mRenderW = w; mRenderH = h; } return 0; }
+	// SetRenderPos - Update the position of the object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0) { mRenderX = x; mRenderY = y; if (w || h) { mRenderW = w; mRenderH = h; } return 0; }
 
-    // GetPlacement - Returns the current placement
-    virtual int GetPlacement(Placement& placement)                  { placement = mPlacement; return 0; }
+	// GetPlacement - Returns the current placement
+	virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
 
-    // SetPlacement - Update the current placement
-    virtual int SetPlacement(Placement placement)                   { mPlacement = placement; return 0; }
+	// SetPlacement - Update the current placement
+	virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
 
-    // SetPageFocus - Notify when a page gains or loses focus
-    virtual void SetPageFocus(int inFocus)                          { return; }
+	// SetPageFocus - Notify when a page gains or loses focus
+	virtual void SetPageFocus(int inFocus) { return; }
 
 protected:
-    int mRenderX, mRenderY, mRenderW, mRenderH;
-    Placement mPlacement;
+	int mRenderX, mRenderY, mRenderW, mRenderH;
+	Placement mPlacement;
 };
 
 class ActionObject
 {
 public:
-    ActionObject()              { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
-    virtual ~ActionObject()     {}
+	ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
+	virtual ~ActionObject() {}
 
 public:
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y)        { return 0; }
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y) { return 0; }
 
-    // NotifyKey - Notify of a key press
-    //  Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
-    virtual int NotifyKey(int key)                                  { return 1; }
+	// NotifyKey - Notify of a key press
+	//  Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
+	virtual int NotifyKey(int key) { return 1; }
 
-    // GetRenderPos - Returns the current position of the object
-    virtual int GetActionPos(int& x, int& y, int& w, int& h)        { x = mActionX; y = mActionY; w = mActionW; h = mActionH; return 0; }
+	// GetRenderPos - Returns the current position of the object
+	virtual int GetActionPos(int& x, int& y, int& w, int& h) { x = mActionX; y = mActionY; w = mActionW; h = mActionH; return 0; }
 
-    // SetRenderPos - Update the position of the object
-    //  Return 0 on success, <0 on error
-    virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
+	// SetRenderPos - Update the position of the object
+	//  Return 0 on success, <0 on error
+	virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
 
-    // IsInRegion - Checks if the request is handled by this object
-    //  Return 0 if this object handles the request, 1 if not
-    virtual int IsInRegion(int x, int y)                            { return ((x < mActionX || x > mActionX + mActionW || y < mActionY || y > mActionY + mActionH) ? 0 : 1); }
+	// IsInRegion - Checks if the request is handled by this object
+	//  Return 0 if this object handles the request, 1 if not
+	virtual int IsInRegion(int x, int y) { return ((x < mActionX || x > mActionX + mActionW || y < mActionY || y > mActionY + mActionH) ? 0 : 1); }
 
-    // NotifyVarChange - Notify of a variable change
-    //  Returns 0 on success, <0 on error
-    virtual int NotifyVarChange(std::string varName, std::string value)     { return 0; }
+	// NotifyVarChange - Notify of a variable change
+	//  Returns 0 on success, <0 on error
+	virtual int NotifyVarChange(std::string varName, std::string value) { return 0; }
 
 protected:
-    int mActionX, mActionY, mActionW, mActionH;
+	int mActionX, mActionY, mActionW, mActionH;
 };
 
 class Conditional
 {
 public:
-    Conditional(xml_node<>* node);
+	Conditional(xml_node<>* node);
 
 public:
-    bool IsConditionVariable(std::string var);
-    bool isConditionTrue();
-    bool isConditionValid();
-    void NotifyPageSet();
+	bool IsConditionVariable(std::string var);
+	bool isConditionTrue();
+	bool isConditionValid();
+	void NotifyPageSet();
 
 protected:
-    class Condition
-    {
-    public:
-        std::string mVar1;
-        std::string mVar2;
-        std::string mCompareOp;
-        std::string mLastVal;
-    };
+	class Condition
+	{
+	public:
+		std::string mVar1;
+		std::string mVar2;
+		std::string mCompareOp;
+		std::string mLastVal;
+	};
 
-    std::vector<Condition> mConditions;
+	std::vector<Condition> mConditions;
 
 protected:
-    bool isMounted(std::string vol);
-    bool isConditionTrue(Condition* condition);
-
+	bool isMounted(std::string vol);
+	bool isConditionTrue(Condition* condition);
 };
 
 class InputObject
 {
 public:
-    InputObject()              { HasInputFocus = 0; }
-    virtual ~InputObject()     {}
+	InputObject() { HasInputFocus = 0; }
+	virtual ~InputObject() {}
 
 public:
-    // NotifyKeyboard - Notify of keyboard input
-    //  Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
-    virtual int NotifyKeyboard(int key)                                  { return 1; }
+	// NotifyKeyboard - Notify of keyboard input
+	//  Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
+	virtual int NotifyKeyboard(int key) { return 1; }
 
-	virtual int SetInputFocus(int focus)    { HasInputFocus = focus; return 1; }
+	virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
 
 protected:
 	int HasInputFocus;
@@ -165,26 +164,25 @@
 // Derived Objects
 // GUIText - Used for static text
 class GUIText : public RenderObject, public ActionObject, public Conditional
-
 {
 public:
-    // w and h may be ignored, in which case, no bounding box is applied
-    GUIText(xml_node<>* node);
+	// w and h may be ignored, in which case, no bounding box is applied
+	GUIText(xml_node<>* node);
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // Retrieve the size of the current string (dynamic strings may change per call)
-    virtual int GetCurrentBounds(int& w, int& h);
+	// Retrieve the size of the current string (dynamic strings may change per call)
+	virtual int GetCurrentBounds(int& w, int& h);
 
-    // Notify of a variable change
-    virtual int NotifyVarChange(std::string varName, std::string value);
+	// Notify of a variable change
+	virtual int NotifyVarChange(std::string varName, std::string value);
 
 	// Set maximum width in pixels
 	virtual int SetMaxWidth(unsigned width);
@@ -196,42 +194,42 @@
 	bool isHighlighted;
 
 protected:
-    std::string mText;
-    std::string mLastValue;
-    COLOR mColor;
+	std::string mText;
+	std::string mLastValue;
+	COLOR mColor;
 	COLOR mHighlightColor;
-    Resource* mFont;
-    int mIsStatic;
-    int mVarChanged;
-    int mFontHeight;
+	Resource* mFont;
+	int mIsStatic;
+	int mVarChanged;
+	int mFontHeight;
 	unsigned maxWidth;
 	unsigned charSkip;
 	bool hasHighlightColor;
 
 protected:
-    std::string parseText(void);
+	std::string parseText(void);
 };
 
 // GUIImage - Used for static image
 class GUIImage : public RenderObject
 {
 public:
-    GUIImage(xml_node<>* node);
+	GUIImage(xml_node<>* node);
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // SetRenderPos - Update the position of the object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+	// SetRenderPos - Update the position of the object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
 
 public:
 	bool isHighlighted;
 
 protected:
-    Resource* mImage;
+	Resource* mImage;
 	Resource* mHighlightImage;
 };
 
@@ -239,46 +237,46 @@
 class GUIFill : public RenderObject
 {
 public:
-    GUIFill(xml_node<>* node);
+	GUIFill(xml_node<>* node);
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
 protected:
-    COLOR mColor;
+	COLOR mColor;
 };
 
 // GUIAction - Used for standard actions
 class GUIAction : public ActionObject, public Conditional
 {
 public:
-    GUIAction(xml_node<>* node);
+	GUIAction(xml_node<>* node);
 
 public:
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
-    virtual int NotifyKey(int key);
-    virtual int NotifyVarChange(std::string varName, std::string value);
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	virtual int NotifyKey(int key);
+	virtual int NotifyVarChange(std::string varName, std::string value);
 	virtual int doActions();
 
 protected:
-    class Action
-    {
-    public:
-        std::string mFunction;
-        std::string mArg;
-    };
+	class Action
+	{
+	public:
+		std::string mFunction;
+		std::string mArg;
+	};
 
-    std::vector<Action> mActions;
-    int mKey;
+	std::vector<Action> mActions;
+	int mKey;
 
 protected:
-    int getKeyByName(std::string key);
-    virtual int doAction(Action action, int isThreaded = 0);
-    static void* thread_start(void *cookie);
+	int getKeyByName(std::string key);
+	virtual int doAction(Action action, int isThreaded = 0);
+	static void* thread_start(void *cookie);
 	void simulate_progress_bar(void);
-    int flash_zip(std::string filename, std::string pageName, const int simulate, int* wipe_cache);
+	int flash_zip(std::string filename, std::string pageName, const int simulate, int* wipe_cache);
 	void operation_start(const string operation_name);
 	void operation_end(const int operation_status, const int simulate);
 	static void* command_thread(void *cookie);
@@ -287,92 +285,92 @@
 class GUIConsole : public RenderObject, public ActionObject
 {
 public:
-    GUIConsole(xml_node<>* node);
+	GUIConsole(xml_node<>* node);
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // SetRenderPos - Update the position of the object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+	// SetRenderPos - Update the position of the object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
 
-    // IsInRegion - Checks if the request is handled by this object
-    //  Return 0 if this object handles the request, 1 if not
-    virtual int IsInRegion(int x, int y);
+	// IsInRegion - Checks if the request is handled by this object
+	//  Return 0 if this object handles the request, 1 if not
+	virtual int IsInRegion(int x, int y);
 
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
 protected:
-    enum SlideoutState
-    {
-        hidden = 0,
-        visible,
-        request_hide,
-        request_show
-    };
-    Resource* mFont;
-    Resource* mSlideoutImage;
-    COLOR mForegroundColor;
-    COLOR mBackgroundColor;
-    COLOR mScrollColor;
-    unsigned int mFontHeight;
-    int mCurrentLine;
-    unsigned int mLastCount;
-    unsigned int mMaxRows;
-    int mStartY;
-    int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
-    int mSlideinX, mSlideinY, mSlideinW, mSlideinH;
-    int mConsoleX, mConsoleY, mConsoleW, mConsoleH;
-    int mLastTouchX, mLastTouchY;
-    int mSlideMultiplier;
-    int mSlideout;
-    SlideoutState mSlideoutState;
+	enum SlideoutState
+	{
+		hidden = 0,
+		visible,
+		request_hide,
+		request_show
+	};
+
+	Resource* mFont;
+	Resource* mSlideoutImage;
+	COLOR mForegroundColor;
+	COLOR mBackgroundColor;
+	COLOR mScrollColor;
+	unsigned int mFontHeight;
+	int mCurrentLine;
+	unsigned int mLastCount;
+	unsigned int mMaxRows;
+	int mStartY;
+	int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
+	int mSlideinX, mSlideinY, mSlideinW, mSlideinH;
+	int mConsoleX, mConsoleY, mConsoleW, mConsoleH;
+	int mLastTouchX, mLastTouchY;
+	int mSlideMultiplier;
+	int mSlideout;
+	SlideoutState mSlideoutState;
 
 protected:
-    virtual int RenderSlideout(void);
-    virtual int RenderConsole(void);
-
+	virtual int RenderSlideout(void);
+	virtual int RenderConsole(void);
 };
 
 class GUIButton : public RenderObject, public ActionObject, public Conditional
 {
 public:
-    GUIButton(xml_node<>* node);
-    virtual ~GUIButton();
+	GUIButton(xml_node<>* node);
+	virtual ~GUIButton();
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // SetPos - Update the position of the render object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+	// SetPos - Update the position of the render object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
 
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
 protected:
-    GUIImage* mButtonImg;
-    Resource* mButtonIcon;
-    GUIText* mButtonLabel;
-    GUIAction* mAction;
-    int mTextX, mTextY, mTextW, mTextH;
-    int mIconX, mIconY, mIconW, mIconH;
-    bool mRendered;
+	GUIImage* mButtonImg;
+	Resource* mButtonIcon;
+	GUIText* mButtonLabel;
+	GUIAction* mAction;
+	int mTextX, mTextY, mTextW, mTextH;
+	int mIconX, mIconY, mIconW, mIconH;
+	bool mRendered;
 	bool hasHighlightColor;
 	bool renderHighlight;
 	bool hasFill;
@@ -383,103 +381,103 @@
 class GUICheckbox: public RenderObject, public ActionObject, public Conditional
 {
 public:
-    GUICheckbox(xml_node<>* node);
-    virtual ~GUICheckbox();
+	GUICheckbox(xml_node<>* node);
+	virtual ~GUICheckbox();
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // SetPos - Update the position of the render object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+	// SetPos - Update the position of the render object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
 
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
 protected:
-    Resource* mChecked;
-    Resource* mUnchecked;
-    GUIText* mLabel;
-    int mTextX, mTextY;
-    int mCheckX, mCheckY, mCheckW, mCheckH;
-    int mLastState;
-    bool mRendered;
-    std::string mVarName;
+	Resource* mChecked;
+	Resource* mUnchecked;
+	GUIText* mLabel;
+	int mTextX, mTextY;
+	int mCheckX, mCheckY, mCheckW, mCheckH;
+	int mLastState;
+	bool mRendered;
+	std::string mVarName;
 };
 
 class GUIFileSelector : public RenderObject, public ActionObject
 {
 public:
-    GUIFileSelector(xml_node<>* node);
-    virtual ~GUIFileSelector();
+	GUIFileSelector(xml_node<>* node);
+	virtual ~GUIFileSelector();
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
-    // NotifyVarChange - Notify of a variable change
-    virtual int NotifyVarChange(std::string varName, std::string value);
+	// NotifyVarChange - Notify of a variable change
+	virtual int NotifyVarChange(std::string varName, std::string value);
 
-    // SetPos - Update the position of the render object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+	// SetPos - Update the position of the render object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
 
-    // SetPageFocus - Notify when a page gains or loses focus
-    virtual void SetPageFocus(int inFocus);
+	// SetPageFocus - Notify when a page gains or loses focus
+	virtual void SetPageFocus(int inFocus);
 
 protected:
-    struct FileData {
-        std::string fileName;
-        unsigned char fileType;     // Uses d_type format from struct dirent
-        mode_t protection;          // Uses mode_t format from stat
-        uid_t userId;
-        gid_t groupId;
-        off_t fileSize;
-        time_t lastAccess;          // Uses time_t format from stat
-        time_t lastModified;        // Uses time_t format from stat
-        time_t lastStatChange;      // Uses time_t format from stat
-    };
+	struct FileData {
+		std::string fileName;
+		unsigned char fileType;	 // Uses d_type format from struct dirent
+		mode_t protection;		  // Uses mode_t format from stat
+		uid_t userId;
+		gid_t groupId;
+		off_t fileSize;
+		time_t lastAccess;		  // Uses time_t format from stat
+		time_t lastModified;		// Uses time_t format from stat
+		time_t lastStatChange;	  // Uses time_t format from stat
+	};
 
 protected:
-    virtual int GetSelection(int x, int y);
+	virtual int GetSelection(int x, int y);
 
-    virtual int GetFileList(const std::string folder);
-    static bool fileSort(FileData d1, FileData d2);
+	virtual int GetFileList(const std::string folder);
+	static bool fileSort(FileData d1, FileData d2);
 
 protected:
-    std::vector<FileData> mFolderList;
-    std::vector<FileData> mFileList;
-    std::string mPathVar;
-    std::string mExtn;
-    std::string mVariable;
+	std::vector<FileData> mFolderList;
+	std::vector<FileData> mFileList;
+	std::string mPathVar;
+	std::string mExtn;
+	std::string mVariable;
 	std::string mSortVariable;
 	std::string mSelection;
 	std::string mHeaderText;
 	std::string mLastValue;
-    int actualLineHeight;
+	int actualLineHeight;
 	int mStart;
-    int mLineSpacing;
+	int mLineSpacing;
 	int mSeparatorH;
 	int mHeaderSeparatorH;
-    int mShowFolders, mShowFiles, mShowNavFolders;
-    int mUpdate;
-    int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
+	int mShowFolders, mShowFiles, mShowNavFolders;
+	int mUpdate;
+	int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
 	int mHeaderH;
 	int mFastScrollW;
 	int mFastScrollLineW;
@@ -493,16 +491,16 @@
 	int scrollingY;
 	int mHeaderIsStatic;
 	int touchDebounce;
-    unsigned mFontHeight;
-    unsigned mLineHeight;
-    int mIconWidth, mIconHeight, mFolderIconHeight, mFileIconHeight, mFolderIconWidth, mFileIconWidth, mHeaderIconHeight, mHeaderIconWidth;
-    Resource* mHeaderIcon;
+	unsigned mFontHeight;
+	unsigned mLineHeight;
+	int mIconWidth, mIconHeight, mFolderIconHeight, mFileIconHeight, mFolderIconWidth, mFileIconWidth, mHeaderIconHeight, mHeaderIconWidth;
+	Resource* mHeaderIcon;
 	Resource* mFolderIcon;
-    Resource* mFileIcon;
-    Resource* mBackground;
-    Resource* mFont;
-    COLOR mBackgroundColor;
-    COLOR mFontColor;
+	Resource* mFileIcon;
+	Resource* mBackground;
+	Resource* mFont;
+	COLOR mBackgroundColor;
+	COLOR mFontColor;
 	COLOR mHeaderBackgroundColor;
 	COLOR mHeaderFontColor;
 	COLOR mSeparatorColor;
@@ -521,56 +519,56 @@
 class GUIListBox : public RenderObject, public ActionObject
 {
 public:
-    GUIListBox(xml_node<>* node);
-    virtual ~GUIListBox();
+	GUIListBox(xml_node<>* node);
+	virtual ~GUIListBox();
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
-    // NotifyVarChange - Notify of a variable change
-    virtual int NotifyVarChange(std::string varName, std::string value);
+	// NotifyVarChange - Notify of a variable change
+	virtual int NotifyVarChange(std::string varName, std::string value);
 
-    // SetPos - Update the position of the render object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+	// SetPos - Update the position of the render object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
 
-    // SetPageFocus - Notify when a page gains or loses focus
-    virtual void SetPageFocus(int inFocus);
+	// SetPageFocus - Notify when a page gains or loses focus
+	virtual void SetPageFocus(int inFocus);
 
 protected:
-    struct ListData {
-        std::string displayName;
+	struct ListData {
+		std::string displayName;
 		std::string variableValue;
 		unsigned int selected;
-    };
+	};
 
 protected:
-    virtual int GetSelection(int x, int y);
+	virtual int GetSelection(int x, int y);
 
 protected:
-    std::vector<ListData> mList;
-    std::string mVariable;
+	std::vector<ListData> mList;
+	std::string mVariable;
 	std::string mSelection;
 	std::string currentValue;
 	std::string mHeaderText;
 	std::string mLastValue;
 	int actualLineHeight;
-    int mStart;
+	int mStart;
 	int startY;
 	int mSeparatorH, mHeaderSeparatorH;
-    int mLineSpacing;
-    int mUpdate;
-    int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH, mHeaderH;
+	int mLineSpacing;
+	int mUpdate;
+	int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH, mHeaderH;
 	int mFastScrollW;
 	int mFastScrollLineW;
 	int mFastScrollRectW;
@@ -581,15 +579,15 @@
 	int scrollingSpeed;
 	int scrollingY;
 	static int mSortOrder;
-    unsigned mFontHeight;
-    unsigned mLineHeight;
+	unsigned mFontHeight;
+	unsigned mLineHeight;
 	Resource* mHeaderIcon;
-    Resource* mIconSelected;
-    Resource* mIconUnselected;
-    Resource* mBackground;
-    Resource* mFont;
-    COLOR mBackgroundColor;
-    COLOR mFontColor;
+	Resource* mIconSelected;
+	Resource* mIconUnselected;
+	Resource* mBackground;
+	Resource* mFont;
+	COLOR mBackgroundColor;
+	COLOR mFontColor;
 	COLOR mHeaderBackgroundColor;
 	COLOR mHeaderFontColor;
 	COLOR mSeparatorColor;
@@ -609,53 +607,51 @@
 class GUIPartitionList : public RenderObject, public ActionObject
 {
 public:
-    GUIPartitionList(xml_node<>* node);
-    virtual ~GUIPartitionList();
+	GUIPartitionList(xml_node<>* node);
+	virtual ~GUIPartitionList();
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
-    // NotifyVarChange - Notify of a variable change
-    virtual int NotifyVarChange(std::string varName, std::string value);
+	// NotifyVarChange - Notify of a variable change
+	virtual int NotifyVarChange(std::string varName, std::string value);
 
-    // SetPos - Update the position of the render object
-    //  Return 0 on success, <0 on error
-    virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+	// SetPos - Update the position of the render object
+	//  Return 0 on success, <0 on error
+	virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
 
-    // SetPageFocus - Notify when a page gains or loses focus
-    virtual void SetPageFocus(int inFocus);
+	// SetPageFocus - Notify when a page gains or loses focus
+	virtual void SetPageFocus(int inFocus);
 
 protected:
-
-protected:
-    virtual int GetSelection(int x, int y);
+	virtual int GetSelection(int x, int y);
 	virtual void MatchList(void);
 
 protected:
-    std::vector<PartitionList> mList;
+	std::vector<PartitionList> mList;
 	std::string ListType;
-    std::string mVariable;
+	std::string mVariable;
 	std::string selectedList;
 	std::string currentValue;
 	std::string mHeaderText;
 	std::string mLastValue;
 	int actualLineHeight;
-    int mStart;
+	int mStart;
 	int startY;
 	int mSeparatorH, mHeaderSeparatorH;
-    int mLineSpacing;
-    int mUpdate;
-    int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH, mHeaderH;
+	int mLineSpacing;
+	int mUpdate;
+	int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH, mHeaderH;
 	int mFastScrollW;
 	int mFastScrollLineW;
 	int mFastScrollRectW;
@@ -666,15 +662,15 @@
 	int scrollingSpeed;
 	int scrollingY;
 	static int mSortOrder;
-    unsigned mFontHeight;
-    unsigned mLineHeight;
+	unsigned mFontHeight;
+	unsigned mLineHeight;
 	Resource* mHeaderIcon;
-    Resource* mIconSelected;
-    Resource* mIconUnselected;
-    Resource* mBackground;
-    Resource* mFont;
-    COLOR mBackgroundColor;
-    COLOR mFontColor;
+	Resource* mIconSelected;
+	Resource* mIconUnselected;
+	Resource* mBackground;
+	Resource* mFont;
+	COLOR mBackgroundColor;
+	COLOR mFontColor;
 	COLOR mHeaderBackgroundColor;
 	COLOR mHeaderFontColor;
 	COLOR mSeparatorColor;
@@ -696,87 +692,86 @@
 class GUIAnimation : public RenderObject
 {
 public:
-    GUIAnimation(xml_node<>* node);
+	GUIAnimation(xml_node<>* node);
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
 protected:
-    AnimationResource* mAnimation;
-    int mFrame;
-    int mFPS;
-    int mLoop;
-    int mRender;
-    int mUpdateCount;
+	AnimationResource* mAnimation;
+	int mFrame;
+	int mFPS;
+	int mLoop;
+	int mRender;
+	int mUpdateCount;
 };
 
 class GUIProgressBar : public RenderObject, public ActionObject
 {
 public:
-    GUIProgressBar(xml_node<>* node);
+	GUIProgressBar(xml_node<>* node);
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // NotifyVarChange - Notify of a variable change
-    //  Returns 0 on success, <0 on error
-    virtual int NotifyVarChange(std::string varName, std::string value);
+	// NotifyVarChange - Notify of a variable change
+	//  Returns 0 on success, <0 on error
+	virtual int NotifyVarChange(std::string varName, std::string value);
 
 protected:
-    Resource* mEmptyBar;
-    Resource* mFullBar;
-    std::string mMinValVar;
-    std::string mMaxValVar;
-    std::string mCurValVar;
-    float mSlide;
-    float mSlideInc;
-    int mSlideFrames;
-    int mLastPos;
+	Resource* mEmptyBar;
+	Resource* mFullBar;
+	std::string mMinValVar;
+	std::string mMaxValVar;
+	std::string mCurValVar;
+	float mSlide;
+	float mSlideInc;
+	int mSlideFrames;
+	int mLastPos;
 
 protected:
-    virtual int RenderInternal(void);       // Does the actual render
-
+	virtual int RenderInternal(void);	   // Does the actual render
 };
 
 class GUISlider : public RenderObject, public ActionObject
 {
 public:
-    GUISlider(xml_node<>* node);
-    virtual ~GUISlider();
+	GUISlider(xml_node<>* node);
+	virtual ~GUISlider();
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	// NotifyTouch - Notify of a touch event
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
 protected:
-    GUIAction* sAction;
-    Resource* sSlider;
-    Resource* sSliderUsed;
-    Resource* sTouch;
-    int sTouchW, sTouchH;
-    int sCurTouchX;
-    int sUpdate;
+	GUIAction* sAction;
+	Resource* sSlider;
+	Resource* sSliderUsed;
+	Resource* sTouch;
+	int sTouchW, sTouchH;
+	int sCurTouchX;
+	int sUpdate;
 };
 
 #define MAX_KEYBOARD_LAYOUTS 5
@@ -799,7 +794,7 @@
 {
 public:
 	GUIKeyboard(xml_node<>* node);
-    virtual ~GUIKeyboard();
+	virtual ~GUIKeyboard();
 
 public:
 	virtual int Render(void);
@@ -812,12 +807,12 @@
 
 protected:
 	struct keyboard_key_class
-    {
-        unsigned char key;
+	{
+		unsigned char key;
 		unsigned char longpresskey;
-        unsigned int end_x;
+		unsigned int end_x;
 		unsigned int layout;
-    };
+	};
 
 	Resource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
 	struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
@@ -836,25 +831,25 @@
 class GUIInput : public RenderObject, public ActionObject, public Conditional, public InputObject
 {
 public:
-    // w and h may be ignored, in which case, no bounding box is applied
-    GUIInput(xml_node<>* node);
+	// w and h may be ignored, in which case, no bounding box is applied
+	GUIInput(xml_node<>* node);
 	virtual ~GUIInput();
 
 public:
-    // Render - Render the full object to the GL surface
-    //  Return 0 on success, <0 on error
-    virtual int Render(void);
+	// Render - Render the full object to the GL surface
+	//  Return 0 on success, <0 on error
+	virtual int Render(void);
 
-    // Update - Update any UI component animations (called <= 30 FPS)
-    //  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
-    virtual int Update(void);
+	// Update - Update any UI component animations (called <= 30 FPS)
+	//  Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
+	virtual int Update(void);
 
-    // Notify of a variable change
-    virtual int NotifyVarChange(std::string varName, std::string value);
+	// Notify of a variable change
+	virtual int NotifyVarChange(std::string varName, std::string value);
 
 	// NotifyTouch - Notify of a touch event
-    //  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
-    virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
+	//  Return 0 on success, >0 to ignore remainder of touch, and <0 on error
+	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
 	virtual int NotifyKeyboard(int key);
 
@@ -865,17 +860,17 @@
 	virtual int HandleTextLocation(int x);
 
 protected:
-    GUIText* mInputText;
+	GUIText* mInputText;
 	GUIAction* mAction;
 	Resource* mBackground;
 	Resource* mCursor;
 	Resource* mFont;
 	std::string mText;
-    std::string mLastValue;
+	std::string mLastValue;
 	std::string mVariable;
 	std::string mMask;
 	std::string mMaskVariable;
-    COLOR mBackgroundColor;
+	COLOR mBackgroundColor;
 	COLOR mCursorColor;
 	int scrollingX;
 	int lastX;
