/*------------------------------------------------------------------------ - HTML Table Filter Generator - Grid Layout feature v1.2 - By Max Guglielmi (tablefilter.free.fr) - Licensed under the MIT License -------------------------------------------------------------------------*/ TF.prototype.SetGridLayout = function() /*==================================================== - generates a grid with fixed headers =====================================================*/ { if(!this.gridLayout) return; var f = this.fObj; this.gridWidth = f.grid_width!=undefined ? f.grid_width : null; //defines grid width this.gridHeight = f.grid_height!=undefined ? f.grid_height : null; //defines grid height this.gridMainContCssClass = f.grid_cont_css_class!=undefined //defines css class for main container ? f.grid_cont_css_class : 'grd_Cont'; this.gridContCssClass = f.grid_tbl_cont_css_class!=undefined //defines css class for div containing table ? f.grid_tbl_cont_css_class : 'grd_tblCont'; this.gridHeadContCssClass = f.grid_tblHead_cont_css_class!=undefined //defines css class for div containing headers' table ? f.grid_tblHead_cont_css_class : 'grd_headTblCont'; this.gridInfDivCssClass = f.grid_inf_grid_css_class!=undefined //defines css class for div containing rows counter, paging etc. ? f.grid_inf_grid_css_class : 'grd_inf'; this.gridHeadRowIndex = f.grid_headers_row_index!=undefined //defines which row contains column headers ? f.grid_headers_row_index : 0; this.gridHeadRows = f.grid_headers_rows!=undefined //array of headers row indexes to be placed in header table ? f.grid_headers_rows : [0]; this.gridEnableFilters = f.grid_enable_default_filters!=undefined ? f.grid_enable_default_filters : true; //generate filters in table headers this.gridDefaultColWidth = f.grid_default_col_width!=undefined ? f.grid_default_col_width : '100px'; //default col width this.gridEnableColResizer = f.grid_enable_cols_resizer!=undefined ? f.grid_enable_cols_resizer : true; //enables/disables columns resizer this.gridColResizerPath = f.grid_cont_col_resizer_path!=undefined //defines col resizer script path ? f.grid_cont_col_resizer_path : this.basePath+'TFExt_ColsResizer/TFExt_ColsResizer.js'; if(!this.hasColWidth){// in case column widths are not set default width 100px this.colWidth = []; for(var k=0; k0 ) this.tbl.removeChild(thead[0]); //Headers table style this.headTbl.style.width = this.tbl.style.width; this.headTbl.style.tableLayout = 'fixed'; this.tbl.style.tableLayout = 'fixed'; this.headTbl.cellPadding = this.tbl.cellPadding; this.headTbl.cellSpacing = this.tbl.cellSpacing; //Headers container width this.headTblCont.style.width = this.tblCont.clientWidth+'px'; //content table without headers needs col widths to be reset this.SetColWidths(); this.tbl.style.width = ''; if(tf_isIE || tf_isIE7) this.headTbl.style.width = ''; //scroll synchronisation var o = this; //TF object this.tblCont.onscroll = function(){ o.headTblCont.scrollLeft = this.scrollLeft; var _o = this; //this = scroll element //New pointerX calc taking into account scrollLeft if(!o.isPointerXOverwritten){ try{ TF.Evt.pointerX = function(e) { e = e || window.event; var scrollLeft = tf_StandardBody().scrollLeft + _o.scrollLeft; return (e.pageX + _o.scrollLeft) || (e.clientX + scrollLeft); } o.isPointerXOverwritten = true; } catch(ee) { o.isPointerXOverwritten = false; } } } /*** Default behaviours activation ***/ var f = this.fObj==undefined ? {} : this.fObj; //Sort is enabled if not specified in config object if(f.sort != false){ this.sort = true; this.sortConfig.asyncSort = true; this.sortConfig.triggerIds = sortTriggers; } if(this.gridEnableColResizer){ if(!this.hasExtensions){ this.extensions = { name:['ColumnsResizer_'+this.id], src:[this.gridColResizerPath], description:['Columns Resizing'], initialize:[function(o){ o.SetColsResizer('ColumnsResizer_'+o.id); }] } this.hasExtensions = true; } else { if(!this.__containsStr('colsresizer',this.extensions.src.toString().tf_LCase())){ this.extensions.name.push('ColumnsResizer_'+this.id); this.extensions.src.push(this.gridColResizerPath); this.extensions.description.push('Columns Resizing'); this.extensions.initialize.push(function(o){o.SetColsResizer('ColumnsResizer_'+o.id);}); } } } //Default columns resizer properties for grid layout f.col_resizer_cols_headers_table = this.headTbl.getAttribute('id'); f.col_resizer_cols_headers_index = this.gridHeadRowIndex; f.col_resizer_width_adjustment = 0; f.col_enable_text_ellipsis = false; //Cols generation for all browsers excepted IE<=7 o.tblHasColTag = (tf_Tag(o.tbl,'col').length > 0) ? true : false; if(!tf_isIE && !tf_isIE7){ //Col elements are enough to keep column widths after sorting and filtering function createColTags(o) { if(!o) return; for(var k=(o.nbCells-1); k>=0; k--) { var col = tf_CreateElm( 'col', ['id', o.id+'_col_'+k]); o.tbl.firstChild.parentNode.insertBefore(col,o.tbl.firstChild); col.style.width = o.colWidth[k]; o.gridColElms[k] = col; } o.tblHasColTag = true; } if(!o.tblHasColTag) createColTags(o); else{ var cols = tf_Tag(o.tbl,'col'); for(var i=0; i0 ) r = tbody[0].insertRow(0); else r = o.tbl.insertRow(0); r.style.height = '0px'; for(var i=0; i0 ) tbody[0].moveRow(o.leadColWidthsRow.rowIndex, 0); else o.tbl.moveRow(o.leadColWidthsRow.rowIndex, 0); } if(afterSortFn!=null) afterSortFn.call(null,o,colIndex); } } var afterColResizedFn = tf_IsFn(f.on_after_col_resized) ? f.on_after_col_resized : null; f.on_after_col_resized = function(o,colIndex){ if(colIndex==undefined) return; var w = o.crWColsRow.cells[colIndex].style.width; var col = o.gridColElms[colIndex]; col.style.width = w; var thCW = o.crWColsRow.cells[colIndex].clientWidth; var tdCW = o.crWRowDataTbl.cells[colIndex].clientWidth; if(tf_isIE || tf_isIE7) o.tbl.style.width = o.headTbl.clientWidth+'px'; if(thCW != tdCW && !tf_isIE && !tf_isIE7) o.headTbl.style.width = o.tbl.clientWidth+'px'; if(afterColResizedFn!=null) afterColResizedFn.call(null,o,colIndex); } if(this.tbl.clientWidth != this.headTbl.clientWidth) this.tbl.style.width = this.headTbl.clientWidth+'px'; } TF.prototype.RemoveGridLayout = function() /*==================================================== - removes the grid layout =====================================================*/ { if(!this.gridLayout) return; var t = this.tbl.parentNode.removeChild(this.tbl); this.tblMainCont.parentNode.insertBefore(t, this.tblMainCont); this.tblMainCont.parentNode.removeChild( this.tblMainCont ); this.tblMainCont = null; this.headTblCont = null; this.headTbl = null; this.tblCont = null; this.tbl.outerHTML = this.sourceTblHtml; this.tbl = tf_Id(this.id); //needed to keep reference }