/*************************************************************************
 * 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 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) {
	//左右に配置して、同時に動く場合に、左右の行の高さを調整する
	$("#GantBody").heightReset();

	//テーブルのヘッダ固定と画面の幅、高さの調整
	//div#divPos > div#outer > div#layer > div#divHide > table.viewTable
	$("div > div > div > div > table.viewTable").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に実行される
		//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); 
			})()
		);
}

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++ 元のハヤブサの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.
		for(var 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(var 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,
	  //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, stat,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);

			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;
			oDivHide.style.width = jTS.outerWidth() + "px";
			oDivHide.style.height = jTS.outerHeight() - 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);
				//実際のテーブルの表示できる幅と高さを計算する(ユーザー指定優先)
				nHoriLimit = ($t.p.width ) ? parseInt($t.p.width ) : nHoriLimit;
				nVertLimit = ($t.p.height) ? parseInt($t.p.height) : 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(bHoriPermit) { bHoriScroll = true; }
					if(bVertPermit) { bVertScroll = true; }

					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));

				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) < 7 && jHdr[0])
					{ jHdr[0].style.padding = jHdr[0].currentStyle.padding };
				// 可視範囲を保存しとく
				nOldHoriLimit = nHoriLimit;
				nOldVertLimit = nVertLimit;
			}
		});
	};
	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;

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

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

// 5.1.3.0 (2010/02/01) Comment
//			if(isMSIE) { nDum = jTh.innerWidth() || jTh.outerWidth(); }
//			else { nDum = jTh.width(); }
			nDum = jTh.width();
			colModel[idx] = {name:field,index:field, width:nDum, align:"left"};
		});

		//IE時、ヘッダの幅設定はcolgroupに行う
/* 5.1.3.0 (2010/02/01) Comment
		if(isMSIE) {
		  var getIEColSet = function (jTab) {
			  var oThead = jTab.find("thead")[0];
			  var oRows = $.makeArray(oThead.rows);
			  //確認対象として、データ行１行目も含まれる
			  var jHybsTr = $.hybs.getHybsTr(jTab.find("tbody tr:first"));
			  if(jHybsTr[0]) oRows = $.merge(oRows, jHybsTr.is("tr") ? [jHybsTr[0]] : jHybsTr[0].rows);
  
			  var nRowLen = oRows.length;
			  var aInfoSet = [];
  
			  var nCellSpacing = jTab.attr("cellSpacing");
			  nCellSpacing = ("" == nCellSpacing) ? 2 : parseInt(nCellSpacing, 10);
  
			  //IE7にはまだborder-spacingが利かなくて、cellspacingがそのまま採用される
			  for(var nRowUp = 0; nRowUp < nRowLen; nRowUp++) {
				var oCols = oRows[nRowUp].cells;
				var nColLen = oCols.length;
				var bContinue = false;
				if( 0 == aInfoSet.length) {
				  var oTd, jTd, nOWidth;
				  for(var nColUp = 0; nColUp < nColLen; nColUp++) {
					oTd = oCols[nColUp]; jTd = $(oTd);
					//nOWidth = jTd.outerWidth(); 
					nOWidth = oTd.offsetWidth;
					aInfoSet.push({colSpan:oTd.colSpan, rowSpan:(oTd.rowSpan-1), owidth:nOWidth, bSet:true});
				  }
				}
				else {
				  var nColUp = 0;
				  var oCol = null;
				  //下のaInfoSetの長さは動的に変わる可能性があります。
				  for(var nInfoUp = 0; nInfoUp < aInfoSet.length; nInfoUp++) {
					  var oInfo = aInfoSet[nInfoUp];
					  //複数行に跨った時
					  if(oInfo.rowSpan > 0) { oInfo.rowSpan--; continue; }
  
					  while(true) {
						  //行の中に次のカラムがなかった時
						  if(nColUp >= nColLen) { break; }
						  if(!oCol) {
							  var oTd = oCols[nColUp], jTd = $(oTd);
							  //width=0の時、offsetWidthとjQueryのouterWidthはずれがあります
							  //var nOWidth = jTd.outerWidth();
							  var nOWidth = oTd.offsetWidth;
							  oCol = {colSpan:oTd.colSpan, rowSpan:(oTd.rowSpan-1), owidth:nOWidth, bSet:true};
						  }
  
						  if(oInfo.colSpan == oCol.colSpan) {
							  oInfo.rowSpan = oCol.rowSpan;
							  if(!oInfo.bSet && oCol.bSet) {
								oInfo.owidth = oCol.owidth;
								oInfo.bSet	 = true;
							  }
							  oCol = null; nColUp++;
							  break;
						  }
						  else if(oInfo.colSpan  < oCol.colSpan) {
							  oInfo.rowSpan = oCol.rowSpan;
							  oCol.colSpan -= oInfo.colSpan;
							  oCol.owidth  -= oInfo.owidth + nCellSpacing;
							  oCol.bSet 	= false;
							  break; 
						  }
						  else {
							  aInfoSet.splice(nInfoUp, 0, oCol);
							  nInfoUp++;
							  oInfo.rowSpan  = oCol.rowSpan;
							  oInfo.colSpan -= oCol.colSpan;
							  oInfo.owidth	-= oCol.owidth + nCellSpacing;
							  oInfo.bSet	 = false;
							  oCol = null; nColUp++;
						  }
					  }
				  }
				}
				// colSpanは2以上或いはbSetはfalseの場合、フラグをセットする
				$.each(aInfoSet, function(n, a) {if(1 < a.colSpan || !a.bSet) bContinue = true; return !bContinue;});
				if(!bContinue) break;
			  }
			  return aInfoSet;
		  }

		  jDum = jTS.find("colgroup"); nDum = jDum.length;
		  var oDum = getIEColSet(jTS),	sDum="";
		  $.each(oDum, function(n, a) {
			if(n < nDum) $("<col span='" + a.colSpan + "' width='" + a.owidth + "px'>").appendTo(jDum[n]);
			else sDum += "<colgroup><col span='" + a.colSpan + "' width='" + a.owidth + "px'></colgroup>";
		  });
		  //No列のない場合、colgroupも無さそう
		  if(sDum) { if(nDum) $(jDum[nDum-1]).after(sDum); else jTS.prepend(sDum); }
		}
*/
		jTS.addClass("scroll");

		oDum = ts.parentNode;
		// Mis ScrollBar2
		//grid.bHide = ts.parentNode.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"})
