/*************************************************************************
 * 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に戻して表示幅/高さを求める)
		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 ) : nHoriLimit;
//				nVertLimit = ($t.p.height) ? parseInt($t.p.height) : 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");

		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を設定
		jTS.data("trTh").find("a,input,select,textarea").each(function () {
			$(this).attr("tabindex","999");
		});

//		//マウスでのデータ行の出入りとクロックによる画面表示の変更(未完成)
//		$(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);
