jQuery.MapRollover = function(config) {
	var gfx_path = 'gfx/maps/';
	var gfx_ext = '.gif';
	var cssClass = 'maprolloverimg';
	var defaultImage = 'default'+gfx_ext;
	var useFade = false;
	var fadeSpeed = 'fast';
	var usePreloading = true;
	var imageRefTag = 'rollover';
	var useExtension = true;
	
	if (config != null) {
		if (config.useExtension != null) { useExtension = config.useExtension; if (!useExtension) gfx_ext = ''; }
		if (config.gfx_path != null) gfx_path = config.gfx_path;
		if (config.gfx_ext != null) { gfx_ext = config.gfx_ext; defaultImage = 'default'+gfx_ext; }
		if (config.cssClass != null) cssClass = config.cssClass;
		if (config.useFade != null) useFade = config.useFade;
		if (config.usePreloading != null) usePreloading = config.usePreloading;
		if (config.defaultImage != null) defaultImage = config.defaultImage;
		if (config.imageRefTag != null) imageRefTag = config.imageRefTag;
		if (config.fadeSpeed != null) fadeSpeed = config.fadeSpeed;		
	}
	
	var img = $('img[usemap]');
	var mapName = img.attr('usemap').substr(1);
	var map = $('map[name="'+mapName+'"]');
	if(!(img.is('img') && img.attr('usemap') && map.size() > 0)) { return; }
	
	handleImg = function(obj, useDefault) {
		var mapName = obj.parent().attr('name');
		var img = $('img[usemap=#' + mapName + ']');
		var imgSrc = gfx_path + mapName.toLowerCase() + '/' + obj.attr(imageRefTag).toLowerCase() + gfx_ext;
		
		if (useFade) {		
			if (useDefault) {
				$('img[usemap=#'+mapName+'].'+cssClass).hide();
			} else {		
				$('img[usemap=#'+mapName+'].'+cssClass).each(function (e) {
					if ($(this).attr('src') == imgSrc) {
						$(this).fadeIn(fadeSpeed);
					}
				});			
			}
		} else {
			if (useDefault) imgSrc = gfx_path + mapName.toLowerCase() + '/' + defaultImage;
			img.attr('src', imgSrc);
		}
	};
	
	if (usePreloading) {
		// Preload images
		$(map).find('area[coords]').each(function (e) {
			var imgSrc = gfx_path + mapName.toLowerCase() + '/' + $(this).attr(imageRefTag).toLowerCase() + gfx_ext;
			$('<img />').attr('src', imgSrc);
		});
	}
	
	if (useFade) {
		// Create images
		$(map).find('area[coords]').each(function (e) {
			var imgSrc = gfx_path + mapName.toLowerCase() + '/' + $(this).attr(imageRefTag).toLowerCase() + gfx_ext;
			img.clone().hide().attr('src', imgSrc).addClass(cssClass).appendTo(img.parent());			
		});
	}
	
	$(map).find('area[coords]').mouseover(function(e) { handleImg($(this), false);}).mouseout(function(e) { handleImg($(this), true); });
};