/************************************************
 * 
 * レイヤー操作
 * 
 * DEPENDENCIES
 *  - 
 * 
 * Author : $Author: watanabe $
 * Last Modified : $Date: 2006/10/30 10:11:51 $
 * Version : $Revision: 1.5 $
 * 
 * (c) CYBER AGENT.LTD
 * 
 ************************************************/
var LayerUtil = {
	_LayerIds:new Array(),
	/**
	 * 初期処理(window.onloadで呼ぶこと)
	 * 
	 * @param Array LayerIds 画面内で表示切り替えするID配列
	 */
	initialize:function(LayerIds){
		this._LayerIds = LayerIds;
	},
	/**
	 * レイヤー表示・非表示
	 * 
	 * @param boolean flag         表示=true・非表示=false
	 * @param String  layerId      レイヤーID名
	 * @param String  positionId   表示位置参照ID名(任意)
	 * @param Array   hiddenIds    消したいレイヤーID配列(任意)※指定しない場合LayerIdsの値を参照
	 * @param String  positionType openLayerBackground用表示位置:left=デフォルト or right(任意)
	 */
	showLayer : function(flag, layerId, positionId, hiddenIds, positionType){
		var targetLayer = null;
		var top = 0;
		var left = 0;
		var hiddenLayers = this._LayerIds;
		if (hiddenIds != null) {
			hiddenLayers = hiddenIds;
		}
		if (hiddenLayers == null) {
			hiddenLayers = new Array();
		}

		if (positionId) {
			if (document.getElementById(positionId)) {
				var target = document.getElementById(positionId);
				if (target.offsetTop && target.offsetLeft) {
					top = target.offsetTop+7;
					left = target.offsetLeft+5;
				}
			}
		}

		// NNの場合
		if (document.layers) {
			targetLayer = document.layers[layerId];
			if (flag) {
				// 他のレイヤーが表示されてたら消したい
				for (var i=0, len=hiddenLayers.length; i < len; i++) {
					if (document.layers[hiddenLayers[i]]) {
						document.layers[hiddenLayers[i]].visibility = "hidden";
					}
				}
				// 表示
				targetLayer.visibility = "show";
				if (positionId) {
					targetLayer.style.top = top+"px";
					targetLayer.style.left = left+"px";
				}
				targetLayer.style.zIndex="1000";
			} else {
				// 非表示
				targetLayer.visibility = "hidden";
			}
		}
		// IEとNN6の場合
		if (document.getElementById) {
			targetLayer = document.getElementById(layerId);
			if (flag) {
				// 他のレイヤーが表示されてたら消したい
				for (var i=0, len=hiddenLayers.length; i < len; i++) {
					if (document.getElementById(hiddenLayers[i])) {
						document.getElementById(hiddenLayers[i]).style.visibility = "hidden";
					}
				}
				// 表示
				targetLayer.style.visibility = "visible";
				if (positionId) {
					targetLayer.style.top = top+"px";
					targetLayer.style.left = left+"px";
				}
				targetLayer.style.zIndex="1000";
			} else {
				// 非表示
				targetLayer.style.visibility = "hidden";
			}
		}

		// IE5.5以上のみ、セレクトボックスが優先表示されるため、targetLayerの下にiframeを敷く
		if (window.createPopup && !window.opera) {
			if (flag) {
				// 他のレイヤーが表示されてたら消したい
				for (var i=0, len=hiddenLayers.length; i < len; i++) {
					if (document.getElementById(hiddenLayers[i])) {
						this.closeLayerBackground(document.getElementById(hiddenLayers[i]));
					}
				}
				// 表示
				this.openLayerBackground(targetLayer, positionType);
			} else {
				// 非表示
				this.closeLayerBackground(targetLayer);
			}
		}
	},

	/**
	 * レイヤー表示切替
	 * 
	 * @param String layerId     レイヤーID名
	 * @param String positionId  表示位置参照ID名(任意)
	 */
	switchLayer : function(layerId, positionId) {
		var status = "";
		// NNの場合
		if (document.layers) {
			status = document.layers[layerId].visibility;
		}
		// IE・NC6の場合
		if (document.getElementById) {
			status = document.getElementById(layerId).style.visibility;
		}

		if (positionId) {
			this.showLayer(true, layerId, positionId);
		} else if (status == "" || status == "hidden" || status == "hide") {
			this.showLayer(true, layerId, positionId);
		} else if (status == "visible" || status == "show") {
			this.showLayer(false, layerId, positionId);
		} else {
			//alert('debug:' + status);
		}
	},

	/**
	 * visibility 属性の切替
	 *
	 * @param String id     ID名
	 * @param String value  visibility値
	 */
	switchVisibility:function (id, value) {
		// NNの場合
		if (document.layers) {
			if (document.layers[id]) {
				document.layers[id].visibility = value;
			}
		}
		// IEとNN6の場合
		if (document.getElementById) {
			if (document.getElementById(id)) {
				document.getElementById(id).style.visibility = value;
			}
		}
	},

	/**
	 * display 属性の切替
	 *
	 * @param String id     ID名
	 * @param String value  display値
	 */
	switchDispaly:function (id, value) {
		// NNの場合
		if (document.layers) {
			if (document.layers[id]) {
				document.layers[id].display = value;
			}
		}
		// IEとNN6の場合
		if (document.getElementById) {
			if (document.getElementById(id)) {
				document.getElementById(id).style.display = value;
			}
		}
	},

	/**
	 * レイヤーの背景にIframeを敷く。(IE用)
	 *
	 * @param Object target 対象のオブジェクト
	 */
	openLayerBackground:function (target, position){
		if (target==null) return;
		var layerIframe = this.getLayerBackground(target);
		if (layerIframe==null) layerIframe = this.createLayerBackground(target,this.getLayerBackgroundId(target));

		var width = target.offsetWidth;
		var height = target.offsetHeight;
		var position = position || 'left';
		layerIframe.style.top = target.style.top || "0px";
		if (position == 'right') {
			layerIframe.style.right = target.style.right || "0px";
			layerIframe.style.left = null;
		} else {
			layerIframe.style.left = target.style.left || "0px";
		}
		layerIframe.style.zIndex = target.style.zIndex - 1;
		layerIframe.style.position = "absolute";
		layerIframe.style.display = "block";
		layerIframe.style.width = width || "0px";
		layerIframe.style.height = height || "0px";
	},

	/**
	 * レイヤーの背景に敷いたIframeを消す。(IE用)
	 *
	 * @param Object target 対象のオブジェクト
	 */
	closeLayerBackground:function (target){
		if (target==null) return;
		var layerIframe = this.getLayerBackground(target);
		if (layerIframe!=null) layerIframe.style.display = "none";
	},

	/**
	 * レイヤーの背景に敷くIframeを生成。(IE用)
	 *
	 * @param Object target 対象のオブジェクト
	 */
	createLayerBackground:function (target){
		if (target==null) return null;
		var id = this.getLayerBackgroundId(target);

		if (document.getElementById(id)) {
			return document.getElementById(id);
		}

        var layerIframe = document.createElement("<iframe scrolling='no' frameborder='0'"
                                                +"style='position:absolute;top:0px;left:0px;display:none;'"
                                                +"></iframe>"); 
		layerIframe.name = id;
		layerIframe.id = id;
		if (target.offsetParent==null || target.offsetParent.id=="") {
			window.document.body.appendChild(layerIframe);
		} else {
			target.offsetParent.appendChild(layerIframe);
		}
		return layerIframe;
	},

	/**
	 * レイヤーの背景に敷くIframeのID名をセット。(IE用)
	 *
	 * @param Object target 対象のオブジェクト
	 */
	getLayerBackgroundId:function (target){
		if (target.id==null) return "layerIframe";
		return "layerIframe_"+target.id;
	},

	/**
	 * レイヤーの背景に敷くIframeのオブジェクトをセット。(IE用)
	 *
	 * @param Object target 対象のオブジェクト
	 */
	getLayerBackground:function (target){
		return document.getElementById(this.getLayerBackgroundId(target));
	}
};
