		var htmlNBSP = "&nbsp;";
		var LinkList = new Array;
		var ImageNameMap = new Array;
		var Timer = new Array;

		function NSMouseCallback(name,callback)
		{	this.name = name;
			this.callback = callback;
		}
		function AddNSMouseCapture(srclayer,name,down_callback,up_callback)
		{	
			if (null == srclayer.captureEvents) return;
		//Local	
			var callbacklist;
			var i;
		//Capture
			if (null != srclayer.down_callback)	srclayer.releaseEvents(Event.MOUSEDOWN);	
			if (null != srclayer.up_callback)	srclayer.releaseEvents(Event.MOUSEUP);	
			srclayer.captureEvents(Event.MOUSEDOWN);
			srclayer.captureEvents(Event.MOUSEUP);
		//Init
			if (null == srclayer.down_callback)	srclayer.down_callback = new Array;
			if (null == srclayer.up_callback)	srclayer.up_callback = new Array;
		//Add Callback	
			for (i = 0; i < srclayer.down_callback.length; i++)
			{	if (srclayer.down_callback[i].name == name)
				{	srclayer.down_callback[i].callback = down_callback;
					break;
				}
			}
			if (i == srclayer.down_callback.length)
				srclayer.down_callback[srclayer.down_callback.length] = new NSMouseCallback(name,down_callback);
		
			for (i = 0; i < srclayer.up_callback.length; i++)
			{	if (srclayer.up_callback[i].name == name)
				{	srclayer.up_callback[i].callback = up_callback;
					break;
				}
			}
			if (i == srclayer.up_callback.length)
				srclayer.up_callback[srclayer.up_callback.length] = new NSMouseCallback(name,up_callback);
		//Set Handle
			callbacklist = "";
			for (i = 0 ; i < srclayer.down_callback.length; i++)
				callbacklist = callbacklist + srclayer.down_callback[i].callback;
			srclayer.onmousedown = new Function("event",callbacklist);
		
			callbacklist = "";
			for (i = 0 ; i < srclayer.up_callback.length; i++)
				callbacklist = callbacklist + srclayer.up_callback[i].callback;
			srclayer.onmouseup = new Function("event",callbacklist);
		}
		function RemoveNSMouseCapture(srclayer,name)
		{	if (null == srclayer.releaseEvents) return;
			srclayer.releaseEvents(Event.MOUSEDOWN);
			srclayer.releaseEvents(Event.MOUSEUP);
			srclayer.down_callback = null;
			srclayer.up_callback = null;
		}
		function IsPrefixWith(szSrc,start,szPrefix)
		{	if ("" == szSrc || "" == szPrefix) return false;
			if (0 == szSrc.length || 0 == szPrefix.length) return false;
			
			var		i;
		
			for(i = 0; 0 != szSrc.charAt(start + i) && 0 != szPrefix.charAt(i); i++) {
				if (szSrc.charAt(start + i) != szPrefix.charAt(i))	break; }
			return 0 == szPrefix.charAt(i);
		}
		function IsPrefixSpecialChar(szSrc,start)
		{	if ("" == szSrc || 0 == szSrc.length) return false;		
			return '&' == szSrc.charAt(start);
		}
		function GetPrefixSpecialCharLen(szSrc,start)
		{
		//	Gaurd
			if (0 == szSrc.length || '&' != szSrc.charAt(start)) return 0;
		//	Init
			var	Len	= 0 , i;
			
			for(i = 0; 0 != szSrc.charAt(i); i++)
			{	if (';' == szSrc.charAt(start + i))
				{	Len = i + 1;
					break;
				}
			}
		//	Return
			return Len;
		}
		
		function FindTopDoc(curWindow)
		{
			if (curWindow == null)
				return null;
			if ((curWindow.parent != null) && (curWindow.parent != curWindow)) {
				return this.FindTopDoc(curWindow.parent);
			}
		
			return curWindow.document;	
		}
		
		function FindParentDoc(curWindow)
		{
			if (curWindow == null)
				return null;
			if (curWindow.parent == null)
				return null;
		
			return curWindow.parent.document;
		}
		
		function FindTargetDoc(curWindow, target)
		{
			if (curWindow == null)
				return null;
		
			if (curWindow.frames[target]) {
				return curWindow.frames[target];
			} else if ((curWindow.parent != null) && (curWindow.parent != curWindow)) {
				return this.FindTargetDoc(curWindow.parent, target);
			}
			
			return null; 
		}
		
		function GoLink(url,target)
		{
		//	gaurd
			if (url == null) 
				return;
			if (url.length == 0) 
				return;
		
			//.
			if (target == "_blank") {
				window.open(url);
			} else {
				var target_doc = null;
				if (target == null || target.length == 0 || target == "_self") {
					target_doc = document;
				} else if (target == "_top") {
					target_doc = FindTopDoc(window);
				} else if (target == "_parent") {
					target_doc = FindParentDoc(window);
				} else {
					target_doc = FindTargetDoc(window, target);
				}
		
				//.
				if (target_doc == null) {
					window.open(url);
				} else {
					target_doc.location.href = url;
				}
			}
		}
		
		function HitTest()
		{	if (null == document.all) return true;
		
			return (   window.event.x > 0 && window.event.x < document.all[Me.target].offsetWidth 
					&& window.event.y > 0 && window.event.y < document.all[Me.target].offsetHeight);
		}
		
		function UpdateSrcText(var_name,update_text)
		{
			var	i = 0;
			var	parse_text	= "";	
		
			for (i = 0; i < update_text.length; i ++)
			{
				if ('\'' == update_text.charAt(i))
					parse_text = parse_text + "\\";	
				parse_text = parse_text + update_text.charAt(i);
			}
		
			eval(var_name + "='" + parse_text + "'; ");
		}
		
		function AddLink(src_text,text_link)
		{
			var text_res = "";
		
			if (text_link.length)
				text_res = "<A href='" + text_link + "'>" + src_text + "</A>";
			else
				text_res = src_text;
		
			return text_res;
		}
		
		function GetLayer(target)
		{	var target_layer;
			if (document.all)
			{	target_layer = document.all[target];
			}
			else if (document.layers)
			{	if (document.layers[target + "_layer"])
					target_layer = document.layers[target + "_layer"];
				else
					target_layer = document.layers[target].document.layers[target + "_layer"];
			}
			return target_layer;
		}
		function UpdateLayer(target,restext)
		{	var target_layer;
			target_layer = GetLayer(target);
			if (document.all)
			{	target_layer.innerHTML = restext;
			}
			else if (document.layers)
			{	target_layer.document.open("text/html");
				target_layer.document.write(restext);
				target_layer.document.close();	
			}	
		}
		function AddTextLink(strLink)
		{	LinkList[LinkList.length] = strLink;  }
		function GoTextLink(LinkIndex)
		{	GoLink(LinkList[LinkIndex],'');	}
		function ReloadPage()
		{	for (i = 0 ; i < Timer.length ; i++)
				clearTimout(Timer[i]);
			document.location.reload(false);
		}
		function setJSTimeout(name,callback,delay)
		{	setTimeout("if ('undefined' != typeof(" + name + ")) " + callback + " else document.location.reload(true);",delay);
		}
		function ReplaceImageNS(layername,name, state)
		{	var CurDoc;
			if (document.layers)
				CurDoc = document.layers[layername].document.layers[layername + "_layer"].document;
			else
				CurDoc = document;	
			if (bIsSupportOK) {
				for (i = 0; i < imgCounter; i++) {
					if (CurDoc.images[ImageList[i][NameIndex]] != null) {
						if ((name == ImageList[i][NameIndex]) && (ImageList[i][state] != null))
							CurDoc.images[name].src = ImageList[i][state].src;
					}
				}
			}
		}
		function Debug(msg)
	{//	window.status	= msg;
	}
	function ImageInfo(width,height)
	{
		this.width = width;
		this.height= height;
	}
	var ImageInfoList = new Array;
	var RestoreList = new Array;
	var PreloadList = new Array;
	var CellList = new Array;
	function GetCellInfo(idname)
	{	return CellList[idname];
	}
	function PreloadImage(filename)
	{	var Index = PreloadList.length;
		PreloadList[Index]		= new Image;
		PreloadList[Index].src	= filename;
	}
	function GetTargetLayer(idname)
	{	var		i;
		var		targetlayer;
		for (i = 0; i < document.layers.length; i++)
		{	var	curlayer;
			if (document.layers[i].document.layers.length == 0)
				continue;
			curlayer = document.layers[i].document.layers[0];
			if (curlayer.document.images.length == 0)
				continue;
			if (null != curlayer.document.images[idname])
			{	targetlayer = curlayer;
				break;
			}
			if (idname == curlayer.document.images[0].name)
			{	targetlayer = curlayer;
				break;
			}
		}
		return targetlayer;
	}
	function GetImageObject(srclayer,idname)
	{	var pImage;
		var ImgName;
	
		if (null == ImageNameMap[idname])	
			ImgName = idname;
		else
			ImgName = ImageNameMap[idname];
	
		if (document.all)
		{	pImage = document.images[ImgName];
		}
		else if (document.layers)
		{	var		i;
			if (srclayer && srclayer.document)
				pImage = srclayer.document.images[ImgName];
			if (null == pImage)
				pImage = document.images[ImgName];
			if (null == pImage)
			for (i = 0; i < document.layers.length; i++)
			{	var		curlayer;
				if (document.layers[i].document.layers.length > 0)
					curlayer = document.layers[i].document.layers[0];
				if (curlayer == null) continue;
				if (curlayer.document.images.length == 0) continue;
				if (curlayer.document.images.length == 0)
					continue;
				if (null != curlayer.document.images[ImgName])
				{	pImage = curlayer.document.images[ImgName];
					break;
				}
				if (ImgName == curlayer.document.images[0].name)
				{	pImage = curlayer.document.images[0];
					break;
				}
			}
		}
		return pImage;
	}
	function SwapImageFile(srclayer,idname,filename,resize,keepaspect,isrestore)
	{
	//	local
		var swapimg = new Image;
		var pImage;
		var CellInfo;
		var ImgName;
	//	init
		if (null == ImageNameMap[idname])	
			ImgName = idname;
		else
			ImgName = ImageNameMap[idname];
		pImage = GetImageObject(srclayer,idname);
		CellInfo = GetCellInfo(idname);
		if (null == pImage) return;	//for cell error
		if (null == CellInfo) return;	//for cell error
	//	Preload image to get width & height		
		if (null == ImageInfoList[pImage.src])
			ImageInfoList[pImage.src] = new ImageInfo(pImage.width,pImage.height);
	//	Swap Image
		swapimg.src = filename;
	//	Check Complete
		if (	false == swapimg.complete
			&&	swapimg.width == 0)
		{
			Debug("Not Complete");
		//	return;
		}
	//	Store Swap Info
		if (null == ImageInfoList[swapimg.src])
			ImageInfoList[swapimg.src] = new ImageInfo(swapimg.width,swapimg.height);
	//	
		if (false == resize)
		{
			if (document.all)
			{	pImage.src = filename;	
				pImage.width = ImageInfoList[pImage.src].width;
	   			pImage.height= ImageInfoList[pImage.src].height;  
			}
			else if (document.layers)
			{	var targetlayer = GetTargetLayer(ImgName);
				if (targetlayer != null)
				{	targetlayer.document.open("text/html");
					if (isrestore)
						targetlayer.document.write("<img src=" + '"' + filename + '"' + " name='" + ImgName + "' width=" + CellInfo.width + " height=" + CellInfo.height + ">");
					else
						targetlayer.document.write("<img src=" + '"' + filename + '"' + " name='" + ImgName + "' width=" + swapimg.width + " height=" + swapimg.height + ">");
					targetlayer.document.close();
				}			
			}
			Debug("img=" + filename + " w=" + pImage.width + " h=" + pImage.height);
		}
		else
		{
			if (keepaspect)
			{	var ratio	= 1;
				var restore_file= RestoreList[idname];
				var	org_width	= CellInfo.width;	//ImageInfoList[restore_file].width;
				var org_height	= CellInfo.height;	//ImageInfoList[restore_file].height;
				var x_ratio;
				var y_ratio;
	
				pImage.src = filename;	
	
				x_ratio = org_width / ImageInfoList[pImage.src].width;
				y_ratio = org_height / ImageInfoList[pImage.src].height;
				ratio = (x_ratio > y_ratio) ? y_ratio : x_ratio;
	
				pImage.width = ratio * ImageInfoList[pImage.src].width;
	   			pImage.height= ratio * ImageInfoList[pImage.src].height;
			}
			else
			{	//	var restore_file= RestoreList[idname];
				if (document.all)
				{	pImage.src		= filename;
					pImage.width	= CellInfo.width;	//ImageInfoList[restore_file].width;
	   				pImage.height	= CellInfo.height;	//ImageInfoList[restore_file].height;
				}
				else if (document.layers)
				{	var targetlayer = GetTargetLayer(ImgName);
					if (targetlayer != null)
					{	targetlayer.document.open("text/html");
						targetlayer.document.write("<img src=" + '"' + filename + '"' + " name='" + ImgName + "' width=" + CellInfo.width + " height=" + CellInfo.height + ">");
						targetlayer.document.close();
					}
				}
			}
		}
	}
	function SwapImage(srclayer,idname,filename,resize)
	{
		if (null == RestoreList[idname])
		{
			var pImage = GetImageObject(srclayer,idname);
	
			if (pImage)
				RestoreList[idname] = pImage.src;
			else
				Debug("fail to get src in swap image");
		}
		SwapImageFile(srclayer,idname,filename,resize,false,false);
	}
	function SwapHitTest(LayerWidth,LayerHeight)
	{	var eventX, eventY;
		
		if (document.all)
		{	eventX = window.event.offsetX;
			eventY = window.event.offsetY;
		}
		else if (document.layers)
		{	eventX = eventNS.pageX;
			eventY = eventNS.pageY;
		}
		
		if (   eventX > 0 && eventX < LayerWidth 
			&& eventY > 0 && eventY < LayerHeight)
			return true;
		else
			return false;
	}
	function RestoreImage(srclayer,idname,resize)
	{	if (RestoreList[idname])
		{	SwapImageFile(srclayer,idname,RestoreList[idname],resize,false,true);
		}
	}
	function SwapInfo(idname,restore,filename,resize)
	{	this.idname = idname;
		this.filename = filename;
		this.restore = restore;
		this.resize = resize;
	}
	function SwapItem_AddFile(idname,restore,file,resize)
	{	this.infolist[this.infolist.length] = new SwapInfo(idname,restore,file,resize);
	}
	function SwapItem()
	{	this.infolist = new Array;
		this.addfile = SwapItem_AddFile;
	}
	function SwapEffect_AddItem(itemname,item)
	{	this.itemlist[itemname]	= item;
	}
	function SwapEffect_onSwapFile(itemname,event,srclayer)
	{	var item = this.itemlist[itemname];
		var i;
		if (null == item) return;
		for(i = 0; i < item.infolist.length; i++)
		{	var info = item.infolist[i];
			if (info.restore)
				RestoreImage(srclayer,info.idname,info.resize);			
			else
				SwapImage(srclayer,info.idname,info.filename,info.resize);			
		}
	}
	function SwapEffect_onmouseover(event,srclayer)
	{	this.onswapfile("onmouseover",event,srclayer);
		if (document.layers)
			AddNSMouseCapture(srclayer,this.name,this.name + ".onmousedown(event,this);",this.name + ".onmouseup(event,this);");
	}
	function SwapEffect_onmouseout(event,srclayer)
	{	this.onswapfile("onmouseout",event,srclayer);
		if (document.layers)
			RemoveNSMouseCapture(srclayer);
	}
	function SwapEffect_onmousemove(event,srclayer)
	{	this.onswapfile("onmousemove",event,srclayer);
	}
	function SwapEffect_onmousedown(event,srclayer)
	{	this.onswapfile("onmousedown",event,srclayer);
		if (document.layers)
			AddNSMouseCapture(srclayer,this.name,this.name + ".onmousedown(event,this);",this.name + ".onmouseup(event,this);");
	}
	function SwapEffect_onmouseup(event,srclayer)
	{	this.onswapfile("onmouseup",event,srclayer);
		if (document.layers)
			AddNSMouseCapture(srclayer,this.name,this.name + ".onmousedown(event,this);",this.name + ".onmouseup(event,this);");
	}
	function SwapEffect(name)
	{	this.name = name;
		this.itemlist = new Array;	
		this.additem = SwapEffect_AddItem;
		this.onswapfile = SwapEffect_onSwapFile;
		this.onmouseover = SwapEffect_onmouseover;
		this.onmouseout  = SwapEffect_onmouseout;
		this.onmousemove = SwapEffect_onmousemove;
		this.onmousedown = SwapEffect_onmousedown;
		this.onmouseup = SwapEffect_onmouseup;
	}
	function AddRolloverRestore(idname)
	{	var pImage = GetImageObject(null,idname);
		RestoreList[idname] = pImage.src;
		if (null == ImageInfoList[pImage.src])
			ImageInfoList[pImage.src] = new ImageInfo(pImage.width,pImage.height);
	}
	function AddCellInfo(idname,width,height)
	{	CellList[idname] = new ImageInfo(width,height);
		AddRolloverRestore(idname);
	}
	
