From f3b8a39ba8ac491abbbec2669bbd23d2b7a78961 Mon Sep 17 00:00:00 2001
From: echicken <>
Date: Tue, 5 Feb 2013 07:03:28 +0000
Subject: [PATCH] Did ... stuff, to make it more worky, less pollusive and
 easier to maintain.

---
 xtrn/ecreader/ecReader.js | 565 ++++++++++++++++++--------------------
 1 file changed, 267 insertions(+), 298 deletions(-)

diff --git a/xtrn/ecreader/ecReader.js b/xtrn/ecreader/ecReader.js
index d6a0b54280..24c0761152 100644
--- a/xtrn/ecreader/ecReader.js
+++ b/xtrn/ecreader/ecReader.js
@@ -8,16 +8,15 @@ console.putmsg("\1h\1wecReader by echicken, loading message threads...");
 
 load("sbbsdefs.js");
 load("msgutils.js");
-load(js.exec_dir + "msglib.js");
 load("frame.js");
 load("tree.js");
+load(js.exec_dir + "msglib.js");
 
 var maxMessages = 0;			// How many messages to load per sub, 0 for all.
-var showMail = true;			// Allow access to the private 'mail' sub-board
 var threaded = true;			// False to default to flat view
 var setPointers = true; 		// False to leave scan pointers unaffected by reading
 var reverseThreads = true;		// True to list threads from most to least recently updated
-var reverseMessages = false;	// True to list messages in a thread from oldest to newest
+var reverseMessages = false;	// True to list messages in a thread from newest to oldest
 var lbg = BG_CYAN;				// Lightbar background
 var lfg = WHITE;				// Foreground colour of highlighted text
 var nfg = LIGHTGRAY;			// Foreground colour of non-highlighted text
@@ -29,76 +28,19 @@ var hfg = "\1h\1w"; 			// Heading text (CTRL-A format, for now)
 var sffg = "\1h\1c";			// Heading sub-field text (CTRL-A format, for now)
 var mfg = "\1n\1w";				// Message text colour (CTRL-A format, for now)
 
-var messages;
-var tree;
-var currentMessage = 0;
-var mail = false;
-
-if(argc > 0 && argv[0])
-	var msgBase = new MsgBase(argv[0]);
-else
-	var msgBase = new MsgBase(msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].code);
-
-var frame = new Frame(1, 1, console.screen_columns, console.screen_rows, BG_BLACK|WHITE);
-var titleFrame = new Frame(1, 1, console.screen_columns, 2, fbg|WHITE, frame);
-var columnFrame = new Frame(1, 3, console.screen_columns, 1, fbg|WHITE, frame);
-var treeFrame = new Frame(1, 4, console.screen_columns, console.screen_rows - 4, BG_BLACK|WHITE, frame);
-var helpFrame = new Frame(1, console.screen_rows, console.screen_columns, 1, fbg|WHITE, frame);
-var messageFrame = new Frame(1, 3, console.screen_columns, console.screen_rows - 3, BG_BLACK|WHITE, frame);
-var headerFrame = new Frame(1, 3, console.screen_columns, 4, fbg|WHITE, messageFrame);
-var bodyFrame = new Frame(1, 7, console.screen_columns, console.screen_rows - 7, BG_BLACK|WHITE, messageFrame);
-var messageBar = new Frame(1, console.screen_rows, console.screen_columns, 1, fbg|WHITE, messageFrame);
-var promptFrame = new Frame(20, Math.round(console.screen_rows / 2) - 3, console.screen_columns - 40, 6, fbg|WHITE, frame);
-var promptSubFrame = new Frame(22, promptFrame.y + 1, promptFrame.width - 4, 4, BG_BLACK|WHITE, promptFrame);
-
-frame.open();
-messageFrame.bottom();
-headerFrame.bottom();
-promptFrame.bottom();
-
-helpFrame.center(
-	hfg + "UP" + sffg + "/" + hfg + "DN  "
-	+ hfg + "[" + sffg + "PgUp/PgDn" + hfg + "]  "
-	+ hfg + "HOME" + sffg + "/" + hfg + "END  "
-	+ hfg + "T" + sffg + "hreaded  "
-	+ hfg + "F" + sffg + "lat  "
-	+ hfg + "A" + sffg + "rea  "
-	+ hfg + "E" + sffg + "mail  "
-	+ hfg + "P" + sffg + "ost  "
-	+ hfg + "DEL" + sffg + "ete  "
-	+ hfg + "Q" + sffg + "uit"
-);
-
-messageBar.center(
-	hfg + "UP" + sffg + "/" + hfg + "DN  "
-	+ hfg + "[" + sffg + "PgUp/PgDn" + hfg + "]  "
-	+ hfg + "HOME" + sffg + "/" + hfg + "END  "
-	+ hfg + "R" + sffg + "eply  "
-	+ hfg + "P" + sffg + "revious  "
-	+ hfg + "N" + sffg + "ext  "
-	+ hfg + "DEL" + sffg + "ete  "
-	+ hfg + "Q" + sffg + "uit"
-);
+var messages, tree, frame, titleFrame, columnFrame, treeFrame, helpFrame,
+	messageFrame, headerFrame, bodyFrame, messageBar, promptFrame,
+	promptSubFrame;
 
