Add keyboard key highlight
diff --git a/gui/devices/1024x600/res/ui.xml b/gui/devices/1024x600/res/ui.xml
index 9873669..2542a18 100755
--- a/gui/devices/1024x600/res/ui.xml
+++ b/gui/devices/1024x600/res/ui.xml
@@ -364,6 +364,7 @@
 			<object type="keyboard">
 				<placement x="0" y="341" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="65" width="92" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" key11="104:c:8" />
diff --git a/gui/devices/1024x768/res/ui.xml b/gui/devices/1024x768/res/ui.xml
index ab269c1..af14bc2 100644
--- a/gui/devices/1024x768/res/ui.xml
+++ b/gui/devices/1024x768/res/ui.xml
@@ -364,6 +364,7 @@
 			<object type="keyboard">
 				<placement x="0" y="408" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="90" width="85" />
 					<row1 key01="80:" key02="q" long02="1" key03="w" long03="2" key04="e" long04="3" key05="r" long05="4" key06="t" long06="5" key07="y" long07="6" key08="u" long08="7" key09="i" long09="8" key10="o" long10="9" key11="p" long11="0" key12="94:c:8" />
diff --git a/gui/devices/1280x800/res/ui.xml b/gui/devices/1280x800/res/ui.xml
index 8b9503d..14f2b77 100644
--- a/gui/devices/1280x800/res/ui.xml
+++ b/gui/devices/1280x800/res/ui.xml
@@ -364,6 +364,7 @@
 			<object type="keyboard">
 				<placement x="0" y="438" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="91" width="106" />
 					<row1 key01="102:" key02="q" long02="1" key03="w" long03="2" key04="e" long04="3" key05="r" long05="4" key06="t" long06="5" key07="y" long07="6" key08="u" long08="7" key09="i" long09="8" key10="o" long10="9" key11="p" long11="0" key12="118:c:8" />
diff --git a/gui/devices/1920x1200/res/ui.xml b/gui/devices/1920x1200/res/ui.xml
index 3220dc0..62c07d6 100644
--- a/gui/devices/1920x1200/res/ui.xml
+++ b/gui/devices/1920x1200/res/ui.xml
@@ -364,6 +364,7 @@
 			<object type="keyboard">
 				<placement x="0" y="684" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="129" width="159" />
 					<row1 key01="153:" key02="q" long02="1" key03="w" long03="2" key04="e" long04="3" key05="r" long05="4" key06="t" long06="5" key07="y" long07="6" key08="u" long08="7" key09="i" long09="8" key10="o" long10="9" key11="p" long11="0" key12="177:c:8" />
diff --git a/gui/devices/320x480/res/ui.xml b/gui/devices/320x480/res/ui.xml
index 3231f5f..04807cd 100644
--- a/gui/devices/320x480/res/ui.xml
+++ b/gui/devices/320x480/res/ui.xml
@@ -321,6 +321,7 @@
 			<object type="keyboard">
 				<placement x="0" y="253" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="52" width="32" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" />
diff --git a/gui/devices/480x800/res/ui.xml b/gui/devices/480x800/res/ui.xml
index 3d6b879..5ac4113 100644
--- a/gui/devices/480x800/res/ui.xml
+++ b/gui/devices/480x800/res/ui.xml
@@ -320,6 +320,7 @@
 			<object type="keyboard">
 				<placement x="0" y="450" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="78" width="48" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" />
diff --git a/gui/devices/480x854/res/ui.xml b/gui/devices/480x854/res/ui.xml
index 1733b90..7593601 100644
--- a/gui/devices/480x854/res/ui.xml
+++ b/gui/devices/480x854/res/ui.xml
@@ -319,6 +319,7 @@
 			<object type="keyboard">
 				<placement x="0" y="504" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="78" width="48" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" />
diff --git a/gui/devices/540x960/res/ui.xml b/gui/devices/540x960/res/ui.xml
index 5a82579..587ccc7 100644
--- a/gui/devices/540x960/res/ui.xml
+++ b/gui/devices/540x960/res/ui.xml
@@ -320,6 +320,7 @@
 			<object type="keyboard">
 				<placement x="0" y="600" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="78" width="54" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" />
diff --git a/gui/devices/720x1280/res/ui.xml b/gui/devices/720x1280/res/ui.xml
index 5490acc..1c16783 100644
--- a/gui/devices/720x1280/res/ui.xml
+++ b/gui/devices/720x1280/res/ui.xml
@@ -325,6 +325,7 @@
 			<object type="keyboard">
 				<placement x="0" y="800" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="106" width="72" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" />
