function LayerPopup() {
	var objCurrentBtnId = null;
	var objCurtainLayer = null;
	var objLayers = {};
	
	// screen resources.
	var option = {
		curtain:{
			id:'curtainLayer',
			bgcolor:'#fff',
			opacity:50	
		}
	};
	
	// language resources.
	var gLanguageResources = new Array();
	gLanguageResources['closeCurrentOpenedLayerFirst'] = 'close the current opened layer window first.';
	gLanguageResources['closeLayer'] = 'close this layer window.';
	
	this.initialize = function () {
		// initialize.
		objCurtainLayer = document.createElement('div');
		objCurtainLayer.id = option.curtain.id;
		objCurtainLayer.style.backgroundColor = option.curtain.bgcolor;
		objCurtainLayer.style.position = 'absolute';
		objCurtainLayer.style.left = '0px';
		objCurtainLayer.style.top = '0px';
		objCurtainLayer.style.zIndex = 150;
		Object.setOpacity(objCurtainLayer, option.curtain.opacity);
		
		//window.addEvent('onresize', function () {
		//	return relocate(objCurrentBtnId);
		//});
	}
	
	this.add = function (btnId, ids, addFunc) {
		var objButton = document.getElementById(btnId);
		if (ids.length == 1) {
			var targetObj = ids;
		} else {
			curId = ids[0];
			newId= ids[1];
			var targetObj = document.getElementById(curId);
		}
		var tempObj = targetObj.parentNode.removeChild(targetObj);
		
		objLayers[btnId] = {target:tempObj, position:addFunc.position};
		objButton.onclick = toggleLayer;
		
		tempObj.id = newId;
		tempObj.style.display = 'none';
		document.getElementsByTagName('body')[0].appendChild(tempObj);
		
		if (!!addFunc) {
			for (var action in addFunc) {
				switch (action) {
				case 'appendCloseBtn':
					var objTarget = document.getElementById(addFunc[action]);
					objTarget.appendChild(createCloseButton());
					break;
				case 'hideSelectBox':
					objLayers[btnId].selectbox = addFunc[action];
				}
			}
		}
		
		return true;
	}
	
	this.setLanguageResources = function (data) {
		for (var key in data) {
			gLanguageResources[key] = data[key];
		}
	}
	
	var relocate = function (id) {
		if (id == null || (!objLayers[id] && !objLayers[id].target))
			return false;
		
		objLayers[id].target.style.position = 'absolute';
		
		if (!objLayers[id].position) {
			var tempSize = Object.getScreenSize();
			objLayers[id].target.style.left = tempSize.display.width / 2 - objLayers[id].target.offsetWidth / 2 + 'px';
		} else {
			for (var prop in objLayers[id].position) {
				switch (prop) {
				case 'bottom':
					objLayers[id].target.style.bottom = eval(objLayers[id].position.bottom) + 'px';
					break;
				case 'left':
					objLayers[id].target.style.left = eval(objLayers[id].position.left) + 'px';
					break;
				case 'right':
					objLayers[id].target.style.right = eval(objLayers[id].position.right) + 'px';
					break;
				case 'top':
					objLayers[id].target.style.top = eval(objLayers[id].position.top) + 'px';
					break;
				}
			}
		}
		
		return true;
	}
	
	var createCloseButton = function () {
		var objButton = document.createElement('div');
		objButton.className = 'button closebtn';
		objButton.href = '#';
		objButton.appendChild(document.createTextNode(gLanguageResources['closeLayer']));
		objButton.onclick = function () {
			hideLayer(objCurrentBtnId);
			objCurrentBtnId = null;
		}
		
		return objButton;
	}
	
	var toggleLayer = function () {
		if (objCurrentBtnId == null) {
			showLayer(this.id);
		} else if (objCurrentBtnId == this.id) {
			hideLayer(objCurrentBtnId);
		} else {
			alert(gLanguageResources['closeCurrentOpenedLayerFirst']);
		}
		
		return false;
	}
	
	var showLayer = function (id) {
		objLayers[id].target.style.display = 'block';
		objLayers[id].target.style.zIndex = 200;
		
		if (!objLayers[id].position) {
			openCurtainLayer();
			if (objBrowser.isIE6) toggleAllSelectBox('hidden');
		} else if (objBrowser.isIE6 && !!objLayers[id].selectbox) {
			toggleSelectBox(id, 'hidden');
		}
		
		relocate(id);
		objCurrentBtnId = id;
	}
	
	var hideLayer = function (id) {
		objLayers[id].target.style.display = 'none';
		
		if (!objLayers[id].position) {
			closeCurtainLayer();
			if (objBrowser.isIE6) toggleAllSelectBox('visible');
		} else if (objBrowser.isIE6 && !!objLayers[id].selectbox) {
			toggleSelectBox(id, 'visible');
		}
		
		objCurrentBtnId = null;
	}
	
	var openCurtainLayer = function () {
		var objBODY = document.getElementsByTagName('body')[0];
		var tempSize = Object.getScreenSize();
		
		objCurtainLayer.style.width = tempSize.whole.width + 'px';
		objCurtainLayer.style.height = tempSize.whole.height + 'px';
		objBODY.appendChild(objCurtainLayer);
	}
	
	var closeCurtainLayer = function () {
		if (!!document.getElementById(option.curtain.id))
			document.getElementsByTagName('body')[0].removeChild(objCurtainLayer);
	}
	
	var toggleAllSelectBox = function (type) {
		var objSELECTs = document.getElementsByTagName('select');
		
		for (var i=0; i<objSELECTs.length; i++) {
			objSELECTs[i].style.visibility = type;
		}
	}
	
	var toggleSelectBox = function (id, type) {
		var indexes = new Array();
		var objSELECTs = document.getElementsByTagName('select');
		
		switch (typeof(objLayers[id].selectbox)) {
		case 'number':
			indexes.push(objLayers[id].selectbox);
			break;
		case 'object':
			indexes = objLayers[id].selectbox;
			break;
		default:
			return false;
			break;
		}
		
		for (var i=0; i<indexes.length; i++) {
			objSELECTs[indexes[i]].style.visibility = type;
		}
		
		return true;
	}
}
