﻿/*--- DOMの差異を吸収するための関数群 ---*/
/*-- ドキュメント系 --*/
/*- Window( Frame )の高さの取得 -*/
function getWindowHeight()
{
	if(window.innerHeight) return window.innerHeight; // Mozilla, Opera, NN4
	if(document.documentElement && document.documentElement.clientHeight) // 以下 IE
		return document.documentElement.clientHeight;
	else if(document.body && document.body.clientHeight)
		return document.body.clientHeight;
	return 0;
}
/*- Window( Frame )の幅の取得 -*/
function getWindowWidth()
{
	if(window.innerWidth) return window.innerWidth; // Mozilla, Opera, NN4
	if(document.documentElement && document.documentElement.clientWidth) // 以下 IE
		return document.documentElement.clientWidth;
	else if(document.body && document.body.clientWidth)
		return document.body.clientWidth;
	return 0;
}
/*- Window( Frame )のスクリーン上の位置（X座標）-*/
function getWinXOffset()
{
	if(window.scrollX) return window.scrollX; // Moziila
	if(window.pageXOffset) return window.pageXOffset; // Opera, NN4
	if(document.documentElement && document.documentElement.scrollLeft) // 以下 IE
		return document.documentElement.scrollLeft;
	else if(document.body && document.body.scrollLeft)
		return document.body.scrollLeft;
	return 0;
}
/*- Window( Frame )のスクリーン上の位置（Y座標）-*/
function getWinYOffset()
{
	if(window.scrollY) return window.scrollY; // Mozilla
	if(window.pageYOffset) return window.pageYOffset; // Opera, NN4
	if(document.documentElement && document.documentElement.scrollTop) // 以下 IE
		return document.documentElement.scrollTop;
	else if(document.body && document.body.scrollTop)
		return document.body.scrollTop;
	return 0;
}

/*-- エレメント系 --*/
/*- ID からエレメントを取得する -*/
function getElemID(_id, _doc)
{ // NN4 未対応
	var e;
	if (!_doc) { _doc = document; }
	if(_doc.getElementById && (e=_doc.getElementById(_id)))
		return e;
	if (_doc.getElementsByName && (e=_doc.getElementsByName(_id)))
		return e[0];
	if (_doc.all && (e=_doc.all[_id])) return e; // IE4
	return null; // NN4
}
/*- エレメントを生成する -*/
function createElem(_tag, _elmOwner)
{
	if(document.createElement && document.body.appendChild ) // IE5+, Mozilla
	{
		var elm = document.createElement(_tag);
		_elmOwner.appendChild(elm);
		return elm;
	}
	if(document.insertAdjacentHTML) return _elmOwner.insertAdjacentHTML("<"+ _tag +" />", "BeforeEnd"); // Opera7
	return null;
}

