diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index 9346aaab11ee708b6dcd3fa7e0746f482dfd0c8e..908641aad171c2ecf2daad80d530c15cb4fc88fa 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -36,6 +36,7 @@
  ****************************************************************************/
 
 #include "sbbs.h"
+#include "md5.h"
 #include "base64.h"
 
 #ifdef JAVASCRIPT
@@ -948,6 +949,38 @@ js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	return(JS_TRUE);
 }
 
+static JSBool
+js_md5_calc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
+{
+	BYTE		digest[MD5_DIGEST_SIZE];
+	JSBool		hex=JS_FALSE;
+	char*		inbuf;
+	char		outbuf[64];
+	JSString*	js_str;
+
+	*rval = JSVAL_NULL;
+
+	if((inbuf=JS_GetStringBytes(JS_ValueToString(cx, argv[0])))==NULL) 
+		return(JS_FALSE);
+
+	if(argc>1 && JSVAL_IS_BOOLEAN(argv[1]))
+		hex=JSVAL_TO_BOOLEAN(argv[1]);
+
+	MD5_calc(digest,inbuf,strlen(inbuf));
+
+	if(hex)
+		MD5_hex(outbuf,digest);
+	else
+		b64_encode(outbuf,sizeof(outbuf),digest,sizeof(digest));
+
+	js_str = JS_NewStringCopyZ(cx, outbuf);
+	if(js_str==NULL)
+		return(JS_FALSE);
+
+	*rval = STRING_TO_JSVAL(js_str);
+	return(JS_TRUE);
+}
+
 static JSBool
 js_truncsp(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
@@ -1250,7 +1283,7 @@ static jsMethodSpec js_global_functions[] = {
 	,JSDOCSTR("calculate and return 32-bit CRC of string")
 	},		
 	{"chksum",			js_chksum,			1,	JSTYPE_NUMBER,	JSDOCSTR("string text")
-	,JSDOCSTR("calculate and return 32-bit chksum of string")
+	,JSDOCSTR("calculate and return 32-bit checksum of string")
 	},
 	{"ctrl",			js_ctrl,			1,	JSTYPE_STRING,	JSDOCSTR("number or string")
 	,JSDOCSTR("return ASCII control character representing character passed - Example: <tt>ctrl('C') returns '\3'</tt>")
@@ -1329,6 +1362,9 @@ static jsMethodSpec js_global_functions[] = {
 	{"base64_decode",	js_b64_decode,		1,	JSTYPE_STRING,	JSDOCSTR("string text")
 	,JSDOCSTR("returns base64-decoded string or <i>null</i> on error")
 	},
+	{"md5_calc",		js_md5_calc,		1,	JSTYPE_STRING,	JSDOCSTR("string text [,bool hex]")
+	,JSDOCSTR("returns MD5 digest of string in base64 (default) or hexadecimal encoding")
+	},
 	{0}
 };