diff --git a/exec/load/inputline.js b/exec/load/inputline.js
index 97196ed4c88de939ff76664a8499e22b97ab9652..66bcc64bf7ddf1ce1153f779423e8cf2a85afb95 100644
--- a/exec/load/inputline.js
+++ b/exec/load/inputline.js
@@ -1,73 +1,39 @@
+bbs.command_str='';
 load("str_cmds.js");
-full_redraw=false;
+load("funclib.js");
+load("frame.js");
 
-function InputLine(x,y,w,max,bg,fg,title)
-{
-	this.x=1;
-	this.y=24;
-	this.width=79;
-	this.max_buffer=200;
+function InputLine(frame,text) {
+	/* private properties */
+	var properties = {
+		frame:undefined,
+		text:undefined,
+		buffer:[]
+	};
+	var settings = {
+		show_border:true,
+		show_title:true,
+		timeout:50,
+		max_buffer:200
+	};
 	
-	this.bg=BG_BLACK;
-	this.fg=LIGHTGRAY;
-	this.buffer="";
+	/* protected properties */
+	this.__defineGetter__("frame",function() {
+		return properties.frame;
+	});
 	
-	this.title_bg=BG_LIGHTGRAY;
-	this.title_fg=BLACK;
-	this.title="";
+	/* public properties */
+	this.colors = {
+		bg:BG_BLUE,
+		fg:WHITE
+	};
 	
-	this.clear=function() 
-	{
-		console.gotoxy(this.x + console.strlen(this.title),this.y);
-		console.attributes=this.bg;
-		console.write(format("%*s",this.width-console.strlen(this.title),""));
-	}
-	this.init=function(x,y,w,max,bg,fg,title) 
-	{
-		if(x) this.x=x;
-		if(y) this.y=y;
-		if(w) this.width=w;
-		if(max) this.max_buffer=max;
-		if(bg) this.bg=bg;
-		if(fg) this.fg=fg;
-		if(title) this.title=title;
-	
-		if(this.x + this.w > console.screen_columns) {
-			log("input line wider than screen. adjusting to fit.");
-			this.w=console.screen_columns-this.x-1;
-		}
-		if(this.x >= console.screen_columns || this.y > console.screen_rows) {
-			log("input line off the screen. using defaults.");
-			this.x=1;
-			this.y=1;
-		}
-	}
-	this.submit=function()
-	{
-		if(strlen(this.buffer)<1) return null;
-		
-		if(this.buffer[0]==";") {
-			if(this.buffer.length>1 && (user.compare_ars("SYSOP") || bbs.sys_status&SS_TMPSYSOP)) {
-				console.clear();
-				str_cmds(this.buffer.substr(1));
-				this.reset();
-				this.clear();
-				full_redraw=true;
-				return null;
-			}
-		}
-		
-		var command=this.buffer;
-		this.reset();
-		this.clear();
-		return command;
-	}
-	this.inkey=function(hotkeys)
-	{
-		var key=console.inkey(K_NOCRLF|K_NOSPIN|K_NOECHO);
-		if(!key) 
-			return false;
-		if(hotkeys) 
+	/* public methods */
+	this.getkey = function(use_hotkeys) {
+		var key=console.inkey(K_NOCRLF|K_NOSPIN|K_NOECHO,settings.timeout);
+		if(key == "") 
+			return undefined;
+		if(use_hotkeys) 
 			return key;
 		switch(key) {
 		case '\x00':	/* CTRL-@ (NULL) */
@@ -91,7 +57,6 @@ function InputLine(x,y,w,max,bg,fg,title)
 		case '\x1a':	/* CTRL-Z */
 		case '\x1c':	/* CTRL-\ */
 		case '\x1f':	/* CTRL-_ */
-		case '\x1b':	/* ESC */
 		case KEY_UP:
 		case KEY_DOWN:
 		case KEY_LEFT:
@@ -101,91 +66,84 @@ function InputLine(x,y,w,max,bg,fg,title)
 			return key;
 		case '\x7f':	/* DELETE */
 		case '\b':
-			this.backspace();
-			return false;
+			return backspace();
 		case '\r':
 		case '\n':
-			return this.submit();
-		default:
-			this.bufferKey(key);
-			return false;
-		}
-	}
-	this.backspace=function()
-	{
-		if(this.buffer.length>0) {
-			if(this.buffer.length<=this.getWidth()) {
-				this.getxy();
-				console.left();
-				console.attributes=this.bg;
-				console.write(" ");
-				this.buffer=this.buffer.substr(0,this.buffer.length-1);
-			} else {
-				this.buffer=this.buffer.substr(0,this.buffer.length-1);
-				console.gotoxy(this);
-				console.right(console.strlen(this.title));
-				this.printBuffer();
-			}
-			return true;
-		} else {
+			return submit();
+		case '\x1b':
 			return false;
+		default:
+			return bufferKey(key);
 		}
 	}
-	this.reset=function()
-	{
-		this.buffer="";
+	this.init = function(x,y,w,h,frame) {
+		var attr = this.colors.bg + this.colors.fg;
+		properties.frame = new Frame(x,y,w,h,attr,frame);
+		properties.frame.v_scroll = false;
+		properties.frame.h_scroll = true;
+		properties.frame.open();
 	}
-	this.getxy=function()
-	{
-		console.gotoxy(this.x + console.strlen(this.title) + this.buffer.length,this.y);
+	
+	/* private functions */
+	function bufferKey(key) {
+		if(properties.buffer.length >= settings.max_buffer) 
+			return false;
+		properties.buffer+=key;
+		if(properties.buffer.length>properties.frame.width) 
+			printBuffer();
+		 else 
+			properties.frame.putmsg(key);
+		return undefined;
 	}
-	this.bufferKey=function(key)
-	{
-		if(this.buffer.length >= this.max_buffer) {
+	function backspace() {
+		if(properties.buffer.length == 0) 
 			return false;
-		} else if(this.buffer.length>=this.getWidth()) {
-			this.buffer+=key;
-			console.gotoxy(this);
-			console.right(console.strlen(this.title));
-			this.printBuffer();
-		} else {
-			this.getxy();
-			this.buffer+=key;
-			console.attributes=this.fg + this.bg;
-			console.write(key);
+		properties.buffer=properties.buffer.substr(0,properties.buffer.length-1);
+		if(properties.buffer.length+1>=properties.frame.width) 
+			printBuffer();
+		else {
+			properties.frame.left();
+			properties.frame.putmsg(" ");
+			properties.frame.left();
 		}
-		return true;
+		return undefined;
 	}
-	this.getWidth=function()
-	{
-		return this.width-console.strlen(this.title);
+	function printBuffer() {
+		properties.frame.clear();
+		var overrun=properties.buffer.length-properties.frame.width;
+		if(overrun > 0) {
+			var truncated=properties.buffer.substr(overrun);
+			properties.frame.putmsg(truncated);
+		}
+		else {
+			properties.frame.putmsg(properties.buffer);
+		}
 	}
-	this.draw=function()
-	{
-		console.gotoxy(this);
-		this.printTitle();
-//		if(this.x + this.width == console.screen_columns && this.y == console.screen_rows) 
-//			console.cleartoeol(this.bg);
-		this.printBuffer();
+	function reset() {
+		properties.buffer = [];
+		properties.frame.clear();
 	}
-	this.printTitle=function()
-	{
-		if(this.title.length > 0) {
-			console.attributes=this.title_fg + this.title_bg;
-			console.write(this.title);
+	function submit() {
+		// if(strlen(properties.buffer)<1) 
+			// return null;
+		if(properties.buffer[0]==";") {
+			if(properties.buffer.length>1 && (user.compare_ars("SYSOP") || bbs.sys_status&SS_TMPSYSOP)) {
+				str_cmds(properties.buffer.substr(1));
+				reset();
+				return null;
+			}
 		}
+		var cmd=properties.buffer;
+		reset();
+		return cmd;
 	}
-	this.printBuffer=function()
-	{
-		console.attributes=this.fg+this.bg;
-		if(this.buffer.length>this.getWidth()) {
-			var overrun=this.buffer.length-this.getWidth();
-			var truncated=this.buffer.substr(overrun);
-			console.write(truncated);
-		} else {
-			console.write(printPadded(this.buffer,this.getWidth()));
+	function init(frame,text) {
+		if(frame instanceof Frame) {
+			properties.frame=frame;
+		}
+		if(text) {
+			properties.text = text;
 		}
 	}
-
-	this.init(x,y,w,max,bg,fg,title);
+	init.apply(this,arguments);
 }