/*************************************************************************
 * JQuery利用ヘッダ固定 4.3.5.0 (2009/02/01) 追加
 * Revision: $Id: scrollBar2.js,v 1.3 2009/03/11 01:08:18 C21044 Exp $
 *************************************************************************/

/* 旧関数を呼び出した場合はアラートを出す（旧の*_inof.jsp対策） */
// function scrollBar2( obj ){alert("custom/query_info.jsp及びcustom/result_info.jspで次の部分を削除して下さい。\n<script>タグ（ヘッダ固定とフォーカス）、BODYのonLoadとoncontextmenu属性、scrollBar2(...)");}
// function AdjustScroll2( obj ){alert("custom/query_info.jsp及びcustom/result_info.jspで次の部分を削除して下さい。\n<script>タグ（ヘッダ固定とフォーカス）、BODYのonLoadとoncontextmenu属性、AdjustScroll2(...)");}

function scrollBar2( obj ){alert("Old Script Error!!\ncustom/query_info.jsp,custom/result_info.jsp Please delete the following part.\n<script>Tag(Header fix and Focus) , BODY onLoad and oncontextmenu Attribute. scrollBar2(...)");}

function AdjustScroll2( obj ){alert("Old Script Error!!\ncustom/query_info.jsp,custom/result_info.jsp Please delete the following part.\n<script>Tag(Header fix and Focus) , BODY onLoad and oncontextmenu Attribute. AdjustScroll2(...)");}

// エラー対応のために空メソッドを用意
function SetScrollHeader( obj ){}