/*- エレメントの位置（X軸方向）の取得 -*/
function getElemLeft(_elm)
{
	if(typeof(window.crypto)!="undefined" && typeof(window.getComputedStyle)!="undefined") return parseInt(_elm.style.left); // Mozilla(NN6) バグ
	if(document.layers) return _elm.left; // NN4
	return _elm.offsetLeft || _elm.style.pixelLeft || 0; // IE, Mozilla(NN6.1+), Opera
}
/*- エレメントの位置（Y軸方向）の取得 -*/
function getElemTop(_elm)
{
	if(window.crypto && window.getComputedStyle) return parseInt(_elm.style.top); // Mozilla(NN6) バグ
	if(document.layers) return _elm.top; // NN4
	return _elm.offsetTop || _elm.style.pixelTop || 0; // IE, Mozilla(NN6.1+), Opera
}
/*- エレメントの位置（X軸方向）を設定する -*/
function setElemLeft(_elm,_l)
{
	if(document.layers) _elm.moveTo(_l,_elm.top); // NN4
	else if(typeof(_elm.style.left)!="undefined"&& typeof(_elm.style.left)=="string") // IE5+, Mozilla, Opera 7
		_elm.style.left=_l+'px';
	else if(typeof(_elm.style.pixelLeft)!="undefined") // IE4, Opera 6
		_elm.style.pixelLeft=_l;
}
/*- エレメントの位置（Y軸方向）を設定する -*/
function setElemTop(_elm, _t)
{
	if(document.layers) _elm.moveTo(_elm.left,_t); // NN4
	else if(typeof(_elm.style.top)!="undefined"&& typeof(_elm.style.top)=="string") // IE5+, Mozilla, Opera 7
		_elm.style.top =_t +'px';
	else if(typeof(_elm.style.pixelTop)!="undefined") // IE4, Opera 6
		_elm.style.pixelTop =_t;
}
/*- エレメントを絶対値で移動する -*/
function setElemPos(_elm,_l,_t)
{
	if(document.layers) _elm.moveTo(_l,_t); // NN4
	else if(typeof(_elm.style.left)!="undefined"&& typeof(_elm.style.left)=="string"){ // IE5+, Mozilla, Opera 7
		_elm.style.left=_l+'px';
		_elm.style.top =_t+'px';
	}
	else if(typeof(_elm.style.pixelLeft)!="undefined"){ // IE4, Opera 6
		_elm.style.pixelLeft=_l;
		_elm.style.pixelTop =_t;
	}
}
/*- エレメントを相対値で移動する -*/
function setElemPosBy(_elm,_l,_t)
{
	if(document.layers) _elm.moveBy(_l,_t); // NN4
	else if(typeof(window.crypto)!="undefined" && typeof(window.getComputedStyle)!="undefined"){ // Mozilla
		_elm.style.left=(parseInt(_elm.style.left)+Math.round(_l))+'px';
		_elm.style.top =(parseInt(_elm.style.top) +Math.round(_t) )+'px';
	}
	else if(typeof(_elm.style.left)!="undefined"&& typeof _elm.style.left=="string"){ // IE5+, (Mozilla), Opera
		_elm.style.left=(_elm.offsetLeft+Math.round(_l))+'px';
		_elm.style.top =(_elm.offsetTop +Math.round(_t) )+'px';
	}
	else if(typeof(_elm.style.pixelLeft)!="undefined"){ // IE4
		_elm.style.pixelLeft+=Math.round(left);
		_elm.style.pixelTop +=Math.round(top);
	}
}

/*- エレメントの幅を取得する -*/
function getElemWidth(_elm)
{
	return document.layers? _elm.clip.width: (_elm.offsetWidth || _elm.style.pixelWidth || 0);
}
/*- エレメントの高さを取得する -*/
function getElemHeight(_elm)
{
	return document.layers? _elm.clip.height: (_elm.offsetHeight || _elm.style.pixelHeight || 0);
}
/*- エレメントの幅を指定する -*/
function setElemWidth(_elm, _w)
{
	if(document.layers) _elm.resizeTo(width, _elm.clip.height); // NN4
	else if(typeof(_elm.style.width)!="undefined"&& typeof(_elm.style.width)=="string") // IE5+, Mozilla, Opera 7
		_elm.style.width =_w +'px';
	else if(typeof(_elm.style.pixelWidth)!="undefined") // IE4, Opera 6
		_elm.style.pixelWidth  = _w;
}
/*- エレメントの高さを指定する -*/
function setElemHeight(_elm, _h)
{
	if(document.layers) _elm.resizeTo(_elm.clip.width, _h); // NN4
	else if(typeof(_elm.style.height)!="undefined"&& typeof(_elm.style.height)=="string") // IE5+, Mozilla, Opera 7
		_elm.style.height =_h +'px';
	else if(typeof(_elm.style.pixelHeight)!="undefined") // IE4, Opera 6
		_elm.style.pixelHeight  = _h;
}
/*- エレメントのサイズを絶対値で設定する -*/
function setElemSize(_elm, _w, _h){
	if(document.layers) _elm.resizeTo(_w, _h); // NN4
	else if(typeof(_elm.style.width)!="undefined"&& typeof(_elm.style.width)=="string"){ // IE5+, Mozilla, Opera 7
		var tmp, n;
		var nBorderX = 0;
		var nBorderY = 0;
		if (tmp = _elm.currentStyle) {
			nBorderX += isNaN(n = parseInt(tmp.paddingLeft))?	0: n;
			nBorderX += isNaN(n = parseInt(tmp.paddingRight))?	0: n;
			nBorderY += isNaN(n = parseInt(tmp.paddingTop))?	0: n;
			nBorderY += isNaN(n = parseInt(tmp.paddingBottom))?	0: n;
		}
		_elm.style.width =_w - nBorderX +'px';
		_elm.style.height=_h - nBorderY +'px';
	}
	else if(typeof _elm.style.pixelWidth!="undefined"){ // IE4, Opera 6
		_elm.style.pixelWidth  = _w;
		_elm.style.pixelHeight = _h;
	}
}
/*- エレメントをサイズを相対値で指定する -*/
function setElemSizeBy(_elm, _w, _h)
{
	if(document.layers) _elm.resizeBy(_w, _h); // NN4
	else if(typeof(_elm.style.width)!="undefined"&& typeof(_elm.style.width)=="string"){ // IE5+, Mozilla, Opera 7
		_elm.style.width =(_elm.offsetWidth +Math.round(_w))+'px';
		_elm.style.height=(_elm.offsetHeight+Math.round(_h))+'px';
	}
	else if(typeof(_elm.style.pixelWidth)!="undefined"){ // IE4, Opera 6
		_elm.style.pixelWidth +=Math.round(_w);
		_elm.style.pixelHeight+=Math.round(_h);
	}
}