diff --git a/gui/devices/800x1280/res/ui.xml b/gui/devices/800x1280/res/ui.xml
index a86c7d6..0a9290e 100755
--- a/gui/devices/800x1280/res/ui.xml
+++ b/gui/devices/800x1280/res/ui.xml
@@ -321,6 +321,7 @@
 			<object type="keyboard">
 				<placement x="0" y="740" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="115" width="80" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" />
diff --git a/gui/devices/800x480/res/ui.xml b/gui/devices/800x480/res/ui.xml
index dc73246..53530d5 100755
--- a/gui/devices/800x480/res/ui.xml
+++ b/gui/devices/800x480/res/ui.xml
@@ -364,6 +364,7 @@
 			<object type="keyboard">
 				<placement x="0" y="277" />
 				<layout resource1="keyboard1" resource2="keyboard2" resource3="keyboard3" resource4="keyboard4" />
+				<highlight color="#90909080" />
 				<layout1>
 					<keysize height="51" width="73" />
 					<row1 key01="q" long01="1" key02="w" long02="2" key03="e" long03="3" key04="r" long04="4" key05="t" long05="5" key06="y" long06="6" key07="u" long07="7" key08="i" long08="8" key09="o" long09="9" key10="p" long10="0" key11="70:c:8" />
diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp
index 6595d8d..f44e563 100644
--- a/gui/keyboard.cpp
+++ b/gui/keyboard.cpp
@@ -1,4 +1,24 @@
-// keyboard.cpp - GUIKeyboard object
+/* keyboard.cpp - GUIKeyboard object
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * The code was written from scratch by Dees_Troy dees_troy at
+ * yahoo
+ *
+ * Copyright (c) 2012
+ */
 
 #include <stdarg.h>
 #include <stdio.h>
@@ -30,6 +50,8 @@
 	: Conditional(node)
 {
 	int layoutindex, rowindex, keyindex, Xindex, Yindex, keyHeight = 0, keyWidth = 0;
+	rowY = colX = -1;
+	highlightRenderCount = hasHighlight = 0;
 	char resource[9], layout[7], row[4], key[5], longpress[6];
 	xml_attribute<>* attr;
 	xml_node<>* child;
@@ -53,6 +75,17 @@
 		mAction = new GUIAction(node);
 	}
 
+	memset(&mHighlightColor, 0, sizeof(COLOR));
+	child = node->first_node("highlight");
+	if (child) {
+		attr = child->first_attribute("color");
+		if (attr) {
+			hasHighlight = 1;
+			std::string color = attr->value();
+			ConvertStrToColor(color, &mHighlightColor);
+		}
+	}
+
 	// Load the images for the different layouts
 	child = node->first_node("layout");
 	if (child)
@@ -294,7 +327,26 @@
 	if (keyboardImg[currentLayout - 1] && keyboardImg[currentLayout - 1]->GetResource())
 		gr_blit(keyboardImg[currentLayout - 1]->GetResource(), 0, 0, KeyboardWidth, KeyboardHeight, mRenderX, mRenderY);
 
-	mRendered = true;
+	if (hasHighlight && highlightRenderCount != 0) {
+		int boxheight, boxwidth, x;
+		if (rowY == 0)
+			boxheight = row_heights[currentLayout - 1][rowY];
+		else
+			boxheight = row_heights[currentLayout - 1][rowY] - row_heights[currentLayout - 1][rowY - 1];
+		if (colX == 0) {
+			x = mRenderX;
+			boxwidth = keyboard_keys[currentLayout - 1][rowY][colX].end_x;
+		} else {
+			x = mRenderX + keyboard_keys[currentLayout - 1][rowY][colX - 1].end_x;
+			boxwidth = keyboard_keys[currentLayout - 1][rowY][colX].end_x - keyboard_keys[currentLayout - 1][rowY][colX - 1].end_x;
+		}
+		gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
+		gr_fill(x, mRenderY + row_heights[currentLayout - 1][rowY - 1], boxwidth, boxheight);
+		if (highlightRenderCount > 0)
+			highlightRenderCount--;
+	} else
+		mRendered = true;
+
 	return ret;
 }
 
@@ -323,7 +375,7 @@
 
 int GUIKeyboard::GetSelection(int x, int y)
 {
-	if (x < mRenderX || x - mRenderX > KeyboardWidth || y < mRenderY || y - mRenderY > KeyboardHeight) return -1;
+	if (x < mRenderX || x - mRenderX > (int)KeyboardWidth || y < mRenderY || y - mRenderY > (int)KeyboardHeight) return -1;
 	return 0;
 }
 
