diff --git a/web/lib/template.ssjs b/web/lib/template.ssjs
index 7a23844182e25d13ee7cdc7e53f05525c68a9063..f0e676b53023b13766fed2b9a228cf147fdff099 100644
--- a/web/lib/template.ssjs
+++ b/web/lib/template.ssjs
@@ -1,138 +1,142 @@
 /*****************************************************************************/
-/* SSJS templating library													 */
-/* %%name%% is replaced with the HTML encoded value of template.name		 */
-/* ^^name^^ is replaced with the URI encoded value of template.name			 */
-/* @@name@@ is replaced with the value if template.name						 */
-/* 																			 */
-/* @@name:sname@@ is replaced with the value of template.name.sname			 */
-/* (^^ and %% are also supported)											 */
-/* 																			 */
-/* @@JS:js_expression@@ is replaced with the return value of js_expression 	 */
-/* (^^ and %% are also supported)											 */
-/* 																			 */
-/* <<REPEAT name>>															 */
-/* ... @@name:sname@@ ...													 */
-/* <<END REPEAT name>>														 */
-/* 																			 */
+/* SSJS templating library                                                   */
+/* %%name%% is replaced with the HTML encoded value of template.name         */
+/* ^^name^^ is replaced with the URI encoded value of template.name          */
+/* @@name@@ is replaced with the value if template.name                      */
+/*                                                                           */
+/* @@name:sname@@ is replaced with the value of template.name.sname          */
+/* (^^ and %% are also supported)                                            */
+/*                                                                           */
+/* @@JS:js_expression@@ is replaced with the return value of js_expression   */
+/* (^^ and %% are also supported)                                            */
+/*                                                                           */
+/* <<REPEAT name>>                                                           */
+/* ... @@name:sname@@ ...                                                    */
+/* <<END REPEAT name>>                                                       */
+/*                                                                           */
 /* Iterates over the array/object template.name and replaces name:sname with */
-/* the value of template.name.sname.										 */
-/* (^^ and %% are also supported)											 */
-/*																			 */
+/* the value of template.name.sname.                                         */
+/* (^^ and %% are also supported)                                            */
+/*                                                                           */
 /*****************************************************************************/
 
 /* $Id$ */
 
 template=new Object;
-load("sbbsdefs.js");	// UFLAG_G
+load("sbbsdefs.js");    // UFLAG_G
 load("../web/lib/html_themes.ssjs");
+if(http_request.virtual_path=="/nodelist.ssjs")
+    load("../web/lib/main_nodelist.ssjs"); // Who's Online Listing
+    
 load("../web/lib/leftnav_nodelist.ssjs"); // Left Side Navigation Node Listing