/*- エレメントの表示／非表示の設定 -*/
function setElemVisibility(_elm, _visible)
{
	(_elm.style||_elm).visibility=(_visible)? ((window.opera && !document.documentElement)? 'visible' :'inherit') :'hidden';
}


/*-- コントロール関連 --*/
/*- Select コントロールで、現在選択中のオプションを返す -*/
function getCurrentOption(_e)
{
	if (!_e || _e.selectedIndex < 0) return null;
	return _e.options[_e.selectedIndex];
}

/*-- イベント関連 --*/
/*- イベントをキャンセルする -*/
function cancelEvent(_evt)
{
	if (window.event)		{ window.event.returnValue = !(window.event.cancelBubble = true); }
	else if (_evt)			{ if (_evt.preventDefault) { _evt.preventDefault(); _evt.stopPropagation();}}
	return false;
}
/*- イベント発生時のドキュメント上の座標（X座標） -*/
function getEventPageX(_e)
{
	var e = _e;
	if(!e && !(e = window.event)) return;
	if(window.opera) return (document.documentElement? window.pageXOffset: 0) + e.clientX; // Opera
	if(e.pageX) return e.pageX; // Mozilla, NN4, Safari
	if(e.clientX){ // IE
		var sl=0;
		if(document.documentElement && document.documentElement.scrollLeft)
			sl=document.documentElement.scrollLeft;
		else if(document.body && typeof(document.body.scrollLeft)!="undefined")
			sl=document.body.scrollLeft - document.body.clientLeft;
		else
			sl=(window.scrollX || window.pageXOffset);
		return sl+e.clientX;
	}
	return 0;
}
/*- イベント発生時のドキュメント上の座標（Y座標） -*/
function getEventPageY(_e)
{
	var e = _e;
	if(!e && !(e = window.event)) return;
	if(window.opera) return (document.documentElement? window.pageYOffset: 0) + e.clientY; // Opera
	else if(e.pageY) return e.pageY; // Mozilla, NN4, Safari
	else if(e.clientY){ // IE
		var st=0;
		if(document.documentElement && document.documentElement.scrollTop)
			st=document.documentElement.scrollTop;
		else if(document.body && typeof(document.body.scrollTop)!="undefined")
			st=document.body.scrollTop - document.body.clientTop;
		else
			st=(window.scrollY || window.pageYOffset);
		return st+e.clientY;
	}
	return 0;
}
/*- イベント発生時の発生元エレメントのドキュメント上の座標（X座標） -*/
function getEventPageSrcX(_e)
{
	var e = _e, tmp;
	if(!e && !(e = window.event)) return;
	if(!e.srcElement) return 0;
	tmp = ((tmp = e.srcElement.parentElement) && (tmp = tmp.parentElement) && (tmp = tmp.parentElement) && tmp.cellPadding);
	if (isNaN(tmp)) tmp = ((tmp = e.srcElement.currentStyle) && isNaN(tmp = parseInt(tmp.paddingTop))? 0: tmp)
	return getEventPageX(e) - (e.offsetX || 0) - tmp;
}
/*- イベント発生時の発生元エレメントのドキュメント上の座標（Y座標） -*/
function getEventPageSrcY(_e)
{
	var e = _e, tmp;
	if(!e && !(e = window.event)) return;
	if(!e.srcElement) return 0;
	tmp = ((tmp = e.srcElement.parentElement) && (tmp = tmp.parentElement) && (tmp = tmp.parentElement) && tmp.cellPadding);
	if (isNaN(tmp)) tmp = ((tmp = e.srcElement.currentStyle) && isNaN(tmp = parseInt(tmp.paddingLeft))? 0: tmp)
	return getEventPageY(e) - (e.offsetY || 0) - tmp;
}
/*--- 文字列操作関数群 ---*/
// ---------------------------
// 説明：	指定された文字に一定文字列ごとにトークを挿入します。
// 引数：	_sString		対象となる文字列
// 			_nLength		インターバル
// 			_sToken			区切り文字（オプション）
// 			_blRight		文字列のカウント方向（オプション）true:右から
// 返り値：	生成された文字列
function InsertToken(_sString, _nLength, _sToken, _blRight)
{
	_sString	= _sString.toString();
	var nStart	= _nLength;
	var nLen	= _sString.length;
	if (!nLen) return "";

	if (typeof(_sToken) == "undefined" || !_sToken.length) _sToken = ",";
	if (typeof(_blRight) == "undefined" || _blRight)
		if ((nStart = nLen % _nLength) == 0)
			nStart = _nLength;
	var sRet = _sString.substr(0, nStart);
	if (nLen > _nLength)
	{
		for (var i=1; i*_nLength < nLen; i++)
		{
			sRet += _sToken + _sString.substr(nStart, _nLength);
			nStart += _nLength;
		}
	}
	return sRet;
}