(function ($) {
/*
 * scrollBar3.js 0.01
 * HYBS grid
 * Date: 2008-09-12 rev 1
 * Revised from : 1.jqGrid - jQuery plugin
 *				  2.DataGrid - dojo.dojox
 */

$.hgrid = $.hgrid || {};
$.hgrid.defaults = {
	sGantBody: "GantBody",
	sViewTable: "viewTable",
	sGridList: "GridList",
	sInAdjusting: "__bInAdjusting"
};

// Clear old header fix
/*
//(function() {
//	var fClear = function (){};
//
//	// Clear events
//	$.each(["onresize", "beforeunload"], function() {
//		if(window[this]) { window[this] = null; }
//	});
//
//	// Clear event handler
//	$.each(["scrollBar", "AdjustScroll", "scrollBar2", "AdjustScroll2", "SetScrollHeader"], function() {
//		if(window[this]) { window[this] = fClear; }
//	});
//})();
*/

//hgridデフォルトのロード関数
$.hgrid.load = function (evt) {
	var jTbls = $("div > div > div > div > table.viewTable");

	//左右に配置して、同時に動く場合に、左右の行の高さを調整する
	var gantBody = $("#"+$.hgrid.defaults.sGantBody+":first");
	$(window).data("gantBody",gantBody);

	if( gantBody.length > 0 && jTbls.length == 2 ) {
//		$("#GantBody").heightReset();
		gantBody.heightReset();
	}

// 5.3.2.0 (2011/02/01) Modify
	jTbls.each( function(i) {
		cacheHW( $(this) );
	});

	//テーブルのヘッダ固定と画面の幅、高さの調整
//	div#divPos > div#outer > div#layer > div#divHide > table.viewTable
//	$("div > div > div > div > table.viewTable").hybsGrid().adjustSB();
	jTbls.hybsGrid().adjustSB();

	//元のfocus2の実行
	if(focus2) { focus2(); }
};

//hgridデフォルトのリサイズ関数
	$.hgrid.resize = function (evt) {
	//画面のサイズ変更中のフラグ
	var bInAdjusting = $(this).data($.hgrid.defaults.sInAdjusting);
	if(!bInAdjusting) {
		$(this).data($.hgrid.defaults.sInAdjusting, true);
		//IEの複数回のresizeを避けるため、実際のサイズ変更はsetTimeoutに実行される
// 5.1.6.0 (2010/05/01) UNCOMMENT
		setTimeout(function() {
			var sGridList = $.hgrid.defaults.sGridList;
			var listGrid = $(window).data(sGridList);
			//サイズ変更の必要があるテーブルのサイズ調整
			if(listGrid) { $.each(listGrid, function() { $(this.oTab).adjustSB();}); }
			$(window).data($.hgrid.defaults.sInAdjusting, false);
		}, 100);
	}
};

//hgridデフォルトのアンロード関数
$.hgrid.unload = function (evt) {
	var sGridList = $.hgrid.defaults.sGridList;
	var listGrid = $(this).data(sGridList);
	if(listGrid) {
		//今までヘッダ固定のテーブルに保存した全てのデータの解放
		$.each(listGrid, function() { this.oTab.grid = this.oTab.p = null;});

		// Clear array
		listGrid.length = 0;
	}
	$(this).removeData(sGridList) ;
	$.hgrid = null;
};

//hgridイベントの登録
$(window).unbind("load.hgrid").bind("load.hgrid", $.hgrid.load)
		 .unbind("resize.hgrid").bind("resize.hgrid", $.hgrid.resize)
		 .unbind("unload.hgrid").bind("unload.hgrid", $.hgrid.unload);

//IEとFirfoxのスクロールバーの幅を求める
var getSBWidth = function () {
	//この関数中のSBWidth変数に幅が設定されていなかったら、すぐ下の関数で求められる
	return arguments.callee.SBWidth || 
		(arguments.callee.SBWidth = 
			(function () {
				//見えない二つのdivを作ってから、スクロールバーの幅を計算する
				//From http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php
				var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div>'); 
				// Append our div, do our calculation and then remove it 
				$('body').append(div); 
				var w1 = $('div', div).innerWidth(); 
				div.css('overflow-y', 'scroll'); 
				var w2 = $('div', div).innerWidth(); 
				$(div).remove(); 
				return (w1 - w2); 
			})()
		);
};

//テーブルの高さ、幅をキャッシュする
var cacheHW = function ( jTs ) {
	if( jTs.data("cache") ) { return; }

// 5.4.0.0 (2011/10/01) Add
	var isMSIE = $.browser.msie ? true:false;

	jTs.parent().attr("id", "divHide2" ).css({width:"10000em"})

// 5.4.0.0 (2011/10/01) Modify
//	jTs.data("tbw",jTs.outerWidth());
//	jTs.data("tbh",jTs.outerHeight());

	var thw = [];
	var jThead = $("thead:first", jTs);
	var jTrTh = $("tr th", jThead);
	jTs.data("thead",jThead);
	jTs.data("trTh",jTrTh);
	jTrTh.each( function(j) {
// 5.4.0.0 (2011/10/01) Modify
//		thw[j] = $(this).outerWidth() || $(this).innerWidth();
// 5.4.2.0 (2011/12/01) Modify
//		thw[j] = isMSIE ? $(this).outerWidth() || $(this).innerWidth() : $(this).width();
		thw[j] = isMSIE ? $(this).innerWidth() : $(this).width();
	});
	jTs.data("thw",thw);

	var jFirstTr = $.hybs.getHybsTr(jTs.find("tbody tr:first"));
	jTs.data("firstTr",jFirstTr);

// 5.4.0.0 (2011/10/01) Modify
//	var trh = jFirstTr.outerHeight() || jFirstTr.innerHeight();
	var trh = isMSIE ? jFirstTr.outerHeight() || jFirstTr.innerHeight() : jFirstTr.height();
	jTs.data("trh",trh);

	var tdw = [];
	var tdh = [];
	var jFirstTrTd = $("td", jFirstTr);
	jTs.data("firstTrTd",jFirstTrTd);
	jFirstTrTd.each( function(j) {
// 5.4.2.0 (2011/12/01) Add
		// イベントカラム対応(幅/高さが明示指定されていない場合、一旦autoに戻して表示幅/高さを求める)
		// このauto関係処理のみを事前に行った方が横幅と高さの計算は上手くいくが、ヘッダの高さの計算が
		// (offsetHeightの取得タイミングがあり）上手くいかないため、今の段階ではこのままにする。
		// bodyのtdに対してwidth,heightを指定する事で回避可能。
		if( $(this).find(".h_evElm").length > 0 ) {
			// 2回目以降(イベントカラム発動時に一旦autoに戻す
			if( $(this).attr("wa") == "true" )	{ $(this).css("width","auto"); }
			if( $(this).attr("ha") == "true" )	{ $(this).css("height","auto"); }

			// 幅/高さがautoの要素をマーキングしておく
			if( $(this).css("width") == "auto" )	{ $(this).attr("wa","true"); }
			if( $(this).css("height") == "auto" )	{ $(this).attr("ha","true"); }
		}
// 5.4.0.0 (2011/10/01) Modify
//		tdw[j] = $(this).outerWidth() || $(this).innerWidth();
//		tdh[j] = $(this).height();
// 5.4.2.0 (2011/12/01) Modify
//		tdw[j] = isMSIE ? $(this).outerWidth() || $(this).innerWidth() : $(this).width();
//		tdh[j] = isMSIE ? $(this).outerHeight() || $(this).innerHeight() : $(this).height();
		tdw[j] = isMSIE ? $(this).innerWidth() : $(this).width();
		tdh[j] = $(this).height();
	});

	jTs.data("tdw",tdw);
	jTs.data("tdh",tdh);

	jTs.data("cache",true);
}

var clearCache = function ( jTs ) {
	jTs.data("cache",false);
}

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++ 元のハヤブサのheightResetを改造して、jQuery対応の形で 	  ++
// ++ 左右分割画面の行の高さを調節する			 				  ++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$.fn.heightReset = function( opts ) {
	p = $.extend(true, {}, $.hgrid.defaults, opts || {});

	return this.each( function() {
//		// Container has an id named GantBody
//		if(this.id != p.sGantBody) return;

//		//クラスviewTableのテーブルが二つの場合だけに限定する
		var jTabs = $("table." + p.sViewTable, this);
//		if(jTabs.length != 2) return;

		var x1Tabs = jTabs.get(0);
		var x2Tabs = jTabs.get(1);
		var x1Rows = x1Tabs.rows, x2Rows = x2Tabs.rows;

		var wkHeight, nRowCnt = x1Tabs.rows.length;
		// 3.6.0.7 (2004/11/06) Only the header is separately set.
		if( nRowCnt > 0 ) {
			wkHeight = Math.max(x1Tabs.rows[0].offsetHeight, x2Tabs.rows[0].offsetHeight);
			// One with a large header is adopted.
			x1Rows[0].style.height = x2Rows[0].style.height = wkHeight + "px";
		}

		var isMSIE = $.browser.msie ? true:false;
//		var isMoz = $.browser.mozilla ? true:false;
//		var isOpera = $.browser.opera ? true:false;
//		var isSafari = $.browser.safari ? true : false;
//		var defaultView = document.defaultView || {};
		// Reset to 0;
		wkHeight = 0;
		// The height of the cell is matched to the maximum value of first five rows in the tbody data.
		var i;
		for( i = 1; i < nRowCnt && i < 6; i++) {
			if(isMSIE) {
				if("auto" != x1Rows[i].currentStyle.height) {continue;}
			}
//			else if(isMoz) {
//				if("auto" != defaultView.getComputedStyle(x1Rows[i], null).getPropertyValue("height")) {continue;}
//			}

			// One with large data is adopted.
			wkHeight = Math.max(wkHeight, Math.max(x1Rows[i].offsetHeight, x2Rows[i].offsetHeight));
		}
		// The height of the cell is matched to the maximum value data.
		for( i = 1; i < nRowCnt; i++) {
			if(isMSIE) {
				if("auto" != x1Rows[i].currentStyle.height) {continue;}
			}
			//else if(isMoz) {
			//	  if("auto" != defaultView.getComputedStyle(x1Rows[i], null).getPropertyValue("height")) {continue;}
			//}

			x1Rows[i].style.height = x2Rows[i].style.height = wkHeight + "px" ;
		}
	});
};
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++ ヘッダ固定のメーンjQuery関数								  ++
// ++	nFixHDataRow ⇒ データ行が固定したい行数				  ++
// ++	bX1VScroll ⇒ 左右分割の左側の縦スクロールバーの表示可否  ++
// ++	bX2VScroll ⇒ 左右分割の右側の縦スクロールバーの表示可否  ++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$.fn.hybsGrid = function( opts ) {
	opts = $.extend(true, {
		selrow: null,
		multiselect: false,
		multikey: false,
		nHoriExtra: 16,
		nVertExtra: 10,
		nMinLimit: 50,
// 5.4.0.0 (2011/10/01)
//		nWidthScroll: 16,
		nWidthScroll: getSBWidth(),
//		nFixHDataRow: 0,
		bX1VScroll: false,
		bX2VScroll: true
	}, $.hgrid.defaults, opts || {});

	//ヘッダ固定の基本情報
	var gridDef = { 		
//		headers:[],
//		cols:[],
//		dragStart: function(i,x) {
//			//ヘッダの項目の幅変更が始まる時に呼ばれる関数
//			this.resizing = { idx: i, startX: x};
//			this.hDiv.style.cursor = "e-resize";
//		},
//		dragMove: function(x) {
//			//ヘッダの項目の幅変更最中に呼ばれる関数
//			if(this.resizing) {
//				var diff = x-this.resizing.startX;
//				var h = this.headers[this.resizing.idx];
//				var newWidth = h.width + diff;
//				var msie = $.browser.msie;
//				if(newWidth > 30) {
//					h.el.style.width = newWidth+"px";
//					h.newWidth = newWidth; 
//					this.cols[this.resizing.idx].style.width = newWidth+"px";
//					this.newWidth = this.width+diff;
//					//$('table:first',this.bDiv).css("width",this.newWidth +"px");
//					//$('table:first',this.hDiv).css("width",this.newWidth +"px");
//					var scrLeft = this.bDiv.scrollLeft;
//					this.hDiv.scrollLeft = this.bDiv.scrollLeft;
//					if(msie) {
//						if(scrLeft - this.hDiv.scrollLeft >= 5) {this.bDiv.scrollLeft = this.bDiv.scrollLeft - 17;}
//					}
//				}
//			}
//		},
//		dragEnd: function() {
//			//ヘッダの項目の幅変更終了の時に呼ばれる関数
//			this.hDiv.style.cursor = "default";
//			if(this.resizing) {
//				var idx = this.resizing.idx;
//				this.headers[idx].width = this.headers[idx].newWidth || this.headers[idx].width;
//				this.cols[idx].style.width = this.headers[idx].newWidth || this.headers[idx].width;
//				if(this.newWidth) {this.width = this.newWidth;}
//				this.resizing = false;
//			}
//		},
		scrollGrid: function() {
			//スクロールバーを移動時に呼ばれる関数
			var $grid = this;
			var scrollTop  = $grid.bDiv.scrollTop;
//			var scrollLeft = $grid.bDiv.scrollLeft;
			//新ヘッダの位置を変更する
			$grid.hDiv.scrollLeft = $grid.bDiv.scrollLeft;
			//左右分割の時
			//左にヘッダ固定テーブルがあれば、スクロール位置も変更
			if($grid.oPrev) {
				var bDivPrev = $grid.oPrev.grid.bDiv;
				if(scrollTop != bDivPrev.scrollTop) { bDivPrev.scrollTop = scrollTop; }
			}
			//右にヘッダ固定テーブルがあれば、スクロール位置も変更
			if($grid.oNext) {
				var bDivNext = $grid.oNext.grid.bDiv;
				if(scrollTop != bDivNext.scrollTop) { bDivNext.scrollTop = scrollTop; }
			}
		}
	};
//	$.fn.getInd = function(obj,rowid,rc){
//		var ret =false;
//		$(obj).each(function(i){
//			if(this.id==rowid) {
//				ret = rc===true ? this : i;
//				return false;
//			}
//		});
//		return ret;
//	};
//	$.fn.setSelection = function(selection,sd)	{
//		return this.each(function(){
//			var t = this, pt;
//			if(selection===false) {pt = sd;}
//			else { var ind = $(t).getInd(t.rows,selection); pt=$(t.rows[ind]);}
//			selection = $(pt).attr("id");
//			if (!pt.html()) {return;}
//			if(!t.p.multiselect) {
//				if( t.p.selrow ) {$(t.rows[t.p.selindex]).removeClass("selected");}
//				t.p.selrow = $(pt).attr("id"); t.p.selindex = $(pt)[0].rowIndex;
//				$(pt).addClass("selected");
//			} 
//		});
//	};
	//ヘッダ固定の幅と高さの調節ためのjQuery関数
	$.fn.adjustSB = function(shrink) {
		return this.each(function(){
			var $t = this;
			if (!$t.grid ) {return;}
			if(typeof shrink != 'boolean') {shrink=true;}

			var jTS = $($t);

// 5.1.3.0 (2010/02/01) Add
// 5.1.6.0 (2010/05/01) Del ヘッダーにつけたデータを隠すのは、ボディ部分のtopではなく、ヘッダーのheightで指定
//			//IEのcolspan問題対応のため、ヘッダーにつけたデータは、本来のデータ行で隠す
//			if( $t.grid.firstRowHeight ) {
//				$($t.grid.bDiv).css("top",-1*$t.grid.firstRowHeight);
//			}

			var nDum, oDum;
			//新ヘッダ外のdiv幅の設定
			oDum = $t.grid.hTable.parentNode;
			// Ensure headNodeContainer is equal or wider than table header
			if(oDum.style.width) { oDum.style.width = $t.grid.hTable.offsetWidth+"px"; }

			//元のテーブルのヘッダをその外のdivで隠すようにする
			var oDivHide = $t.grid.bHide;
			var jHdr = $("thead:first", $t);
			nDum = jHdr.outerHeight() + 2 * jHdr[0].offsetTop;
// 5.3.2.0 (2011/02/01) Modify
// 5.4.0.0 (2011/10/01) Modify
			oDivHide.style.width = jTS.outerWidth() + "px";
			oDivHide.style.height = jTS.outerHeight() - nDum + "px";
//			oDivHide.style.width = jTS.data("tbw") + "px";
//			oDivHide.style.height = jTS.data("tbh") - nDum + "px";
//			oDivHide.style.height = jTS.outerHeight() + "px";
			oDivHide.scrollTop = nDum;

			var nOldHoriLimit = 0, nOldVertLimit = 0;
			while(true) {
				var nWinWidth = $(window).width();
				var nWinHeight = $(window).height();
				var jBDiv = $($t.grid.bDiv);
				var osTab = jBDiv.offset();

				//画面に表示できるテーブルの幅と高さを求める
				var nwidth, nheight, oflX, oflY, bHoriScroll, bVertScroll;
				//var bHasNext = ($t.grid.oNext ? true : false);
				var oNext = $t.grid.oNext, oPrev = $t.grid.oPrev;
				var nHoriLimit, nVertLimit;
				//画面に表示できる範囲の幅と高さ(FireFoxにosTabのオフセットは小数点がある)
				nHoriLimit = Math.max(nWinWidth - Math.ceil(osTab.left) - $t.p.nHoriExtra, $t.p.nMinLimit);
				nVertLimit = Math.max(nWinHeight - Math.ceil(osTab.top) - $t.p.nVertExtra, $t.p.nMinLimit);
				//実際のテーブルの表示できる幅と高さを計算する(ユーザー指定優先)
// 5.1.4.0 (2010/03/01) Modify
//				nHoriLimit = ($t.p.width ) ? parseInt($t.p.width  , 10) : nHoriLimit;
//				nVertLimit = ($t.p.height) ? parseInt($t.p.height , 10) : nVertLimit;
				nHoriLimit = ($t.p.width ) ? ( $t.p.width.indexOf("%")  < 0 ? parseInt($t.p.width,10)  : nHoriLimit*(parseInt($t.p.width,10) /100) ) : nHoriLimit;
				nVertLimit = ($t.p.height) ? ( $t.p.height.indexOf("%") < 0 ? parseInt($t.p.height,10) : nVertLimit*(parseInt($t.p.height,10)/100) ) : nVertLimit;
				// 可視範囲が拡大されていない限り、ロープを終了させる
				if((nHoriLimit <= nOldHoriLimit) && (nVertLimit <= nOldVertLimit)) { break; }

				var nMainTabW = $t.offsetWidth, nMainTabH = oDivHide.offsetHeight;
				nwidth  = nHoriLimit;
				nheight = nVertLimit;
			//	var bHoriScroll, bVertScroll;

				// There exists a scroll grid in the left 
				//if($t.grid.oNext) {
				//	  nwidth = $t.offsetWidth;
				//	  oflX = "hidden";
				//	  oflY = "hidden";
				//	  bVertScroll = false;
				//	  bHoriScroll = false;
				//}
				//else {
					var nHoriDiff = (nwidth - nMainTabW);
					var nVertDiff = (nheight - nMainTabH);
											  
					bHoriScroll = (nHoriDiff < 0);
					bVertScroll = (nVertDiff < 0);

//					// 左右分割画面の左画面の時、垂直スクロールバーが表示したくない時
//					if(oNext && !$t.p.bX1VScroll) bVertScroll = false;

					//水平と垂直にスクロールバーが出るか、出ないか、或いは出せないかを判別
					var bHoriPermit, bVertPermit;
					bHoriPermit = bVertPermit = false;
					if(!bHoriScroll && $t.p.nWidthScroll > nHoriDiff) {
						bHoriPermit = bVertScroll || ($t.p.nWidthScroll > nVertDiff);
					}
					if(!bVertScroll && $t.p.nWidthScroll > nVertDiff) {
						bVertPermit = bHoriScroll || ($t.p.nWidthScroll > nHoriDiff);
					}

					//左右分割画面の左画面に水平スクロールがある場合
					if(oPrev && oPrev.grid.bHoriScroll) { bHoriPermit = false; }

//					// 左右分割画面の左画面の時、垂直スクロールバーが表示したくない時
//					if(oNext && !$t.p.bX1VScroll) bVertScroll = false;

					if(bHoriPermit) { bHoriScroll = true; }
					if(bVertPermit) { bVertScroll = true; }

// 5.3.7.0 (2011/07/01)
					// 左右分割画面の左画面の時、垂直スクロールバーが表示したくない時
					if(oNext && !$t.p.bX1VScroll) bVertScroll = false;

					oflX = bHoriScroll ? "scroll" : "hidden";
					oflY = bVertScroll ? "scroll" : "hidden";

					//nwidth  -= (bVertScroll ? $t.p.nWidthScroll : 0);
					//nheight -= (bHoriScroll ? $t.p.nWidthScroll : 0);
				//}

				//テーブル外要素の幅と高さ変更
				nwidth  = Math.min(nwidth , nMainTabW + (bVertScroll ? $t.p.nWidthScroll : 0));
				nheight = Math.min(nheight, nMainTabH + (bHoriScroll ? $t.p.nWidthScroll : 0));

				//gridにスクロールを保存
				$t.grid.bHoriScroll = bHoriScroll;
				$t.grid.bVertScroll = bVertScroll;
				$t.grid.width  = nwidth;
				$t.grid.height = nheight;

				//左右分割場合、前のテーブルを調節
				if(oPrev) {
					// 左右分割画面の左ビューの高さの計算
					var nX1H = nheight - (bHoriScroll ? $t.p.nWidthScroll : 0) + (oPrev.grid.bHoriScroll ? $t.p.nWidthScroll : 0);
					if(nX1H != oPrev.grid.height) {
						// 左右分割画面の左ビューのlayerとouterの高さの再設定
						oPrev.grid.height = nX1H;
						var nPrevHDivHeight = oPrev.grid.hDiv.offsetHeight;
						var jPrevBDiv = $(oPrev.grid.bDiv);
						jPrevBDiv.css("height", nX1H + "px").parent().css({height: nX1H + nPrevHDivHeight + "px"});
					}
				}

				//新ヘッダ幅の設定
				$($t.grid.hDiv).width(nwidth - (bVertScroll ? $t.p.nWidthScroll : 0));
// 5.1.6.0 (2010/05/01) Add
				if( $t.grid.firstRowHeight ) {
					var fstRH = $t.grid.firstRowHeight;
					$t.grid.firstRowHeight = null;
					$($t.grid.hDiv).height($t.grid.hDiv.offsetHeight - fstRH);
				}

// 5.1.3.0 (2010/02/01) Modify
//				var nHDivHeight = $t.grid.hDiv.offsetHeight;
//				var nHDivHeight = $t.grid.hDiv.offsetHeight - ( $t.grid.firstRowHeight ? $t.grid.firstRowHeight : 0 );
// 5.1.6.0 (2010/05/01) Modify
				var nHDivHeight = $t.grid.hDiv.offsetHeight;
				jBDiv.css({ 
					   width: nwidth + "px",
					   height: nheight+ "px",
					   "overflow-x": oflX, "overflow-y": oflY
				}).parent().css({
					   height: nheight + nHDivHeight + "px",
					   width: nwidth + "px"
				});

				// IE6の初期スクロールバー使用不可のバグ対処
				if($.browser.msie && parseInt($.browser.version,10) < 7 && jHdr[0]) {
					jHdr[0].style.padding = jHdr[0].currentStyle.padding;
				}
				// 可視範囲を保存しとく
				nOldHoriLimit = nHoriLimit;
				nOldVertLimit = nVertLimit;
			}

			// 5.1.8.0 (2010/07/01) 左右分割で画面遷移時に左右位置が異なるバグを修正
			// 5.2.0.0 (2010/09/01) 動的に要素を追加・変更した場合にヘッダーを合わなくなるため常にscrollGridを呼び出し
//			if( $t.grid.oPrev ) {
				$t.grid.scrollGrid();
//			}
		});
	};
	return this.each( function(nTabIdx) {

// 5.1.3.0 (2010/02/01) Comment
//		if(this.grid) {return;}
		// Must have scroll bar div structure
//		if("divHide" != this.parentNode.id) {return;}
		if("divHide" != this.parentNode.id && "divHide2" != this.parentNode.id) {return;}

		var ts = this, jTS = $(ts);

		var isMSIE = $.browser.msie ? true:false;
//		var isMoz = $.browser.mozilla ? true:false;
//		var isOpera = $.browser.opera ? true:false;
//		var isSafari = $.browser.safari ? true : false;

		var grid = $.extend(true, {}, gridDef);
		var p = $.extend(true, {}, opts);

//		var colNames = p.colNames = [];
		var colModel = p.colModel = [];
//		var nDum, oDum, jDum;
//		var oDum, jDum;

		cacheHW( jTS );

// 5.1.3.0 (2010/02/01) Modify
//		jTS.parent().attr("id", "divHide2" ).css({width:"10000em"});

		//テーブルヘッダの幅の保存
		var isCheckFirstRow = false;
//		$("thead tr th", this).each(function(idx) {
		jTS.data("trTh").each(function(idx) {
			var jTh = $(this);
//			colNames[idx] = jTh.text();
//			var field = jTh.attr("field") || colNames[idx];
			var field = jTh.attr("field") || jTh.text();

// 5.1.4.0 (2010/03/01) Modify
//			if(isMSIE) { nDum = jTh.innerWidth() || jTh.outerWidth(); }
//			else { nDum = jTh.width(); }
//			nDum = jTh.innerWidth() || jTh.outerWidth();
// 5.3.2.0 (2011/02/01) Modify
//			nDum = jTS.data("thw")[idx];

// 5.1.3.0 (2010/02/01) Add
			// IEでは、theadとtbodyのcolspanの構造が異なる場合に、theadのthにwidthを設定しただけでは
			// 正しく表示されないため、colSpanが含まれる場合は、データの一行目のcolSpanの構造を解析し、
			// ヘッダーの後ろにつけた上で表示する。
			if( isMSIE && jTh.attr("colSpan") > 1 ) { isCheckFirstRow = true; }
//			if( isMSIE ){ colModel[idx] = {name:field, index:field, width:nDum, align:"left", colspan:jTh.attr("colSpan") }; }
//			else		{ colModel[idx] = {name:field, index:field, width:nDum, align:"left" }; }
			if( isMSIE ){ colModel[idx] = {name:field, index:field, width:jTS.data("thw")[idx], colspan:jTh.attr("colSpan") }; }
			else		{ colModel[idx] = {name:field, index:field, width:jTS.data("thw")[idx] }; }
		});

		var isAddFirstRow = false;
		var jFirstTr = jTS.data("firstTr");
//		jDum = jTS.parents("#" + p.sGantBody + ":first");
		var jDum = $(window).data("gantBody");
// 5.3.0.0 (2010/11/17) Add
		if( jDum.length > 0 ) {
//			jFirstTr = $.hybs.getHybsTr(jTS.find("tbody tr:first"));
			isAddFirstRow = true;
		}
		else if( isCheckFirstRow ) {
//			jFirstTr = $.hybs.getHybsTr(jTS.find("tbody tr:first"));
			if(jFirstTr[0]){
//				$("td",jFirstTr).each(function ( j ) {
				jTS.data("firstTrTd").each(function ( j ) {
					if( !colModel[j] || !colModel[j].colspan || $(this).attr("colSpan") != colModel[j].colspan ) {
						isAddFirstRow = true;
						return false;
					}
				});
			}
		}

		jTS.addClass("scroll");

		var oDum = ts.parentNode;
		grid.bHide = ts.parentNode;
		grid.bDiv  = grid.bHide.parentNode;

// 5.1.3.0 (2010/02/01) Modify
//		jTS.parent().attr("id", oDum.id + "2").css({width:"50em"})

		//viewにセットされた幅と高さをテーブルのp変数にセット
		oDum = jTS.parents("#divPos")[0];
		if(oDum) {
			$.each(["width", "height"], function() {
// 5.1.4.0 (2010/03/01) Modify
//				if(oDum.style[this]) {
				if(ts.p && ts.p[this]) {
					p[this] = ts.p[this];
				}
				else if(oDum.style[this]) {
					p[this] = oDum.style[this];
// 5.1.3.0 (2010/02/01) Modify
//					oDum.style[this] = "auto";
					oDum.style[this] = "auto";
				}
			});
		}

		//外のdivに括られた中のヘッダ固定テーブルを返す関数
		var getViewTable = function (o) {
			return $("table:first", o);
		};

		$.each(p.colModel, function(i){if(typeof this.width == "undefined") {this.width=150;}});

//		var thead;
//		var thead = $("thead:first",ts).get(0);
		var thead = jTS.data("thead").get(0);

// 5.1.3.0 (2010/02/01) Comment
//		var w;
//		var i=0, th, idn, thdiv;
		//ヘッダの項目の幅を調整出来るために、必要な要素を追加(未完成)
//		$("tr th",thead).each(function ( j ) {
		jTS.data("trTh").each(function ( j ) {
//			w = p.colModel[j].width;
// 5.1.3.0 (2010/02/01) Comment
//			if(!p.colModel[j].resizable) {p.colModel[j].resizable = false;}
//			//幅が調整出来る場合、必要なdivとspanを追加
//			if(p.colModel[j].resizable) {
//				// wrap td's content with div
//				th = this;
//				idn = p.colModel[i].name;
//				idn = (idn) ? idn : i+1;
//				thdiv = document.createElement("div");
//				thdiv.id = ""+idn+"";
//				$(thdiv).html($(this).text()+"&#160;");
//				th.innerHTML = "";
//				th.appendChild(thdiv);
//
//				res = document.createElement("span");
//				$(res).html("&#160;");
//				if(p.colModel[j].resizable){
//					$(res).mousedown(function (e) {grid.dragStart( j ,e.clientX);return false;});
//				} else {$(res).css("cursor","default");}
//				$(this).css("width",w+"px").prepend(res);
//				if(p.colModel[j].hidden) {$(this).css("display","none");}
//				grid.headers[j] = { width: w, el: this };
//			}
//			else {
//				$(this).css("width",w+"px");
				$(this).css("width",p.colModel[j].width+"px");
//				grid.headers[j] = { width: w, el: this };
//			}
		});

		//新しいヘッダを作成
		grid.hTable = document.createElement("table");
		//新しいヘッダの属性は元のヘッダと同じようにセットする
		var jHTable = $(grid.hTable);
		jHTable.addClass(jTS.attr("class")).css({margin:"0px"});
		// 5.2.3.0 (2010/12/01) 
//		$.each(["cellSpacing", "cellPadding", "border"], function(i, name) {
		$.each(["cellspacing", "cellpadding", "border", "bordercolor", "frame", "rules"], function(i, name) {
			if(jTS.attr(name)) jHTable.attr(name, jTS.attr(name));
		});
		//固定ヘッダのidにheaderTableをセット
		jHTable.attr("id", "headerTable");
		
		// 5.5.3.2(2012/06/08) 非表示を一度元に戻す
		jTS.data("trTh").find("a,input,select,textarea").each(function () {
				//$(this).attr("tabindex","").css("visibility","");
				$(this).attr("tabindex","").removeClass("visihidden"); // 5.5.4.2 (2012/07/13)
		});

		oDum = thead;
		//元のヘッダからヘッダ前のデータを新ヘッダにコピー
		while(oDum) {
//			var oChild1st = grid.hTable.firstChild;
//			grid.hTable.insertBefore(oDum.cloneNode(true), oChild1st);
//			Dom function can't copy event in Firefox
			jHTable.prepend($(oDum).clone(true));
			oDum = oDum.previousSibling;
		}

// 5.1.3.0 (2010/02/01) Add
		//データの一行目をコピー
		if(isAddFirstRow && jFirstTr && jFirstTr[0]) {
//			grid.firstRowHeight = $(jFirstTr).innerHeight();
//			grid.firstRowHeight = jTS.data("trh");
			grid.firstRowHeight = jTS.data("trh") + 1;
			$("td",jFirstTr).each(function (j) {
// 5.3.2.0 (2011/02/01) Modify
//				$(this).css("width",$(this).innerWidth() || $(this).outerWidth() ).css("height",$(this).height() );
				$(this).css("width",jTS.data("tdw")[j]+"px" ).css("height",jTS.data("tdh")[j]+"px" );
			});
			jTrCl = jFirstTr.clone();
// 5.4.2.0 (2011/12/01) Modify
//			$("td",jTrCl).html("").css("backgroundColor","transparent");  
			$("td",jTrCl).each(function (j) {
				$(this).html( $(this).text() == "" ? "" : " " ).css("backgroundColor","transparent");
			});

			jAddTo = ( jTrCl.is("tr") ? $(document.createElement("tbody")).appendTo(jHTable) : jHTable );
			jAddTo.append(jTrCl);
		}

		//データ行を固定したい時に該当のデータ行を新ヘッダの下に移動する
		//上でのロジックでデータをコピーした場合は正しく動作しません。(追加行分、widthを設定する必要あり?)
//		if(p.nFixHDataRow > 0) {
//			var nRowUp = 0;
//			var jAddTo, jTr = $.hybs.getHybsTr(jTS.find("tbody tr:first"));
//			while(jTr[0] && (nRowUp < p.nFixHDataRow)) {
// 5.1.3.0 (2010/02/01) Modify
//				if(0 == nRowUp) { jAddTo = jTr.is("tr") ? $("tbody").appendTo(jHTable) : jHTable; }
//				if(0 == nRowUp) { jAddTo = jTr.is("tr") ? $(document.createElement("tbody")).appendTo(jHTable) : jHTable; }
//				var jNextTr = jTr.next();
//				jAddTo.append(jTr);
//				nRowUp++;
//				jTr = jNextTr;
//			}
//		}

		//新ヘッダの幅設定
//		$("thead:first tr th", grid.hTable).each(function(ii) {
//			grid.cols[ii] = this;
//		});

		//新ヘッダの外のdiv作成
		grid.hDiv = document.createElement("div");
//		var hg = false;
		$(grid.hDiv)
			.attr("class", "hGrid-header")
			.append($('<div style="width:10000em;" />')
			.append(grid.hTable));
//			.append($('<div />')
//			.bind("selectstart", function () { return false; });
//		if(hg) {$(grid.hDiv).hide();}

// 5.3.7.0 (2011/07/01) 隠したヘッダー行にフォーカスが当たらないようにtabindexを設定
// 5.5.1.0 (2012/04/03) さらにvisibilityをhiddenにして領域はそのまま内容を表示させないようにする
		jTS.data("trTh").find("a,input,select,textarea").each(function () {
				//$(this).attr("tabindex","999").css("visibility","hidden");
				$(this).attr("tabindex","999").addClass("visihidden"); // 5.5.4.2 (2012/07/13)
		});

//		//マウスでのデータ行の出入りとクロックによる画面表示の変更(未完成)
//		$(ts).mouseover(function(e) {
//			var td = (e.target || e.srcElement);
//			var ts = $(ts).parents("table:first")[0];
//			var ptr = $(td,ts.rows).parent("tr");
//			if($(ptr).hasClass("jqgrow")) {
//				$(ptr).addClass("over");
//				if(!$(td).hasClass("editable")){
//					td.title = $(td).text();
//				}
//			}
//			e.stopPropagation();
//			return false;
//		}).mouseout(function(e) {
//			var td = (e.target || e.srcElement);
//			ptr = $(td,ts.rows).parent("tr");
//			$(ptr).removeClass("over");
//			if(!$(td).hasClass("editable")){
//				td.title = "";
//			}
//			return false;
//		}).click(function(e) {
//			var td = (e.target || e.srcElement);
//			ptr = $(td,ts.rows).parent("tr");
//			if($(ptr).length === 0 ){
//				ptr = $(td,ts.rows).parents("tr:first");
//				td = $(td).parents("td:first")[0];
//			}
//			if ( !ts.p.multikey ) {
//				$(ts).setSelection(false,ptr);
//			} else {
//				if(e[ts.p.multikey]) {
//					$(ts).setSelection(false,ptr);
//				} 
//			}
//			e.stopPropagation();
//		});

// 5.1.3.0 (2010/02/01) Modify
		if( $(grid.bDiv).prev().attr("class") == "hGrid-header" ) {
			$(grid.bDiv).prev().remove();
		}
		$(grid.bDiv).before(grid.hDiv);

// 5.2.0.0 (2010/09/01) Comment
//		grid.scrollGrid();

//		if( isMSIE ) {
//			if( p.multikey) {$(grid.bDiv).bind("selectstart",function(){return false;});}
//		} else {
//			if( p.multikey) {$(grid.bDiv).bind("mousedown",function(){return false;});}
//		}
//		if(hg) {$(grid.bDiv).hide();}

		//ヘッダの各データの幅を調節するためのイベント登録(未完成)
/* 5.1.3.0 (2010/02/01) Comment
//		$(grid.hDiv).mousemove(function (e) {
//			var ts = getViewTable(e.target)[0]; if(ts && ts.grid) {ts.grid.dragMove(e.clientX)};
//		}).mouseup(function (e) {
//			var grid;
//			var ts = getViewTable(e.target)[0]; if(ts && ts.grid) { grid = ts.grid; }
//			if(grid && grid.resizing) {
//				grid.dragEnd();
//				if(grid.newWidth){
//					var gwdt = (grid.width < ts.p.width) ? grid.width : ts.p.width;
//					var overfl = (grid.width <= ts.p.width) ? "hidden" : "auto";
//					$(grid.bDiv).width(gwdt+17).css("overflow-x",overfl);
//					$(grid.hDiv).width(gwdt);
//				}
//			}
//			return false;
//		});
*/

		//テーブルの水平と垂直のスクロールのイベント登録
		$(grid.bDiv)
			.scroll(function (e) {var ts = getViewTable(e.target)[0]; if(ts && ts.grid) {ts.grid.scrollGrid();}});
//			.css({ padding: "0px", margin: "0px" })

		oDum = $(window).data(p.sGridList);
		//左右分割画面の判定とそのテーブル情報取得
//		jDum = jTS.parents("#" + p.sGantBody + ":first");
		if( jDum.length > 0 && oDum  ) {
			var prevGrid = oDum[oDum.length-1];

			if(prevGrid.oWrap === jDum[0]) {
				prevGrid.oTab.grid.oNext = ts;
				grid.oPrev = prevGrid.oTab;
			}
		}
		if(!oDum) oDum = [];
		oDum.push({oTab:ts, oWrap:jDum[0]});
		//ヘッダ固定テーブルの情報をwindowにセットする
		$(window).data(p.sGridList, oDum);

		clearCache( jTS );

		//テーブルの必要なデータ設定
		ts.grid = grid;
		ts.p = p;
		//定義した変数をクリア
		grid = p = null;
//		nDum = oDum = jDum = null;
		oDum = jDum = null;
		ts = jTS = null;
	});
};
})(jQuery);
