diff --git a/exec/lbshell.js b/exec/lbshell.js
index dd3759e2f2074cf53930c6be099b1b813df5593e..f02ff1c160422057c57cf5d507b9c21421dfffba 100644
--- a/exec/lbshell.js
+++ b/exec/lbshell.js
@@ -269,7 +269,7 @@ while(1) {
 			while(!done) {
 				file: switch(filemenu.getval()) {
 					case KEY_LEFT:
-						mainbar.current=mainbar.items.length-1;
+						main_left();
 						done=1;
 						break;
 					case '\b':
@@ -331,8 +331,7 @@ while(1) {
 						break;
 					case KEY_RIGHT:
 						if(filemenu.items[filemenu.current].retval!='I') {
-							mainbar.current++;
-							next_key='S';
+							main_right();
 							done=1;
 							break;
 						}
@@ -639,8 +638,7 @@ while(1) {
 						break;
 					case KEY_RIGHT:
 						if(settingsmenu.items[settingsmenu.current].retval!='F') {
-							next_key='E';
-							mainbar.current++;
+							main_right();
 							done=1;
 							break;
 						}
@@ -697,8 +695,7 @@ while(1) {
 						draw_main(true);
 						break;
 					case KEY_LEFT:
-						mainbar.current--;
-						next_key='F';
+						main_left();
 						done=1;
 						break;
 					case '\b':
@@ -777,14 +774,12 @@ while(1) {
 						draw_main(true);
 						break;
 					case KEY_RIGHT:
-						mainbar.current++;
+						main_right();
 						done=1;
-						next_key='M';
 						break;
 					case KEY_LEFT:
-						mainbar.current--;
+						main_left();
 						done=1;
-						next_key='S';
 						break;
 					case '\b':
 					case '\x7f':
@@ -931,14 +926,12 @@ while(1) {
 						draw_main(true);
 						break;
 					case KEY_RIGHT:
-						mainbar.current++;
+						main_right();
 						done=1;
-						next_key='C';
 						break;
 					case KEY_LEFT:
-						mainbar.current--;
+						main_left();
 						done=1;
-						next_key='E';
 						break;
 					case '\b':
 					case '\x7f':
@@ -997,14 +990,12 @@ while(1) {
 						user.chat_settings ^= CHAT_SPLITP;
 						break;
 					case KEY_RIGHT:
-						mainbar.current++;
+						main_right();
 						done=1;
-						next_key='x';
 						break;
 					case KEY_LEFT:
-						mainbar.current--;
+						main_left();
 						done=1;
-						next_key='M';
 						break;
 					case '\b':
 					case '\x7f':
@@ -1074,9 +1065,8 @@ while(1) {
 						break;
 					case KEY_LEFT:
 						if(infomenu.items[infomenu.current].retval!='U') {
-							mainbar.current--;
+							main_left();
 							done=1;
-							next_key='x';
 							break infoloop;
 						}
 						// Fall-through
@@ -1119,7 +1109,7 @@ while(1) {
 						draw_main(true);
 						break infoloop;
 					case KEY_RIGHT:
-						mainbar.current++;
+						main_right();
 						done=1;
 						break infoloop;
 					case '\b':
@@ -1204,3 +1194,27 @@ function draw_main(topline)
 	console.cleartoeol();
 	console.gotoxy(1,1);
 }
+
+function main_right()
+{
+	do {
+		mainbar.current++;
+		if(mainbar.current==mainbar.items.length)
+			mainbar.current=0;
+	} while(mainbar.items[mainbar.current].disabled || mainbar.items[mainbar.current].retval==undefined))
+	next_key=mainbar.items[mainbar.current].retval;
+	if(next_key=='G' || next_key==';')
+		next_key='';
+}
+
+function main_left()
+{
+	do {
+		if(mainbar.current==0)
+			mainbar.current=mainbar.items.length;
+		mainbar.current--;
+	} while(mainbar.items[mainbar.current].disabled || mainbar.items[mainbar.current].retval==undefined))
+	next_key=mainbar.items[mainbar.current].retval;
+	if(next_key=='G' || next_key==';')
+		next_key='';
+}