diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index a19659aa8175b7896d619327cb00b265185c8e86..85531bd6c8791cc273c440451f794fe0a56bbebb 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -98,7 +98,7 @@ js_format(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 			if (!str)
 			    return JS_FALSE;
 			arglist[i-1]=JS_GetStringBytes(str);
-		} else if(JSVAL_IS_INT(argv[i]))
+		} else if(JSVAL_IS_INT(argv[i]) || JSVAL_IS_BOOLEAN(argv[i]))
 			arglist[i-1]=(char *)JSVAL_TO_INT(argv[i]);
 		else
 			arglist[i-1]=NULL;
@@ -127,6 +127,21 @@ js_mswait(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	return(JS_TRUE);
 }
 
+static JSBool
+js_random(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	*rval = INT_TO_JSVAL(sbbs_random(JSVAL_TO_INT(argv[0])));
+	return(JS_TRUE);
+}
+
+static JSBool
+js_time(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	*rval = INT_TO_JSVAL(time(NULL));
+	return(JS_TRUE);
+}
+
+
 static JSBool
 js_beep(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
@@ -149,6 +164,108 @@ js_exit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	return(JS_FALSE);
 }
 
+static JSBool
+js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	char*		str;
+	JSString*	js_str;
+
+	if((js_str=JS_ValueToString(cx, argv[0]))==NULL) 
+		return(JS_FALSE);
+
+	if((str=JS_GetStringBytes(js_str))==NULL) 
+		return(JS_FALSE);
+
+	*rval = INT_TO_JSVAL(crc16(str));
+	return(JS_TRUE);
+}
+
+static JSBool
+js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	char*		str;
+	JSString*	js_str;
+
+	if((js_str=JS_ValueToString(cx, argv[0]))==NULL) 
+		return(JS_FALSE);
+
+	if((str=JS_GetStringBytes(js_str))==NULL) 
+		return(JS_FALSE);
+
+	*rval = INT_TO_JSVAL(crc32(str,strlen(str)));
+	return(JS_TRUE);
+}
+
+static JSBool
+js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	ulong		sum=0;
+	char*		p;
+	JSString*	js_str;
+
+	if((js_str=JS_ValueToString(cx, argv[0]))==NULL) 
+		return(JS_FALSE);
+
+	if((p=JS_GetStringBytes(js_str))==NULL) 
+		return(JS_FALSE);
+
+	while(*p) sum+=*(p++);
+
+	*rval = INT_TO_JSVAL(sum);
+	return(JS_TRUE);
+}
+
+static JSBool
+js_ascii(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	char*		p;
+	char		str[2];
+	JSString*	js_str;
+
+	if(JSVAL_IS_STRING(argv[0])) {	/* string to ascii-int */
+		if((js_str=JS_ValueToString(cx, argv[0]))==NULL) 
+			return(JS_FALSE);
+
+		if((p=JS_GetStringBytes(js_str))==NULL) 
+			return(JS_FALSE);
+
+		*rval = INT_TO_JSVAL(*p);
+		return(JS_TRUE);
+	}
+
+	/* ascii-int to str */
+	str[0]=(uchar)JSVAL_TO_INT(argv[0]);
+	str[1]=0;
+
+	js_str = JS_NewStringCopyZ(cx, str);
+
+	*rval = STRING_TO_JSVAL(js_str);
+
+	return(JS_TRUE);
+}
+
+static JSBool
+js_strip_ctrl(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	ulong		sum=0;
+	char*		p;
+	JSString*	js_str;
+
+	if((js_str=JS_ValueToString(cx, argv[0]))==NULL) 
+		return(JS_FALSE);
+
+	if((p=JS_GetStringBytes(js_str))==NULL) 
+		return(JS_FALSE);
+
+	strip_ctrl(p);
+
+	js_str = JS_NewStringCopyZ(cx, p);
+
+	*rval = STRING_TO_JSVAL(js_str);
+
+	return(JS_TRUE);
+}
+
 static JSClass js_global_class ={
         "Global",
 		JSCLASS_HAS_PRIVATE, /* needed for scfg_t ptr */
@@ -162,7 +279,14 @@ static JSFunctionSpec js_global_functions[] = {
 	{"format",			js_format,			1},		/* return a formatted string (ala printf) */
 	{"mswait",			js_mswait,			0},		/* millisecond wait/sleep routine */
 	{"sleep",			js_mswait,			0},		/* millisecond wait/sleep routine */
+	{"random",			js_random,			1},		/* return random int between 0 and n */
+	{"time",			js_time,			0},		/* return time in Unix format */
 	{"beep",			js_beep,			0},		/* local beep (freq, dur) */
+	{"crc16",			js_crc16,			1},		/* calculate 16-bit CRC of string */
+	{"crc32",			js_crc32,			1},		/* calculate 32-bit CRC of string */
+	{"chksum",			js_chksum,			1},		/* calculate 32-bit chksum of string */
+	{"ascii",			js_ascii,			1},		/* convert str to ascii-val or vice-versa */
+	{"strip_ctrl",		js_strip_ctrl,		1},		/* strip ctrl chars from string */
 	{0}
 };