/* table display切り替え : セル連結無しのみ
// first 2009/06/14:
// 1. json 使用 → global変数を減らす
// 2. document.createElement 使用 → 並べ替え対象項目 selector や昇降radio button 実行ボタンは、JavaScriptで作成。&実行ボタンへのイベント登録も初期化メソッドで済ませる
// 3. 外部ファイル化
// sorter との共存:カラム非表示用は、theadの最後に追加。sorter 側で、先頭チェックボックスカラムを並べ替え対象から外せる様に、obj.startcolumn propaty追加
よって、さきに、sorterに登録後、checkbox追加と obj.startcolumnのデータ変更を行う。
// ajax tsv 読み込みとの共存:Objectのリセットは、innerHTML="" として、作り替えた方が早いかも。
*/
var display_tool = {};
display_tool.all = 100;
display_tool.column_only = 200;
display_tool.row_only = 300;
display_tool.obj = []; // display_changer データ保持用、複数table対応のため配列にする。
/* html記述されているtableを対象に、表示切り替え機能を追加
// @param t_id : table要素の id
// @param control_id : select要素 や、radio button などを追加するための、コントローラー用要素(divまたはformなど)のid
// 返値 作成objectのdisplay_tool.objに登録された配列要素番号
*/
display_tool.pre_exist_setter =function (t_id, control_id ){
var t_obj = document.getElementById( t_id );
display_tool.obj.push(new display_changer(t_obj,control_id ,display_tool.all) );
return display_tool.obj.length-1;
}
/* html記述されているtableを対象に、列のみの表示切り替え機能を追加
// @param t_id : table要素の id
// @param control_id : select要素 や、radio button などを追加するための、コントローラー用要素(divまたはformなど)のid
// 返値 作成objectのdisplay_tool.objに登録された配列要素番号
*/
display_tool.pre_exist_column =function (t_id, control_id ){
var t_obj = document.getElementById( t_id );
display_tool.obj.push(new display_changer(t_obj,control_id ,display_tool.column_only) );
return display_tool.obj.length-1;
}
/* データを2次元配列で与えて、table作成
// @param data : データ2次元配列
// @param head_line : thead 用の項目名配列
// @param t_id : table作成対象要素の id
// @param control_id : select要素 や、radio button などを追加するための、コントローラー用要素(divまたはformなど)のid
// 返値 作成objectのdisplay_tool.objに登録された配列要素番号
*/
display_tool.make_table = function(data, head_line, t_id, control_id ){
}
/*@cc_on@*/ // ie用条件コンパイル
/*
// @param chk_name: checkbox name
// @param chk_id : checkbox id
// @param c_value : checkbox value
*/
display_tool.create_check = function(chk_name, chk_id, c_value ){
var elm = /*@if(true) document.createElement( ""); @else@*/
document.createElement("INPUT");
elm.setAttribute("type","checkbox");
elm.setAttribute("name", chk_name );
elm.setAttribute("id", chk_id );
elm.setAttribute("value",c_value);
/*@end@*/
return elm;
}
display_tool.create_button = function(btn_id, b_value, event_call ){
var elm = /*@if(true) document.createElement( ""); @else@*/
document.createElement("INPUT");
elm.setAttribute("type","BUTTON");
elm.setAttribute("value",b_value);
elm.setAttribute("id", btn_id );
/*@end@*/
elm./*@if(true) attachEvent('on'+ @else@*/ addEventListener( /*@end@*/
'click', event_call , false);
// event_call は wrapperの結果を渡す
return elm;
}
/* 表示切り替え機能を追加
// @param t_obj : table object
// @param control_id : 表示切り替えbutton を追加するための、コントローラー用要素(divまたはformなど)のid
// @param rc : 行のみ、列のみ、または行列ともに、の指定
それぞれ、display_tool.row_only、display_tool.column_only、display_tool.all
*/
display_changer = function(t_obj , control_id, rc){
this.tabletop_obj = t_obj; // 保持しておいた方が便利、結局こちらを引数にする
var tb_obj = t_obj.getElementsByTagName( "tbody" );
this.tablebody_obj = tb_obj[0]; // tbody は一個はあるはず?
this.row_chk_prefix = control_id+'_rowchk';
this.col_chk_prefix = control_id+'_colchk';
this.btn_prefix = control_id+'_changer';
this.col_list = [];
this.row_list = [];
this.btn_list = [];
if( rc != display_tool.row_only ){ this.add_column(); } // all と column
if( rc != display_tool.column_only ){ this.add_row(); } // all と row カラム用の行にもセル追加のためあとから実行
this.add_btn(control_id);
// alert("col check:"+this.col_list.length +", row:"+this.row_list.length ); // debug
}
/*
// 列非表示用チェックボックス
// tableデータの変更があったとき、列のチェックボックスを調整
*/
display_changer.prototype.edit_column = function(){
var i,j,row,cell, name,id,val,clen,rlen ,chk;
var th_obj = this.tabletop_obj.getElementsByTagName( "thead" );
// thead のカラム数 または、データ一行目のカラム数
th_obj = th_obj[0];
rlen =th_obj.rows.length;
if(rlen<2 ){ // チェックボックス用の行しかないので、データの行を調べる
clen = this.tablebody_obj.rows[0].cells.length;
}else{
clen = th_obj.rows[0].cells.length;
}
cell = this.col_list[0].parentNode;
row = cell.parentNode;
rlen = row.cells.length ;
alert("row:"+rlen +", data len:"+clen); // debug
if( rlenclen){
for( j=rlen-1; j>= clen; j--){
row.removeChild(row.cells[j]);
this.col_list.pop();
}
}
}
/*
// 列非表示用チェックボックス
// thead の先頭に1行追加、先頭以外のセルにcheckboxを入れる
*/
display_changer.prototype.add_column = function(){
var i,j,row,cell, name,id,val,clen,rlen ,chk;
var th_obj = this.tabletop_obj.getElementsByTagName( "thead" );
// thead のカラム数
if(th_obj.length>0){
th_obj = th_obj[0];
clen =th_obj.rows[0].cells.length;
}else{
clen = this.tablebody_obj.rows[0].cells.length;
th_obj = document.createElement('thead');
this.tabletop_obj.appendChild(th_obj);
}
row = th_obj.insertRow(th_obj.rows.length); // sorter で、rows[0]を参照するので、併用のためにはtheadの最後に追加
cell= row.insertCell( 0 ); // 先頭ブランクセル挿入
cell.innerHTML = " ";
name= this.col_chk_prefix; // name は全部同じに
for( j=1; j< clen; j++){
cell= row.insertCell( row.cells.length );
id = this.col_chk_prefix +'_'+j;
chk = display_tool.create_check(name,id, j);
cell.appendChild( chk );
this.col_list.push(chk);
}
}
/*
// 行非表示用チェックボックス
// tbodyの各行先頭にcheckbox 入りカラムを追加
*/
display_changer.prototype.add_row = function(){
var i,j,row,cell, name,id,val,clen,rlen ,chk;
rlen = this.tablebody_obj.rows.length;
name= this.row_chk_prefix; // name は全部同じに
for( i=0; i< rlen; i++){
row = this.tablebody_obj.rows[i];
cell= row.insertCell( 0 );
id = this.row_chk_prefix +'_'+i;
chk = display_tool.create_check(name,id, i);
cell.appendChild( chk );
this.row_list.push(chk);
}
// thead の各行にも先頭セル追加、tbody とセル数あわせる
var th_obj = this.tabletop_obj.getElementsByTagName( "thead" );
if(th_obj.length>0){
var hlen = th_obj.length;
for( h=0; h 0 ){ // 列非表示有
btn = display_tool.create_button(this.btn_prefix+"_delcol" , "チェック列非表示"
, function(instance){
return function(){ instance.col_none(instance); };
}( this)
) ;
con.appendChild( btn ) ;
}
if( this.row_list.length > 0 ){ // 行非表示有
btn = display_tool.create_button(this.btn_prefix+"_delrow" , "チェック行非表示"
, function(instance){
return function(){ instance.row_none(instance); };
}( this)
// local 変数this を関数objectに渡す wrapper
) ;
con.appendChild( btn ) ;
}
}
display_changer.prototype.show_all = function(instance){
// 設定した style.display = 'none' を消す
var i,j,rlen,clen, row, cell, chk;
// thead にあるcheckbox を全てチェックはずす
clen = instance.col_list.length;
for( j=0; j< clen; j++){
chk = instance.col_list[j];
chk.checked = false;
}
rlen = instance.row_list.length;
for( i=0; i< rlen; i++){
chk = instance.row_list[i];
chk.checked = false;
}
rlen = instance.tabletop_obj.rows.length;
// table の全行全列対象にする
for( i=0; i< rlen; i++){
row = instance.tabletop_obj.rows[i];
instance.remove_property(row, 'display');
clen = row.cells.length;
for( j=0; j< clen; j++){
cell = row.cells[j];
instance.remove_property(cell, 'display');
}
}
}
display_changer.prototype.col_none = function(instance){
var i,j,rlen,clen, row, cell, chk;
// table の全行対象に、チェックのついたカラムのみ、非表示
clen = instance.col_list.length;
if( clen < 1 )return; // チェックボックスを作ってないので何もしない
var chk_col = [false];
// 行頭チェック用のセルを追加しているかの判断
if( instance.row_list.length > 1 ){ chk_col.push(false);// alert("行あり"); // debug
}
for( j=0; j< clen; j++){
chk_col.push( instance.col_list[j].checked );
}
rlen = instance.tabletop_obj.rows.length;
for( i=rlen-1; i >=0; i--){
row = instance.tabletop_obj.rows[i];
clen = row.cells.length;
for( j=1; j< clen; j++){
// 先頭1カラムにはチェックボックスはない,2カラム目は行非表示チェックの追加の有無による
// chk = instance.col_list[j-2]; // display none にすると値がとれない?? cell 数あってないので、配列overか
if( chk_col[j]){
cell = row.cells[j];
cell.style.display = "none";
}
}
}
}
display_changer.prototype.row_none = function(instance){
var i,j,rlen,clen, row, cell ;
if( instance.row_list.length < 1 )return; // チェックボックスを作ってないので何もしない
rlen = instance.tablebody_obj.rows.length;
// tbody の全行対象に、チェックのついたカラムのみ、非表示
for( i=0; i< rlen; i++){
if( instance.row_list[i].checked ){
row = instance.tablebody_obj.rows[i];
row.style.display = "none";
}
}
}
display_changer.prototype.remove_property = function(obj, propaty){
obj.style. /*@if(true) propaty = ""; @else@*/
removeProperty(propaty);
/*@end@*/
}
/* ***************** */