//
// Internet Explorer Cache Cleanup
// See http://www.winmag.com/fixes/ie/iecache.htm
//

var TITLE = "IE Cache Cleanup";
var IEDIR = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\Cache";
var IEMAX = "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Cache\\Content\\CacheLimit";
var IEBAR = "HKLM\\Software\\Microsoft\\Internet Explorer\\Main\\Window Title";
var wsh   = WScript.CreateObject("WScript.Shell");
var fso   = WScript.CreateObject("Scripting.FileSystemObject");
var nfiles = 0;
var nbytes = 0;

function delcache(dirname) {
	// Open directory name, catch "not found" error
	try {
		var dir = fso.GetFolder(dirname);
  	} catch(err) { return err; }
	var e;
	// Delete files in the current directory
	for (e = new Enumerator(dir.files); !e.atEnd(); e.moveNext()) {
		var file = e.item();
		try { file.Delete(1); } catch (err) { }
	}
	// Delete subdirectories recursively
	for (e = new Enumerator(dir.subFolders); !e.atEnd(); e.moveNext()) {
		var folder = e.item();
		delcache(folder);
		try { folder.Delete(1); } catch (err) { }
	}
	return null;
}

function tally(dirname) {
	// Open directory name, catch "not found" error
	try {
		var dir = fso.GetFolder(dirname);
  	} catch(err) { return err; }
	var e;
	// Count number and size of files in this directory
	for (e = new Enumerator(dir.files); !e.atEnd(); e.moveNext()) {
		var file = e.item();
		nbytes += file.Size;
		nfiles++;
	}
	// Count files in the subdirectories as well
	for (e = new Enumerator(dir.subFolders); !e.atEnd(); e.moveNext()) {
		var folder = e.item();
		tally(folder);
	}
	return null;
}

// Get IE cache directory name from the registry
var iecache = "";
try {
	iecache = wsh.RegRead(IEDIR);
} catch(e) {}
if ( iecache && fso.FolderExists(iecache) )
	iecache = iecache.replace(/\\$/, "");

// Get IE cache max size (in megabytes) from the registry
var iemax = 0;
try {
	iemax = wsh.RegRead(IEMAX);
} catch(e) {}
if ( !iecache || iecache.length < 6 || !iemax ) {
	wsh.Popup("Cannot determine IE cache directory or settings.",0,TITLE,16);
	WScript.Quit(1);
}

// If IE is running it will prevent complete cache cleanup
// but it also prevents "run from here" so let's skip it.
var iename = "Internet Explorer";
try {
	iename = wsh.RegRead(IEBAR);
} catch(e) {}
//var ierun = wsh.AppActivate(iename);
//if ( ierun ) {
//	wsh.Popup("Please close all Internet Explorer windows\nbefore starting IE cache cleanup.",0,TITLE,64);
//	WScript.Quit(2);
//}

// Count files in cache directory
tally(iecache);
if ( nfiles <= 1 ) {	// INDEX.DAT never dies
	wsh.Popup("No cleanup currently needs to be performed.",0,TITLE,64);
	WScript.Quit(3);
}

// Do you really want to go through with it?
var mb = Math.round(100*(nbytes/(1024*1024)))/100;
if ( mb > 10 )
	mb = Math.round(mb);
var msg = "Internet Explorer cache will be cleaned:\n\n";
msg += "Folder:\t"+iecache+"\n";
msg += "Maximum:\t"+iemax+" MB\n";
msg += "Currently:\t"+mb+" MB, "+nfiles+" files\n";
if ( mb > iemax )
	msg += "(NOTE: Cache space overflow!)\n";
msg += "\nDo you want to continue?";
var yn = wsh.Popup(msg,0,TITLE,36);
if ( yn != 6 ) {
	wsh.Popup("Cancelled at your request. No changes made.",0,TITLE,48);
	WScript.Quit(4);
}

// Goodbye cache, hello disk space!
delcache(iecache);

msg =  "Internet Explorer cache cleanup complete.";
wsh.Popup(msg,0,TITLE,64);
WScript.Quit(0);