@@ -349,6 +401,7 @@
 			for (indexy=0; indexy<MAX_KEYBOARD_ROWS; indexy++) {
 				if (row_heights[currentLayout - 1][indexy] > rely) {
 					rowIndex = indexy;
+					rowY = indexy;
 					indexy = MAX_KEYBOARD_ROWS;
 				}
 			}
@@ -358,10 +411,19 @@
 				if (keyboard_keys[currentLayout - 1][rowIndex][indexx].end_x > relx) {
 					// This is the key that was pressed!
 					initial_key = keyboard_keys[currentLayout - 1][rowIndex][indexx].key;
+					colX = indexx;
 					indexx = MAX_KEYBOARD_KEYS;
 				}
 			}
+			if (initial_key != 0)
+				highlightRenderCount = -1;
+			else
+				highlightRenderCount = 0;
+			mRendered = false;
 		} else {
+			if (highlightRenderCount != 0)
+				mRendered = false;
+			highlightRenderCount = 0;
 			startSelection = 0;
 		}
 		break;
@@ -369,9 +431,17 @@
 		break;
 	case TOUCH_RELEASE:
 		if (x < startX - (KeyboardWidth * 0.5)) {
+			if (highlightRenderCount != 0) {
+				highlightRenderCount = 0;
+				mRendered = false;
+			}
 			PageManager::NotifyKeyboard(KEYBOARD_SWIPE_LEFT);
 			return 0;
 		} else if (x > startX + (KeyboardWidth * 0.5)) {
+			if (highlightRenderCount != 0) {
+				highlightRenderCount = 0;
+				mRendered = false;
+			}
 			PageManager::NotifyKeyboard(KEYBOARD_SWIPE_RIGHT);
 			return 0;
 		}
@@ -379,8 +449,19 @@
 	case TOUCH_HOLD:
 	case TOUCH_REPEAT:
 
-		if (startSelection == 0 || GetSelection(x, y) == -1)
+		if (startSelection == 0 || GetSelection(x, y) == -1) {
+			if (highlightRenderCount != 0) {
+				highlightRenderCount = 0;
+				mRendered = false;
+			}
 			return 0;
+		} else if (highlightRenderCount != 0) {
+			if (state == TOUCH_RELEASE)
+				highlightRenderCount = 2;
+			else
+				highlightRenderCount = -1;
+			mRendered = false;
+		}
 
 		// Find the correct row
 		for (indexy=0; indexy<MAX_KEYBOARD_ROWS; indexy++) {
@@ -408,6 +489,7 @@
 						mRendered = false;
 					} else if ((int)keyboard_keys[currentLayout - 1][rowIndex][indexx].key == KEYBOARD_ACTION) {
 						// Action
+						highlightRenderCount = 0;
 						if (mAction) {
 							// Keyboard has its own action defined
 							return (mAction ? mAction->NotifyTouch(state, x, y) : 1);
diff --git a/gui/objects.hpp b/gui/objects.hpp
index 8f78236..c310b36 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -675,7 +675,9 @@
 	unsigned int currentLayout;
 	unsigned int row_heights[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS];
 	unsigned int KeyboardWidth, KeyboardHeight;
+	int rowY, colX, highlightRenderCount, hasHighlight;
 	GUIAction* mAction;
+	COLOR mHighlightColor;
 };
 
 // GUIInput - Used for keyboard input
diff --git a/gui/pages.cpp b/gui/pages.cpp
index 7e9274d..c4a65b4 100644
--- a/gui/pages.cpp
+++ b/gui/pages.cpp
@@ -54,17 +54,24 @@
     if (str[0] != '#')          return -1;
     str.erase(0, 1);
 
-    int result = strtol(str.c_str(), NULL, 16);
-    if (str.size() > 6)
-    {
-        // We have alpha channel
-        color->alpha = result & 0x000000FF;
-        result = result >> 8;
-    }
-    color->red = (result >> 16) & 0x000000FF;
-    color->green = (result >> 8) & 0x000000FF;
-    color->blue = result & 0x000000FF;
-    return 0;
+	int result;
+	if (str.size() >= 8) {
+		// We have alpha channel
+		string alpha = str.substr(6, 2);
+		result = strtol(alpha.c_str(), NULL, 16);
+		color->alpha = result & 0x000000FF;
+		str.resize(6);
+		result = strtol(str.c_str(), NULL, 16);
+		color->red = (result >> 16) & 0x000000FF;
+		color->green = (result >> 8) & 0x000000FF;
+		color->blue = result & 0x000000FF;
+	} else {
+		result = strtol(str.c_str(), NULL, 16);
+		color->red = (result >> 16) & 0x000000FF;
+		color->green = (result >> 8) & 0x000000FF;
+		color->blue = result & 0x000000FF;
+	}
+	return 0;
 }
 
 // Helper APIs