////////////////////////////////////////////////////////////////////////////////
// テーブル表示クラスライブラリ
function TableClass(strBase)
{
	var m_strCellTag=      "span";	// テーブルテンプレートが記述されているタグ名
	var m_strCellPrefix=   "cell";	// テーブルのCELL識別子
	var m_strHeaderPrefix= "head";	// テーブルのヘッダテンプレートの識別子
	var	m_nSort=0;			// ソートする項目のID
	var	m_nSortDsec= 0;		// 昇順：0 降順:1 を決めるフラグ
	var m_arData;			// データ
	var m_limit= 10;		// 表示件数
	var m_offset= 0;		// オフセット位置
	var m_calcLimit= 0;		// 計算後の実際の表示件数
	var m_arHeaderId= new Array();
	var m_arCellId= new Array();
	var m_strBase= strBase;	// 表の表示位置が指定されているIDが入る

	////////////////////////////////////////////////////////////////////////////////
	// テーブルの構築、再構築関数
	function _createTable(arData)
	{
		m_arData= arData;

		// Offset値の呼び出し
		//var offset= getCookie("offset");
		//if (typeof(offset) == "undefined") 
		//	m_offset= 0;
		//else                               
		//	m_offset= eval(offset);

		// テーブルの更新
		_updateTable();
		//_createLimit();
	}
	////////////////////////////////////////////////////////////////////////////////
	// テーブルの構築、再構築用内部関数。
	function _createTableInner()
	{
		// 変数宣言
		var i;
		var eleCell;
		var strMatch;
		var eleData;

		// 描画の初期化
		var eleBase= document.getElementById(m_strBase);
			eleBase.innerHTML= "";

		if (! m_arData.length)
			return;// 入力エラー対策

		// Cellの構築
		for (i= 0 ; i < m_calcLimit ; i++)
		{
			eleBase.appendChild(_createCell(m_arData[i + m_offset]));
		}
	}
	////////////////////////////////////////////////////////////////////////////////
	// セルを作成する関数
	function _createCell(data)
	{
		return createCell(data, m_offset, m_limit);
	}
	////////////////////////////////////////////////////////////////////////////////
	// テーブル情報の更新関数
	function _updateTable()
	{	
		_calcOffset();
		_createTableInner();
		_createOffset();
		
		//setCookie("offset", m_offset, 1);// Offset値の保存
	}	
	////////////////////////////////////////////////////////////////////////////////
	// オフセットボタンを作成する関数。
	function _createOffset()
	{
		return createOffset(m_arData.length, m_offset, m_limit);
	}
	////////////////////////////////////////////////////////////////////////////////
	// 件数表示を設定するオプションリストを作成する関数。
	function _createLimit()
	{	
		var strText= "";
		var eleLimit= document.getElementById("limit");
		var i;
		var add= 10;

		strText=  "<select name='limit' OnChange=\"a.setRows(this.options[selectedIndex].value); a.updateTable();\">\n";

		for (i= 0 ; i < 100 ; i+= add)
		{
			strText+= "<option value='" + i +"'";
			if (i == eval(m_limit))
				strText+= " selected";
			
			strText+= ">"+ i +"</option>\n";
		}
		strText+= "</select>\n";
		if (eleLimit)
			eleLimit.innerHTML= strText;		
	}	
	////////////////////////////////////////////////////////////////////////////////
	// オフセット値を計算する内部関数。
	function _calcOffset()
	{	
		m_offset=     eval(m_offset);
		m_calcLimit=  eval(m_limit);
		m_limit=      eval(m_limit);

		if (m_offset < 1)
		{
			m_offset= 0;
		}
		// オフセット位置、リミット設定
		if (m_arData.length  < (m_offset + m_limit))
		{
			//m_offset= m_arData.length - m_limit;
			if (m_offset < 1)
				m_offset= 0;
			m_calcLimit= m_arData.length - m_offset;
		}
		if (m_offset > (m_arData.length -  1))
		{
			if (0 == (m_arData.length  % m_limit))
				m_offset= m_arData.length - m_limit;
			else
				m_offset= m_arData.length - (m_arData.length  % m_limit);

			m_calcLimit= m_arData.length - m_offset;
		}
	}
	////////////////////////////////////////////////////////////////////////////////
	// 表示する表の行オフセット位置から「次へ」を決める関数。
	function _nextPage()
	{
		m_offset+= m_limit;
		_updateTable();
	}
	////////////////////////////////////////////////////////////////////////////////
	// 表示する表の行オフセット位置から「前へ」を決める関数。
	function _prevPage()
	{
		m_offset-= m_limit;
		_updateTable();
	}
	////////////////////////////////////////////////////////////////////////////////
	// 表示する表の行オフセット位置を決める関数。
	function _setPage(nPage)
	{
		m_offset= nPage * m_limit;
		_updateTable();
	}
	// ソート用内部関数
	function _sortCmp(a, b)
	{
	    if      (a[m_nSort] == b[m_nSort]) return  0; 
	    else if (a[m_nSort]  > b[m_nSort])
			if (m_nSortDsec) return -1;
			else             return  1;
		else 
			if (m_nSortDsec) return  1;
			else             return -1;
	}
	// ソートするための関数
	function _Sort(nIndex, nDesc)
	{
		m_nSort=     nIndex;
		m_nSortDsec= nDesc;
		m_arData.sort(_sortCmp);
		
		_updateTable();
	}
	// 表示する表の行数を設定する関数
	function _setRows(nRows)
	{
		if (nRows < 1)
			return;
		
		// 行数の設定
		m_limit= eval(nRows);
		
		if (! m_arData)
			return;
	}

	////////////////////////////////////////////////////////////////////////////////
	// パブリックメンバメソッドの設定
	TableClass.prototype.createTable= _createTable;
	TableClass.prototype.updateTable= _updateTable;
	TableClass.prototype.setPage=     _setPage;
	TableClass.prototype.nextPage=    _nextPage;
	TableClass.prototype.prevPage=    _prevPage;
	TableClass.prototype.Sort= 		  _Sort;
	TableClass.prototype.setRows=     _setRows;
}

////////////////////////////////////////////////////////////////////////////////
function setCookie(name, value, day)
{
	var item;
	var expires;
	var exp;

	exp= new Date();
	exp.setTime(exp.getTime() + day * 24 * 60 * 60 * 1000);
	item= "@" + name + "=" + escape(value) + ";";
	expires= "expires=" + exp.toGMTString();
	document.cookie= item + expires;
}
////////////////////////////////////////////////////////////////////////////////
function getCookie(name)
{
	var item;
	var value;
	var cookie;
	var offset;

	item= "@" + name + "=";
	cookie= document.cookie + ";";
	offset= cookie.indexOf(item);
	if (-1 != offset)
	{
		s= offset + item.length;
		e= cookie.indexOf(";", s);
		value= unescape(cookie.substring(s, e));
	}
	return value;
}


