diff --git a/CONTROL/control b/CONTROL/control
index f82741c..852869c 100644
--- a/CONTROL/control
+++ b/CONTROL/control
@@ -1,7 +1,7 @@
 Package: webif
 Priority: optional
 Section: web
-Version: 1.4.9-2
+Version: 1.4.9-3
 Architecture: mipsel
 Maintainer: af123@hpkg.tv
 Depends: tcpfix,webif-channelicons(>=1.1.27),lighttpd(>=1.4.39-1),jim(>=0.79),jim-pack(>=0.79),jim-oo(>=0.77),jim-sqlite3(>=0.77),jim-cgi(>=0.7-2),jim-binary(>=0.76),service-control(>=2.3),busybox(>=1.20.2-1),lsof(>=4.87),epg(>=1.2.8),hmt(>=2.0.10),ssmtp,cron-daemon(>=1.18.3-3),at(>=3.1.18),anacron,trm(>=1.1),openssl-command,nicesplice,id3v2,file,rsvsync(>=1.1.13),webif-charts(>=1.2-1),stripts(>=1.4.2),tmenu(>=1.21-2),ffmpeg(>=2.8),id3v2,multienv(>=1.6),tcpping(>=1.1),e2fsprogs,wireless-tools(>=29-1),dbupdate,recmon(>=2.0.7),hwctl,nugget(>=0.98),sqlite3(>=3.15.1),jim-xconv,zip(>=3.0-1),wget
diff --git a/webif/html/browse/script.js b/webif/html/browse/script.js
index d0548be..5269fa0 100755
--- a/webif/html/browse/script.js
+++ b/webif/html/browse/script.js
@@ -10,6 +10,18 @@ var plugins = {
 	dmenu_prepare: {}
 };
 
+// pattern matches directory path prefix
+var pathre = /.*\/|\.[^.]*$/g;
+
+// IDs of size, img elements for folders use RFC4648 s5 encoding of name
+function folderID(folder)
+{
+	return btoa(escape(folder))
+	    .replace(/\+/g, '-')
+	    .replace(/\//g, '_')
+	    .replace(/=/g, '');
+}
+
 function blockpage(msg)
 {
 	if (!msg)
@@ -115,21 +127,11 @@ function epginfo_callback(data, status, xhr)
 function insert_folder_size(folder, size)
 {
 	// folder = folder.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
-	// ID of size element is ID + RFC4648 s5 encoding of folder name
-	folder = "ID" +
-             btoa(escape(folder))
-                     .replace(/\+/g, '-')
-                     .replace(/\//g, '_')
-                     .replace(/=/g, '');
+	size += (size.search(/\d$/) == -1 ? 'iB' : ' bytes');
+	folder = folderID(folder);
 	//console.log("Folder: (%s) = (%s)", folder, size);
-	if (size.search(/\d$/) == -1)
-		size += 'iB';
-	else
-		size += ' bytes';
-	if (folder == "")
-		$('#dirsize').text(' (' + size + ')');
-	else
-		$('#' + folder).text(' (' + size + ')');
+	$(folder == "" ? '#dirsize' : '#ID' + folder)
+	    .text(' (' + size + ')');
 }
 
 function folder_size_callback(data, status, xhr)
@@ -141,11 +143,9 @@ function folder_size_callback(data, status, xhr)
 
 function set_folder_new(folder, cnt)
 {
-	folder = folder.replace(/ /g, '');
-	folder = folder.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
 	//console.log("Folder: (%s) = (%s)", folder, cnt);
 	left = cnt > 99 ? 11 : (cnt > 9 ? 14 : 17);
-	$('#img' + folder)
+	$('#img' + folderID(folder))
 	    .attr('src', '/img/Folder_New.png')
 	    .next('span.foldernum')
 	    .css('left', left + 'px')
@@ -164,10 +164,8 @@ function new_folder_callback(data, status, xhr)
 
 function set_folder__(folder)
 {
-	folder = folder.replace(/ /g, '');
-	folder = folder.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
 	//console.log("Folder: (%s)", folder);
-	$('#img' + folder + ' ~ span.folderu').show();
+	$('#img' + folderID(folder) + ' ~ span.folderu').show();
 }
 
 function __folder_callback(data, status, xhr)
@@ -264,7 +262,7 @@ var $confirm;	// Populated after DOM is loaded.
 
 function confirm_action(action, callback, file, type, id)
 {
-	var bfile = file.replace(/.*\/|\.[^.]*$/g, '');
+	var bfile = file.replace(pathre, '');
 	$confirm.dialog('option', 'buttons', {
 		'Yes': function() { $(this).dialog('close');
 			callback(file, type, id); },
@@ -437,7 +435,7 @@ var menuclick = function(action, el, pos)
 {
 	var file = $(el).parent().prevAll('a.bf').last().attr('file');
 	var efile = encodeURIComponent(file);
-	var bfile = file.replace(/.*\/|\.[^.]*$/g, '');
+	var bfile = file.replace(pathre, '');
 	bfile = bfile.replace(/[\x00-\x1f]+/g, '');
 	var type = $(el).attr('type');
 	var id = $(el).attr('did');