1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2024-05-12 19:36:41 +02:00
TableFilter/dist/tablefilter-uncompressed.js

2740 lines
103 KiB
JavaScript

/*------------------------------------------------------------------------
- HTML Table Filter Generator v2.5
- By Max Guglielmi (tablefilter.free.fr)
- Licensed under the MIT License
--------------------------------------------------------------------------
Copyright (c) 2009-2012 Max Guglielmi
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------
- Special credit to:
Cedric Wartel, cnx.claude@free.fr, Florent Hirchy, Váry Péter,
Anthony Maes, Nuovella Williams, Fuggerbit, Venkata Seshagiri Rao
Raya, Piepiax, Manuel Kern, Baladhandayutham for active contribution
and/or inspiration
------------------------------------------------------------------------*/
var TF = function(id)
/*====================================================
- TF object constructor
- Params:
- id: table id (string)
- refRow (optional): row index (number)
- config (optional): configuration
object (literal object)
=====================================================*/
{
if(arguments.length === 0){ return; }
this.id = id;
this.version = '2.5';
this.year = (new Date()).getFullYear();
this.tbl = tf_Id(id);
this.startRow = undefined;
this.refRow = null;
this.headersRow = null;
this.fObj = null;
this.nbFilterableRows = null;
this.nbRows = null;
this.nbCells = null;
this.hasGrid = false;
this.enableModules = true;
if(this.tbl != null && this.tbl.nodeName.tf_LCase() == 'table' && this.GetRowsNb())
{
if(arguments.length>1)
{
for(var i=0; i<arguments.length; i++)
{
var argtype = typeof arguments[i];
switch(argtype.tf_LCase())
{
case 'number':
this.startRow = arguments[i];
break;
case 'object':
this.fObj = arguments[i];
break;
}//switch
}//for
}//if
var f = !this.fObj ? {} : this.fObj;
//Start row et cols nb
this.refRow = this.startRow==undefined ? 2 : (this.startRow+1);
try{ this.nbCells = this.GetCellsNb(this.refRow) }
catch(e){ this.nbCells = this.GetCellsNb(0) }
this.basePath = f.base_path!=undefined ? f.base_path : 'TableFilter/'; //default script base path
if(this.enableModules){
/*** Modules: features of the script ***/
this.registeredModules = []; //modules to be loaded
this.alreadyImportedModules = []; //modules already imported in the page
this.importedModules = []; //modules imported by the TF script
this.modulesPath = f.modules_path!=undefined ? f.modules_path : this.basePath+'TF_Modules/'; //js modules files path
this.module = {
populateSelect:{ name:'populateSelect', desc:'Builds select type filters',
path: this.modulesPath + 'tf_populateSelect.js', loaded:0,
init: function(o) { o.module.populateSelect.loaded = 1; }
},
populateCheckList:{ name:'populateCheckList', desc:'Builds checklist type filters',
path: this.modulesPath + 'tf_populateCheckList.js', loaded:0,
init: function(o) { o.module.populateCheckList.loaded = 1; }
},
gridLayout: { name:'gridLayout', desc:'Grid layout feature',
path: this.modulesPath + 'tf_gridLayout.js', loaded:0,
init: function(o) { o.module.gridLayout.loaded = 1; }
},
paging: { name:'paging', desc:'Paging feature',
path: this.modulesPath + 'tf_paging.js', loaded:0,
init: function(o) { o.module.paging.loaded = 1; }
},
sort: { name:'sort', desc:'Sort feature',
path: this.modulesPath + 'tf_sort.js', loaded:0,
init: function(o) { o.module.sort.loaded = 1; }
},
popUpFilters: { name:'popUpFilters', desc:'Filters in pop-up container feature',
path: this.modulesPath + 'tf_popupFilters.js', loaded:0,
init: function(o) { o.module.popUpFilters.loaded = 1; }
},
themes: { name:'themes', desc:'Themes loading feature',
path: this.modulesPath + 'tf_themes.js', loaded:0,
init: function(o) { o.module.themes.loaded = 1; }
},
colOps: { name:'colOps', desc:'Columns operations feature',
path:this.modulesPath + 'tf_colOps.js', loaded:0,
init: function(o){ o.module.colOps.loaded = 1; }
},
fixedHeaders: { name:'fixedHeaders', desc:'Fixed headers feature - Deprecated',
path:this.modulesPath + 'tf_fixedHeaders.js', loaded:0,
init: function(o){ o.module.fixedHeaders.loaded = 1; }
},
rowsCounter: { name:'rowsCounter', desc:'Rows counter feature',
path:this.modulesPath + 'tf_rowsCounter.js', loaded:0,
init: function(o){ o.module.rowsCounter.loaded = 1; }
},
loader: { name:'loader', desc:'Loader feature',
path:this.modulesPath + 'tf_loader.js', loaded:0,
init: function(o){ o.module.loader.loaded = 1; }
},
statusBar: { name:'statusBar', desc:'Status bar feature',
path:this.modulesPath + 'tf_statusBar.js', loaded:0,
init: function(o){ o.module.statusBar.loaded = 1; }
},
resetBtn:{ name:'resetBtn', desc:'Reset button feature',
path:this.modulesPath + 'tf_resetBtn.js', loaded:0,
init: function(o){ o.module.resetBtn.loaded = 1; }
},
helpInstructions:{ name:'helpInstructions', desc:'Help, About',
path:this.modulesPath + 'tf_resetBtn.js', loaded:0,
init: function(o){ o.module.helpInstructions.loaded = 1; }
},
alternateRows:{ name:'alternateRows', desc:'Alternating rows color feature',
path:this.modulesPath + 'tf_alternateRows.js', loaded:0,
init: function(o){ o.module.alternateRows.loaded = 1; }
},
cookies:{ name:'cookies', desc:'Remember values feature (cookies)',
path:this.modulesPath + 'tf_cookies.js', loaded:0,
init: function(o){ o.module.cookies.loaded = 1; }
},
highlightKeywords:{ name:'highlightKeywords', desc:'Remember values feature (cookies)',
path:this.modulesPath + 'tf_highlightKeywords.js', loaded:0,
init: function(o){ o.module.highlightKeywords.loaded = 1; }
},
refreshFilters:{ name:'refreshFilters', desc:'Refresh filters feature',
path:this.modulesPath + 'tf_refreshFilters.js', loaded:0,
init: function(o){ o.module.refreshFilters.loaded = 1; }
},
extensions:{ name:'extensions', desc:'Extensions loading feature',
path:this.modulesPath + 'tf_extensions.js', loaded:0,
init: function(o){ o.module.extensions.loaded = 1; }
},
watermark:{ name:'watermark', desc:'Watermark feature',
path:this.modulesPath + 'tf_watermark.js', loaded:0,
init: function(o){ o.module.watermark.loaded = 1; }
},
ezEditTable:{ name:'ezEditTable', desc:'ezEditTable adapter',
path:this.modulesPath + 'tf_ezEditTable.js', loaded:0,
init: function(o){ o.module.ezEditTable.loaded = 1; }
},
publicMethods:{ name:'publicMethods', desc:'Additional public methods for developers',
path:this.modulesPath + 'tf_publicMethods.js', loaded:0,
init: function(o){ o.module.publicMethods.loaded = 1; }
}
};
}
/*** filter types ***/
this.fltTypeInp = 'input';
this.fltTypeSlc = 'select';
this.fltTypeMulti = 'multiple';
this.fltTypeCheckList = 'checklist';
this.fltTypeNone = 'none';
this.fltCol = []; //filter type of each column
for(var i=0; i<this.nbCells; i++){
if(this['col'+i]==undefined)
this['col'+i] = (f['col_'+i]==undefined)
? this.fltTypeInp : f['col_'+i].tf_LCase();
this.fltCol.push(this['col'+i]);
}
if(this.enableModules){
//Registers select and checklist scripts if needed
if(this.fltCol.tf_Has(this.fltTypeSlc) ||
this.fltCol.tf_Has(this.fltTypeMulti))
this.registeredModules.push(this.module.populateSelect.name);
if(this.fltCol.tf_Has(this.fltTypeCheckList)) this.registeredModules.push(this.module.populateCheckList.name);
}
/*** Developer additional methods ***/
this.publicMethods = f.public_methods!=undefined ? f.public_methods : false;
/*** filters' grid properties ***/
this.fltGrid = f.grid==false ? false : true; //enables/disables filter grid
/*** Grid layout ***/
this.gridLayout = f.grid_layout ? true : false; //enables/disables grid layout (fixed headers)
this.hasGridWidthsRow = false; //flag indicating if the grid has an additional row for column widths (IE<=7)
this.gridColElms = [];
this.sourceTblHtml = null;
if(this.gridLayout){
if(this.tbl.outerHTML==undefined) tf_SetOuterHtml(); //Firefox does not support outerHTML property...
this.sourceTblHtml = this.tbl.outerHTML; //original table html
}
/*** ***/
this.filtersRowIndex = f.filters_row_index!=undefined ? f.filters_row_index : 0;
this.headersRow = f.headers_row_index!=undefined ? f.headers_row_index : (this.filtersRowIndex==0 ? 1 : 0);
if(this.gridLayout){
if(this.headersRow>1) this.filtersRowIndex = this.headersRow+1;
else{ this.filtersRowIndex = 1; this.headersRow = 0; }
}
this.fltCellTag = f.filters_cell_tag!=undefined //defines tag of the cells containing filters (td/th)
? (f.filters_cell_tag!='th' ? 'td' : 'th') : 'td';
this.fltIds = []; //stores filters ids
this.fltElms = []; //stores filters DOM elements
this.searchArgs = null; //stores filters values
this.tblData = []; //stores table data
this.validRowsIndex = null; //stores valid rows indexes (rows visible upon filtering)
this.fltGridEl = null; //stores filters row element
this.isFirstLoad = true; //is first load boolean
this.infDiv = null; //container div for paging elements, reset btn etc.
this.lDiv = null; //div for rows counter
this.rDiv = null; //div for reset button and results per page select
this.mDiv = null; //div for paging elements
this.contDiv = null; //table container div for fixed headers (IE only)
this.infDivCssClass = f.inf_div_css_class!=undefined //defines css class for div containing
? f.inf_div_css_class : 'inf'; //paging elements, rows counter etc.
this.lDivCssClass = f.left_div_css_class!=undefined //defines css class for left div
? f.left_div_css_class : 'ldiv';
this.rDivCssClass = f.right_div_css_class!=undefined //defines css class for right div
? f.right_div_css_class : 'rdiv';
this.mDivCssClass = f.middle_div_css_class!=undefined //defines css class for mid div
? f.middle_div_css_class : 'mdiv';
this.contDivCssClass = f.content_div_css_class!=undefined
? f.content_div_css_class : 'cont'; //table container div css class
/*** filters' grid appearance ***/
this.stylesheet = f.stylesheet!=undefined ? f.stylesheet : this.basePath+'filtergrid.css'; //stylesheet file
this.stylesheetId = this.id + '_style';
this.fltsRowCssClass = f.flts_row_css_class!=undefined //defines css class for filters row
? f.flts_row_css_class : 'fltrow';
this.enableIcons = f.enable_icons!=undefined ? f.enable_icons : true; //enables/disables icons (paging, reset button)
this.alternateBgs = f.alternate_rows ? true : false; //enables/disbles rows alternating bg colors
this.hasColWidth = f.col_width ? true : false; //defines widths of columns
this.colWidth = this.hasColWidth ? f.col_width : null;
this.fixedHeaders = f.fixed_headers ? true : false; //enables/disables fixed headers
this.tBodyH = f.tbody_height ? f.tbody_height : 200; //tbody height if fixed headers enabled
this.fltCssClass = f.flt_css_class!=undefined //defines css class for filters
? f.flt_css_class : 'flt';
this.fltMultiCssClass = f.flt_multi_css_class!=undefined //defines css class for multiple selects filters
? f.flt_multi_css_class : 'flt_multi';
this.fltSmallCssClass = f.flt_small_css_class!=undefined //defines css class for filters
? f.flt_small_css_class : 'flt_s';
this.singleFltCssClass = f.single_flt_css_class!=undefined //defines css class for single-filter
? f.single_flt_css_class : 'single_flt';
this.isStartBgAlternate = true;
this.rowBgEvenCssClass = f.even_row_css_class!=undefined //defines css class for even rows
? f.even_row_css_class :'even';
this.rowBgOddCssClass = f.odd_row_css_class!=undefined //defines css class for odd rows
? f.odd_row_css_class :'odd';
/*** filters' grid behaviours ***/
this.enterKey = f.enter_key==false ? false : true; //enables/disables enter key
this.isModFilterFn = f.mod_filter_fn ? true : false; //enables/disables alternative fn call
this.modFilterFn = this.isModFilterFn ? f.mod_filter_fn : null;// used by tf_DetectKey fn
this.onBeforeFilter = tf_IsFn(f.on_before_filter) //calls function before filtering starts
? f.on_before_filter : null;
this.onAfterFilter = tf_IsFn(f.on_after_filter) //calls function after filtering
? f.on_after_filter : null;
this.matchCase = f.match_case ? true : false; //enables/disables case sensitivity
this.exactMatch = f.exact_match ? true : false; //enables/disbles exact match for search
this.refreshFilters = f.refresh_filters ? true : false; //refreshes drop-down lists upon validation
this.disableExcludedOptions = f.disable_excluded_options!=undefined ? f.disable_excluded_options : false; //wheter excluded options are disabled
this.activeFlt = null; //stores active filter element
this.activeFilterId = null; //id of active filter
this.hasColOperation = f.col_operation ? true : false; //enables/disbles column operation(sum,mean)
this.colOperation = null;
this.hasVisibleRows = f.rows_always_visible ? true : false; //enables always visible rows
this.visibleRows = this.hasVisibleRows ? f.rows_always_visible : [];//array containing always visible rows
this.searchType = f.search_type!=undefined //defines search type: include or exclude
? f.search_type : 'include';
this.isExternalFlt = f.external_flt_grid ? true : false; //enables/disables external filters generation
this.externalFltTgtIds = f.external_flt_grid_ids!=undefined //array containing ids of external elements containing filters
? f.external_flt_grid_ids : null;
this.externalFltEls = []; //stores filters elements if isExternalFlt is true
this.execDelay = f.exec_delay ? parseInt(f.exec_delay) : 100; //delays filtering process if loader true
this.status = f.status ? true : false; //enables/disables status messages
this.onFiltersLoaded = tf_IsFn(f.on_filters_loaded) //calls function when filters grid loaded
? f.on_filters_loaded : null;
this.singleSearchFlt = f.single_search_filter ? true : false; //enables/disables single filter search
this.onRowValidated = tf_IsFn(f.on_row_validated) //calls function after row is validated
? f.on_row_validated : null;
this.customCellDataCols = f.custom_cell_data_cols ? f.custom_cell_data_cols : []; //array defining columns for customCellData event
this.customCellData = tf_IsFn(f.custom_cell_data) //calls custom function for retrieving cell data
? f.custom_cell_data : null;
this.inpWatermark = f.input_watermark!=undefined ? f.input_watermark : ''; //input watermark text array
this.inpWatermarkCssClass = f.input_watermark_css_class!=undefined //defines css class for input watermark
? f.input_watermark_css_class : 'fltWatermark';
this.isInpWatermarkArray = f.input_watermark!=undefined
? (tf_IsArray(f.input_watermark) ? true : false) : false;
this.toolBarTgtId = f.toolbar_target_id!=undefined //id of toolbar container element
? f.toolbar_target_id : null;
this.helpInstructions = (f.help_instructions!=undefined) ? f.help_instructions : null; //enables/disables help div
this.popUpFilters = f.popup_filters!=undefined ? f.popup_filters : false; //popup filters
this.markActiveColumns = f.mark_active_columns!=undefined ? f.mark_active_columns : false; //active columns color
this.activeColumnsCssClass = f.active_columns_css_class!=undefined //defines css class for active column header
? f.active_columns_css_class : 'activeHeader';
this.onBeforeActiveColumn = tf_IsFn(f.on_before_active_column) //calls function before active column header is marked
? f.on_before_active_column : null;
this.onAfterActiveColumn = tf_IsFn(f.on_after_active_column) //calls function after active column header is marked
? f.on_after_active_column : null;
/*** selects customisation and behaviours ***/
this.displayAllText = f.display_all_text!=undefined ? f.display_all_text : ''; //defines 1st option text
this.enableSlcResetFilter = f.enable_slc_reset_filter!=undefined ? f.enable_slc_reset_filter : true;
this.enableEmptyOption = f.enable_empty_option ? true : false; //enables/disables empty option in combo-box filters
this.emptyText = f.empty_text!=undefined ? f.empty_text : '(Empty)'; //defines empty option text
this.enableNonEmptyOption = f.enable_non_empty_option ? true : false; //enables/disables non empty option in combo-box filters
this.nonEmptyText = f.non_empty_text!=undefined ? f.non_empty_text : '(Non empty)'; //defines empty option text
this.onSlcChange = f.on_change==false ? false : true; //enables/disables onChange event on combo-box
this.sortSlc = f.sort_select==false ? false : true; //enables/disables select options sorting
this.isSortNumAsc = f.sort_num_asc ? true : false; //enables/disables ascending numeric options sorting
this.sortNumAsc = this.isSortNumAsc ? f.sort_num_asc : null;
this.isSortNumDesc = f.sort_num_desc ? true : false; //enables/disables descending numeric options sorting
this.sortNumDesc = this.isSortNumDesc ? f.sort_num_desc : null;
this.slcFillingMethod = f.slc_filling_method!=undefined //sets select filling method: 'innerHTML' or
? f.slc_filling_method : 'createElement'; //'createElement'
this.fillSlcOnDemand = f.fill_slc_on_demand ? true : false; //enabled selects are populated on demand
this.activateSlcTooltip = f.activate_slc_tooltip!=undefined //IE only, tooltip text appearing on select
? f.activate_slc_tooltip : 'Click to activate'; // before it is populated
this.multipleSlcTooltip = f.multiple_slc_tooltip!=undefined //tooltip text appearing on multiple select
? f.multiple_slc_tooltip : 'Use Ctrl key for multiple selections';
this.hasCustomSlcOptions = f.custom_slc_options && tf_IsObj(f.custom_slc_options)
? true : false;
this.customSlcOptions = f.custom_slc_options!=undefined
? f.custom_slc_options : null;
this.onBeforeOperation = tf_IsFn(f.on_before_operation) //calls function before col operation
? f.on_before_operation : null;
this.onAfterOperation = tf_IsFn(f.on_after_operation) //calls function after col operation
? f.on_after_operation : null;
/*** checklist customisation and behaviours ***/
this.checkListDiv = []; //checklist container div
this.checkListDivCssClass = f.div_checklist_css_class!=undefined
? f.div_checklist_css_class : 'div_checklist'; //defines css class for div containing checklist filter
this.checkListCssClass = f.checklist_css_class!=undefined //defines css class for checklist filters
? f.checklist_css_class : 'flt_checklist';
this.checkListItemCssClass = f.checklist_item_css_class!=undefined //defines css class for checklist item (li)
? f.checklist_item_css_class : 'flt_checklist_item';
this.checkListSlcItemCssClass = f.checklist_selected_item_css_class!=undefined //defines css class for selected checklist item (li)
? f.checklist_selected_item_css_class : 'flt_checklist_slc_item';
this.activateCheckListTxt = f.activate_checklist_text!=undefined //Load on demand text
? f.activate_checklist_text : 'Click to load data';
this.checkListItemDisabledCssClass = f.checklist_item_disabled_css_class!=undefined //defines css class for checklist filters
? f.checklist_item_disabled_css_class : 'flt_checklist_item_disabled';
this.enableCheckListResetFilter = f.enable_checklist_reset_filter!=undefined ? f.enable_checklist_reset_filter : true;
/*** Filter operators ***/
this.rgxOperator = f.regexp_operator!=undefined ? f.regexp_operator : 'rgx:';
this.emOperator = f.empty_operator!=undefined ? f.empty_operator : '[empty]';
this.nmOperator = f.nonempty_operator!=undefined ? f.nonempty_operator : '[nonempty]';
this.orOperator = f.or_operator!=undefined ? f.or_operator : '||';
this.anOperator = f.and_operator!=undefined ? f.and_operator : '&&';
this.grOperator = f.greater_operator!=undefined ? f.greater_operator : '>';
this.lwOperator = f.lower_operator!=undefined ? f.lower_operator : '<';
this.leOperator = f.lower_equal_operator!=undefined ? f.lower_equal_operator : '<=';
this.geOperator = f.greater_equal_operator!=undefined ? f.greater_equal_operator : '>=';
this.dfOperator = f.different_operator!=undefined ? f.different_operator : '!';
this.lkOperator = f.like_operator!=undefined ? f.like_operator : '*';
this.eqOperator = f.equal_operator!=undefined ? f.equal_operator : '=';
this.stOperator = f.start_with_operator!=undefined ? f.start_with_operator : '{';
this.enOperator = f.end_with_operator!=undefined ? f.end_with_operator : '}';
this.curExp = f.cur_exp!=undefined ? f.cur_exp : '^[¥£€$]';
this.separator = f.separator!=undefined ? f.separator : ',';
/*** rows counter ***/
this.rowsCounter = f.rows_counter ? true : false; //show/hides rows counter
/*** status bar ***/
this.statusBar = f.status_bar ? f.status_bar : false; //show/hides status bar
/*** loader ***/
this.loader = f.loader ? true : false; //enables/disables loader
/*** validation - reset buttons/links ***/
this.displayBtn = f.btn ? true : false; //show/hides filter's validation button
this.btnText = f.btn_text!=undefined ? f.btn_text : (!this.enableIcons ? 'Go' : ''); //defines validation button text
this.btnCssClass = f.btn_css_class!=undefined ? f.btn_css_class : (!this.enableIcons ? 'btnflt' : 'btnflt_icon'); //defines css class for validation button
this.btnReset = f.btn_reset ? true : false; //show/hides reset link
this.btnResetCssClass = f.btn_reset_css_class!=undefined //defines css class for reset button
? f.btn_reset_css_class :'reset';
this.onBeforeReset = tf_IsFn(f.on_before_reset) ? f.on_before_reset : null; //callback function before filters are cleared
this.onAfterReset = tf_IsFn(f.on_after_reset) ? f.on_after_reset : null; //callback function after filters are cleared
/*** paging ***/
this.paging = f.paging ? true : false; //enables/disables table paging
this.hasResultsPerPage = f.results_per_page ? true : false; //enables/disables results per page drop-down
this.btnPageCssClass = f.paging_btn_css_class!=undefined
? f.paging_btn_css_class :'pgInp'; //css class for paging buttons (previous,next,etc.)
this.pagingSlc = null; //stores paging select element
this.resultsPerPage = null; //stores results per page text and values
this.resultsPerPageSlc = null; //results per page select element
this.isPagingRemoved = false; //indicates if paging elements were previously removed
this.nbVisibleRows = 0; //nb visible rows
this.nbHiddenRows = 0; //nb hidden rows
this.startPagingRow = 0; //1st row index of current page
this.nbPages = 0; //total nb of pages
this.currentPageNb = 1; //current page nb
/*** webfx sort adapter ***/
this.sort = f.sort ? true : false; //enables/disables default table sorting
this.isSortEnabled = false; //indicates if sort is set (used in tfAdapter.sortabletable.js)
this.sorted = false; //indicates if tables was sorted
this.sortConfig = f.sort_config!=undefined ? f.sort_config : {};
this.sortConfig.name = this.sortConfig['name']!=undefined ? f.sort_config.name : 'sortabletable';
this.sortConfig.src = this.sortConfig['src']!=undefined ? f.sort_config.src : this.basePath+'sortabletable.js';
this.sortConfig.adapterSrc = this.sortConfig['adapter_src']!=undefined ? f.sort_config.adapter_src : this.basePath+'tfAdapter.sortabletable.js';
this.sortConfig.initialize =this.sortConfig['initialize']!=undefined ? f.sort_config.initialize : function(o){ if(o.SetSortTable) o.SetSortTable(); };
this.sortConfig.sortTypes = this.sortConfig['sort_types']!=undefined ? f.sort_config.sort_types : [];
this.sortConfig.sortCol = this.sortConfig['sort_col']!=undefined ? f.sort_config.sort_col : null;
this.sortConfig.asyncSort = this.sortConfig['async_sort']!=undefined ? true : false;
this.sortConfig.triggerIds = this.sortConfig['sort_trigger_ids']!=undefined ? f.sort_config.sort_trigger_ids : [];
/*** ezEditTable extension ***/
this.selectable = f.selectable!=undefined ? f.selectable : false; //enables/disables table selection feature
this.editable = f.editable!=undefined ? f.editable : false; //enables/disables editable table feature
/*** onkeyup event ***/
this.onKeyUp = f.on_keyup ? true : false; //enables/disables onkeyup event, table is filtered when user stops typing
this.onKeyUpDelay = f.on_keyup_delay!=undefined ? f.on_keyup_delay : 900; //onkeyup delay timer (msecs)
this.isUserTyping = null; //typing indicator
this.onKeyUpTimer = undefined;
/*** keyword highlighting ***/
this.highlightKeywords = f.highlight_keywords ? true : false; //enables/disables keyword highlighting
this.highlightCssClass = f.highlight_css_class!=undefined ? f.highlight_css_class : 'keyword'; //defines css class for highlighting
this.highlightedNodes = [];
/*** data types ***/
this.defaultDateType = f.default_date_type!=undefined //defines default date type (european DMY)
? f.default_date_type : 'DMY';
this.thousandsSeparator = f.thousands_separator!=undefined //defines default thousands separator
? f.thousands_separator : ','; //US = ',' EU = '.'
this.decimalSeparator = f.decimal_separator!=undefined //defines default decimal separator
? f.decimal_separator : '.'; //US & javascript = '.' EU = ','
this.hasColNbFormat = f.col_number_format ? true : false; //enables number format per column
this.colNbFormat = this.hasColNbFormat ? f.col_number_format : null; //array containing columns nb formats
this.hasColDateType = f.col_date_type ? true : false; //enables date type per column
this.colDateType = this.hasColDateType ? f.col_date_type : null; //array containing columns date type
/*** status messages ***/
this.msgFilter = f.msg_filter!=undefined //filtering
? f.msg_filter : 'Filtering data...';
this.msgPopulate = f.msg_populate!=undefined //populating drop-downs
? f.msg_populate : 'Populating filter...';
this.msgPopulateCheckList = f.msg_populate_checklist!=undefined //populating drop-downs
? f.msg_populate_checklist : 'Populating list...';
this.msgChangePage = f.msg_change_page!=undefined //changing paging page
? f.msg_change_page : 'Collecting paging data...';
this.msgClear = f.msg_clear!=undefined //clearing filters
? f.msg_clear : 'Clearing filters...';
this.msgChangeResults = f.msg_change_results!=undefined //changing nb results/page
? f.msg_change_results : 'Changing results per page...';
this.msgResetValues = f.msg_reset_grid_values!=undefined //re-setting grid values
? f.msg_reset_grid_values : 'Re-setting filters values...';
this.msgResetPage = f.msg_reset_page!=undefined //re-setting page
? f.msg_reset_page : 'Re-setting page...';
this.msgResetPageLength = f.msg_reset_page_length!=undefined //re-setting page length
? f.msg_reset_page_length : 'Re-setting page length...';
this.msgSort = f.msg_sort!=undefined //table sorting
? f.msg_sort : 'Sorting data...';
this.msgLoadExtensions = f.msg_load_extensions!=undefined //extensions loading
? f.msg_load_extensions : 'Loading extensions...';
this.msgLoadThemes = f.msg_load_themes!=undefined //themes loading
? f.msg_load_themes : 'Loading theme(s)...';
/*** ids prefixes ***/
this.prfxTf = 'TF'; //css class name added to table
this.prfxFlt = 'flt'; //filters (inputs - selects)
this.prfxValButton = 'btn'; //validation button
this.prfxInfDiv = 'inf_'; //container div for paging elements, rows counter etc.
this.prfxLDiv = 'ldiv_'; //left div
this.prfxRDiv = 'rdiv_'; //right div
this.prfxMDiv = 'mdiv_'; //middle div
this.prfxContentDiv = 'cont_'; //table container if fixed headers enabled
this.prfxCheckListDiv = 'chkdiv_'; //checklist filter container div
this.prfxSlcPages = 'slcPages_'; //pages select
this.prfxSlcResults = 'slcResults_'; //results per page select
this.prfxSlcResultsTxt = 'slcResultsTxt_'; //label preciding results per page select
this.prfxBtnNextSpan = 'btnNextSpan_'; //span containing next page button
this.prfxBtnPrevSpan = 'btnPrevSpan_'; //span containing previous page button
this.prfxBtnLastSpan = 'btnLastSpan_'; //span containing last page button
this.prfxBtnFirstSpan = 'btnFirstSpan_'; //span containing first page button
this.prfxBtnNext = 'btnNext_'; //next button
this.prfxBtnPrev = 'btnPrev_'; //previous button
this.prfxBtnLast = 'btnLast_'; //last button
this.prfxBtnFirst = 'btnFirst_'; //first button
this.prfxPgSpan = 'pgspan_'; //span for tot nb pages
this.prfxPgBeforeSpan = 'pgbeforespan_'; //span preceding pages select (contains 'Page')
this.prfxPgAfterSpan = 'pgafterspan_'; //span following pages select (contains ' of ')
this.prfxCounter = 'counter_'; //rows counter div
this.prfxTotRows = 'totrows_span_'; //nb displayed rows label
this.prfxTotRowsTxt = 'totRowsTextSpan_'; //label preceding nb rows label
this.prfxResetSpan = 'resetspan_'; //span containing reset button
this.prfxLoader = 'load_'; //loader div
this.prfxStatus = 'status_'; //status bar div
this.prfxStatusSpan = 'statusSpan_'; //status bar label
this.prfxStatusTxt = 'statusText_';//text preceding status bar label
this.prfxCookieFltsValues = 'tf_flts_'; //filter values cookie
this.prfxCookiePageNb = 'tf_pgnb_'; //page nb cookie
this.prfxCookiePageLen = 'tf_pglen_'; //page length cookie
this.prfxMainTblCont = 'gridCont_'; //div containing grid elements if grid_layout true
this.prfxTblCont = 'tblCont_'; //div containing table if grid_layout true
this.prfxHeadTblCont = 'tblHeadCont_'; //div containing headers table if grid_layout true
this.prfxHeadTbl = 'tblHead_'; //headers' table if grid_layout true
this.prfxGridFltTd = '_td_'; //id of td containing the filter if grid_layout true
this.prfxGridTh = 'tblHeadTh_'; //id of th containing column header if grid_layout true
this.prfxHelpSpan = 'helpSpan_'; //id prefix for help elements
this.prfxHelpDiv = 'helpDiv_'; //id prefix for help elements
this.prfxPopUpSpan = 'popUpSpan_'; //id prefix for pop-up filter span
this.prfxPopUpDiv = 'popUpDiv_'; //id prefix for pop-up div containing filter
/*** cookies ***/
this.hasStoredValues = false;
this.rememberGridValues = f.remember_grid_values ? true : false; //remembers filters values on page load
this.fltsValuesCookie = this.prfxCookieFltsValues + this.id; //cookie storing filter values
this.rememberPageNb = this.paging && f.remember_page_number
? true : false; //remembers page nb on page load
this.pgNbCookie = this.prfxCookiePageNb + this.id; //cookie storing page nb
this.rememberPageLen = this.paging && f.remember_page_length
? true : false; //remembers page length on page load
this.pgLenCookie = this.prfxCookiePageLen + this.id; //cookie storing page length
this.cookieDuration = f.set_cookie_duration
? parseInt(f.set_cookie_duration) :100000; //cookie duration
/*** extensions ***/
this.hasExtensions = f.extensions ? true : false; //imports external script
this.extensions = (this.hasExtensions) ? f.extensions : null;
/*** themes ***/
this.enableDefaultTheme = f.enable_default_theme ? true : false;
this.hasThemes = (f.enable_default_theme
|| (f.themes && tf_IsObj(f.themes))) ? true : false; //imports themes
this.themes = (this.hasThemes) ? f.themes : null;
this.themesPath = f.themes_path!=undefined ? f.themes_path : this.basePath+'TF_Themes/'; //themes path
/***(deprecated: backward compatibility) ***/
this.hasBindScript = f.bind_script ? true : false; //imports external script
this.bindScript = (this.hasBindScript) ? f.bind_script : null;
/*** TF events ***/
var o = this;
this.Evt = {
name: {
filter: 'Filter',
populateselect: 'Populate',
populatechecklist: 'PopulateCheckList',
changepage: 'ChangePage',
clear: 'Clear',
changeresultsperpage: 'ChangeResults',
resetvalues: 'ResetValues',
resetpage: 'ResetPage',
resetpagelength: 'ResetPageLength',
sort: 'Sort',
loadextensions: 'LoadExtensions',
loadthemes: 'LoadThemes'
},
_DetectKey: function(e)
/*====================================================
- common fn that detects return key for a given
element (onkeypress for inputs)
=====================================================*/
{
if(!o.enterKey) return;
var evt = e || window.event;
if(evt)
{
var key=(evt.charCode)?evt.charCode:
((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0));
if(key=='13')
{
o.Filter();
tf_CancelEvent(evt);
tf_StopEvent(evt);
} else {
o.isUserTyping = true;
window.clearInterval(o.onKeyUpTimer);
o.onKeyUpTimer = undefined;
}
}//if evt
},
_OnKeyUp: function(e)
/*====================================================
- onkeyup event for text filters
(onKeyUp property)
=====================================================*/
{
if(!o.onKeyUp) return;
var evt = e || window.event;
var key=(evt.charCode)?evt.charCode:
((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0));
o.isUserTyping = false;
if(key!=13 && key!=9 && key!=27 && key!=38 && key!=40)
{
function filter()
{
window.clearInterval(o.onKeyUpTimer);
o.onKeyUpTimer = undefined;
if(!o.isUserTyping)
{
o.Filter();
o.isUserTyping = null;
}
}
if(o.onKeyUpTimer==undefined)
o.onKeyUpTimer = window.setInterval(filter, o.onKeyUpDelay);
} else {
window.clearInterval(o.onKeyUpTimer);
o.onKeyUpTimer = undefined;
}
},
_OnKeyDown: function(e)
/*====================================================
- onkeydown event for input filters
(onKeyUp property)
=====================================================*/
{
if(!o.onKeyUp) return;
o.isUserTyping = true;
},
_OnInpBlur: function(e)
/*====================================================
- onblur event for input filters (onKeyUp property)
=====================================================*/
{
if(o.onKeyUp){
o.isUserTyping = false;
window.clearInterval(o.onKeyUpTimer);
}
//Watermark
if(this.value == '' && o.inpWatermark != ''){
this.value = (o.isInpWatermarkArray)
? o.inpWatermark[this.getAttribute('ct')] : o.inpWatermark;
tf_AddClass(this, o.inpWatermarkCssClass);
}
if(o.ezEditTable){
if(o.editable) o.ezEditTable.Editable.Set();
if(o.selectable) o.ezEditTable.Selection.Set();
}
},
_OnInpFocus: function(e)
/*====================================================
- onfocus event for input filters
=====================================================*/
{
var evt = e || window.event;
o.activeFilterId = this.getAttribute('id');
o.activeFlt = tf_Id(o.activeFilterId);
//Watermark
if(!o.isInpWatermarkArray){
if(this.value == o.inpWatermark && o.inpWatermark != ''){
this.value = '';
tf_RemoveClass(this, o.inpWatermarkCssClass);
}
} else {
var inpWatermark = o.inpWatermark[this.getAttribute('ct')];
if(this.value == inpWatermark && inpWatermark != ''){
this.value = '';
tf_RemoveClass(this, o.inpWatermarkCssClass);
}
}
if(o.popUpFilters){
tf_CancelEvent(evt);
tf_StopEvent(evt);
}
if(o.ezEditTable){
if(o.editable) o.ezEditTable.Editable.Remove();
if(o.selectable) o.ezEditTable.Selection.Remove();
}
},
_OnSlcFocus: function(e)
/*====================================================
- onfocus event for select filters
=====================================================*/
{
var evt = e || window.event;
o.activeFilterId = this.getAttribute('id');
o.activeFlt = tf_Id(o.activeFilterId);
if(o.fillSlcOnDemand && this.getAttribute('filled') == '0')
{// select is populated when element has focus
var ct = this.getAttribute('ct');
o.PopulateSelect(ct);
if(!tf_isIE) this.setAttribute('filled','1');
}
if(o.popUpFilters){
tf_CancelEvent(evt);
tf_StopEvent(evt);
}
},
_OnSlcChange: function(e)
/*====================================================
- onchange event for select filters
=====================================================*/
{
var evt = e || window.event;
if(o.popUpFilters) tf_StopEvent(evt);
if(o.onSlcChange) o.Filter();
},
_OnSlcBlur: function()
/*====================================================
- onblur event for select filters
=====================================================*/
{
},
_OnCheckListChange: function(e)
/*====================================================
- onchange event for checklist filters
=====================================================*/
{
//Checks caller is not null
if(!o.Evt._OnCheckListChange.caller) return;
o.Evt._OnSlcChange(e);
},
_OnCheckListClick: function()
/*====================================================
- onclick event for checklist filters
=====================================================*/
{
if(o.fillSlcOnDemand && this.getAttribute('filled') == '0')
{
var ct = this.getAttribute('ct');
o.PopulateCheckList(ct);
o.checkListDiv[ct].onclick = null;
o.checkListDiv[ct].title = '';
}
},
_OnCheckListFocus: function()
/*====================================================
- onclick event for checklist filter container
=====================================================*/
{
o.activeFilterId = this.firstChild.getAttribute('id');
o.activeFlt = tf_Id(o.activeFilterId);
},
_OnBtnClick: function()
/*====================================================
- onclick event for validation button
(btn property)
=====================================================*/
{
o.Filter();
},
_OnSlcPagesChangeEvt: null, //used by sort adapter
_EnableSlc: function()
/*====================================================
- onclick event slc parent node (enables filters)
IE only
=====================================================*/
{
this.firstChild.disabled = false;
this.firstChild.focus();
this.onclick = null;
},
_Clear: function()
/*====================================================
- clears filters
=====================================================*/
{
o.ClearFilters();
},
_OnHelpBtnClick: function()
/*====================================================
- Help button onclick event
=====================================================*/
{
o._ToggleHelp();
},
_Paging: { //used by sort adapter
nextEvt: null,
prevEvt: null,
lastEvt: null,
firstEvt: null
}
};
if(this.enableModules){
//Register modules to be imported
var m = this.module, rm = this.registeredModules;
if(this.loader || this.statusBar || this.status || this.hasThemes /*|| this.publicMethods*/)
rm.push(m.loader.name);
if(this.hasThemes /*|| this.publicMethods*/) rm.push(m.themes.name);
if(this.paging /*|| this.publicMethods*/) rm.push(m.paging.name);
if(this.gridLayout/* || this.publicMethods*/) rm.push(m.gridLayout.name);
if(this.sort || this.gridLayout /*|| this.publicMethods*/) rm.push(m.sort.name);
if(this.popUpFilters /*|| this.publicMethods*/) rm.push(m.popUpFilters.name);
if(this.rowsCounter /*|| this.publicMethods*/) rm.push(m.rowsCounter.name);
if(this.fixedHeaders /*|| this.publicMethods*/) rm.push(m.fixedHeaders.name);
if(this.rememberGridValues || this.rememberPageLen || this.rememberPageNb /*|| this.publicMethods*/)
rm.push(m.cookies.name);
if(this.statusBar|| this.status || this.loader || this.hasThemes /*|| this.publicMethods*/) rm.push(m.statusBar.name);
if(this.btnReset /*|| this.publicMethods*/) rm.push(m.resetBtn.name);
if((this.helpInstructions || this.helpInstructions==null)/*|| this.publicMethods*/) rm.push(m.helpInstructions.name);
if(this.alternateBgs /*|| this.publicMethods*/) rm.push(m.alternateRows.name);
if(this.highlightKeywords /*|| this.publicMethods*/) rm.push(m.highlightKeywords.name);
if(this.refreshFilters /*|| this.publicMethods*/) rm.push(m.refreshFilters.name);
if(this.hasColOperation /*|| this.publicMethods*/) rm.push(m.colOps.name);
if(this.selectable || this.editable) rm.push(m.ezEditTable.name);
if(this.hasExtensions || this.gridLayout /*|| this.publicMethods*/){
rm.push(m.extensions.name);
if(!rm.tf_Has(m.populateCheckList.name, true)) rm.push(m.populateCheckList.name);
}
if(this.inpWatermark != '') rm.push(m.watermark.name);
if(this.publicMethods || this.hasExtensions || this.refreshFilters ||
this.popUpFilters || this.markActiveColumns) rm.push(m.publicMethods.name);
//Import modules
for(var i=0; i<rm.length; i++){
var module = m[rm[i]];
if(tf_IsImported(module.path)){
module.loaded = 1;
this.alreadyImportedModules.push(module.name);
} else { this.ImportModule(module); this.importedModules.push(module.name) };
}
}
}//if tbl!=null
}
TF.prototype = {
AddGrid: function()
{
if(this.enableModules){
if(this.isFirstLoad){
var o = this;
if(tf_isNotIE){
window[this.id + '_DelayAddGrid'] = function()
{
if(arguments.callee.done) return;
//Chrome & Safari do not seem to fire window.onload event
//Sorry for this ugly solution, one more ;-)
setTimeout(function(){ o._AddGrid(); },1);
arguments.callee.done = 1;
}
tf_AddEvent(window, 'load', window[this.id + '_DelayAddGrid']);
} else {
//Under IE script continues execution before dynamically imported scripts are fully loaded
function checkLoadedModules(){
var modulesFullyImported = true;
for(var i=0; i<o.registeredModules.length; i++){
var module = o.module[o.registeredModules[i]];
if(!module.loaded){
modulesFullyImported = false;
break;
}
}
if(modulesFullyImported){
clearInterval(pe);
o._AddGrid();
}
}
var pe = setInterval(checkLoadedModules, 10);
}
} else this._AddGrid();
} else this._AddGrid();
}, Init : function(){ this.AddGrid(); }, Initialize : function(){ this.AddGrid(); },
init : function(){ this.AddGrid(); }, initialize : function(){ this.AddGrid(); },
_AddGrid: function()
/*====================================================
- adds row with filtering grid bar and sets grid
behaviours and layout
=====================================================*/
{
if(this.hasGrid) return;
if(this.gridLayout) this.refRow = this.startRow==undefined ? 0 : this.startRow;
if(this.popUpFilters && ((this.filtersRowIndex==0 && this.headersRow == 1) || this.gridLayout)) this.headersRow = 0;
var f = !this.fObj ? {} : this.fObj;
var n = (this.singleSearchFlt) ? 1 : this.nbCells, inpclass;
if(window['tf_'+this.id] == undefined) window['tf_'+this.id] = this;
//loads stylesheet if not imported
//Issues with browsers != IE, IE rules in this case
this.IncludeFile(this.stylesheetId, this.stylesheet, null, 'link');
//loads theme
if(this.hasThemes) this._LoadThemes();
if(this.gridLayout)
{
this.isExternalFlt = true;
this.SetGridLayout();
//Once grid generated 1st filterable row is 0 again
this.refRow = (tf_isIE || tf_isIE7) ? (this.refRow+1) : 0;
}
if(this.loader) this.SetLoader();
if(this.popUpFilters){ if(!this.isFirstLoad && !this.gridLayout){ this.headersRow--; } this.SetPopupFilterIcons(); }
if(this.hasResultsPerPage)
{
this.resultsPerPage = f['results_per_page']!=undefined
? f['results_per_page'] : this.resultsPerPage;
if(this.resultsPerPage.length<2)
this.hasResultsPerPage = false;
else
this.pagingLength = this.resultsPerPage[1][0];
}
if(!this.fltGrid)
{//filters grid is not genetared
this.refRow = (this.refRow-1);
if(this.gridLayout) this.refRow = 0;
this.nbFilterableRows = this.GetRowsNb();
this.nbVisibleRows = this.nbFilterableRows;
this.nbRows = this.nbFilterableRows + this.refRow;
} else {
if(this.isFirstLoad)
{
if(!this.gridLayout){
var fltrow;
var thead = tf_Tag(this.tbl,'thead');
if(thead.length>0)
fltrow = thead[0].insertRow(this.filtersRowIndex);
else
fltrow = this.tbl.insertRow(this.filtersRowIndex);
if(this.headersRow>1 && this.filtersRowIndex <= this.headersRow && !this.popUpFilters) this.headersRow++;
if(this.popUpFilters) this.headersRow++;
if(this.fixedHeaders) this.SetFixedHeaders();
fltrow.className = this.fltsRowCssClass;
//Disable for grid_layout
if(this.isExternalFlt && (!this.gridLayout || this.popUpFilters)) fltrow.style.display = 'none';
}
this.nbFilterableRows = this.GetRowsNb();
this.nbVisibleRows = this.nbFilterableRows;
this.nbRows = this.tbl.rows.length;
for(var i=0; i<n; i++){// this loop adds filters
var fltcell = tf_CreateElm(this.fltCellTag);
if(this.singleSearchFlt) fltcell.colSpan = this.nbCells;
if(!this.gridLayout) fltrow.appendChild(fltcell);
inpclass = (i==n-1 && this.displayBtn) ? this.fltSmallCssClass : this.fltCssClass;
if(this.popUpFilters) this.SetPopupFilter(i);
if(this['col'+i]==undefined)
this['col'+i] = (f['col_'+i]==undefined)
? this.fltTypeInp : f['col_'+i].tf_LCase();
if(this.singleSearchFlt)
{//only 1 input for single search
this['col'+i] = this.fltTypeInp;
inpclass = this.singleFltCssClass;
}
if(this['col'+i]==this.fltTypeSlc || this['col'+i]==this.fltTypeMulti)
{//selects
var slc = tf_CreateElm(this.fltTypeSlc,
['id',this.prfxFlt+i+'_'+this.id],
['ct',i],['filled','0']);
if(this['col'+i]==this.fltTypeMulti)
{
slc.multiple = this.fltTypeMulti;
slc.title = this.multipleSlcTooltip;
}
slc.className = (this['col'+i].tf_LCase()==this.fltTypeSlc)
? inpclass : this.fltMultiCssClass;// for ie<=6
if(this.isExternalFlt && this.externalFltTgtIds && tf_Id(this.externalFltTgtIds[i]))
{//filter is appended in desired element
tf_Id(this.externalFltTgtIds[i]).appendChild(slc);
this.externalFltEls.push(slc);
} else {
fltcell.appendChild(slc);
}
this.fltIds.push(this.prfxFlt+i+'_'+this.id);
if(!this.fillSlcOnDemand) this._PopulateSelect(i);
slc.onkeypress = this.Evt._DetectKey;
slc.onchange = this.Evt._OnSlcChange;
slc.onfocus = this.Evt._OnSlcFocus;
slc.onblur = this.Evt._OnSlcBlur;
if(this.fillSlcOnDemand)
{//1st option is created here since PopulateSelect isn't invoked
var opt0 = tf_CreateOpt(this.displayAllText,'');
slc.appendChild(opt0);
}
/* Code below for IE: it prevents select options to
slide out before select it-self is populated.
This is an unexpeted behavior for users since at
1st click options are empty. Work around:
select is disabled and by clicking on element
(parent td), users enable drop-down and select is
populated at same time. */
if(this.fillSlcOnDemand && tf_isIE)
{
slc.disabled = true;
slc.title = this.activateSlcTooltip;
slc.parentNode.onclick = this.Evt._EnableSlc;
if(this['col'+i]==this.fltTypeMulti)
this.__deferMultipleSelection(slc,0);
}
}
else if(this['col'+i]==this.fltTypeCheckList)
{// checklist
var divCont = tf_CreateElm('div',
['id',this.prfxCheckListDiv+i+'_'+this.id],
['ct',i],['filled','0']);
divCont.className = this.checkListDivCssClass;
if(this.isExternalFlt && this.externalFltTgtIds
&& tf_Id(this.externalFltTgtIds[i]))
{//filter is appended in desired element
tf_Id(this.externalFltTgtIds[i]).appendChild(divCont);
this.externalFltEls.push(divCont);
} else {
fltcell.appendChild(divCont);
}
this.checkListDiv[i] = divCont;
this.fltIds.push(this.prfxFlt+i+'_'+this.id);
if(!this.fillSlcOnDemand) this._PopulateCheckList(i);
divCont.onclick = this.Evt._OnCheckListFocus;
if(this.fillSlcOnDemand)
{
divCont.onclick = this.Evt._OnCheckListClick;
divCont.appendChild(tf_CreateText(this.activateCheckListTxt));
}
}
else
{
var inptype;
(this['col'+i]==this.fltTypeInp) ? inptype='text' : inptype='hidden';//show/hide input
var inp = tf_CreateElm(this.fltTypeInp,['id',this.prfxFlt+i+'_'+this.id],['type',inptype],['ct',i]);
if(inptype!='hidden')
inp.value = (this.isInpWatermarkArray) ? this.inpWatermark[i] : this.inpWatermark;
inp.className = inpclass;// for ie<=6
if(this.inpWatermark!='') tf_AddClass(inp, this.inpWatermarkCssClass); //watermark css class
inp.onfocus = this.Evt._OnInpFocus;
if(this.isExternalFlt && this.externalFltTgtIds && tf_Id(this.externalFltTgtIds[i]))
{//filter is appended in desired element
tf_Id(this.externalFltTgtIds[i]).appendChild(inp);
this.externalFltEls.push(inp);
} else {
fltcell.appendChild(inp);
}
this.fltIds.push(this.prfxFlt+i+'_'+this.id);
inp.onkeypress = this.Evt._DetectKey;
inp.onkeydown = this.Evt._OnKeyDown;
inp.onkeyup = this.Evt._OnKeyUp;
inp.onblur = this.Evt._OnInpBlur;
if(this.rememberGridValues)
{
var flts = tf_ReadCookie(this.fltsValuesCookie); //reads the cookie
var reg = new RegExp(this.separator,'g');
var flts_values = flts.split(reg); //creates an array with filters' values
if(flts_values[i]!=' ')
this.SetFilterValue(i,flts_values[i],false);
}
}
if(i==n-1 && this.displayBtn)// this adds validation button
{
var btn = tf_CreateElm(this.fltTypeInp,['id',this.prfxValButton+i+'_'+this.id],
['type','button'], ['value',this.btnText]);
btn.className = this.btnCssClass;
if(this.isExternalFlt && this.externalFltTgtIds && tf_Id(this.externalFltTgtIds[i]))
//filter is appended in desired element
tf_Id(this.externalFltTgtIds[i]).appendChild(btn);
else
fltcell.appendChild(btn);
btn.onclick = this.Evt._OnBtnClick;
}//if
}// for i
} else {
this.__resetGrid();
}//if isFirstLoad
}//if this.fltGrid
/* Filter behaviours */
if(this.rowsCounter) this.SetRowsCounter();
if(this.statusBar) this.SetStatusBar();
if(this.fixedHeaders && !this.isFirstLoad) this.SetFixedHeaders();
if(this.paging) this.SetPaging();
if(this.hasResultsPerPage && this.paging) this.SetResultsPerPage();
if(this.btnReset) this.SetResetBtn();
if(this.helpInstructions) this.SetHelpInstructions();
if(this.hasColWidth && !this.gridLayout) this.SetColWidths();
if(this.alternateBgs && this.isStartBgAlternate)
this.SetAlternateRows(); //1st time only if no paging and rememberGridValues
if(this.hasColOperation && this.fltGrid)
{
this.colOperation = f.col_operation;
this.SetColOperation();
}
if(this.sort) this.SetSort();
if(this.selectable || this.editable) this.SetEditable();
/* Deprecated Loads external script */
if(this.hasBindScript)
{
if(this.bindScript['src']!=undefined)
{
var scriptPath = this.bindScript['src'];
var scriptName = (this.bindScript['name']!=undefined)
? this.bindScript['name'] : '';
this.IncludeFile(scriptName,scriptPath,this.bindScript['target_fn']);
}
}//if bindScript
/* */
this.isFirstLoad = false;
this.hasGrid = true;
if(this.rememberGridValues || this.rememberPageLen || this.rememberPageNb)
this.ResetValues();
//TF css class is added to table
if(!this.gridLayout) tf_AddClass(this.tbl, this.prfxTf);
if(this.loader) this.ShowLoader('none');
/* Loads extensions */
if(this.hasExtensions) this.LoadExtensions();
if(this.onFiltersLoaded)
this.onFiltersLoaded.call(null,this);
},// AddGrid
EvtManager: function(evt,s)
/*====================================================
- TF events manager
- Params:
- event name (string)
- config object (optional literal object)
=====================================================*/
{
var o = this;
var slcIndex = (s!=undefined && s.slcIndex!=undefined) ? s.slcIndex : null;
var slcExternal = (s!=undefined && s.slcExternal!=undefined) ? s.slcExternal : false;
var slcId = (s!=undefined && s.slcId!=undefined) ? s.slcId : null;
var pgIndex = (s!=undefined && s.pgIndex!=undefined) ? s.pgIndex : null;
function efx(){
if(evt!=undefined)
switch(evt)
{
case o.Evt.name.filter:
(o.isModFilterFn)
? o.modFilterFn.call(null,o)
: o._Filter();
break;
case o.Evt.name.populateselect:
(o.refreshFilters)
? o._PopulateSelect(slcIndex,true)
: o._PopulateSelect(slcIndex,false,slcExternal,slcId);
break;
case o.Evt.name.populatechecklist:
o._PopulateCheckList(slcIndex,slcExternal,slcId);
break;
case o.Evt.name.changepage:
o._ChangePage(pgIndex);
break;
case o.Evt.name.clear:
o._ClearFilters();
o._Filter();
break;
case o.Evt.name.changeresultsperpage:
o._ChangeResultsPerPage();
break;
case o.Evt.name.resetvalues:
o._ResetValues();
o._Filter();
break;
case o.Evt.name.resetpage:
o._ResetPage(o.pgNbCookie);
break;
case o.Evt.name.resetpagelength:
o._ResetPageLength(o.pgLenCookie);
break;
case o.Evt.name.sort:
void(0);
break;
case o.Evt.name.loadextensions:
o._LoadExtensions();
break;
case o.Evt.name.loadthemes:
o._LoadThemes();
break;
default: //to be used by extensions events when needed
o['_'+evt].call(null,o,s);
break;
}
if(o.status || o.statusBar) o.StatusMsg('');
if(o.loader) o.ShowLoader('none');
}
if(this.loader || this.status || this.statusBar)
{
try{
this.ShowLoader('');
this.StatusMsg(o['msg'+evt]);
} catch(e){}
window.setTimeout(efx,this.execDelay);
} else efx();
},
ImportModule: function(module)
{
if(!module.path || !module.name) return;
this.IncludeFile(module.name, module.path, module.init);
},
RemoveGrid: function()
/*====================================================
- removes a filter grid
=====================================================*/
{
if(this.fltGrid && this.hasGrid)
{
var rows = this.tbl.rows;
if(this.paging) this.RemovePaging();
if(this.statusBar) this.RemoveStatusBar();
if(this.rowsCounter) this.RemoveRowsCounter();
if(this.btnReset) this.RemoveResetBtn();
if(this.helpInstructions || this.helpInstructions==null) this.RemoveHelpInstructions();
if(this.paging) this.RemoveResultsPerPage();
if(this.isExternalFlt && !this.popUpFilters) this.RemoveExternalFlts();
if(this.fixedHeaders) this.RemoveFixedHeaders();
if(this.infDiv) this.RemoveTopDiv();
if(this.highlightKeywords) this.UnhighlightAll();
if(this.sort) this.RemoveSort();
if(this.loader) this.RemoveLoader();
if(this.popUpFilters) this.RemovePopupFilters();
if(this.markActiveColumns) this.ClearActiveColumns();
for(var j=this.refRow; j<this.nbRows; j++)
{//this loop shows all rows and removes validRow attribute
rows[j].style.display = '';
try
{
if(rows[j].hasAttribute('validRow'))
rows[j].removeAttribute('validRow');
} //ie<=6 doesn't support hasAttribute method
catch(e){
for(var x = 0; x < rows[j].attributes.length; x++)
{
if(rows[j].attributes[x].nodeName.tf_LCase()=='validrow')
rows[j].removeAttribute('validRow');
}//for x
}//catch(e)
//removes alterning colors
if(this.alternateBgs) this.RemoveRowBg(j);
}//for j
if(this.fltGrid && !this.gridLayout)
{
this.fltGridEl = rows[this.filtersRowIndex];
this.tbl.deleteRow(this.filtersRowIndex);
}
if(this.gridLayout) this.RemoveGridLayout();
tf_RemoveClass(this.tbl, this.prfxTf);
this.activeFlt = null;
this.isStartBgAlternate = true;
this.hasGrid = false;
}//if this.fltGrid
},
SetTopDiv: function()
/*====================================================
- Generates div above table where paging,
reset button, rows counter label etc. are placed
=====================================================*/
{
if(this.infDiv!=null) return;
/*** container div ***/
var infdiv = tf_CreateElm('div',['id',this.prfxInfDiv+this.id]);
infdiv.className = this.infDivCssClass;// setAttribute method doesn't seem to work on ie<=6
if(this.toolBarTgtId) //custom container
tf_Id(this.toolBarTgtId).appendChild(infdiv);
else if(this.fixedHeaders && this.contDiv) //fixed headers
this.contDiv.parentNode.insertBefore(infdiv, this.contDiv);
else if(this.gridLayout){ //grid-layout
this.tblMainCont.appendChild(infdiv);
infdiv.className = this.gridInfDivCssClass;
}
else //default location: above table
this.tbl.parentNode.insertBefore(infdiv, this.tbl);
this.infDiv = tf_Id(this.prfxInfDiv+this.id);
/*** left div containing rows # displayer ***/
var ldiv = tf_CreateElm('div',['id',this.prfxLDiv+this.id]);
ldiv.className = this.lDivCssClass;/*'ldiv'*/;
infdiv.appendChild(ldiv);
this.lDiv = tf_Id(this.prfxLDiv+this.id);
/*** right div containing reset button
+ nb results per page select ***/
var rdiv = tf_CreateElm('div',['id',this.prfxRDiv+this.id]);
rdiv.className = this.rDivCssClass/*'rdiv'*/;
infdiv.appendChild(rdiv);
this.rDiv = tf_Id(this.prfxRDiv+this.id);
/*** mid div containing paging elements ***/
var mdiv = tf_CreateElm('div',['id',this.prfxMDiv+this.id]);
mdiv.className = this.mDivCssClass/*'mdiv'*/;
infdiv.appendChild(mdiv);
this.mDiv = tf_Id(this.prfxMDiv+this.id);
if(this.helpInstructions==null) this.SetHelpInstructions();
},
RemoveTopDiv: function()
/*====================================================
- Removes div above table where paging,
reset button, rows counter label etc. are placed
=====================================================*/
{
if(this.infDiv==null) return;
this.infDiv.parentNode.removeChild(this.infDiv);
this.infDiv = null;
},
RemoveExternalFlts: function()
/*====================================================
- removes external filters
=====================================================*/
{
if(!this.isExternalFlt && !this.externalFltTgtIds) return;
for(var ct=0; ct<this.externalFltTgtIds.length; ct++)
if(tf_Id(this.externalFltTgtIds[ct]))
tf_Id(this.externalFltTgtIds[ct]).innerHTML = '';
},
Filter: function()
{
this.EvtManager(this.Evt.name.filter);
},
_Filter: function()
/*====================================================
- Filtering fn
- retrieves data from each td in every single tr
and compares to search string for current
column
- tr is hidden if all search strings are not
found
=====================================================*/
{
if(!this.fltGrid || (!this.hasGrid && !this.isFirstLoad)) return;
//invokes eventual onbefore method
if(this.onBeforeFilter) this.onBeforeFilter.call(null,this);
if(this.inpWatermark != '') this.SetWatermark(false);
var row = this.tbl.rows;
f = this.fObj!=undefined ? this.fObj : [];
var hiddenrows = 0;
this.validRowsIndex = [];
var o = this;
//removes keyword highlighting
if(this.highlightKeywords) this.UnhighlightAll();
//removes popup filters active icons
if(this.popUpFilters) this.SetAllPopupFiltersIcon();
//removes active column header class
if(this.markActiveColumns) this.ClearActiveColumns();
//search args re-init
this.searchArgs = this.GetFiltersValue();
var num_cell_data, nbFormat;
var re_le = new RegExp(this.leOperator), re_ge = new RegExp(this.geOperator);
var re_l = new RegExp(this.lwOperator), re_g = new RegExp(this.grOperator);
var re_d = new RegExp(this.dfOperator), re_lk = new RegExp(tf_RegexpEscape(this.lkOperator));
var re_eq = new RegExp(this.eqOperator), re_st = new RegExp(this.stOperator);
var re_en = new RegExp(this.enOperator), re_an = new RegExp(this.anOperator);
var re_cr = new RegExp(this.curExp), re_em = this.emOperator;
var re_nm = this.nmOperator, re_re = new RegExp(tf_RegexpEscape(this.rgxOperator));
function highlight(str,ok,cell){//keyword highlighting
if(o.highlightKeywords && ok){
str = str.replace(re_lk,'');
str = str.replace(re_eq,'');
str = str.replace(re_st,'');
str = str.replace(re_en,'');
var w = str;
if(re_le.test(str) || re_ge.test(str) || re_l.test(str) || re_g.test(str) || re_d.test(str))
w = tf_GetNodeText(cell);
if(w!='')
tf_HighlightWord(cell,w,o.highlightCssClass,o);
}
}
//looks for search argument in current row
function hasArg(sA,cell_data,j)
{
var occurence;
//Search arg operator tests
var hasLO = re_l.test(sA), hasLE = re_le.test(sA);
var hasGR = re_g.test(sA), hasGE = re_ge.test(sA);
var hasDF = re_d.test(sA), hasEQ = re_eq.test(sA);
var hasLK = re_lk.test(sA), hasAN = re_an.test(sA);
var hasST = re_st.test(sA), hasEN = re_en.test(sA);
var hasEM = (re_em == sA), hasNM = (re_nm == sA);
var hasRE = re_re.test(sA);
//Search arg dates tests
var isLDate = (hasLO && tf_IsValidDate(sA.replace(re_l,''),dtType));
var isLEDate = (hasLE && tf_IsValidDate(sA.replace(re_le,''),dtType));
var isGDate = (hasGR && tf_IsValidDate(sA.replace(re_g,''),dtType));
var isGEDate = (hasGE && tf_IsValidDate(sA.replace(re_ge,''),dtType));
var isDFDate = (hasDF && tf_IsValidDate(sA.replace(re_d,''),dtType));
var isEQDate = (hasEQ && tf_IsValidDate(sA.replace(re_eq,''),dtType));
if(tf_IsValidDate(cell_data,dtType))
{//dates
var dte1 = tf_FormatDate(cell_data,dtType);
if(isLDate)
{// lower date
var dte2 = tf_FormatDate(sA.replace(re_l,''),dtType);
occurence = (dte1 < dte2);
}
else if(isLEDate)
{// lower equal date
var dte2 = tf_FormatDate(sA.replace(re_le,''),dtType);
occurence = (dte1 <= dte2);
}
else if(isGEDate)
{// greater equal date
var dte2 = tf_FormatDate(sA.replace(re_ge,''),dtType);
occurence = (dte1 >= dte2);
}
else if(isGDate)
{// greater date
var dte2 = tf_FormatDate(sA.replace(re_g,''),dtType);
occurence = (dte1 > dte2);
}
else if(isDFDate)
{// different date
var dte2 = tf_FormatDate(sA.replace(re_d,''),dtType);
occurence = (dte1.toString() != dte2.toString());
}
else if(isEQDate)
{// equal date
var dte2 = tf_FormatDate(sA.replace(re_eq,''),dtType);
occurence = (dte1.toString() == dte2.toString());
}
else if(re_lk.test(sA)) // searched keyword with * operator doesn't have to be a date
{// like date
occurence = o.__containsStr(sA.replace(re_lk,''),cell_data,null,false);
}
else if(tf_IsValidDate(sA,dtType))
{
var dte2 = tf_FormatDate(sA,dtType);
occurence = (dte1.toString() == dte2.toString());
}
else if(hasEM) //empty
occurence = (cell_data.tf_Trim()=='' ? true : false);
else if(hasNM) //non-empty
occurence = (cell_data.tf_Trim()!='' ? true : false);
}
else
{
//first numbers need to be formated
if(o.hasColNbFormat && o.colNbFormat[j]!=null)
{
num_cell_data = tf_RemoveNbFormat(cell_data,o.colNbFormat[j]);
nbFormat = o.colNbFormat[j];
} else {
if(o.thousandsSeparator==',' && o.decimalSeparator=='.')
{
num_cell_data = tf_RemoveNbFormat(cell_data,'us');
nbFormat = 'us';
} else {
num_cell_data = tf_RemoveNbFormat(cell_data,'eu');
nbFormat = 'eu';
}
}
// first checks if there is any operator (<,>,<=,>=,!,*,=,{,},rgx:)
if(hasLE) //lower equal
occurence = num_cell_data <= tf_RemoveNbFormat(sA.replace(re_le,''),nbFormat);
else if(hasGE) //greater equal
occurence = num_cell_data >= tf_RemoveNbFormat(sA.replace(re_ge,''),nbFormat);
else if(hasLO) //lower
occurence = num_cell_data < tf_RemoveNbFormat(sA.replace(re_l,''),nbFormat);
else if(hasGR) //greater
occurence = num_cell_data > tf_RemoveNbFormat(sA.replace(re_g,''),nbFormat);
else if(hasDF) //different
occurence = o.__containsStr(sA.replace(re_d,''),cell_data) ? false : true;
else if(hasLK) //like
occurence = o.__containsStr(sA.replace(re_lk,''),cell_data,null,false);
else if(hasEQ) //equal
occurence = o.__containsStr(sA.replace(re_eq,''),cell_data,null,true);
else if(hasST) //starts with
occurence = cell_data.indexOf(sA.replace(re_st,''))==0 ? true : false;
else if(hasEN) //ends with
{
var searchArg = sA.replace(re_en,'');
occurence = cell_data.lastIndexOf(searchArg,cell_data.length-1)==(cell_data.length-1)-(searchArg.length-1)
&& cell_data.lastIndexOf(searchArg,cell_data.length-1) > -1
? true : false;
}
else if(hasEM) //empty
occurence = (cell_data.tf_Trim()=='' ? true : false);
else if(hasNM) //non-empty
occurence = (cell_data.tf_Trim()!='' ? true : false);
else if(hasRE){ //regexp
try{ //in case regexp fires an exception
var searchArg = sA.replace(re_re,''); //operator is removed
var rgx = new RegExp(searchArg);
occurence = rgx.test(cell_data);
} catch(e) { occurence = false; }
}
else
occurence = o.__containsStr(sA,cell_data,(f['col_'+j]==undefined) ? this.fltTypeInp : f['col_'+j]);
}//else
return occurence;
}//fn
for(var k=this.refRow; k<this.nbRows; k++)
{
/*** if table already filtered some rows are not visible ***/
if(row[k].style.display == 'none') row[k].style.display = '';
var cell = row[k].cells;
var nchilds = cell.length;
// checks if row has exact cell #
if(nchilds != this.nbCells) continue;
var occurence = [];
var isRowValid = (this.searchType=='include') ? true : false;
var singleFltRowValid = false; //only for single filter search
for(var j=0; j<nchilds; j++)
{// this loop retrieves cell data
var sA = this.searchArgs[(this.singleSearchFlt) ? 0 : j]; //searched keyword
var dtType = (this.hasColDateType) ? this.colDateType[j] : this.defaultDateType;
if(sA=='') continue;
var cell_data = this.GetCellData(j, cell[j]).tf_MatchCase(this.matchCase);
var sAOrSplit = sA.split(this.orOperator);//multiple search parameter operator ||
var hasMultiOrSA = (sAOrSplit.length>1) ? true : false;//multiple search || parameter boolean
var sAAndSplit = sA.split(this.anOperator);//multiple search parameter operator &&
var hasMultiAndSA = (sAAndSplit.length>1) ? true : false;//multiple search && parameter boolean
if(hasMultiOrSA || hasMultiAndSA)
{//multiple sarch parameters
var cS, occur = false;
var s = (hasMultiOrSA) ? sAOrSplit : sAAndSplit;
for(var w=0; w<s.length; w++)
{
cS = s[w].tf_Trim();
occur = hasArg(cS,cell_data,j);
highlight(cS,occur,cell[j]);
if(hasMultiOrSA && occur) break;
if(hasMultiAndSA && !occur) break;
}
occurence[j] = occur;
}
else {//single search parameter
occurence[j] = hasArg(sA.tf_Trim(),cell_data,j);
highlight(sA,occurence[j],cell[j]);
}//else single param
if(!occurence[j]) isRowValid = (this.searchType=='include') ? false : true;
if(this.singleSearchFlt && occurence[j]) singleFltRowValid = true;
if(this.popUpFilters) this.SetPopupFilterIcon(j, true);
if(this.markActiveColumns){
if(k == this.refRow){
if(this.onBeforeActiveColumn) this.onBeforeActiveColumn.call(null, this, j);
tf_AddClass(this.GetHeaderElement(j), this.activeColumnsCssClass);
if(this.onAfterActiveColumn) this.onAfterActiveColumn.call(null, this, j);
}
}
}//for j
if(this.singleSearchFlt && singleFltRowValid) isRowValid = true;
if(!isRowValid)
{
this.SetRowValidation(k,false);
// always visible rows need to be counted as valid
if(this.hasVisibleRows && this.visibleRows.tf_Has(k) && !this.paging)
this.validRowsIndex.push(k);
else
hiddenrows++;
} else {
this.SetRowValidation(k,true);
this.validRowsIndex.push(k);
if(this.alternateBgs) this.SetRowBg(k,this.validRowsIndex.length);
if(this.onRowValidated) this.onRowValidated.call(null,this,k);
}
}// for k
this.nbVisibleRows = this.validRowsIndex.length;
this.nbHiddenRows = hiddenrows;
this.isStartBgAlternate = false;
if(this.rememberGridValues) this.RememberFiltersValue(this.fltsValuesCookie);
if(!this.paging) this.ApplyGridProps();//applies filter props after filtering process
if(this.paging){
this.startPagingRow = 0;
this.currentPageNb = 1;
this.SetPagingInfo(this.validRowsIndex);
}//starts paging process
//invokes eventual onafter function
if(this.onAfterFilter) this.onAfterFilter.call(null,this);
},
ApplyGridProps: function()
/*====================================================
- checks methods that should be called
after filtering and/or paging process
=====================================================*/
{
if(this.activeFlt && this.activeFlt.nodeName.tf_LCase()==this.fltTypeSlc && !this.popUpFilters)
{// blurs active filter (IE)
this.activeFlt.blur();
if(this.activeFlt.parentNode) this.activeFlt.parentNode.focus();
}
if(this.visibleRows) this.SetVisibleRows();//shows rows always visible
if(this.colOperation) this.SetColOperation();//makes operation on a col
if(this.refreshFilters) this.RefreshFiltersGrid();//re-populates drop-down filters
var nr = (!this.paging && this.hasVisibleRows)
? (this.nbVisibleRows - this.visibleRows.length) : this.nbVisibleRows;
if(this.rowsCounter) this.RefreshNbRows(nr);//refreshes rows counter
if(this.inpWatermark != '') this.SetWatermark(true);
if(this.popUpFilters) this.CloseAllPopupFilters();
},
GetColValues: function(colindex,num,exclude)
/*====================================================
- returns an array containing cell values of
a column
- needs following args:
- column index (number)
- a boolean set to true if we want only
numbers to be returned
- array containing rows index to be excluded
from returned values
=====================================================*/
{
if(!this.fltGrid) return;
var row = this.tbl.rows;
var colValues = [];
for(var i=this.refRow; i<this.nbRows; i++)//iterates rows
{
var isExludedRow = false;
if(exclude!=undefined && tf_IsObj(exclude))
{ // checks if current row index appears in exclude array
isExludedRow = exclude.tf_Has(i); //boolean
}
var cell = row[i].cells;
var nchilds = cell.length;
if(nchilds == this.nbCells && !isExludedRow)
{// checks if row has exact cell # and is not excluded
for(var j=0; j<nchilds; j++)// this loop retrieves cell data
{
if(j==colindex && row[i].style.display=='')
{
var cell_data = this.GetCellData(j, cell[j]).tf_LCase();
var nbFormat = this.colNbFormat ? this.colNbFormat[colindex] : null;
(num) ? colValues.push(tf_RemoveNbFormat(cell_data,nbFormat))
: colValues.push(cell_data);
}//if j==k
}//for j
}//if nchilds == this.nbCells
}//for i
return colValues;
},
GetFilterValue: function(index)
/*====================================================
- Returns value of a specified filter
- Params:
- index: filter column index (numeric value)
=====================================================*/
{
if(!this.fltGrid) return;
var fltValue;
var flt = this.GetFilterElement(index);
if(flt==null) return fltValue='';
if(this['col'+index]!=this.fltTypeMulti &&
this['col'+index]!=this.fltTypeCheckList)
fltValue = flt.value;
else if(this['col'+index] == this.fltTypeMulti)
{//mutiple select
fltValue = '';
for(var j=0; j<flt.options.length; j++)
if(flt.options[j].selected)
fltValue = fltValue.concat(
flt.options[j].value+' ' +
this.orOperator + ' '
);
//removes last operator ||
fltValue = fltValue.substr(0,fltValue.length-4);
}
else if(this['col'+index]==this.fltTypeCheckList)
{//checklist
if(flt.getAttribute('value')!=null)
{
fltValue = flt.getAttribute('value');
//removes last operator ||
fltValue = fltValue.substr(0,fltValue.length-3);
} else fltValue = '';
}
return fltValue;
},
GetFiltersValue: function()
/*====================================================
- Returns the value of every single filter
=====================================================*/
{
if(!this.fltGrid) return;
var searchArgs = [];
for(var i=0; i<this.fltIds.length; i++)
searchArgs.push(
this.GetFilterValue(i).tf_MatchCase(this.matchCase).tf_Trim()
);
return searchArgs;
},
GetFilterId: function(index)
/*====================================================
- Returns filter id of a specified column
- Params:
- index: column index (numeric value)
=====================================================*/
{
if(!this.fltGrid) return;
return this.fltIds[i];
},
GetFiltersByType: function(type,bool)
/*====================================================
- returns an array containing ids of filters of a
specified type (inputs or selects)
- Note that hidden filters are also returned
- Needs folllowing args:
- filter type string ('input','select',
'multiple')
- optional boolean: if set true method
returns column indexes otherwise filters ids
=====================================================*/
{
if(!this.fltGrid) return;
var arr = [];
for(var i=0; i<this.fltIds.length; i++)
{
var fltType = this['col'+i];
if(fltType == type.tf_LCase())
{
var a = (bool) ? i : this.fltIds[i];
arr.push(a);
}
}
return arr;
},
GetFilterElement: function(index)
/*====================================================
- returns filter DOM element for a given column
index
=====================================================*/
{
if(!this.fltGrid) return null;
return tf_Id(this.fltIds[index]);
},
GetCellsNb: function(rowIndex)
/*====================================================
- returns number of cells in a row
- if rowIndex param is passed returns number of
cells of specified row (number)
=====================================================*/
{
var tr = (rowIndex == undefined) ? this.tbl.rows[0] : this.tbl.rows[rowIndex];
return tr.cells.length;
},
GetRowsNb: function(includeHeaders)
/*====================================================
- returns total nb of filterable rows starting
from reference row if defined
- Param:
- includeHeaders: if true header rows are
included in calculation(= table rows number)
=====================================================*/
{
var s = this.refRow==undefined ? 0 : this.refRow;
var ntrs = this.tbl.rows.length;
if(includeHeaders){ s = 0; }
return parseInt(ntrs-s);
},
GetCellData: function(i, cell)
/*====================================================
- returns text content of a given cell
- Params:
- i: index of the column (number)
- cell: td DOM object
=====================================================*/
{
if(i==undefined || cell==null) return "";
//First checks for customCellData event
if(this.customCellData && this.customCellDataCols.tf_Has(i))
return this.customCellData.call(null,this,cell,i);
else
return tf_GetNodeText(cell);
},
GetRowDisplay: function(row)
{
if(!this.fltGrid && !tf_IsObj(row)) return;
return row.style.display;
},
SetRowValidation: function(rowIndex,isValid)
/*====================================================
- Validates/unvalidates row by setting 'validRow'
attribute and shows/hides row
- Params:
- rowIndex: index of the row (number)
- isValid: boolean
=====================================================*/
{
var row = this.tbl.rows[rowIndex];
if(!row || (typeof isValid).tf_LCase()!='boolean') return;
// always visible rows are valid
if(this.hasVisibleRows && this.visibleRows.tf_Has(rowIndex) && !this.paging)
isValid = true;
var displayFlag = (isValid) ? '' : 'none';
var validFlag = (isValid) ? 'true' : 'false';
row.style.display = displayFlag;
if(this.paging)
row.setAttribute('validRow',validFlag);
},
ValidateAllRows: function()
/*====================================================
- Validates all filterable rows
=====================================================*/
{
if(!this.hasGrid) return;
this.validRowsIndex = [];
for(var k=this.refRow; k<this.nbFilterableRows; k++)
{
this.SetRowValidation(k,true);
this.validRowsIndex.push(k);
}
},
SetFilterValue: function(index,searcharg,doFilter)
/*====================================================
- Inserts value in a specified filter
- Params:
- index: filter column index (numeric value)
- searcharg: search string
- doFilter: optional boolean for multiple
selects: executes filtering when multiple
select populated... IE only!
=====================================================*/
{
if((!this.fltGrid && !this.isFirstLoad) || this.GetFilterElement(index)==null) return;
var slc = this.GetFilterElement(index);
var execFilter = (doFilter==undefined) ? true : doFilter;
searcharg = (searcharg==undefined) ? '' : searcharg;
if(this['col'+index]!=this.fltTypeMulti &&
this['col'+index]!=this.fltTypeCheckList){
slc.value = searcharg;
if(this['col'+index]==this.fltTypeInp && this.inpWatermark!='')
tf_RemoveClass(slc, this.inpWatermarkCssClass);
}
else if(this['col'+index] == this.fltTypeMulti)
{//multiple selects
var s = searcharg.split(' '+this.orOperator+' ');
var ct = 0; //keywords counter
for(var j=0; j<slc.options.length; j++)
{
if(s=='') slc.options[j].selected = false;
if(slc.options[j].value=='') slc.options[j].selected = false;
if(slc.options[j].value!='' && s.tf_Has(slc.options[j].value,true))
{
if(tf_isIE)
{// IE multiple selection work-around
//when last value reached filtering can be executed
var filter = (ct==(s.length-1) && execFilter) ? true : false;
this.__deferMultipleSelection(slc,j,filter);
ct++;
}
else
slc.options[j].selected = true;
}//if
}//for j
}
else if(this['col'+index]==this.fltTypeCheckList)
{//checklist
searcharg = searcharg.tf_MatchCase(this.matchCase);
var s = searcharg.split(' '+this.orOperator+' ');
var fltValue = slc.setAttribute('value','');
var fltIndex = slc.setAttribute('indexes','');
for(var k=0; k<tf_Tag(slc,'li').length; k++)
{
var li = tf_Tag(slc,'li')[k];
var lbl = tf_Tag(li,'label')[0];
var chk = tf_Tag(li,'input')[0];
var lblTxt = tf_GetNodeText(lbl).tf_MatchCase(this.matchCase);
if(lblTxt!='' && s.tf_Has(lblTxt,true))
{
chk.checked = true;
this.__setCheckListValues(chk);
}
else{
chk.checked = false;
this.__setCheckListValues(chk);
}
}
}
},
SetColWidths: function(rowIndex)
/*====================================================
- sets coluun widths in pixels
=====================================================*/
{
if(!this.fltGrid || !this.hasColWidth) return;
var o = this, rIndex;
if(rowIndex==undefined) rIndex = this.tbl.rows[0].style.display!='none' ? 0 : 1;
else rIndex = rowIndex;
setWidths(this.tbl.rows[rIndex]);
function setWidths(row)
{
if(!o && (o.nbCells!=o.colWidth.length)) return;
if(o.nbCells==row.cells.length)
for(var k=0; k<o.nbCells; k++)
row.cells[k].style.width = o.colWidth[k];
}
},
SetVisibleRows: function()
/*====================================================
- makes a row always visible
- Note this works only if paging is false
=====================================================*/
{
if(this.hasGrid && this.hasVisibleRows && !this.paging)
{
for(var i=0; i<this.visibleRows.length; i++)
{
if(this.visibleRows[i]<=this.nbRows)//row index cannot be > nrows
this.SetRowValidation(this.visibleRows[i],true);
}//for i
}//if hasGrid
},
ClearFilters: function()
{
this.EvtManager(this.Evt.name.clear);
},
_ClearFilters: function()
/*====================================================
- clears grid filters
=====================================================*/
{
if(!this.fltGrid) return;
if(this.onBeforeReset){ this.onBeforeReset.call(null, this, this.GetFiltersValue()); }
for(var i=0; i<this.fltIds.length; i++)
this.SetFilterValue(i,'');
if(this.refreshFilters){
this.activeFilterId = '';
this.RefreshFiltersGrid();
}
if(this.rememberPageLen){ tf_RemoveCookie(this.pgLenCookie); }
if(this.rememberPageNb){ tf_RemoveCookie(this.pgNbCookie); }
if(this.onAfterReset){ this.onAfterReset.call(null, this); }
},
ClearActiveColumns: function()
/*====================================================
- clears active columns header class name
=====================================================*/
{
for(var i=0; i<this.fltIds.length; i++)
tf_RemoveClass(this.GetHeaderElement(i), this.activeColumnsCssClass);
},
RefreshGrid: function(config)
/*====================================================
- Re-generates filters grid
=====================================================*/
{
var configObj = !config ? this.fObj : config;
var hasSort = this.sort;
if(hasSort) this.sort = false; //sort property is set to false in order to avoid sort object re-instanciation
this.nbRows = this.GetRowsNb(); //in case table is refreshed
this.RemoveGrid();
window['tf_'+this.id] = new TF(this.id, this.startRow, configObj);
this.isFirstLoad = true;
this.fltIds = [];
this._AddGrid();
if(hasSort){
//New tbody content needs to be referenced in sortabletable script with setTBody() method
//this.st = SortableTable object
this.st.setTBody(this.tbl.tBodies[0]); //Note this is a method of the Sortable Table 1.12 script (Erik Arvidsson)
this.sort = true; //finally sort property is enabled again
}
},
/*====================================================
- Private methods
=====================================================*/
__resetGrid: function()
/*====================================================
- Only used by AddGrid() method
- Resets filtering grid bar if previously removed
=====================================================*/
{
if(this.isFirstLoad) return;
// grid was removed, grid row element is stored in fltGridEl property
if(!this.gridLayout){
this.tbl.rows[this.filtersRowIndex].parentNode.insertBefore(
this.fltGridEl,
this.tbl.rows[this.filtersRowIndex]
);
}
if(this.isExternalFlt)
{// filters are appended in external placeholders elements
for(var ct=0; ct<this.externalFltTgtIds.length; ct++)
if(tf_Id(this.externalFltTgtIds[ct])){
tf_Id(this.externalFltTgtIds[ct]).appendChild(this.externalFltEls[ct]);
//IE special treatment for gridLayout, appended filters are empty
if(this.gridLayout && this.externalFltEls[ct].innerHTML=='' && this['col'+ct] != this.fltTypeInp){
if(this['col'+ct] == this.fltTypeSlc || this['col'+ct] == this.fltTypeMulti)
this.PopulateSelect(ct);
if(this['col'+ct] == this.fltTypeCheckList) this.PopulateCheckList(ct);
}
}
}
this.nbFilterableRows = this.GetRowsNb();
this.nbVisibleRows = this.nbFilterableRows;
this.nbRows = this.tbl.rows.length;
if(this.isSortEnabled) this.sort = true;
if(this.tbl.rows[this.filtersRowIndex].innerHTML=='')
refreshFilters(this);
else
if(this.popUpFilters){ this.headersRow++; this.SetPopupFilters(); }
/*** ie bug work-around, filters need to be re-generated
since row is empty; insertBefore method doesn't seem to work properly
with previously generated DOM nodes modified by innerHTML ***/
function refreshFilters(o){
o.tbl.deleteRow(o.filtersRowIndex);
o.RemoveGrid();
o.fltIds = [];
o.isFirstLoad = true;
if(o.popUpFilters) o.RemovePopupFilters();
o._AddGrid();
}
if(!this.gridLayout) tf_AddClass(this.tbl, this.prfxTf);
this.hasGrid = true;
},
__containsStr: function(arg,data,fltType,forceMatch)
/*==============================================
- Checks if data contains searched arg,
returns a boolean
- Params:
- arg: searched string
- data: data string
- fltType: filter type (string,
exact match by default for selects -
optional)
- forceMatch: boolean forcing exact
match (optional)
===============================================*/
{
// Improved by Cedric Wartel (cwl)
// automatic exact match for selects and special characters are now filtered
var regexp;
var modifier = (this.matchCase) ? 'g' : 'gi';
var exactMatch = (forceMatch==undefined) ? this.exactMatch : forceMatch;
if(exactMatch || (fltType!=this.fltTypeInp && fltType!=undefined))//Váry Péter's patch
regexp = new RegExp('(^\\s*)'+tf_RegexpEscape(arg)+'(\\s*$)', modifier);
else
regexp = new RegExp(tf_RegexpEscape(arg), modifier);
return regexp.test(data);
},
IncludeFile: function(fileId, filePath, callback, type)
{
var ftype = (type==undefined) ? 'script' : type;
var isImported = tf_IsImported(filePath, ftype);
if(isImported) return;
var o = this, isLoaded = false, file;
var head = tf_Tag(document,'head')[0];
if(ftype.tf_LCase() == 'link')
file = tf_CreateElm(
'link', ['id',fileId], ['type','text/css'],
['rel','stylesheet'], ['href',filePath]
);
else
file = tf_CreateElm(
'script', ['id',fileId],
['type','text/javascript'], ['src',filePath]
);
file.onload = file.onreadystatechange = function()
{//Browser <> IE onload event works only for scripts, not for stylesheets
if(!isLoaded &&
(!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete'))
{
isLoaded = true;
if(typeof callback === 'function') callback.call(null,o);
}
}
file.onerror = function(){
throw new Error('TF script could not load:\n' + this.src);
}
head.appendChild(file);
}
}
/* --- */
/*====================================================
- General TF utility fns below
=====================================================*/
function tf_GetNodeText(n)
/*====================================================
- returns text + text of child nodes of a node
=====================================================*/
{
var s = n.textContent || n.innerText || n.innerHTML.replace(/\<[^<>]+>/g, '');
return s.replace(/^\s+/, '').replace(/\s+$/, '').tf_Trim();
//return s.tf_Trim();
}
function tf_IsObj(v)
/*====================================================
- checks if var exists and is an object
- returns a boolean
=====================================================*/
{
var isO = false;
if((typeof v).tf_LCase()=='string'){
if(window[v] && (typeof window[v]).tf_LCase()=='object')
isO = true;
} else {
if(v && (typeof v).tf_LCase()=='object')
isO = true;
}
return isO;
}
function tf_IsFn(fn)
/*====================================================
- checks if passed param is a function
- returns a boolean
=====================================================*/
{
return (fn && fn.constructor == Function);
}
function tf_IsArray(obj){
/*====================================================
- checks if passed param is an array
- returns a boolean
=====================================================*/
return obj.constructor == Array;
}
function tf_Id(id)
/*====================================================
- this is just a getElementById shortcut
=====================================================*/
{
return document.getElementById(id);
}
function tf_Tag(o,tagname)
/*====================================================
- this is just a getElementsByTagName shortcut
=====================================================*/
{
return o.getElementsByTagName(tagname);
}
function tf_RegexpEscape(s)
/*====================================================
- escapes special characters [\^$.|?*+()
for regexp
- Many thanks to Cedric Wartel for this fn
=====================================================*/
{
// traite les caractères spéciaux [\^$.|?*+()
//remplace le carctère c par \c
function escape(e)
{
a = new RegExp('\\'+e,'g');
s = s.replace(a,'\\'+e);
}
chars = new Array('\\','[','^','$','.','|','?','*','+','(',')');
//for(e in chars) escape(chars[e]); // compatibility issue with prototype
for(var e=0; e<chars.length; e++) escape(chars[e]);
return s;
}
function tf_CreateElm(tag)
/*====================================================
- creates an html element with its attributes
- accepts the following params:
- a string defining the html tag
to create
- an undetermined # of arrays containing the
couple 'attribute name','value' ['id','myId']
=====================================================*/
{
if(tag==undefined || tag==null || tag=='') return;
var el = document.createElement(tag);
if(arguments.length>1)
{
for(var i=0; i<arguments.length; i++)
{
var argtype = typeof arguments[i];
switch(argtype.tf_LCase())
{
case 'object':
if(arguments[i].length==2)
{
el.setAttribute(arguments[i][0],arguments[i][1]);
}//if array length==2
break;
}//switch
}//for i
}//if args
return el;
}
function tf_CreateText(node)
/*====================================================
- this is just a document.createTextNode shortcut
=====================================================*/
{
return document.createTextNode(node);
}
function tf_AddEvent(obj,event_name,func_name,use_capture){
if(obj.attachEvent)
obj.attachEvent('on'+event_name, func_name);
else if(obj.addEventListener)
obj.addEventListener(event_name,func_name,(use_capture==undefined ? false : use_capture));
else
obj['on'+event_name] = func_name;
}
function tf_RemoveEvent(obj,event_name,func_name,use_capture){
if(obj.detachEvent)
obj.detachEvent('on'+event_name,func_name);
else if(obj.removeEventListener)
obj.removeEventListener(event_name,func_name,(use_capture==undefined ? false : use_capture));
else
obj['on'+event_name] = null;
}
function tf_StopEvent(e){
if(!e) e = window.event;
if(e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
}
function tf_CancelEvent(e){
if(!e) e = window.event;
if(e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
}
function tf_ObjPosition(obj, tag){
var l = 0, t = 0;
if (obj && obj.offsetParent && tag.tf_Has(obj.nodeName.tf_LCase())) {
do {
l += obj.offsetLeft;
t += obj.offsetTop;
} while (obj = obj.offsetParent);
}
return [l,t];
}
function tf_NumSortAsc(a, b){ return (a-b); }
function tf_NumSortDesc(a, b){ return (b-a); }
function tf_IgnoreCaseSort(a, b){
var x = a.tf_LCase();
var y = b.tf_LCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
String.prototype.tf_MatchCase = function (mc){
if(!mc) return this.tf_LCase();
else return this.toString();
}
String.prototype.tf_Trim = function()
{//optimised by Anthony Maes
return this.replace(/(^[\s\xA0]*)|([\s\xA0]*$)/g,'');
}
String.prototype.tf_LCase = function(){
return this.toLowerCase();
}
String.prototype.tf_UCase = function(){
return this.toUpperCase();
}
Array.prototype.tf_Has = function(s,mc){
//return this.indexOf(s) >= 0;
var sCase = (mc==undefined) ? false : mc;
for (i=0; i<this.length; i++)
if(this[i].toString().tf_MatchCase(sCase)==s) return true;
return false;
}
Array.prototype.tf_IndexByValue = function(s,mc){
var sCase = (mc==undefined) ? false : mc;
for (i=0; i<this.length; i++)
if(this[i].toString().tf_MatchCase(sCase)==s) return i;
return (-1);
}
// Is this IE 6? the ultimate browser sniffer ;-)
//window['tf_isIE'] = (window.innerHeight) ? false : true;
window['tf_isIE'] = (window.innerHeight) ? false : /msie|MSIE 6/.test(navigator.userAgent) ? true : false;
window['tf_isIE7'] = (window.innerHeight) ? false : /msie|MSIE 7/.test(navigator.userAgent) ? true : false;
function tf_HasClass(elm,cl){
if(!elm) return false;
return elm.className.match(new RegExp('(\\s|^)'+cl+'(\\s|$)'));
}
function tf_AddClass(elm,cl){
if(!elm) return;
if(!tf_HasClass(elm,cl))
elm.className += ' '+cl;
}
function tf_RemoveClass(elm,cl){
if(!elm) return;
if(!tf_HasClass(elm,cl)) return;
var reg = new RegExp('(\\s|^)'+cl+'(\\s|$)');
elm.className = elm.className.replace(reg,'');
}
function tf_IsValidDate(dateStr, format){
if(format == null) { format = 'DMY'; }
format = format.toUpperCase();
if(format.length != 3) {
if(format=='DDMMMYYYY'){
var d = tf_FormatDate(dateStr, format);
dateStr = d.getDate()+'/'+(d.getMonth()+1)+'/'+d.getFullYear();
format = 'DMY';
}
}
if((format.indexOf('M') == -1) || (format.indexOf('D') == -1) ||
(format.indexOf('Y') == -1)) { format = 'DMY'; }
if(format.substring(0, 1) == 'Y') { // If the year is first
var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
} else if(format.substring(1, 2) == 'Y') { // If the year is second
var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/;
var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/;
} else { // The year must be third
var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/;
var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
}
// If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
if((reg1.test(dateStr) == false) && (reg2.test(dateStr) == false)) { return false; }
var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
// Check to see if the 3 parts end up making a valid date
if(format.substring(0, 1) == 'M') { var mm = parts[0]; } else
if(format.substring(1, 2) == 'M') { var mm = parts[1]; } else { var mm = parts[2]; }
if(format.substring(0, 1) == 'D') { var dd = parts[0]; } else
if(format.substring(1, 2) == 'D') { var dd = parts[1]; } else { var dd = parts[2]; }
if(format.substring(0, 1) == 'Y') { var yy = parts[0]; } else
if(format.substring(1, 2) == 'Y') { var yy = parts[1]; } else { var yy = parts[2]; }
if(parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
if(parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
if(parseFloat(dd) != dt.getDate()) { return false; }
if(parseFloat(mm)-1 != dt.getMonth()) { return false; }
return true;
}
function tf_FormatDate(dateStr, format){
if(format === null){ format = 'DMY'; }
if(!dateStr || dateStr === ''){ return new Date(1001, 0, 1); }
var oDate, parts;
function y2kDate(yr){
if(yr == undefined) return 0;
if(yr.length>2) return yr;
var y;
if(yr <= 99 && yr>50) //>50 belong to 1900
y = '19' + yr;
if(yr<50 || yr =='00') //<50 belong to 2000
y = '20' + yr;
return y;
}
function mmm2mm(mmm){
if(mmm == undefined){ return 0; }
var mondigit;
var MONTH_NAMES = new Array(
'january','february','march','april','may','june','july','august','september','october','november','december',
'jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'
);
for (var m_i=0; m_i < MONTH_NAMES.length; m_i++){
var month_name = MONTH_NAMES[m_i];
if (mmm.toLowerCase() === month_name){
mondigit = m_i+1;
break;
}
}
if ((mondigit > 11) || (mondigit < 23)){ mondigit = mondigit - 12; }
if ((mondigit < 1) || (mondigit > 12)){ return 0; }
return mondigit;
}
switch(format.toUpperCase()){
case 'DDMMMYYYY':
parts = dateStr.replace(/[- \/.]/g,' ').split(' ');
oDate = new Date(y2kDate(parts[2]),mmm2mm(parts[1])-1,parts[0]);
break;
case 'DMY':
parts = dateStr.replace(/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' ');
oDate = new Date(y2kDate(parts[2]),parts[1]-1,parts[0]);
break;
case 'MDY':
parts = dateStr.replace(/^(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' ');
oDate = new Date(y2kDate(parts[2]),parts[0]-1,parts[1]);
break;
case 'YMD':
parts = dateStr.replace(/^((\d\d)?\d\d)([- \/.])(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])$/,'$1 $4 $6').split(' ');
oDate = new Date(y2kDate(parts[0]),parts[1]-1,parts[2]);
break;
default: //in case format is not correct
parts = dateStr.replace(/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' ');
oDate = new Date(y2kDate(parts[2]),parts[1]-1,parts[0]);
break;
}
return oDate;
}
function tf_RemoveNbFormat(data,format){
if(data==null) return;
if(format==null) format = 'us';
var n = data;
if(format.tf_LCase()=='us')
n =+ n.replace(/[^\d\.-]/g,'');
else
n =+ n.replace(/[^\d\,-]/g,'').replace(',','.');
return n;
}
function tf_IsImported(filePath,type){
var isImported = false;
var importType = (type==undefined) ? 'script' : type;
var attr = importType == 'script' ? 'src' : 'href';
var files = tf_Tag(document,importType);
for (var i=0; i<files.length; i++)
{
if(files[i][attr] == undefined) continue;
if(files[i][attr].match(filePath))
{
isImported = true;
break;
}
}
return isImported;
}
function tf_IsStylesheetImported(stylesheet){
var isImported = false;
if(!document.styleSheets) return isImported;
var s = document.styleSheets;
var regexp = new RegExp(stylesheet);
for(var i=0; i<s.length; i++){
if(s[i].imports){ //IE
var imp = s[i].imports;
for(var j=0; j<imp.length; j++){
if(imp[j].href.tf_LCase() == stylesheet.tf_LCase()){
isImported = true; break;
}
}
} else {
var r = (s[i].cssRules ? s[i].cssRules : s[i].rules);
for(var j=0; j<r.length; j++){
if(regexp.test(r[j].cssText)){
isImported = true; break;
}
}
}
}
return isImported;
}
function tf_WriteCookie(name, value, hours){
var expire = '';
if(hours != null)
{
expire = new Date((new Date()).getTime() + hours * 3600000);
expire = '; expires=' + expire.toGMTString();
}
document.cookie = name + '=' + escape(value) + expire;
}
function tf_ReadCookie(name){
var cookieValue = '';
var search = name + '=';
if(document.cookie.length > 0)
{
offset = document.cookie.indexOf(search);
if(offset != -1)
{
offset += search.length;
end = document.cookie.indexOf(';', offset);
if(end == -1) end = document.cookie.length;
cookieValue = unescape(document.cookie.substring(offset, end))
}
}
return cookieValue;
}
function tf_CookieValueArray(name, separator){
if(separator==undefined) separator = ',';
var val = tf_ReadCookie(name); //reads the cookie
var arr = val.split(separator); //creates an array with filters' values
return arr;
}
function tf_CookieValueByIndex(name, index, separator){
if(separator==undefined) separator = ',';
var val = tf_CookieValueArray(name, separator); //reads the cookie
return val[index];
}
function tf_RemoveCookie(name){
tf_WriteCookie(name,'',-1);
}
//Firefox does not support outerHTML property
function tf_SetOuterHtml(){
if(document.body.__defineGetter__) {
if(HTMLElement) {
var element = HTMLElement.prototype;
if(element.__defineGetter__) {
element.__defineGetter__("outerHTML",
function(){
var parent = this.parentNode;
var el = tf_CreateElm(parent.tagName);
el.appendChild(this);
var shtml = el.innerHTML;
parent.appendChild(this);
return shtml;
}
);
}
}
}
if(element.__defineSetter__) {
HTMLElement.prototype.__defineSetter__("outerHTML", function(sHTML) {
var r = this.ownerDocument.createRange();
r.setStartBefore(this);
var df = r.createContextualFragment(sHTML);
this.parentNode.replaceChild(df, this);
return sHTML;
});
}
}
/* --- */
function setFilterGrid(id)
/*====================================================
- Sets filters grid bar
- Calls TF Constructor and generates grid bar
- Params:
- id: table id (string)
- refRow (optional): row index (number)
- config (optional): configuration
object (literal object)
- Returns TF object
=====================================================*/
{
if(arguments.length === 0){ return; }
window['tf_'+id] = new TF(arguments[0], arguments[1], arguments[2]);
window['tf_'+id].AddGrid();
return window['tf_'+id];
}
/*===BEGIN removable section===========================
- Unobtrusive grid bar generation using
'filterable' class
- If you don't use it you can remove safely this
section
/*=====================================================*/
window['tf_isNotIE'] = !(/msie|MSIE/.test(navigator.userAgent));
tf_AddEvent(window, (tf_isNotIE || (typeof window.addEventListener == 'function') ? 'DOMContentLoaded' : 'load'), initFilterGrid);
function initFilterGrid(){
if(!document.getElementsByTagName){ return; }
var tbls = tf_Tag(document,'table'), config;
for (var i=0; i<tbls.length; i++){
var cTbl = tbls[i], cTblId = cTbl.getAttribute('id');
if(tf_HasClass(cTbl,'filterable') && cTblId){
if(tf_IsObj(cTblId+'_config')){
config = window[cTblId+'_config'];
} else { config = undefined; }
window[cTblId+'_isUnob'] = true;
setFilterGrid(cTblId,config);
}
}// for i
}
/*===END removable section===========================*/
/*====================================================
- Backward compatibility fns
=====================================================*/
function grabEBI(id){ return tf_Id(id); }
function grabTag(obj,tagname){ return tf_Tag(obj,tagname); }
function tf_GetCellText(n){ return tf_GetNodeText(n); }
function tf_isObject(varname){ return tf_IsObj(varname); }
function tf_isObj(v){ return tf_IsObj(v); }
function tf_isFn(fn){ return tf_IsFn(fn); }
function tf_isArray(obj){ return tf_IsArray(obj); }
function tf_addEvent(obj,event_name,func_name){ return tf_AddEvent(obj,event_name,func_name); }
function tf_removeEvent(obj,event_name,func_name){ return tf_RemoveEvent(obj,event_name,func_name); }
function tf_addClass(elm,cl){ tf_AddClass(elm,cl); }
function tf_removeClass(elm,cl){ return tf_RemoveClass(elm,cl); }
function tf_hasClass(elm,cl){ return tf_HasClass(elm,cl); }
function tf_isValidDate(dateStr,format){ return tf_IsValidDate(dateStr,format); }
function tf_formatDate(dateStr,format){ return tf_FormatDate(dateStr,format); }
function tf_removeNbFormat(data,format){ return tf_RemoveNbFormat(data,format); }
/* --- */