if (!AE.widget.overShow) {
	(function () {
		var YL = YAHOO.lang,
			YUD = YAHOO.util.Dom,
			YUE = YAHOO.util.Event,
			get = YUD.get;
		AE.namespace('AE.widget.overShow');
		AE.widget.overShow = function () {
			var oComponent = this;
			var oDefConfig = {
				targetId: "overShowTargetId",
				contentId: "overShowContentId",
				showDelayTime: 200,
				hiddenDelayTime: 200,
				excursion: [0, 0],
				needMask: false,
				needXY: true
			};
			var config;
			var isInited = false;
			var dTarget, dContent, iframeMask;
			var delayTimer = false;
			var canClose = true,
				contentShowed = false,
				holded = false;
			oComponent.hold = function () {
				holded = true;
			};
			oComponent.setFree = function () {
				holded = false;
			};
			oComponent.afterShow = new YAHOO.util.CustomEvent("afterShow", oComponent);
			oComponent.init = function (oConfig) {
				if (isInited) return false;
				config = YL.merge(oDefConfig, oConfig || {});
				dTarget = get(config.targetId);
				dContent = get(config.contentId);
				YUE.on(dTarget, "mouseover", oComponent.showDelay);
				YUE.on(dContent, "mouseover", oComponent.showDelay);
				YUE.on(dTarget, "mouseout", oComponent.hiddenDelay);
				YUE.on(dContent, "mouseout", oComponent.hiddenDelay);
				YUE.on(dTarget, "mouseover", function () {
					canClose = false;
				});
				YUE.on(dContent, "mouseover", function () {
					canClose = false;
				});
				YUE.on(dTarget, "mouseout", function () {
					canClose = true;
				});
				YUE.on(dContent, "mouseout", function () {
					canClose = true;
				});
				if (config.needMask) {
					iframeMask = document.createElement("iframe");
					iframeMask.className = "maskIframe";
					iframeMask.style.display = "none";
					iframeMask.style.zIndex = YUD.getStyle(dContent, 'zIndex') - 1;
					iframeMask.style.top = "0px";
					iframeMask.style.left = "0px";
					iframeMask.frameBorder = 0;
					dContent.parentNode.appendChild(iframeMask);
				}
			};
			oComponent.showDelay = function (e) {
				//YUE.stopEvent(e);
				if (delayTimer) {
					clearTimeout(delayTimer);
				}
				delayTimer = setTimeout(oComponent.showDirectly, config.showDelayTime);
			};
			oComponent.showDirectly = function () {
				if (contentShowed || holded) {
					return;
				}
				dContent.style.visibility = 'hidden';
				dContent.style.display = "";
				if (config.needXY) {
					var xy = YUD.getXY(dTarget);
					parsePos(config.excursion);
					xy[0] += config.excursion[0];
					xy[1] += config.excursion[1];
				}
				dContent.style.visibility = 'visible';
				dContent.style.display = '';
				if (config.needXY) {
					YUD.setXY(dContent, xy);
				}
				YUD.setStyle(dContent, 'opacity', 1);
				oComponent.afterShow.fire();
				contentShowed = true;
				if (config.needMask) {
					iframeMask.style.display = "";
					iframeMask.style.width = dContent.offsetWidth + "px";
					iframeMask.style.height = dContent.offsetHeight + "px";
					if (config.needXY) {
						YUD.setXY(iframeMask, xy);
					}
					iframeMask.style.visibility = "visible";
				}
			};
			oComponent.hiddenDelay = function (e) {
				if (holded == true) {
					return;
				}
				YUE.stopEvent(e);
				if (delayTimer) {
					clearTimeout(delayTimer);
				}
				delayTimer = setTimeout(oComponent.hiddenDirectly, config.hiddenDelayTime);
			};
			oComponent.hiddenDirectly = function () {
				if (!canClose) {
					return false;
				}
				dContent.style.display = "none";
				if (config.needMask) {
					iframeMask.style.display = "none";
				}
				contentShowed = false;
			};
			var parsePos = function (aPos) {
					if (typeof (aPos[0]) == 'string') {
						if (aPos[0] == 'auto') {
							(isContentOverflow()) ? aPos[0] = 'right' : aPos[0] = 'left';
						}
						switch (aPos[0]) {
						case 'center':
							aPos[0] = paseInt(dTarget.offsetWidth / 2);
							break;
						case 'right':
							aPos[0] = (dTarget.offsetWidth - dContent.offsetWidth);
							break;
						default:
							aPos[0] = 0;
						}
					}
					if (typeof (aPos[1]) == 'string') {
						switch (aPos[1]) {
						case 'center':
							aPos[1] = paseInt(dTarget.offsetHeight / 2);
							break;
						case 'bottom':
							aPos[1] = dTarget.offsetHeight;
							break;
						default:
							aPos[1] = 0;
						}
					}
					return aPos;
				};
			var isContentOverflow = function () {
					return document.body.offsetWidth < (YUD.getX(dTarget) + dContent.offsetWidth);
				};
		};
	}());
}
