diff --git a/src/sbbs3/js_filebase.c b/src/sbbs3/js_filebase.c
index 6d0b77a0de63025d5309af45858fefed87270dee..d9a8df044f3556152f4e5f8c54e6793d50fd9593 100644
--- a/src/sbbs3/js_filebase.c
+++ b/src/sbbs3/js_filebase.c
@@ -749,6 +749,48 @@ js_get_file_name(JSContext *cx, uintN argc, jsval *arglist)
 	return JS_TRUE;
 }
 
+static JSBool
+js_format_file_name(JSContext *cx, uintN argc, jsval *arglist)
+{
+	jsval*		argv = JS_ARGV(cx, arglist);
+	char*		filepath = NULL;
+	int32		size = 12;
+	bool		pad = false;
+
+	JS_SET_RVAL(cx, arglist, JSVAL_NULL);
+
+ 	if(!js_argc(cx, argc, 1))
+		return JS_FALSE;
+
+	uintN argn = 0;
+	JSVALUE_TO_MSTRING(cx, argv[argn], filepath, NULL);
+	HANDLE_PENDING(cx, filepath);
+	argn++;
+	if(argn < argc && JSVAL_IS_NUMBER(argv[argn])) {
+		JS_ValueToInt32(cx, argv[argn], &size);
+		argn++;
+	}
+	if(argn < argc && JSVAL_IS_BOOLEAN(argv[argn])) {
+		pad = JSVAL_TO_BOOLEAN(argv[argn]);
+		argn++;
+	}
+	if(size < 1) {
+		JS_ReportError(cx, "Invalid size: %d", size);
+		return JS_FALSE;
+	}
+	char* buf = calloc(size + 1, 1);
+	if(buf == NULL) {
+		JS_ReportError(cx, "malloc failure: %d", size + 1);
+		return JS_FALSE;
+	}
+	JSString* js_str;
+	if((js_str = JS_NewStringCopyZ(cx, format_filename(getfname(filepath), buf, size, pad))) != NULL)
+		JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
+	free(buf);
+
+	return JS_TRUE;
+}
+
 static JSBool
 js_get_file_path(JSContext *cx, uintN argc, jsval *arglist)
 {
@@ -1441,6 +1483,11 @@ static jsSyncMethodSpec js_filebase_functions[] = {
 		,JSDOCSTR("dump file metadata to an array of strings for diagnostic uses")
 		,31900
 	},
+	{"format_name",		js_format_file_name,1, JSTYPE_STRING
+		,JSDOCSTR("path/filename [,number size=13] [,boolean pad=false]")
+		,JSDOCSTR("returns formatted (e.g. shortened) version of filename without path (file base does not have to be open) for display")
+		,31900
+	},
 	{0}
 };