+var headerTextWidth = console.screen_columns - 9;
 var msgNumberWidth = 9;
 var dateWidth = 17;
 var subjectWidth = Math.round(((console.screen_columns - 2) - (msgNumberWidth + dateWidth)) / 2);
 var nameWidth = Math.round(subjectWidth / 2);
-while(msgNumberWidth + dateWidth + subjectWidth + nameWidth > (console.screen_columns - 2)) {
+while(msgNumberWidth + dateWidth + subjectWidth + nameWidth > (console.screen_columns - 2))
 	subjectWidth = subjectWidth - 1;
-}
 
-columnFrame.putmsg(
-	format(
-		"%-9s%-" + nameWidth + "s%-" + nameWidth + "s%-" + subjectWidth + "s%s",
-		"Msg #",
-		"From",
-		"To",
-		"Subject",
-		"Date"
-	)
-);
-function formatItem(messageNumber, from, to, subject, wwt) {
+var formatItem = function(messageNumber, from, to, subject, wwt) {
 	var retval = 
 		format(
 			"%-8s%-" + nameWidth + "s%-" + nameWidth + "s%-" + subjectWidth + "s%s",
@@ -111,47 +53,33 @@ function formatItem(messageNumber, from, to, subject, wwt) {
 	return retval;
 }
 
-function getFlatList() {
-	var header = null;
+var getFlatList = function(code) {
+	var msgBase = new MsgBase(code);
+	var header;
 	var item;
-	if(!mail)
-		var mb = msgBase;
-	else
-		var mb = new MsgBase('mail');
 	try {
-		mb.open();
-		if(maxMessages == 0)
-			var start = mb.first_msg;
-		else
-			var start = mb.last_msg - maxMessages;
-		for(var m = start; m <= mb.last_msg; m++) {
-			header = mb.get_msg_header(m);
+		msgBase.open();
+		var start = (maxMessages == 0) ? msgBase.first_msg : msgBase.last_msg - maxMessages;
+		for(var m = start; m <= msgBase.last_msg; m++) {
+			header = msgBase.get_msg_header(m);
 			if(
-				header === null
-				||
-				header.attr&MSG_DELETE
+				header === null || header.attr&MSG_DELETE
 				||
-				(mail
-					&&
-					header.to != user.alias
-					&&
-					header.to != user.name
-					&&
-					header.to_ext != user.number
-				)
-			)
+				(!msgBase.hasOwnProperty('cfg') && header.to != user.alias && header.to != user.name && header.to_ext != user.number)
+			) {
 				continue;
+			}
 			messages.push(header);
 		}
-		mb.close();
+		msgBase.close();
 		if(reverseThreads)
 			messages.reverse();
 		for(var m = 0; m < messages.length; m++) {
-			item = formatItem(messages[m].number, messages[m].from, messages[m].to, messages[m].subject, messages[m].when_written_time);;
-			var i = tree.addItem(item, showMessage, messages[m], mail);
-			if(!mail && messages[messages.length - 1].number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr)
+			item = formatItem(messages[m].number, messages[m].from, messages[m].to, messages[m].subject, messages[m].when_written_time);
+			var i = tree.addItem(item, showMessage, messages[m], code);
+			if(code != "mail" && messages[messages.length - 1].number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr)
 				i.attr = urm;
-			else if(mail && !(messages[messages.length - 1].attr&MSG_READ))
+			else if(code == "mail" && !(messages[messages.length - 1].attr&MSG_READ))
 				i.attr = urm;
 		}
 	} catch(err) {
@@ -161,24 +89,17 @@ function getFlatList() {
 	tree.cycle();
 }
 
-function getThreadedList() {
-	if(!mail) {
-		var threads = getMessageThreads(msgBase.cfg.code, maxMessages);
-		var mb = msgBase;
-	} else {
-		var threads = getMessageThreads('mail', maxMessages);
-		var mb = new MsgBase('mail');
-	}
+var getThreadedList = function(code) {
+	var threads = getMessageThreads(code);
+	var msgBase = new MsgBase(code);
 	var item;
-	for(var t in ((!reverseThreads)?threads.thread:threads.order)) {
-		if(!reverseThreads)
-			var theThread = threads.thread[t];
-		else
-			var theThread = threads.thread[threads.order[t]];
-		if(theThread.messages.length < 2) {
-			mb.open();
-			var header = mb.get_msg_header(theThread.messages[0].number);
-			mb.close();
+	
+	try {
+		for(var t in ((!reverseThreads)?threads.thread:threads.order)) {
+			var theThread = (reverseThreads)?threads.thread[threads.order[t]]:threads.thread[t];
+			msgBase.open();
+			var header = msgBase.get_msg_header(theThread.messages[0].number);
+			msgBase.close();
 			messages.push(header);
 			item = formatItem(
 				theThread.messages[0].number,
@@ -187,50 +108,56 @@ function getThreadedList() {
 				theThread.messages[0].subject,
 				theThread.messages[0].when_written_time
 			);
-			var i = tree.addItem(item, showMessage, messages[messages.length - 1], mail);
-			if(!mail && messages[messages.length - 1].number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr)
-				i.attr = urm;
-			else if(mail && !(messages[messages.length - 1].attr&MSG_READ))
-				i.attr = urm;
-			continue;
-		}
-		item = formatItem(
-			theThread.messages[0].number,
-			theThread.messages[0].from,
-			theThread.messages[0].to,
-			theThread.messages[0].subject,
-			theThread.newest
-		);
-		st = tree.addTree(item);
-		var mm = (reverseMessages) ? theThread.messages.length - 1 : 0;
-		for(var m = 0; m < theThread.messages.length; m++) {
-			mb.open();
-			var header = mb.get_msg_header(theThread.messages[mm].number);
-			mb.close();
-			messages.push(header);
-			item = formatItem(
-				theThread.messages[mm].number,
-				theThread.messages[mm].from,
-				theThread.messages[mm].to,
-				theThread.messages[mm].subject,
-				theThread.messages[mm].when_written_time
-			);
-			var i = st.addItem(item, showMessage, messages[messages.length - 1], mail);
-			if(!mail && messages[messages.length - 1].number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr) {
+			
+			if(theThread.messages.length == 1)
+				var i = tree.addItem(item, showMessage, messages[messages.length - 1], code);
+			else
+				var i = tree.addTree(item);
+				
+			if(msgBase.hasOwnProperty('cfg') && messages[messages.length - 1].number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr)
 				i.attr = urm;
-				st.attr = urm;
-			} else if(mail && messages[messages.length - 1].attr&MSG_READ == 0) {
+			else if(!msgBase.hasOwnProperty('cfg') && !(messages[messages.length - 1].attr&MSG_READ))
 				i.attr = urm;
-				st.attr = urm;
+			
+			if(theThread.messages.length == 1)
+				continue;
+			
+			var mm = (reverseMessages) ? theThread.messages.length - 1 : 0;
+			for(var m = 0; m < theThread.messages.length; m++) {
+				msgBase.open();
+				var header = msgBase.get_msg_header(theThread.messages[mm].number);
+				msgBase.close();
+				messages.push(header);
+				item = formatItem(
+					theThread.messages[mm].number,
+					theThread.messages[mm].from,
+					theThread.messages[mm].to,
+					theThread.messages[mm].subject,
+					theThread.messages[mm].when_written_time
+				);
+				var ii = i.addItem(item, showMessage, messages[messages.length - 1], code);
+				if(!msgBase.hasOwnProperty('cfg') && messages[messages.length - 1].number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr) {
+					ii.attr = urm;
+					i.attr = urm;
+				} else if(msgBase.hasOwnProperty('cfg') && messages[messages.length - 1].attr&MSG_READ == 0) {
+					ii.attr = urm;
+					i.attr = urm;
+				}
+				mm = (reverseMessages) ? mm - 1 : mm + 1;
 			}
-			mm = (reverseMessages) ? mm - 1 : mm + 1;
 		}
+		tree.open();
+		tree.cycle();
+	} catch(err) {
+		log(LOG_DEBUG, err);
 	}
-	tree.open();
-	tree.cycle();
 }
 
-function getList() {
+var getList = function(code) {
+	if(tree.status&1) {
+		tree.close();
+		treeFrame.clear();
+	}
 	tree = new Tree(treeFrame);
 	tree.colors.lbg = lbg;
 	tree.colors.lfg = lfg;
@@ -238,7 +165,8 @@ function getList() {
 	tree.colors.xfg = xfg;
 	tree.colors.tfg = tfg;
 	messages = [];
-	if(!mail) {
+	var msgBase = new MsgBase(code);
+	if(msgBase.hasOwnProperty('cfg')) {
 		var mg = msgBase.cfg.grp_name;
 		var ms = msgBase.cfg.name;
 	} else {	
@@ -249,44 +177,89 @@ function getList() {
 	titleFrame.putmsg(hfg + "Message Group: " + sffg + mg);
 	titleFrame.crlf();
 	titleFrame.putmsg(hfg + "    Sub Board: " + sffg + ms);
-	if(threaded)
-		getThreadedList();
+	(threaded) ? getThreadedList(code) : getFlatList(code);
+}
+
+var deleteMessage = function(header, code) {
+	var ret = false;
+	var msgBase = new MsgBase(code);
+	msgBase.open();
+	if(
+		((msgBase.hasOwnProperty('cfg') && msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].is_operator)
+		||
+		(!msgBase.hasOwnProperty('cfg')))
+		&&
+		prompt("Delete message #" + header.number)
+	)
+		{
+			msgBase.remove_msg(header.number);
+		}
+	msgBase.close();
+	return;
+}
+
+var sendEmail = function() {
+	var ret = true;
+	console.putmsg(hfg + "Send email to: ");
+	var to = console.getstr('', 64, K_LINE);
+	if(to == "")
+		ret = false;
+	else if(system.matchuser(to) > 0)
+		bbs.email(system.matchuser(to, WM_EMAIL));
+	else if(netaddr_type(to) != NET_NONE)
+		bbs.netmail(to, WM_NETMAIL)
 	else
-		getFlatList(false);
+		ret = false;
+	if(!ret) {
+		console.putmsg(hfg + "Invalid user or netmail/email address.");
+		console.crlf();
+		console.pause();
+	}
 }
 
-function showMessage(header, mail) {
+var prompt = function(str) {
+	promptFrame.top();
+	promptSubFrame.clear();
+	frame.cycle();
+	console.gotoxy(promptSubFrame.x, promptSubFrame.y + 1);
+	var ret = console.yesno(str);
+	promptFrame.bottom();
+	frame.invalidate();
+	return ret;
+}
+
+var showMessage = function(header, code) {
 	var retval = "REFRESH";
-	var userInput = "";
-	var h = null;
+	var userInput = false;
 	var n = header.number;
-	currentMessage = messages.indexOf(header);
+	var currentMessage = messages.indexOf(header);
+
+	messageFrame.open();
 	messageFrame.top();
-	if(!mail) {
-		mb = msgBase;
-		if(setPointers && header.number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr)
-			msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr = header.number;
-		mb.open();
-	} else {
-		mb = new MsgBase('mail');
-		mb.open();
+	var msgBase = new MsgBase(code);
+	msgBase.open();
+	if(setPointers && msgBase.hasOwnProperty('cfg') && header.number > msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr) {
+		msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].scan_ptr = header.number;
+	} else if(setPointers && !msgBase.hasOwnProperty('cfg')) {
 		header.attr|=MSG_READ;
-		mb.put_msg_header(header.number, header);
+		msgBase.put_msg_header(header.number, header);
 	}
-	var body = mb.get_msg_body(header.number);
-	mb.close();
+	var body = msgBase.get_msg_body(header.number);
+	msgBase.close();
+
 	headerFrame.putmsg(
-		hfg + format("%15s", "Subject: ") + sffg + header.subject.substr(0, console.screen_columns - 9)
-		+ "\r\n" +
-		hfg + format("%15s", "From: ") + sffg + header.from.substr(0, console.screen_columns - 9)
-		+ "\r\n" +
-		hfg + format("%15s", "To: ") + sffg + header.to.substr(0, console.screen_columns - 9)
-		+ "\r\n" +
-		hfg + format("%15s", "Date: ") + sffg + system.timestr(header.when_written_time)
+		format(
+			hfg + "%14s " + sffg + header.subject.substr(0, headerTextWidth) + "\r\n"
+			+ hfg + "%14s " + sffg + header.from.substr(0, headerTextWidth) + "\r\n"
+			+ hfg + "%14s " + sffg + header.to.substr(0, headerTextWidth) + "\r\n"
+			+ hfg + "%14s " + sffg + system.timestr(header.when_written_time),
+			"Subject:", "From:", "To:", "Date:"
+		)
 	);
 	bodyFrame.scrollTo(0, 0);
 	bodyFrame.putmsg(mfg + word_wrap(body));
 	bodyFrame.scrollTo(0, 0);
+
 	while(userInput != "Q") {
 		if(frame.cycle())
 			console.gotoxy(console.screen_columns, console.screen_rows);
@@ -299,20 +272,16 @@ function showMessage(header, mail) {
 				f.close();
 				frame.invalidate();
 				console.clear();
-				try {
-					if(!mail)
-						bbs.post_msg(mb.cfg.code, WM_QUOTE, header);
-					else if(mail && header.from_net_type == NET_NONE)
-						bbs.email(parseInt(header.from_ext), WM_EMAIL|WM_QUOTE, "", header.subject);
-					else if(mail)
-						bbs.netmail(header.from_net_addr, WM_NETMAIL|WM_QUOTE, header.subject);
-				} catch(err) {
-					log(LOG_ERR, err);
-				}
+				if(msgBase.hasOwnProperty('cfg'))
+					bbs.post_msg(msgBase.cfg.code, WM_QUOTE, header);
+				else if(!msgBase.hasOwnProperty('cfg') && header.from_net_type == NET_NONE)
+					bbs.email(parseInt(header.from_ext), WM_EMAIL|WM_QUOTE, "", header.subject);
+				else if(!msgBase.hasOwnProperty('cfg'))
+					bbs.netmail(header.from_net_addr, WM_NETMAIL|WM_QUOTE, header.subject);
 				frame.draw();
 				retval = header;
 				userInput = "Q";
-				getList();
+				getList((msgBase.hasOwnProperty('cfg'))?msgBase.cfg.code:"mail");
 				break;
 			case "P":
 				if(!threaded && currentMessage < (messages.length - 1)) {
@@ -366,11 +335,9 @@ function showMessage(header, mail) {
 					bodyFrame.scroll(0, bodyFrame.height);
 				break;
 			case KEY_DEL:
-				if(deleteMessage(header)) {
+				if(deleteMessage(header, code)) {
 					userInput = "Q";
 					retval = "REFRESH";
-				} else {
-					frame.cycle();
 				}
 				break;
 			default:
@@ -380,123 +347,125 @@ function showMessage(header, mail) {
 	messageFrame.clear();
 	headerFrame.clear();
 	bodyFrame.clear();
-	if(!retval.hasOwnProperty("number"))
-		messageFrame.bottom();
-	else if(mail)
-		retval.mail = true;
+	if(retval == "REFRESH")
+		messageFrame.close();
 	return retval;
 }
 
-function deleteMessage(header) {
-	var ret = false;
-	if(!mail && msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].is_operator) {
-		if(prompt("Delete message #" + header.number)) {
-			msgBase.open();
-			msgBase.remove_msg(header.number);
-			msgBase.close();
-			ret = true;
-		}
-	} else if(mail && prompt("Delete this message")) {
-		var mailBase = new MsgBase("mail");
-		mailBase.open();
-		mailBase.remove_msg(header.number);
-		mailBase.close();
-		ret = true;
-	}
-	return ret;
-}
+var init = function() {
+	frame = new Frame(1, 1, console.screen_columns, console.screen_rows, BG_BLACK|WHITE);
+	titleFrame = new Frame(1, 1, console.screen_columns, 2, fbg|WHITE, frame);
+	columnFrame = new Frame(1, 3, console.screen_columns, 1, fbg|WHITE, frame);
+	treeFrame = new Frame(1, 4, console.screen_columns, console.screen_rows - 4, BG_BLACK|WHITE, frame);
+	helpFrame = new Frame(1, console.screen_rows, console.screen_columns, 1, fbg|WHITE, frame);
+	messageFrame = new Frame(1, 3, console.screen_columns, console.screen_rows - 3, BG_BLACK|WHITE, frame);
+	headerFrame = new Frame(1, 3, console.screen_columns, 4, fbg|WHITE, messageFrame);
+	bodyFrame = new Frame(1, 7, console.screen_columns, console.screen_rows - 7, BG_BLACK|WHITE, messageFrame);
+	messageBar = new Frame(1, console.screen_rows, console.screen_columns, 1, fbg|WHITE, messageFrame);
+	promptFrame = new Frame(20, Math.round(console.screen_rows / 2) - 3, console.screen_columns - 40, 6, fbg|WHITE, frame);
+	promptSubFrame = new Frame(22, promptFrame.y + 1, promptFrame.width - 4, 4, BG_BLACK|WHITE, promptFrame);
 
-function sendEmail() {
-	var ret = true;
-	console.putmsg(hfg + "Send email to: ");
-	var to = console.getstr('', 64, K_LINE);
-	if(to == "")
-		ret = false;
-	else if(system.matchuser(to) > 0)
-		bbs.email(system.matchuser(to, WM_EMAIL));
-	else if(netaddr_type(to) != NET_NONE)
-		bbs.netmail(to, WM_NETMAIL)
-	else
-		ret = false;
-	if(!ret) {
-		console.putmsg(hfg + "Invalid user or netmail/email address.");
-		console.crlf();
-		console.pause();
-	}
-}
+	tree = new Tree(treeFrame);
+	
+	helpFrame.center(
+		hfg + "UP" + sffg + "/" + hfg + "DN  "
+		+ hfg + "[" + sffg + "PgUp/PgDn" + hfg + "]  "
+		+ hfg + "HOME" + sffg + "/" + hfg + "END  "
+		+ hfg + "T" + sffg + "hreaded  "
+		+ hfg + "F" + sffg + "lat  "
+		+ hfg + "A" + sffg + "rea  "
+		+ hfg + "E" + sffg + "mail  "
+		+ hfg + "P" + sffg + "ost  "
+		+ hfg + "DEL" + sffg + "ete  "
+		+ hfg + "Q" + sffg + "uit"
+	);
 
-function prompt(str) {
-	promptFrame.top();
-	promptSubFrame.clear();
-	frame.cycle();
-	console.gotoxy(promptSubFrame.x, promptSubFrame.y + 1);
-	var ret = console.yesno(str);
+	messageBar.center(
+		hfg + "UP" + sffg + "/" + hfg + "DN  "
+		+ hfg + "[" + sffg + "PgUp/PgDn" + hfg + "]  "
+		+ hfg + "HOME" + sffg + "/" + hfg + "END  "
+		+ hfg + "R" + sffg + "eply  "
+		+ hfg + "P" + sffg + "revious  "
+		+ hfg + "N" + sffg + "ext  "
+		+ hfg + "DEL" + sffg + "ete  "
+		+ hfg + "Q" + sffg + "uit"
+	);
+
+	columnFrame.putmsg(
+		format(
+			"%-9s%-" + nameWidth + "s%-" + nameWidth + "s%-" + subjectWidth + "s%s",
+			"Msg #", "From", "To", "Subject", "Date"
+		)
+	);
+	frame.open();
+	messageFrame.bottom();
+	headerFrame.bottom();
 	promptFrame.bottom();
-	frame.invalidate();
-	return ret;
+	getList(msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].code);
 }
 
-getList();
-var userInput = "";
-var r = "";
-while(userInput != "Q") {
-	switch(userInput) {
-		case "T":
-			tree.close();
-			treeFrame.clear();
-			threaded = true;
-			getList();
-			break;
-		case "F":
-			tree.close();
-			treeFrame.clear();
-			threaded = false;
-			getList();
-			break;
-		case "A":
-			messageAreaSelector(4, 5, console.screen_columns - 6, console.screen_rows - 8, frame, showMail);
-			msgBase = new MsgBase(msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].code);
-			mail = false;
-			getList();
-			break;
-		case "P":
-			frame.invalidate();
-			console.clear();
-			if(!mail)
-				bbs.post_msg(msgBase.cfg.code);
-			else
-				sendEmail();
-			getList();
-			frame.draw();
-			break;
-		case "E":
-			mail = true;
-			getList();
-			break;
-		case KEY_DEL:
-			if(!(tree.currentItem instanceof Tree)) {
-				if(deleteMessage(tree.currentItem.args[0])) {
+var cleanUp = function() {
+	tree.close();
+	frame.close();
+	frame.delete();
+	console.clear();
+}
+
+var main = function() {
+
+	var userInput;
+	var r;
+	var cursub = msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].code;
+
+	while(userInput != "Q") {
+
+		if(frame.cycle())
+			console.gotoxy(console.screen_columns, console.screen_rows);
+
+		userInput = console.inkey(K_NONE, 5).toUpperCase();
+		switch(userInput) {
+			case "T":
+				threaded = true;
+				break;
+			case "F":
+				threaded = false;
+				break;
+			case "A":
+				messageAreaSelector(4, 5, console.screen_columns - 6, console.screen_rows - 8, frame);
+				cursub = msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].code;
+				break;
+			case "P":
+				frame.invalidate();
+				console.clear();
+				(cursub == "mail")?sendEmail():bbs.post_msg(cursub);
+				frame.draw();
+				break;
+			case "E":
+				cursub = "mail";
+				break;
+			case KEY_DEL:
+				if(!(tree.currentItem instanceof Tree) && deleteMessage(tree.currentItem.args[0], cursub)) {
 					tree.currentTree.deleteItem();
-					getList();
+					getList(cursub);
 				}
-			}
-			break;
-		default:
-			if(tree.current === undefined)
 				break;
-			r = tree.getcmd(userInput);
-			if(r == "REFRESH")
-				getList();
-			while(r.hasOwnProperty("number")) {
-				frame.cycle();
-				if(r.hasOwnProperty('mail') && r.mail)
-					r = showMessage(r, true);
-				else
-					r = showMessage(r);
-			}
-			break;
+			default:
+				if(tree.current === undefined)
+					break;
+				r = tree.getcmd(userInput);
+				if(r != "REFRESH" && !r.hasOwnProperty("number"))
+					continue;
+				while(r.hasOwnProperty("number")) {
+					frame.cycle();
+					r = showMessage(r, cursub);
+				}
+				break;
+		}
+		getList(cursub);
 	}
-	userInput = console.inkey(K_NONE, 5).toUpperCase();
-	if(frame.cycle())
-		console.gotoxy(console.screen_columns, console.screen_rows);
-}
\ No newline at end of file
+}
+
+init();
+main();
+cleanUp();
+exit();
\ No newline at end of file
-- 
GitLab