var INVEN = window.INVEN || {};
INVEN.Layer = window.INVEN.Layer || {};

INVEN.Layer.mousex = 0;
INVEN.Layer.mousey = 0;
INVEN.Layer.ready = false;
INVEN.Layer.floatIframes = window.INVEN.Layer.floatIframes || new Array();

INVEN.Layer.setReady = function() {
	INVEN.Layer.ready = true;
}
INVEN.Layer.forceReady = function() {
	INVEN.Layer.setReady();
	removeEvent(window, "onload", INVEN.Layer.setReady);
}
INVEN.ReadyState.add(INVEN.Layer.forceReady);
INVEN.Layer.trackMouse = function(e) {
	if (!e) e = event;
	if (e.x) {
		INVEN.Layer.mousex = e.x;
		INVEN.Layer.mousey = e.y;
	} else {
		scrollLeft = document.compatMode && document.compatMode != "BackCompat" ? document.documentElement.scrollLeft : document.body.scrollLeft;
		scrollTop = document.compatMode && document.compatMode != "BackCompat" ? document.documentElement.scrollTop : document.body.scrollTop;
		INVEN.Layer.mousex = e.pageX - scrollLeft;
		INVEN.Layer.mousey = e.pageY - scrollTop;
	}
}
INVEN.Layer.getFloatControl = function(floatControl) {
	if (floatControl == undefined) {
		floatControl = 'none';
	} else if (typeof(floatControl) == 'boolean') {
		floatControl = floatControl ? 'select' : 'none';
	} else if (floatControl == 'iframe') {
		floatControl = 'iframe';
	} else {
		floatControl = 'none';
	}
	return floatControl;
}
// xplus : [w/e/m]+/-[pixel] plus/minus from west/east/mouse end of baseObj
// xplus : [n/s/m]+/-[pixel] plus/minus from north/south/mouse end of baseObj
// basePos : -mouse, -body, [object]
INVEN.Layer.show = function(obj, xplus, yplus, floatControl, toBody, baseObj) {
	if (!INVEN.Layer.ready) return;
	if (toBody == undefined) toBody = true;
	if (baseObj == undefined) baseObj = "-mouse";
	obj = getObj(obj);
	if (!obj) return;
	floatControl = INVEN.Layer.getFloatControl(floatControl);
	
	var fixXPos = false;
	var fixYPos = false;
	
	scrollLeft = document.compatMode && document.compatMode != "BackCompat" ? document.documentElement.scrollLeft : document.body.scrollLeft;
	scrollTop = document.compatMode && document.compatMode != "BackCompat" ? document.documentElement.scrollTop : document.body.scrollTop;

	// ±âÁØÁÂÇ¥ °è»ê (baseObj, xplus, yplus ÀÌ¿ë)
		switch (baseObj) {
			case '-mouse':
				break;
			case '-body':
				baseObj = document.body;
				if (!baseObj) return;
				break;
			default:
				baseObj = getObj(baseObj);
				if (!baseObj) return;
		}

		var basePos = INVEN.Coordination.create();
		if (baseObj == '-mouse') {
			basePos.x = INVEN.Layer.mousex;
			basePos.y = INVEN.Layer.mousey;
		} else {
			var baseObjPos = INVEN.Coordination.getAbsPos(baseObj);

			var xplusBase = (typeof(xplus) == 'string') ? xplus.substring(0,1).toLowerCase() : 'm';
			var yplusBase = (typeof(yplus) == 'string') ? yplus.substring(0,1).toLowerCase() : 'm';

			switch (xplusBase) {
				case 'e': basePos.x = baseObjPos.x + baseObj.offsetWidth - scrollLeft; break;
				case 'm': basePos.x = INVEN.Layer.mousex; break;
				default: basePos.x = baseObjPos.x - scrollLeft;
			}
			switch (yplusBase) {
				case 's': basePos.y = baseObjPos.y + baseObj.offsetHeight - scrollTop; break;
				case 'm': basePos.y = INVEN.Layer.mousey; break;
				default: basePos.y = baseObjPos.y - scrollTop;
			}
		}
		if (typeof(xplus) == 'string') {
			if (xplus.search(/f/i) != -1) { fixXPos = true; }
			xplus = parseInt(xplus.replace(/[^0-9\-]/ig,''), 10);
		}
		if (typeof(yplus) == 'string') {
			if (yplus.search(/f/i) != -1) { fixYPos = true; }
			yplus = parseInt(yplus.replace(/[^0-9\-]/ig,''), 10);
		}

	// Layer ¹Ù±ùÂÊÀ¸·Î »©±â
		if (toBody && document.body) {
			obj.parentNode.removeChild(obj);
			document.body.appendChild(obj);
		}

	objPos = INVEN.Coordination.getRelPos(obj.parentNode);

	obj.style.visibility = 'hidden';
	obj.style.display = 'inline';
	//obj.style.zIndex = 9999;

	var x = basePos.x - objPos.x + scrollLeft;
	var y = basePos.y - objPos.y + scrollTop;
	
	// º»¹® Å©±â °è»ê
	var cw = document.body.clientWidth + scrollLeft;
	var ch = document.body.clientHeight + scrollTop;

	obj.style.left = x + xplus;
	obj.style.top = y + yplus;

	obj.style.visibility = 'visible';

	var h = obj.offsetHeight;
	var w = obj.offsetWidth;
	var curPos = INVEN.Coordination.getRelPos(obj);
	var objAbsPos = INVEN.Coordination.getAbsPos(obj);

	if ((!fixYPos) && ((objAbsPos.y+ h) > ch)) {
		obj.style.top = y - h - yplus;
		if ((y - h - yplus) < scrollTop) {
			obj.style.top = scrollTop;
		}
	}
	if ((!fixXPos) && ((objAbsPos.x + w) > cw)) {
		obj.style.left = x - w - xplus;
		//if ((objAbsPos.x - w - xplus) < 0) {
		//	obj.style.left = objPos.x + document.body.scrollLeft + document.body.clientWidth - w - 10;
		//}
	}
	obj.style.display = 'none';
	obj.style.display = 'inline';
	switch (floatControl) {
		case 'select':
			INVEN.Layer.floatShow(obj);
			break;
		case 'iframe':
			if (!obj.uniqueID) obj.uniqueID = "inven_" + new Date().getMilliseconds() + "_" + Math.round(Math.random() * 1000);
			if (!INVEN.Layer.floatIframes[obj.uniqueID]) {
				INVEN.Layer.floatIframes[obj.uniqueID] = document.createElement("IFRAME");
				INVEN.Layer.floatIframes[obj.uniqueID].frameBorder = "0";
				INVEN.Layer.floatIframes[obj.uniqueID].frameSpacing = "0";
				INVEN.Layer.floatIframes[obj.uniqueID].style.position = "absolute";
				INVEN.Layer.floatIframes[obj.uniqueID].style.styleFloat = "left";
				INVEN.Layer.floatIframes[obj.uniqueID].style.display = "inline";

			}
			if (INVEN.Layer.floatIframes[obj.uniqueID].parentNode && (INVEN.Layer.floatIframes[obj.uniqueID].parentNode != document.body)) { INVEN.Layer.floatIframes[obj.uniqueID].parentNode.removeChild(INVEN.Layer.floatIframes[obj.uniqueID]); }
			//INVEN.Layer.floatIframes[obj.uniqueID].style.zIndex = obj.style.zIndex;
			//obj.parentNode.insertBefore(INVEN.Layer.floatIframe, obj);
			var objAbsPos = INVEN.Coordination.getAbsPos(obj);
			INVEN.Layer.floatIframes[obj.uniqueID].style.zIndex = obj.style.zIndex - 1;
			INVEN.Layer.floatIframes[obj.uniqueID].style.width = obj.offsetWidth;
			INVEN.Layer.floatIframes[obj.uniqueID].style.height = obj.offsetHeight;
			INVEN.Layer.floatIframes[obj.uniqueID].style.left = objAbsPos.x;
			INVEN.Layer.floatIframes[obj.uniqueID].style.top = objAbsPos.y;
			try {
				if (self.pageYOffset) { // all except Explorer
					INVEN.Layer.floatIframes[obj.uniqueID].style.left = objAbsPos.x;
					INVEN.Layer.floatIframes[obj.uniqueID].style.top = objAbsPos.y;
				} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
					INVEN.Layer.floatIframes[obj.uniqueID].style.left = objAbsPos.x;
					INVEN.Layer.floatIframes[obj.uniqueID].style.top = objAbsPos.y;
				} else if (document.body && obj.currentStyle) { // all other Explorers
					INVEN.Layer.floatIframes[obj.uniqueID].style.left = objAbsPos.x - parseInt(obj.currentStyle.borderLeftWidth, 10);
					INVEN.Layer.floatIframes[obj.uniqueID].style.top = objAbsPos.y - parseInt(obj.currentStyle.borderTopWidth, 10);
				}			
			} catch (e) {}

			document.body.appendChild(INVEN.Layer.floatIframes[obj.uniqueID]);
			INVEN.Layer.floatIframes[obj.uniqueID].style.visibility = 'hidden';
			INVEN.Layer.floatIframes[obj.uniqueID].style.visibility = 'visible';
			break;
	}
}
INVEN.Layer.hide = function(obj, floatControl) {
	obj = getObj(obj);
	if (!obj) return;
	floatControl = INVEN.Layer.getFloatControl(floatControl);
	obj.style.display = 'none';

	switch (floatControl) {
		case 'select':
			INVEN.Layer.floatHide(obj);
			break;
		case 'iframe':
			if (!obj.uniqueID) obj.uniqueID = "inven_" + new Date().getMilliseconds() + "_" + Math.round(Math.random() * 1000);
			if (INVEN.Layer.floatIframes[obj.uniqueID] && INVEN.Layer.floatIframes[obj.uniqueID].parentNode) {
				INVEN.Layer.floatIframes[obj.uniqueID].parentNode.removeChild(INVEN.Layer.floatIframes[obj.uniqueID]);
			}
			break;
	}
}
/* FLOAT CONTROL */
INVEN.Layer.floatObjs = window.INVEN.Layer.floatObjs || new Array();
INVEN.Layer.floatSelects = window.INVEN.Layer.floatObjsState || new Array();

