/* 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@*/ } /* ***************** */