/*--- その他の関数群 ---*/
// ---------------------------
// 説明：	マウス直下の行に色を付ける。
// 引数：	_eRow		マウス直下の TR エレメント
// 引数：	_nRows		色を変える行数 (_eRow から数える)
function TrackingRow(_eRow, _nRows)
{
	if (!_eRow) return;
	if (!_nRows) _nRows=1;
	var eP=_eRow.parentNode;
	if (eP._oldRow)
	{
		if (eP._oldRow == _eRow) { return; }
		for (var i=0,e=eP._oldRow; (i<_nRows)&&e; i++,e=e.nextSibling)
		{
			e.style.backgroundColor = eP._oldRowColor;
		}
	}
	eP._oldRow = _eRow;
	for (var i=0,e=_eRow; (i<_nRows)&&e; i++,e=e.nextSibling)
	{
		eP._oldRowColor = e.style.backgroundColor;
		e.style.backgroundColor = "#B8CFFF";
	}
	var e = _eRow.parentElement;
	for (;e;e=e.parentElement)
	{
		if (e.tagName == "TABLE") break;
	}
	if (e) { e.eCurrentRow = _eRow; }
}
// ---------------------------
// 説明：	ターゲットをクリックする
// 引数：	_sElem		クリックするターゲットエレメント
function ClickElem(_sElem)
{
	var e = getElemID(_sElem);
	if (e) e.click();
}
// ---------------------------
// 説明：	画像を先読み込みする
// 引数：	_ary	URL の配列
function PreloadImg(_ary)
{
	var d,a=new Array(),i,l=_ary.length;
	if(!((d=document) && d.images)) return a;
	for(i=0;i<l;i++){ a[i]=new Image;a[i].src=_ary[i]; }
	return a;
}