//		jTS.parent().attr("id", oDum.id + "2");

		//viewにセットされた幅と高さをテーブルのp変数にセット
		oDum = jTS.parents("#divPos")[0];
		if(oDum) {
			$.each(["width", "height"], function() { 
				if(oDum.style[this]) {
					p[this] = oDum.style[this];
// 5.1.3.0 (2010/02/01) Comment
//					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;
		thead = $("thead:first",ts).get(0);

		//Firefox時、ヘッダの幅設定はtHeaderに行う
// 5.1.3.0 (2010/02/01) Comment
//	  if(!isMSIE) {
		var w, res;
		var i=0, th, idn, thdiv;
		//ヘッダの項目の幅を調整出来るために、必要な要素を追加(未完成)
		$("tr th",thead).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");
				grid.headers[j] = { width: w, el: this };
//			}
		});
//	  }

		//新しいヘッダを作成
		grid.hTable = document.createElement("table");
		//新しいヘッダの属性は元のヘッダと同じようにセットする
		var jHTable = $(grid.hTable);
		jHTable.addClass(jTS.attr("class")).css({margin:"0px"});
		$.each(["cellSpacing", "cellPadding", "border"], 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;
		}

		//データ行を固定したい時に該当のデータ行を新ヘッダの下に移動する
		if(p.nFixHDataRow > 0) {
			var nRowUp = 0;
			var jAddTo, jTr = $.hybs.getHybsTr(jTS.find("tbody tr:first"));
			while(jTr[0] && (nRowUp < p.nFixHDataRow)) {
				if(0 == nRowUp) { jAddTo = jTr.is("tr") ? $("tbody").appendTo(jHTable) : jHTable; }
				var jNextTr = jTr.next();
				jAddTo.append(jTr);
				nRowUp++;
				jTr = jNextTr;
			}
		}

		//新ヘッダの幅設定
		$("thead:first tr th", grid.hTable).each(function(ii) {
			w = p.colModel[ii].width;
			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($('<div />')
			.append(grid.hTable))
			.bind("selectstart", function () { return false; });
		if(hg) {$(grid.hDiv).hide();}

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

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

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