INVEN.Layer.floatShow = function(obj) {
	// IE°¡ ¾Æ´Ï¸é ÀÛµ¿¾ÈÇÔ
	if (!window.ActiveXObject) return;
	
	// ÃÊ±âÈ­
	obj = getObj(obj);
	if (!obj) return;

	// SELECT ÃßÃâ
	var docSelect = document.getElementsByTagName("SELECT");
	var childSelect = obj.getElementsByTagName("SELECT");
	var dsCount = docSelect.length;
	var csCount = childSelect.length;

	// ÁÂÇ¥ °è»ê
	var objPos = INVEN.Coordination.getRelPos(obj);
	var objPosEnd = INVEN.Coordination.create();
	objPosEnd.x = objPos.x + obj.offsetWidth;
	objPosEnd.y = objPos.y + obj.offsetHeight;

	for (var ds = 0; ds < dsCount; ds++) {
		var item = docSelect[ds];

		// ÇÃ·ÎÆÃ ³»ºÎÀÎÁö È®ÀÎ
		var isChild = false;
		for (var cs = 0; cs < csCount; cs++) {
			if (item == childSelect[cs]) isChild = true;
		}
		if (!isChild) {
			if (!item.uniqueID) item.uniqueID = "inven_" + new Date().getMilliseconds() + "_" + Math.round(Math.random() * 1000);

			itemPos = INVEN.Coordination.getAbsPos(item);
			var itemPosEnd = INVEN.Coordination.create();
			itemPosEnd.x = itemPos.x + item.offsetWidth;
			itemPosEnd.y = itemPos.y + item.offsetHeight;

			// °ãÄ¡´ÂÁö Ã¤Å©
			if (((itemPos.x >= objPos.x) && (itemPos.y >= objPos.y) && (itemPos.x <= objPosEnd.x) && (itemPos.y <= objPosEnd.y)) /* ½ÃÀÛÁöÁ¡ °Ë»ç */
				|| ((itemPosEnd.x >= objPos.x) && (itemPosEnd.y >= objPos.y) && (itemPosEnd.x <= objPosEnd.x) && (itemPosEnd.y <= objPosEnd.y))) /* ³¡ÁöÁ¡ °Ë»ç */ {
				if (item.style.visibility != 'hidden') {
					INVEN.Layer.floatSelects[item.uniqueID] = new Array();
					INVEN.Layer.floatSelects[item.uniqueID]['obj'] = item;
					INVEN.Layer.floatSelects[item.uniqueID]['state'] = item.style.visibility;
					item.style.visibility = 'hidden';
				}
			}
		} else {
			if (item.style.visibility == 'hidden') {
				// ¾Èº¸ÀÏ °æ¿ì ÇÃ·ÎÆÃÄÁÆ®·Ñ¿¡ ÀÇÇØ °¨ÃçÁøÁö È®ÀÎ
				for (var foKey in INVEN.Layer.floatSelects) {
					if (foKey == item.uniqueID) {
						item.style.visibility = INVEN.Layer.floatSelects[foKey]['state'];
					}
				}
			}
		}

		INVEN.Layer.floatObjs[obj.id] = 1;
	}
}
INVEN.Layer.floatHide = function(obj) {
	// IE°¡ ¾Æ´Ï¸é ÀÛµ¿¾ÈÇÔ
	if (!window.ActiveXObject) return;
	
	// ÃÊ±âÈ­
	obj = getObj(obj);
	if (!obj) return;

	// ´Ù º¸¿©ÁÖ±â
	for (var key in INVEN.Layer.floatSelects) {
		INVEN.Layer.floatSelects[key]['obj'].style.visibility = INVEN.Layer.floatSelects[key]['state'];
	}

	INVEN.Layer.floatObjs[obj.id] = 0;

	// ´Ù¸¥ ÇÃ·ÎÆÃ Àç°è»ê
	for (var key in INVEN.Layer.floatObjs) {
		if (INVEN.Layer.floatObjs[key]) INVEN.Layer.floatShow(key);
	}
}

addEvent(document, 'onmousemove', INVEN.Layer.trackMouse);
addEvent(window, "onload", INVEN.Layer.setReady);