+
 template.Theme_CSS_File=Themes[CurrTheme].css;
 
 function write_template(filename)  {
-	var fname='../web/templates/'+Themes[CurrTheme].dir+'/'+filename;
-	if(!file_exists(fname)) {
-		fname='../web/templates/'+Themes[DefaultTheme].dir+'/'+filename;
-		if(!file_exists(fname))
-			fname='../web/templates/'+Themes["Default"].dir+'/'+filename;
-	}
-	var inc=new File(fname);
-	if(!inc.open("r",true,1024)) {
-		horrible_error("!Error " + inc.error + " opening template file: "+ fname);
-	}
-	var file='';
-	while(! inc.eof)  {
-		file=file += inc.read(1024);
-	}
-	inc.close();
-	file=file.replace(/<<REPEAT (.*?)>>([\x00-\xff]*?)<<END REPEAT \1>>/g,
-		function(matched, objname, bit, offset, s) {
-			var ret='';
-			for(obj in template[objname]) {
-				ret += parse_regular_bit(bit, objname, template[objname][obj]);
-			}
-			return(ret);
-		});
-	file=parse_regular_bit(file, "", template);
-	file=file.replace(/\<\!-- Magical Synchronet ([\^%@])-code --\>/g,'$1');
-	write(file);
+    var fname='../web/templates/'+Themes[CurrTheme].dir+'/'+filename;
+    if(!file_exists(fname)) {
+        fname='../web/templates/'+Themes[DefaultTheme].dir+'/'+filename;
+        if(!file_exists(fname))
+            fname='../web/templates/'+Themes["Default"].dir+'/'+filename;
+    }
+    var inc=new File(fname);
+    if(!inc.open("r",true,1024)) {
+        horrible_error("!Error " + inc.error + " opening template file: "+ fname);
+    }
+    var file='';
+    while(! inc.eof)  {
+        file=file += inc.read(1024);
+    }
+    inc.close();
+    file=file.replace(/<<REPEAT (.*?)>>([\x00-\xff]*?)<<END REPEAT \1>>/g,
+        function(matched, objname, bit, offset, s) {
+            var ret='';
+            for(obj in template[objname]) {
+                ret += parse_regular_bit(bit, objname, template[objname][obj]);
+            }
+            return(ret);
+        });
+    file=parse_regular_bit(file, "", template);
+    file=file.replace(/\<\!-- Magical Synchronet ([\^%@])-code --\>/g,'$1');
+    write(file);
 }
 
 function parse_regular_bit(bit, objname, obj) {
-	if(objname=="JS")
-		return(bit);
-	if(objname=='') {
-		bit=bit.replace(/([%^@])\1([^^%@\r\n]*?)\:([^:%^@\r\n]*?)\1\1/g,
-			function (matched, start, objname, prop, offset, s) {
-				var res=matched;
-				if(template[objname]!=undefined)
-					res=escape_match(start, template[objname][prop]);
-				return(res);
-			});
-		bit=bit.replace(/([%^@])\1([^:^%@\r\n]*?)\1\1/g,
-			function (matched, start, exp, offset, s) {
-				var res=escape_match(start, template[exp]);
-				return(res);
-			});
-		bit=bit.replace(/([%^@])\1JS:([\x00-\xff]*?)\1\1/g,
-			function (matched, start, exp, offset, s) {
-				var res=escape_match(start, eval(exp));
-				return(res);
-			});
-		bit=bit.replace(/([%^@])\1(.*?)\1\1/g,'');
-	}
-	else {
-		bit=bit.replace(new RegExp('([%^@])\\1'+regex_escape(objname)+':([^^%@\r\n]*?)\\1\\1',"g"),
-			function (matched, start, exp, offset, s) {
-				var res=matched;
-				if(obj[exp]!=undefined)
-					res=escape_match(start, obj[exp]);
-				return(res);
-			});
-	}
-	return bit;
+    if(objname=="JS")
+        return(bit);
+    if(objname=='') {
+        bit=bit.replace(/([%^@])\1([^^%@\r\n]*?)\:([^:%^@\r\n]*?)\1\1/g,
+            function (matched, start, objname, prop, offset, s) {
+                var res=matched;
+                if(template[objname]!=undefined)
+                    res=escape_match(start, template[objname][prop]);
+                return(res);
+            });
+        bit=bit.replace(/([%^@])\1([^:^%@\r\n]*?)\1\1/g,
+            function (matched, start, exp, offset, s) {
+                var res=escape_match(start, template[exp]);
+                return(res);
+            });
+        bit=bit.replace(/([%^@])\1JS:([\x00-\xff]*?)\1\1/g,
+            function (matched, start, exp, offset, s) {
+                var res=escape_match(start, eval(exp));
+                return(res);
+            });
+        bit=bit.replace(/([%^@])\1(.*?)\1\1/g,'');
+    }
+    else {
+        bit=bit.replace(new RegExp('([%^@])\\1'+regex_escape(objname)+':([^^%@\r\n]*?)\\1\\1',"g"),
+            function (matched, start, exp, offset, s) {
+                var res=matched;
+                if(obj[exp]!=undefined)
+                    res=escape_match(start, obj[exp]);
+                return(res);
+            });
+    }
+    return bit;
 }
 
 function escape_match(start, exp, end)  {
-	if(exp==undefined)
-		exp='';
-	exp=exp.toString();
-	if(start=="%")
-		exp=html_encode(exp,false,false,false,false);
-	if(start=="^")
-		exp=encodeURIComponent(exp);
-	exp=exp.replace(/\@/g,'<!-- Magical Synchronet @-code -->');
-	exp=exp.replace(/\^/g,'<!-- Magical Synchronet ^-code -->');
-	exp=exp.replace(/\%/g,'<!-- Magical Synchronet %-code -->');
-	return(exp);
+    if(exp==undefined)
+        exp='';
+    exp=exp.toString();
+    if(start=="%")
+        exp=html_encode(exp,false,false,false,false);
+    if(start=="^")
+        exp=encodeURIComponent(exp);
+    exp=exp.replace(/\@/g,'<!-- Magical Synchronet @-code -->');
+    exp=exp.replace(/\^/g,'<!-- Magical Synchronet ^-code -->');
+    exp=exp.replace(/\%/g,'<!-- Magical Synchronet %-code -->');
+    return(exp);
 }
 
 function error(message)  {
-	template.title="Error";
-	template.err=message;
-	write_template("header.inc");
-	write_template("error.inc");
-	write_template("footer.inc");
-	exit();
+    template.title="Error";
+    template.err=message;
+    write_template("header.inc");
+    write_template("error.inc");
+    write_template("footer.inc");
+    exit();
 }
 
 function horrible_error(message) {
-	write("<html><head><title>ERROR</title></head><body><p>"+message+"</p></body></html>");
+    write("<html><head><title>ERROR</title></head><body><p>"+message+"</p></body></html>");
     exit();
 }
 
 function regex_escape(str)
 {
-	str=str.replace(/([\\\^\$\*\+\?\.\(\)\{\}\[\]])/g,"\\$1");
-	return(str);
+    str=str.replace(/([\\\^\$\*\+\?\.\(\)\{\}\[\]])/g,"\\$1");
+    return(str);
 }
 
 if(user.number==0)
-	template.user_greeting="Welcome, Guest.";
+    template.user_greeting="Welcome, Guest.";
 else
-	if(!(user.security.restrictions&UFLAG_G))
-		template.user_greeting="Welcome, "+user.alias+ ".<br /> You last visited on " +strftime("%A, %B %d, %Y",user.stats.laston_date);
-	else
-		template.user_greeting="Welcome, "+user.alias+ ".";
+    if(!(user.security.restrictions&UFLAG_G))
+        template.user_greeting="Welcome, "+user.alias+ ".<br /> You last visited on " +strftime("%A, %B %d, %Y",user.stats.laston_date);
+    else
+        template.user_greeting="Welcome, "+user.alias+ ".";
 
 /* FTP link */