From a0639cfe1dc6852b9da53df06565d801ba2489c7 Mon Sep 17 00:00:00 2001 From: Max Guglielmi Date: Sun, 12 Oct 2014 22:40:08 +1100 Subject: [PATCH] Code refactoring --- Gruntfile.js | 4 +- dist/filtergrid.css | 2 +- dist/tablefilter_all.js | 7383 ++++++++++++++++++++++++++++++++++++++- src/cookie.js | 61 + src/dom.js | 114 + src/event.js | 56 + src/index.html | 7 +- src/string.js | 46 + src/tablefilter_all.js | 453 +-- src/types.js | 47 + 10 files changed, 7871 insertions(+), 302 deletions(-) create mode 100644 src/cookie.js create mode 100644 src/dom.js create mode 100644 src/event.js create mode 100644 src/string.js create mode 100644 src/types.js diff --git a/Gruntfile.js b/Gruntfile.js index 55ccfe70..199d3c94 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -13,6 +13,8 @@ module.exports = function (grunt) { '<%= source_folder %>string.js', '<%= source_folder %>dom.js', '<%= source_folder %>event.js', + '<%= source_folder %>types.js', + '<%= source_folder %>cookie.js', '<%= source_folder %>tablefilter_all.js' ] }, @@ -105,5 +107,5 @@ module.exports = function (grunt) { // This is the default task being executed if Grunt // is called without any further parameter. grunt.registerTask('default', ['jshint', 'concat', 'uglify', 'cssmin', 'copy']); - + grunt.registerTask('dev', ['jshint', 'concat', 'cssmin', 'copy']); }; \ No newline at end of file diff --git a/dist/filtergrid.css b/dist/filtergrid.css index 93c950cd..644ddc83 100644 --- a/dist/filtergrid.css +++ b/dist/filtergrid.css @@ -1,6 +1,6 @@ /*------------------------------------------------------------------------ - TableFilter stylesheet by Max Guglielmi - - (build date: Sat Oct 11 2014 00:26:58) + - (build date: Sun Oct 12 2014 22:35:16) - Edit below for your projects' needs ------------------------------------------------------------------------*/ diff --git a/dist/tablefilter_all.js b/dist/tablefilter_all.js index f4b0ab66..e02473af 100644 --- a/dist/tablefilter_all.js +++ b/dist/tablefilter_all.js @@ -1,10 +1,7373 @@ -/*------------------------------------------------------------------------ - - TableFilter v3.0 by Max Guglielmi - - build date: Sat Oct 11 2014 00:26:58 - - http://tablefilter.free.fr - - Copyright (c) 2014, Licensed under the MIT License -------------------------------------------------------------------------*/ -function TF(a){if(0!==arguments.length){if(this.id=a,this.version="2.5",this.year=(new Date).getFullYear(),this.tbl=tf_Id(a),this.startRow=null,this.refRow=null,this.headersRow=null,this.fObj=null,this.nbFilterableRows=null,this.nbRows=null,this.nbCells=null,this.hasGrid=!1,this.enableModules=!1,!this.tbl||"table"!==TF.Str.lower(this.tbl.nodeName)||0===this.GetRowsNb())throw new Error("Could not instantiate TF object: table not found.");if(arguments.length>1)for(var b=0;b1?this.filtersRowIndex=this.headersRow+1:(this.filtersRowIndex=1,this.headersRow=0)),this.fltCellTag="th"!==e.filters_cell_tag||"td"!==e.filters_cell_tag?"td":e.filters_cell_tag,this.fltIds=[],this.fltElms=[],this.searchArgs=null,this.tblData=[],this.validRowsIndex=null,this.fltGridEl=null,this.isFirstLoad=!0,this.infDiv=null,this.lDiv=null,this.rDiv=null,this.mDiv=null,this.contDiv=null,this.infDivCssClass=e.inf_div_css_class||"inf",this.lDivCssClass=e.left_div_css_class||"ldiv",this.rDivCssClass=e.right_div_css_class||"rdiv",this.mDivCssClass=e.middle_div_css_class||"mdiv",this.contDivCssClass=e.content_div_css_class||"cont",this.stylesheet=e.stylesheet||this.basePath+"filtergrid.css",this.stylesheetId=this.id+"_style",this.fltsRowCssClass=e.flts_row_css_class||"fltrow",this.enableIcons=e.enable_icons===!1?!1:!0,this.alternateBgs=e.alternate_rows===!0?!0:!1,this.hasColWidth=e.col_width===!0?!0:!1,this.colWidth=this.hasColWidth?e.col_width:null,this.fixedHeaders=e.fixed_headers===!0?!0:!1,this.tBodyH=isNaN(e.tbody_height)?200:e.tbody_height,this.fltCssClass=e.flt_css_class||"flt",this.fltMultiCssClass=e.flt_multi_css_class||"flt_multi",this.fltSmallCssClass=e.flt_small_css_class||"flt_s",this.singleFltCssClass=e.single_flt_css_class||"single_flt",this.isStartBgAlternate=!0,this.rowBgEvenCssClass=e.even_row_css_class||"even",this.rowBgOddCssClass=e.odd_row_css_class||"odd",this.enterKey=e.enter_key===!1?!1:!0,this.isModFilterFn=e.mod_filter_fn===!0?!0:!1,this.modFilterFn=this.isModFilterFn?e.mod_filter_fn:null,this.onBeforeFilter=tf_IsFn(e.on_before_filter)?e.on_before_filter:null,this.onAfterFilter=tf_IsFn(e.on_after_filter)?e.on_after_filter:null,this.matchCase=e.match_case===!0?!0:!1,this.exactMatch=e.exact_match===!0?!0:!1,this.refreshFilters=e.refresh_filters===!0?!0:!1,this.disableExcludedOptions=e.disable_excluded_options===!0?!0:!1,this.activeFlt=null,this.activeFilterId=null,this.hasColOperation=e.col_operation===!0?!0:!1,this.colOperation=null,this.hasVisibleRows=e.rows_always_visible===!0?!0:!1,this.visibleRows=this.hasVisibleRows?e.rows_always_visible:[],this.searchType=e.search_type||"include",this.isExternalFlt=e.external_flt_grid===!0?!0:!1,this.externalFltTgtIds=e.external_flt_grid_ids||null,this.externalFltEls=[],this.execDelay=isNaN(e.exec_delay)?100:parseInt(e.exec_delay,10),this.status=e.status===!0?!0:!1,this.onFiltersLoaded=tf_IsFn(e.on_filters_loaded)?e.on_filters_loaded:null,this.singleSearchFlt=e.single_search_filter===!0?!0:!1,this.onRowValidated=tf_IsFn(e.on_row_validated)?e.on_row_validated:null,this.customCellDataCols=e.custom_cell_data_cols?e.custom_cell_data_cols:[],this.customCellData=tf_IsFn(e.custom_cell_data)?e.custom_cell_data:null,this.inpWatermark=e.input_watermark||"",this.inpWatermarkCssClass=e.input_watermark_css_class||"fltWatermark",this.isInpWatermarkArray=tf_IsArray(e.input_watermark),this.toolBarTgtId=e.toolbar_target_id||null,this.helpInstructions=e.help_instructions||null,this.popUpFilters=e.popup_filters===!0?!0:!1,this.markActiveColumns=e.mark_active_columns===!0?!0:!1,this.activeColumnsCssClass=e.active_columns_css_class||"activeHeader",this.onBeforeActiveColumn=tf_IsFn(e.on_before_active_column)?e.on_before_active_column:null,this.onAfterActiveColumn=tf_IsFn(e.on_after_active_column)?e.on_after_active_column:null,this.displayAllText=e.display_all_text||"",this.enableSlcResetFilter=e.enable_slc_reset_filter===!1?!1:!0,this.enableEmptyOption=e.enable_empty_option===!0?!0:!1,this.emptyText=e.empty_text||"(Empty)",this.enableNonEmptyOption=e.enable_non_empty_option===!0?!0:!1,this.nonEmptyText=e.non_empty_text||"(Non empty)",this.onSlcChange=e.on_change===!1?!1:!0,this.sortSlc=e.sort_select===!1?!1:!0,this.isSortNumAsc=e.sort_num_asc===!0?!0:!1,this.sortNumAsc=this.isSortNumAsc?e.sort_num_asc:null,this.isSortNumDesc=e.sort_num_desc===!0?!0:!1,this.sortNumDesc=this.isSortNumDesc?e.sort_num_desc:null,this.slcFillingMethod=e.slc_filling_method||"createElement",this.fillSlcOnDemand=e.fill_slc_on_demand===!0?!0:!1,this.activateSlcTooltip=e.activate_slc_tooltip||"Click to activate",this.multipleSlcTooltip=e.multiple_slc_tooltip||"Use Ctrl key for multiple selections",this.hasCustomSlcOptions=tf_IsObj(e.custom_slc_options)?!0:!1,this.customSlcOptions=tf_isArray(e.custom_slc_options)?e.custom_slc_options:null,this.onBeforeOperation=tf_IsFn(e.on_before_operation)?e.on_before_operation:null,this.onAfterOperation=tf_IsFn(e.on_after_operation)?e.on_after_operation:null,this.checkListDiv=[],this.checkListDivCssClass=e.div_checklist_css_class||"div_checklist",this.checkListCssClass=e.checklist_css_class||"flt_checklist",this.checkListItemCssClass=e.checklist_item_css_class||"flt_checklist_item",this.checkListSlcItemCssClass=e.checklist_selected_item_css_class||"flt_checklist_slc_item",this.activateCheckListTxt=e.activate_checklist_text||"Click to load filter data",this.checkListItemDisabledCssClass=e.checklist_item_disabled_css_class||"flt_checklist_item_disabled",this.enableCheckListResetFilter=e.enable_checklist_reset_filter===!1?!1:!0,this.rgxOperator=e.regexp_operator||"rgx:",this.emOperator=e.empty_operator||"[empty]",this.nmOperator=e.nonempty_operator||"[nonempty]",this.orOperator=e.or_operator||"||",this.anOperator=e.and_operator||"&&",this.grOperator=e.greater_operator||">",this.lwOperator=e.lower_operator||"<",this.leOperator=e.lower_equal_operator||"<=",this.geOperator=e.greater_equal_operator||">=",this.dfOperator=e.different_operator||"!",this.lkOperator=e.like_operator||"*",this.eqOperator=e.equal_operator||"=",this.stOperator=e.start_with_operator||"{",this.enOperator=e.end_with_operator||"}",this.curExp=e.cur_exp||"^[¥£€$]",this.separator=e.separator||",",this.rowsCounter=e.rows_counter===!0?!0:!1,this.statusBar=e.status_bar===!0?!0:!1,this.loader=e.loader===!0?!0:!1,this.displayBtn=e.btn===!0?!0:!1,this.btnText=e.btn_text||(this.enableIcons?"":"Go"),this.btnCssClass=e.btn_css_class||(this.enableIcons?"btnflt_icon":"btnflt"),this.btnReset=e.btn_reset===!0?!0:!1,this.btnResetCssClass=e.btn_reset_css_class||"reset",this.onBeforeReset=tf_IsFn(e.on_before_reset)?e.on_before_reset:null,this.onAfterReset=tf_IsFn(e.on_after_reset)?e.on_after_reset:null,this.paging=e.paging===!0?!0:!1,this.hasResultsPerPage=e.results_per_page===!0?!0:!1,this.btnPageCssClass=e.paging_btn_css_class||"pgInp",this.pagingSlc=null,this.resultsPerPage=null,this.resultsPerPageSlc=null,this.isPagingRemoved=!1,this.nbVisibleRows=0,this.nbHiddenRows=0,this.startPagingRow=0,this.nbPages=0,this.currentPageNb=1,this.sort=e.sort===!0?!0:!1,this.isSortEnabled=!1,this.sorted=!1,this.sortConfig=e.sort_config||{},this.sortConfig.name=void 0!==this.sortConfig.name?e.sort_config.name:"sortabletable",this.sortConfig.src=void 0!==this.sortConfig.src?e.sort_config.src:this.basePath+"sortabletable.js",this.sortConfig.adapterSrc=void 0!==this.sortConfig.adapter_src?e.sort_config.adapter_src:this.basePath+"tfAdapter.sortabletable.js",this.sortConfig.initialize=void 0!==this.sortConfig.initialize?e.sort_config.initialize:function(a){a.SetSortTable&&a.SetSortTable()},this.sortConfig.sortTypes=tf_isArray(this.sortConfig.sort_types)?e.sort_config.sort_types:[],this.sortConfig.sortCol=void 0!==this.sortConfig.sort_col?e.sort_config.sort_col:null,this.sortConfig.asyncSort=this.sortConfig.async_sort===!0?!0:!1,this.sortConfig.triggerIds=tf_isArray(this.sortConfig.sort_trigger_ids)?e.sort_config.sort_trigger_ids:[],this.selectable=e.selectable===!0?!0:!1,this.editable=e.editable===!0?!0:!1,this.ezEditTableConfig=e.ezEditTable_config||{},this.ezEditTableConfig.name=void 0!==this.ezEditTableConfig.name?e.ezEditTable_config.name:"ezedittable",this.ezEditTableConfig.src=void 0!==this.ezEditTableConfig.src?e.ezEditTable_config.src:this.basePath+"ezEditTable/ezEditTable.js",this.ezEditTableConfig.loadStylesheet=this.ezEditTableConfig.loadStylesheet===!0?!0:!1,this.ezEditTableConfig.stylesheet=this.ezEditTableConfig.stylesheet||this.basePath+"ezEditTable/ezEditTable.css",this.ezEditTableConfig.stylesheetName=void 0!==this.ezEditTableConfig.stylesheetName?e.ezEditTable_config.stylesheetName:"ezEditTableCss",this.ezEditTableConfig.err='Failed to instantiate EditTable object.\n"ezEditTable" module may not be available.',this.onKeyUp=e.on_keyup===!0?!0:!1,this.onKeyUpDelay=isNaN(e.on_keyup_delay)?900:e.on_keyup_delay,this.isUserTyping=null,this.onKeyUpTimer=void 0,this.highlightKeywords=e.highlight_keywords===!0?!0:!1,this.highlightCssClass=e.highlight_css_class||"keyword",this.highlightedNodes=[],this.defaultDateType=e.default_date_type||"DMY",this.thousandsSeparator=e.thousands_separator||",",this.decimalSeparator=e.decimal_separator||".",this.hasColNbFormat=e.col_number_format===!0?!0:!1,this.colNbFormat=tf_isArray(this.hasColNbFormat)?e.col_number_format:null,this.hasColDateType=e.col_date_type===!0?!0:!1,this.colDateType=tf_isArray(this.hasColDateType)?e.col_date_type:null,this.msgFilter=e.msg_filter||"Filtering data...",this.msgPopulate=e.msg_populate||"Populating filter...",this.msgPopulateCheckList=e.msg_populate_checklist||"Populating list...",this.msgChangePage=e.msg_change_page||"Collecting paging data...",this.msgClear=e.msg_clear||"Clearing filters...",this.msgChangeResults=e.msg_change_results||"Changing results per page...",this.msgResetValues=e.msg_reset_grid_values||"Re-setting filters values...",this.msgResetPage=e.msg_reset_page||"Re-setting page...",this.msgResetPageLength=e.msg_reset_page_length||"Re-setting page length...",this.msgSort=e.msg_sort||"Sorting data...",this.msgLoadExtensions=e.msg_load_extensions||"Loading extensions...",this.msgLoadThemes=e.msg_load_themes||"Loading theme(s)...",this.prfxTf="TF",this.prfxFlt="flt",this.prfxValButton="btn",this.prfxInfDiv="inf_",this.prfxLDiv="ldiv_",this.prfxRDiv="rdiv_",this.prfxMDiv="mdiv_",this.prfxContentDiv="cont_",this.prfxCheckListDiv="chkdiv_",this.prfxSlcPages="slcPages_",this.prfxSlcResults="slcResults_",this.prfxSlcResultsTxt="slcResultsTxt_",this.prfxBtnNextSpan="btnNextSpan_",this.prfxBtnPrevSpan="btnPrevSpan_",this.prfxBtnLastSpan="btnLastSpan_",this.prfxBtnFirstSpan="btnFirstSpan_",this.prfxBtnNext="btnNext_",this.prfxBtnPrev="btnPrev_",this.prfxBtnLast="btnLast_",this.prfxBtnFirst="btnFirst_",this.prfxPgSpan="pgspan_",this.prfxPgBeforeSpan="pgbeforespan_",this.prfxPgAfterSpan="pgafterspan_",this.prfxCounter="counter_",this.prfxTotRows="totrows_span_",this.prfxTotRowsTxt="totRowsTextSpan_",this.prfxResetSpan="resetspan_",this.prfxLoader="load_",this.prfxStatus="status_",this.prfxStatusSpan="statusSpan_",this.prfxStatusTxt="statusText_",this.prfxCookieFltsValues="tf_flts_",this.prfxCookiePageNb="tf_pgnb_",this.prfxCookiePageLen="tf_pglen_",this.prfxMainTblCont="gridCont_",this.prfxTblCont="tblCont_",this.prfxHeadTblCont="tblHeadCont_",this.prfxHeadTbl="tblHead_",this.prfxGridFltTd="_td_",this.prfxGridTh="tblHeadTh_",this.prfxHelpSpan="helpSpan_",this.prfxHelpDiv="helpDiv_",this.prfxPopUpSpan="popUpSpan_",this.prfxPopUpDiv="popUpDiv_",this.hasStoredValues=!1,this.rememberGridValues=e.remember_grid_values===!0?!0:!1,this.fltsValuesCookie=this.prfxCookieFltsValues+this.id,this.rememberPageNb=this.paging&&e.remember_page_number?!0:!1,this.pgNbCookie=this.prfxCookiePageNb+this.id,this.rememberPageLen=this.paging&&e.remember_page_length?!0:!1,this.pgLenCookie=this.prfxCookiePageLen+this.id,this.cookieDuration=isNaN(e.set_cookie_duration)?1e5:parseInt(e.set_cookie_duration,10),this.hasExtensions=e.extensions===!0?!0:!1,this.extensions=this.hasExtensions?e.extensions:null,this.enableDefaultTheme=e.enable_default_theme===!0?!0:!1,this.hasThemes=e.enable_default_theme||e.themes&&tf_IsObj(e.themes)?!0:!1,this.themes=this.hasThemes?e.themes:null,this.themesPath=e.themes_path||this.basePath+"TF_Themes/",this.hasBindScript=e.bind_script===!0?!0:!1,this.bindScript=this.hasBindScript?e.bind_script:null;var j=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"},getKeyCode:function(a){return a.charCode?a.charCode:a.keyCode?a.keyCode:a.which?a.which:0},_DetectKey:function(a){if(j.enterKey){var b=a||window.event;if(b){var c=j.Evt.getKeyCode(b);13===c?(j._Filter(),TF.Event.cancel(b),TF.Event.stop(b)):(j.isUserTyping=!0,window.clearInterval(j.onKeyUpTimer),j.onKeyUpTimer=void 0)}}},_OnKeyUp:function(a){function b(){window.clearInterval(j.onKeyUpTimer),j.onKeyUpTimer=void 0,j.isUserTyping||(j.Filter(),j.isUserTyping=null)}if(j.onKeyUp){var c=a||window.event,d=j.Evt.getKeyCode(c);j.isUserTyping=!1,13!==d&&9!==d&&27!==d&&38!==d&&40!==d?void 0===j.onKeyUpTimer&&(j.onKeyUpTimer=window.setInterval(b,j.onKeyUpDelay)):(window.clearInterval(j.onKeyUpTimer),j.onKeyUpTimer=void 0)}},_OnKeyDown:function(){j.onKeyUp&&(j.isUserTyping=!0)},_OnInpBlur:function(){j.onKeyUp&&(j.isUserTyping=!1,window.clearInterval(j.onKeyUpTimer)),""===this.value&&""!==j.inpWatermark&&(this.value=j.isInpWatermarkArray?j.inpWatermark[this.getAttribute("ct")]:j.inpWatermark,TF.Dom.addClass(this,j.inpWatermarkCssClass)),j.ezEditTable&&(j.editable&&j.ezEditTable.Editable.Set(),j.selectable&&j.ezEditTable.Selection.Set())},_OnInpFocus:function(a){var b=a||window.event;if(j.activeFilterId=this.getAttribute("id"),j.activeFlt=tf_Id(j.activeFilterId),j.isInpWatermarkArray){var c=j.inpWatermark[this.getAttribute("ct")];this.value===c&&""!==c&&(this.value="",TF.Dom.removeClass(this,j.inpWatermarkCssClass))}else this.value===j.inpWatermark&&""!==j.inpWatermark&&(this.value="",TF.Dom.removeClass(this,j.inpWatermarkCssClass));j.popUpFilters&&(TF.Event.cancel(b),TF.Event.stop(b)),j.ezEditTable&&(j.editable&&j.ezEditTable.Editable.Remove(),j.selectable&&j.ezEditTable.Selection.Remove())},_OnSlcFocus:function(a){var b=a||window.event;if(j.activeFilterId=this.getAttribute("id"),j.activeFlt=tf_Id(j.activeFilterId),j.fillSlcOnDemand&&"0"===this.getAttribute("filled")){var c=this.getAttribute("ct");j.PopulateSelect(c),tf_isIE||this.setAttribute("filled","1")}j.popUpFilters&&(TF.Event.cancel(b),TF.Event.stop(b))},_OnSlcChange:function(a){var b=j.activeFlt.getAttribute("colIndex");if(!j.activeFlt||!b||j["col"+b]!==j.fltTypeCheckList||j.Evt._OnSlcChange.caller){var c=a||window.event;j.popUpFilters&&TF.Event.stop(c),j.onSlcChange&&j.Filter()}},_OnSlcBlur:function(){},_OnCheckListChange:function(a){j.Evt._OnCheckListChange.caller&&j.Evt._OnSlcChange(a)},_OnCheckListClick:function(){if(j.fillSlcOnDemand&&"0"===this.getAttribute("filled")){var a=this.getAttribute("ct");j.PopulateCheckList(a),j.checkListDiv[a].onclick=null,j.checkListDiv[a].title=""}},_OnCheckListFocus:function(){j.activeFilterId=this.firstChild.getAttribute("id"),j.activeFlt=tf_Id(j.activeFilterId)},_OnCheckListBlur:function(){},_OnBtnClick:function(){j.Filter()},_OnSlcPagesChangeEvt:null,_EnableSlc:function(){this.firstChild.disabled=!1,this.firstChild.focus(),this.onclick=null},_Clear:function(){j.ClearFilters()},_OnHelpBtnClick:function(){j._ToggleHelp()},_Paging:{nextEvt:null,prevEvt:null,lastEvt:null,firstEvt:null}}}}function tf_IsObj(a){var b=!1;return"string"==typeof a?window[a]&&"object"==typeof window[a]&&(b=!0):a&&"object"==typeof a&&(b=!0),b}function tf_IsFn(a){return a&&a.constructor==Function}function tf_IsArray(a){return a&&a.constructor==Array}function tf_Id(a){return document.getElementById(a)}function tf_Tag(a,b){return a.getElementsByTagName(b)}function tf_CreateOpt(a,b,c){var d=c?!0:!1,e=d?TF.Dom.create("option",["value",b],["selected","true"]):TF.Dom.create("option",["value",b]);return e.appendChild(TF.Dom.text(a)),e}function tf_CreateCheckItem(a,b,c){if(a&&b&&c){var d=TF.Dom.create("li"),e=TF.Dom.create("label",["for",a]),f=TF.Dom.create("input",["id",a],["name",a],["type","checkbox"],["value",b]);return e.appendChild(f),e.appendChild(TF.Dom.text(c)),d.appendChild(e),d.label=e,d.check=f,d}}function tf_NumSortAsc(a,b){return a-b}function tf_NumSortDesc(a,b){return b-a}function tf_IgnoreCaseSort(a,b){var c=TF.Str.lower(a),d=TF.Str.lower(b);return d>c?-1:c>d?1:0}function tf_IsValidDate(a,b){if(b||(b="DMY"),b=b.toUpperCase(),3!=b.length&&"DDMMMYYYY"===b){var c=tf_FormatDate(a,b);a=c.getDate()+"/"+(c.getMonth()+1)+"/"+c.getFullYear(),b="DMY"}(-1===b.indexOf("M")||-1===b.indexOf("D")||-1===b.indexOf("Y"))&&(b="DMY");var d,e;if("Y"==b.substring(0,1)?(d=/^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/,e=/^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/):"Y"==b.substring(1,2)?(d=/^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/,e=/^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/):(d=/^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/,e=/^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/),d.test(a)===!1&&e.test(a)===!1)return!1;var f,g,h,i=a.split(RegExp.$1);f="M"===b.substring(0,1)?i[0]:"M"===b.substring(1,2)?i[1]:i[2],g="D"===b.substring(0,1)?i[0]:"D"===b.substring(1,2)?i[1]:i[2],h="Y"===b.substring(0,1)?i[0]:"Y"===b.substring(1,2)?i[1]:i[2],parseFloat(h)<=50&&(h=(parseFloat(h)+2e3).toString()),parseFloat(h)<=99&&(h=(parseFloat(h)+1900).toString());var j=new Date(parseFloat(h),parseFloat(f)-1,parseFloat(g),0,0,0,0);return parseFloat(g)!=j.getDate()?!1:parseFloat(f)-1!=j.getMonth()?!1:!0}function tf_FormatDate(a,b){function c(a){if(void 0===a)return 0;if(a.length>2)return a;var b;return 99>=a&&a>50&&(b="19"+a),(50>a||"00"===a)&&(b="20"+a),b}function d(a){if(void 0===a)return 0;for(var b,c=["january","february","march","april","may","june","july","august","september","october","november","december","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"],d=0;d11||23>b)&&(b-=12),1>b||b>12?0:b}if(b||(b="DMY"),!a||""===a)return new Date(1001,0,1);var e,f;switch(b.toUpperCase()){case"DDMMMYYYY":f=a.replace(/[- \/.]/g," ").split(" "),e=new Date(c(f[2]),d(f[1])-1,f[0]);break;case"DMY":f=a.replace(/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,"$1 $3 $5").split(" "),e=new Date(c(f[2]),f[1]-1,f[0]);break;case"MDY":f=a.replace(/^(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])([- \/.])((\d\d)?\d\d)$/,"$1 $3 $5").split(" "),e=new Date(c(f[2]),f[0]-1,f[1]);break;case"YMD":f=a.replace(/^((\d\d)?\d\d)([- \/.])(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])$/,"$1 $4 $6").split(" "),e=new Date(c(f[0]),f[1]-1,f[2]);break;default:f=a.replace(/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,"$1 $3 $5").split(" "),e=new Date(c(f[2]),f[1]-1,f[0])}return e}function tf_RemoveNbFormat(a,b){if(a){b&&(b="us");var c=a;return c="us"===TF.Str.lower(b)?+c.replace(/[^\d\.-]/g,""):+c.replace(/[^\d\,-]/g,"").replace(",",".")}}function tf_IsImported(a,b){for(var c=!1,d=b?b:"script",e="script"==d?"src":"href",f=tf_Tag(document,d),g=0;g0){var d=document.cookie,e=d.indexOf(c);-1!==e&&(e+=c.length,end=d.indexOf(";",e),-1===end&&(end=d.length),b=unescape(d.substring(e,end)))}return b}function tf_CookieValueArray(a,b){b||(b=",");var c=tf_ReadCookie(a),d=c.split(b);return d}function tf_CookieValueByIndex(a,b,c){c||(c=",");var d=tf_CookieValueArray(a,c);return d[b]}function tf_RemoveCookie(a){tf_WriteCookie(a,"",-1)}function tf_HighlightWord(a,b,c,d){if(a.hasChildNodes)for(var e=0;e]+>/g,"");return b=b.replace(/^\s+/,"").replace(/\s+$/,"")},b.Dom.create=function(a){if(a&&""!==a){var b=document.createElement(a),c=arguments;if(c.length>1)for(var d=0;d0?e[0].insertRow(this.filtersRowIndex):this.tbl.insertRow(this.filtersRowIndex),this.headersRow>1&&this.filtersRowIndex<=this.headersRow&&!this.popUpFilters&&this.headersRow++,this.popUpFilters&&this.headersRow++,this.fixedHeaders&&this.SetFixedHeaders(),d.className=this.fltsRowCssClass,!this.isExternalFlt||this.gridLayout&&!this.popUpFilters||(d.style.display="none")}this.nbFilterableRows=this.GetRowsNb(),this.nbVisibleRows=this.nbFilterableRows,this.nbRows=this.tbl.rows.length;for(var f=0;c>f;f++){var g=TF.Dom.create(this.fltCellTag),h=this["col"+f],i=this.isExternalFlt&&this.externalFltTgtIds?this.externalFltTgtIds[f]:null;if(this.singleSearchFlt&&(g.colSpan=this.nbCells),this.gridLayout||d.appendChild(g),a=f==c-1&&this.displayBtn?this.fltSmallCssClass:this.fltCssClass,this.popUpFilters&&this.SetPopupFilter(f),void 0===h&&(h=void 0===b["col_"+f]?this.fltTypeInp:TF.Str.lower(b["col_"+f])),this.singleSearchFlt&&(h=this.fltTypeInp,a=this.singleFltCssClass),h===this.fltTypeSlc||h===this.fltTypeMulti){var j=TF.Dom.create(this.fltTypeSlc,["id",this.prfxFlt+f+"_"+this.id],["ct",f],["filled","0"]);if(h===this.fltTypeMulti&&(j.multiple=this.fltTypeMulti,j.title=this.multipleSlcTooltip),j.className=TF.Str.lower(h)===this.fltTypeSlc?a:this.fltMultiCssClass,i?(tf_Id(i).appendChild(j),this.externalFltEls.push(j)):g.appendChild(j),this.fltIds.push(this.prfxFlt+f+"_"+this.id),this.fillSlcOnDemand||this._PopulateSelect(f),j.onkeypress=this.Evt._DetectKey,j.onchange=this.Evt._OnSlcChange,j.onfocus=this.Evt._OnSlcFocus,j.onblur=this.Evt._OnSlcBlur,this.fillSlcOnDemand){var k=tf_CreateOpt(this.displayAllText,"");j.appendChild(k)}this.fillSlcOnDemand&&tf_isIE&&(j.disabled=!0,j.title=this.activateSlcTooltip,j.parentNode.onclick=this.Evt._EnableSlc,h===this.fltTypeMulti&&this.__deferMultipleSelection(j,0))}else if(h===this.fltTypeCheckList){var l=TF.Dom.create("div",["id",this.prfxCheckListDiv+f+"_"+this.id],["ct",f],["filled","0"]);l.className=this.checkListDivCssClass,i?(tf_Id(i).appendChild(l),this.externalFltEls.push(l)):g.appendChild(l),this.checkListDiv[f]=l,this.fltIds.push(this.prfxFlt+f+"_"+this.id),this.fillSlcOnDemand||this._PopulateCheckList(f),l.onclick=this.Evt._OnCheckListFocus,this.fillSlcOnDemand&&(l.onclick=this.Evt._OnCheckListClick,l.appendChild(TF.Dom.text(this.activateCheckListTxt)))}else{var m=h===this.fltTypeInp?"text":"hidden",n=TF.Dom.create(this.fltTypeInp,["id",this.prfxFlt+f+"_"+this.id],["type",m],["ct",f]);if("hidden"!=m&&(n.value=this.isInpWatermarkArray?this.inpWatermark[f]:this.inpWatermark),n.className=a,""!==this.inpWatermark&&TF.Dom.addClass(n,this.inpWatermarkCssClass),n.onfocus=this.Evt._OnInpFocus,i?(tf_Id(i).appendChild(n),this.externalFltEls.push(n)):g.appendChild(n),this.fltIds.push(this.prfxFlt+f+"_"+this.id),n.onkeypress=this.Evt._DetectKey,n.onkeydown=this.Evt._OnKeyDown,n.onkeyup=this.Evt._OnKeyUp,n.onblur=this.Evt._OnInpBlur,this.rememberGridValues){var o=tf_ReadCookie(this.fltsValuesCookie),p=new RegExp(this.separator,"g"),q=o.split(p);" "!=q[f]&&this.SetFilterValue(f,q[f],!1)}}if(f==c-1&&this.displayBtn){var r=TF.Dom.create(this.fltTypeInp,["id",this.prfxValButton+f+"_"+this.id],["type","button"],["value",this.btnText]);r.className=this.btnCssClass,i?tf_Id(i).appendChild(r):g.appendChild(r),r.onclick=this.Evt._OnBtnClick}}}else this.__resetGrid();else this.refRow=this.refRow-1,this.gridLayout&&(this.refRow=0),this.nbFilterableRows=this.GetRowsNb(),this.nbVisibleRows=this.nbFilterableRows,this.nbRows=this.nbFilterableRows+this.refRow;if(this.rowsCounter&&this.SetRowsCounter(),this.statusBar&&this.SetStatusBar(),this.fixedHeaders&&!this.isFirstLoad&&this.SetFixedHeaders(),this.paging&&this.SetPaging(),this.hasResultsPerPage&&this.paging&&this.SetResultsPerPage(),this.btnReset&&this.SetResetBtn(),this.helpInstructions&&this.SetHelpInstructions(),this.hasColWidth&&!this.gridLayout&&this.SetColWidths(),this.alternateBgs&&this.isStartBgAlternate&&this.SetAlternateRows(),this.hasColOperation&&this.fltGrid&&(this.colOperation=b.col_operation,this.SetColOperation()),(this.sort||this.gridLayout)&&this.SetSort(),(this.selectable||this.editable)&&this.SetEditable(),this.hasBindScript&&void 0!==this.bindScript.src){var s=this.bindScript.src,t=void 0!==this.bindScript.name?this.bindScript.name:"";this.IncludeFile(t,s,this.bindScript.target_fn)}this.isFirstLoad=!1,this.hasGrid=!0,(this.rememberGridValues||this.rememberPageLen||this.rememberPageNb)&&this.ResetValues(),this.gridLayout||TF.Dom.addClass(this.tbl,this.prfxTf),this.loader&&this.ShowLoader("none"),this.hasExtensions&&this.LoadExtensions(),this.onFiltersLoaded&&this.onFiltersLoaded.call(null,this) -}},EvtManager:function(a,b){function c(){if(a){switch(a){case d.Evt.name.filter:d.isModFilterFn?d.modFilterFn.call(null,d):d._Filter();break;case d.Evt.name.populateselect:d.refreshFilters?d._PopulateSelect(e,!0):d._PopulateSelect(e,!1,f,g);break;case d.Evt.name.populatechecklist:d._PopulateCheckList(e,f,g);break;case d.Evt.name.changepage:d._ChangePage(h);break;case d.Evt.name.clear:d._ClearFilters(),d._Filter();break;case d.Evt.name.changeresultsperpage:d._ChangeResultsPerPage();break;case d.Evt.name.resetvalues:d._ResetValues(),d._Filter();break;case d.Evt.name.resetpage:d._ResetPage(d.pgNbCookie);break;case d.Evt.name.resetpagelength:d._ResetPageLength(d.pgLenCookie);break;case d.Evt.name.sort:break;case d.Evt.name.loadextensions:d._LoadExtensions();break;case d.Evt.name.loadthemes:d._LoadThemes();break;default:d["_"+a].call(null,d,b)}(d.status||d.statusBar)&&d.StatusMsg(""),d.loader&&d.ShowLoader("none")}}var d=this,e=b&&void 0!==b.slcIndex?b.slcIndex:null,f=b&&void 0!==b.slcExternal?b.slcExternal:!1,g=b&&void 0!==b.slcId?b.slcId:null,h=b&&void 0!==b.pgIndex?b.pgIndex:null;if(this.loader||this.status||this.statusBar){try{this.ShowLoader(""),this.StatusMsg(d["msg"+a])}catch(i){}window.setTimeout(c,this.execDelay)}else c()},ImportModule:function(a){a.path&&a.name&&this.IncludeFile(a.name,a.path,a.init)},LoadExtensions:function(){if(!this.Ext){var a=this;this.Ext={list:{},add:function(b,c,d,e){var f=d.split("/")[d.split("/").length-1],g=new RegExp(f),h=d.replace(g,"");a.Ext.list[b]={name:b,description:c,file:f,path:h,callback:e}}}}this.EvtManager(this.Evt.name.loadextensions)},_LoadExtensions:function(){if(this.hasExtensions&&tf_IsArray(this.extensions.name)&&tf_IsArray(this.extensions.src))for(var a=this.extensions,b=0;b',this.btnPrevPageHtml='',this.btnNextPageHtml='',this.btnFirstPageHtml='',this.btnLastPageHtml='',this.loader=!0,this.loaderHtml='
',this.loaderText=null}},RemoveGrid:function(){if(this.fltGrid&&this.hasGrid){var a=this.tbl.rows;this.paging&&this.RemovePaging(),this.statusBar&&this.RemoveStatusBar(),this.rowsCounter&&this.RemoveRowsCounter(),this.btnReset&&this.RemoveResetBtn(),(this.helpInstructions||!this.helpInstructions)&&this.RemoveHelpInstructions(),this.paging&&this.RemoveResultsPerPage(),this.isExternalFlt&&!this.popUpFilters&&this.RemoveExternalFlts(),this.fixedHeaders&&this.RemoveFixedHeaders(),this.infDiv&&this.RemoveTopDiv(),this.highlightKeywords&&this.UnhighlightAll(),this.sort&&this.RemoveSort(),this.loader&&this.RemoveLoader(),this.popUpFilters&&this.RemovePopupFilters(),this.markActiveColumns&&this.ClearActiveColumns(),(this.editable||this.selectable)&&this.RemoveEditable();for(var b=this.refRow;b0&&!c.startRow?void 0:c.startRow||a.refRow,c.scroll_into_view=c.scroll_into_view===!1?!1:!0,c.base_path=c.base_path||a.basePath+"ezEditTable/",c.editable=a.editable=a.fObj.editable,c.selection=a.selectable=a.fObj.selectable,a.selectable&&(c.default_selection=c.default_selection||"row"),c.active_cell_css=c.active_cell_css||"ezETSelectedCell",a._lastValidRowIndex=0,a._lastRowIndex=0,a.selectable){var e=function(b,c,d){if(a.validRowsIndex){var e,f=a.validRowsIndex,g=f.length,h="row"!==b.defaultSelection?c.parentNode:c,i="TD"===c.nodeName?c:null,j=void 0!==d?b.Event.GetKey(d):0,k=f.tf_Has(h.rowIndex),l=34===j||33===j?a.pagingLength||b.nbRowsPerPage:1;if(k)34!==j&&33!==j?(a._lastValidRowIndex=f.tf_IndexByValue(h.rowIndex),a._lastRowIndex=h.rowIndex):(e=34===j?a._lastValidRowIndex+l<=g-1?f[a._lastValidRowIndex+l]:[g-1]:a._lastValidRowIndex-l<=f[0]?f[0]:f[a._lastValidRowIndex-l],a._lastRowIndex=e,a._lastValidRowIndex=f.tf_IndexByValue(e),o(e));else{if(h.rowIndex>a._lastRowIndex)if(h.rowIndex>=f[g-1])e=f[g-1];else{var m=a._lastValidRowIndex+l;e=m>g-1?f[g-1]:f[m]}else if(h.rowIndex<=f[0])e=f[0];else{var n=f[a._lastValidRowIndex-l];e=n?n:f[0]}a._lastRowIndex=h.rowIndex,o(e)}var o=function(d){if("row"===b.defaultSelection)b.Selection.SelectRowByIndex(d);else{b.ClearSelections();var e=c.cellIndex,f=a.tbl.rows[d];"both"===b.defaultSelection&&b.Selection.SelectRowByIndex(d),f&&b.Selection.SelectCell(f.cells[e])}if(a.validRowsIndex.length!==a.GetRowsNb()){var g=a.tbl.rows[d];g&&g.scrollIntoView(!1),i&&(i.cellIndex===a.GetCellsNb()-1&&a.gridLayout?a.tblCont.scrollLeft=1e8:0===i.cellIndex&&a.gridLayout?a.tblCont.scrollLeft=0:i.scrollIntoView(!1))}}}},f=function(b,c){var d="row"!==b.defaultSelection?c.parentNode:c;if(a.paging&&a.nbPages>1){b.nbRowsPerPage=a.pagingLength;var e=a.validRowsIndex,f=e.length,g=parseInt(a.startPagingRow,10)+parseInt(a.pagingLength,10),h=d.rowIndex;h===e[f-1]&&a.currentPageNb!=a.nbPages?a.SetPage("last"):h==e[0]&&1!==a.currentPageNb?a.SetPage("first"):h>e[g-1]&&he[0]&&a.SetPage("previous")}};if(a.paging&&(a.onAfterChangePage=function(a){var b=a.ezEditTable,c=b.Selection.GetActiveRow();c&&c.scrollIntoView(!1);var d=b.Selection.GetActiveCell();d&&d.scrollIntoView(!1)}),"row"===c.default_selection){var g=c.on_before_selected_row;c.on_before_selected_row=function(){f(arguments[0],arguments[1],arguments[2]),g&&g.call(null,arguments[0],arguments[1],arguments[2])};var h=c.on_after_selected_row;c.on_after_selected_row=function(){e(arguments[0],arguments[1],arguments[2]),h&&h.call(null,arguments[0],arguments[1],arguments[2])}}else{var i=c.on_before_selected_cell;c.on_before_selected_cell=function(){f(arguments[0],arguments[1],arguments[2]),i&&i.call(null,arguments[0],arguments[1],arguments[2])};var j=c.on_after_selected_cell;c.on_after_selected_cell=function(){e(arguments[0],arguments[1],arguments[2]),j&&j.call(null,arguments[0],arguments[1],arguments[2])}}}if(a.editable){var k=c.on_added_dom_row;if(c.on_added_dom_row=function(){a.nbFilterableRows++,a.paging?(a.nbRows++,a.nbVisibleRows++,a.nbFilterableRows++,a.paging=!1,a.RemovePaging(),a.AddPaging(!1)):a.RefreshNbRows(),a.alternateBgs&&a.SetAlternateRows(),k&&k.call(null,arguments[0],arguments[1],arguments[2])},c.actions&&c.actions["delete"]){var l=c.actions["delete"].on_after_submit;c.actions["delete"].on_after_submit=function(){a.nbFilterableRows--,a.paging?(a.nbRows--,a.nbVisibleRows--,a.nbFilterableRows--,a.paging=!1,a.RemovePaging(),a.AddPaging(!1)):a.RefreshNbRows(),a.alternateBgs&&a.SetAlternateRows(),l&&l.call(null,arguments[0],arguments[1])}}}try{a.ezEditTable=new EditTable(a.id,c,b),a.ezEditTable.Init()}catch(m){console.log(c.err)}},SetPaging:function(){if((this.hasGrid||this.isFirstLoad)&&this.paging&&(this.isPagingRemoved||this.isFirstLoad)){var a=this.fObj;this.pagingTgtId=a.paging_target_id||null,this.pagingLength=isNaN(a.paging_length)?10:a.paging_length,this.resultsPerPageTgtId=a.results_per_page_target_id||null,this.pgSlcCssClass=a.paging_slc_css_class||"pgSlc",this.pgInpCssClass=a.paging_inp_css_class||"pgNbInp",this.resultsSlcCssClass=a.results_slc_css_class||"rspg",this.resultsSpanCssClass=a.results_span_css_class||"rspgSpan",this.nbVisibleRows=0,this.nbHiddenRows=0,this.startPagingRow=0,this.nbPages=0,this.btnNextPageText=a.btn_next_page_text||">",this.btnPrevPageText=a.btn_prev_page_text||"<",this.btnLastPageText=a.btn_last_page_text||">|",this.btnFirstPageText=a.btn_first_page_text||"|<",this.btnNextPageHtml=a.btn_next_page_html||(this.enableIcons?'':null),this.btnPrevPageHtml=a.btn_prev_page_html||(this.enableIcons?'':null),this.btnFirstPageHtml=a.btn_first_page_html||(this.enableIcons?'':null),this.btnLastPageHtml=a.btn_last_page_html||(this.enableIcons?'':null),this.pageText=a.page_text||" Page ",this.ofText=a.of_text||" of ",this.nbPgSpanCssClass=a.nb_pages_css_class||"nbpg",this.hasPagingBtns=a.paging_btns===!1?!1:!0,this.pagingBtnEvents=null,this.pageSelectorType=a.page_selector_type||this.fltTypeSlc,this.onBeforeChangePage=tf_IsFn(a.on_before_change_page)?a.on_before_change_page:null,this.onAfterChangePage=tf_IsFn(a.on_after_change_page)?a.on_after_change_page:null;var b=this.refRow,c=this.nbRows;if(this.nbPages=Math.ceil((c-b)/this.pagingLength),!this.Evt._Paging.next){var d=this;this.Evt._Paging={slcIndex:function(){return d.pageSelectorType===d.fltTypeSlc?d.pagingSlc.options.selectedIndex:parseInt(d.pagingSlc.value,10)-1},nbOpts:function(){return d.pageSelectorType===d.fltTypeSlc?parseInt(d.pagingSlc.options.length,10)-1:d.nbPages-1},next:function(){d.Evt._Paging.nextEvt&&d.Evt._Paging.nextEvt();var a=d.Evt._Paging.slcIndex()0?d.Evt._Paging.slcIndex()-1:d.Evt._Paging.nbOpts();d.ChangePage(a)},last:function(){d.Evt._Paging.lastEvt&&d.Evt._Paging.lastEvt(),d.ChangePage(d.Evt._Paging.nbOpts())},first:function(){d.Evt._Paging.firstEvt&&d.Evt._Paging.firstEvt(),d.ChangePage(0)},_detectKey:function(a){var b=a||window.event;if(b){var c=d.Evt.getKeyCode(a);13===c&&(d.sorted?(d.Filter(),d.ChangePage(d.Evt._Paging.slcIndex())):d.ChangePage(),this.blur())}},nextEvt:null,prevEvt:null,lastEvt:null,firstEvt:null}}this.Evt._OnSlcPagesChange||(this.Evt._OnSlcPagesChange=function(){d.Evt._Paging._OnSlcPagesChangeEvt&&d.Evt._Paging._OnSlcPagesChangeEvt(),d.ChangePage(),this.blur(),this.parentNode&&tf_isIE&&this.parentNode.focus()});var e;this.pageSelectorType===this.fltTypeSlc&&(e=TF.Dom.create(this.fltTypeSlc,["id",this.prfxSlcPages+this.id]),e.className=this.pgSlcCssClass,e.onchange=this.Evt._OnSlcPagesChange),this.pageSelectorType===this.fltTypeInp&&(e=TF.Dom.create(this.fltTypeInp,["id",this.prfxSlcPages+this.id],["value",this.currentPageNb]),e.className=this.pgInpCssClass,e.onkeypress=this.Evt._Paging._detectKey);var f=TF.Dom.create("span",["id",this.prfxBtnNextSpan+this.id]),g=TF.Dom.create("span",["id",this.prfxBtnPrevSpan+this.id]),h=TF.Dom.create("span",["id",this.prfxBtnLastSpan+this.id]),i=TF.Dom.create("span",["id",this.prfxBtnFirstSpan+this.id]);if(this.hasPagingBtns){if(this.btnNextPageHtml)f.innerHTML=this.btnNextPageHtml,f.onclick=this.Evt._Paging.next;else{var j=TF.Dom.create(this.fltTypeInp,["id",this.prfxBtnNext+this.id],["type","button"],["value",this.btnNextPageText],["title","Next"]);j.className=this.btnPageCssClass,j.onclick=this.Evt._Paging.next,f.appendChild(j)}if(this.btnPrevPageHtml)g.innerHTML=this.btnPrevPageHtml,g.onclick=this.Evt._Paging.prev;else{var k=TF.Dom.create(this.fltTypeInp,["id",this.prfxBtnPrev+this.id],["type","button"],["value",this.btnPrevPageText],["title","Previous"]);k.className=this.btnPageCssClass,k.onclick=this.Evt._Paging.prev,g.appendChild(k)}if(this.btnLastPageHtml)h.innerHTML=this.btnLastPageHtml,h.onclick=this.Evt._Paging.last;else{var l=TF.Dom.create(this.fltTypeInp,["id",this.prfxBtnLast+this.id],["type","button"],["value",this.btnLastPageText],["title","Last"]);l.className=this.btnPageCssClass,l.onclick=this.Evt._Paging.last,h.appendChild(l)}if(this.btnFirstPageHtml)i.innerHTML=this.btnFirstPageHtml,i.onclick=this.Evt._Paging.first;else{var m=TF.Dom.create(this.fltTypeInp,["id",this.prfxBtnFirst+this.id],["type","button"],["value",this.btnFirstPageText],["title","First"]);m.className=this.btnPageCssClass,m.onclick=this.Evt._Paging.first,i.appendChild(m)}}this.pagingTgtId||this.SetTopDiv();var n=this.pagingTgtId?tf_Id(this.pagingTgtId):this.mDiv;""!==n.innerHTML&&(n.innerHTML=""),n.appendChild(i),n.appendChild(g);var o=TF.Dom.create("span",["id",this.prfxPgBeforeSpan+this.id]);o.appendChild(TF.Dom.text(this.pageText)),o.className=this.nbPgSpanCssClass,n.appendChild(o),n.appendChild(e);var p=TF.Dom.create("span",["id",this.prfxPgAfterSpan+this.id]);p.appendChild(TF.Dom.text(this.ofText)),p.className=this.nbPgSpanCssClass,n.appendChild(p);var q=TF.Dom.create("span",["id",this.prfxPgSpan+this.id]);q.className=this.nbPgSpanCssClass,q.appendChild(TF.Dom.text(" "+this.nbPages+" ")),n.appendChild(q),n.appendChild(f),n.appendChild(h),this.pagingSlc=tf_Id(this.prfxSlcPages+this.id),(!this.rememberGridValues||this.isPagingRemoved)&&this.SetPagingInfo(),this.fltGrid||(this.ValidateAllRows(),this.SetPagingInfo(this.validRowsIndex)),this.pagingBtnEvents=this.Evt._Paging,this.isPagingRemoved=!1}},RemovePaging:function(){if(this.hasGrid&&this.pagingSlc){var a,b,c,d,e,f,g;a=tf_Id(this.prfxBtnNextSpan+this.id),b=tf_Id(this.prfxBtnPrevSpan+this.id),c=tf_Id(this.prfxBtnLastSpan+this.id),d=tf_Id(this.prfxBtnFirstSpan+this.id),e=tf_Id(this.prfxPgBeforeSpan+this.id),f=tf_Id(this.prfxPgAfterSpan+this.id),g=tf_Id(this.prfxPgSpan+this.id),this.pagingSlc.parentNode.removeChild(this.pagingSlc),a&&a.parentNode.removeChild(a),b&&b.parentNode.removeChild(b),c&&c.parentNode.removeChild(c),d&&d.parentNode.removeChild(d),e&&e.parentNode.removeChild(e),f&&f.parentNode.removeChild(f),g&&g.parentNode.removeChild(g),this.pagingBtnEvents=null,this.pagingSlc=null,this.isPagingRemoved=!0}},SetPagingInfo:function(a){var b=this.tbl.rows,c=this.pagingTgtId?tf_Id(this.pagingTgtId):this.mDiv,d=tf_Id(this.prfxPgSpan+this.id);if(a&&a.length>0)this.validRowsIndex=a;else{this.validRowsIndex=[];for(var e=this.refRow;e0)if(c.style.visibility="visible",this.pageSelectorType===this.fltTypeSlc)for(var h=0;h=this.startPagingRow&&c>d?("true"!==e.getAttribute("validRow")&&e.getAttribute("validRow")||(e.style.display=""),this.alternateBgs&&this.SetRowBg(this.validRowsIndex[d],d)):(e.style.display="none",this.alternateBgs&&this.RemoveRowBg(this.validRowsIndex[d]))}this.nbVisibleRows=this.validRowsIndex.length,this.isStartBgAlternate=!1,this.ApplyGridProps()},SetPage:function(a){if(this.hasGrid&&this.paging){var b=this.pagingBtnEvents,c=typeof a;if("string"===c)switch(TF.Str.lower(a)){case"next":b.next();break;case"previous":b.prev();break;case"last":b.last();break;case"first":b.first();break;default:b.next()}"number"===c&&this.ChangePage(a-1)}},SetResultsPerPage:function(){if((this.hasGrid||this.isFirstLoad)&&!this.resultsPerPageSlc&&this.resultsPerPage){if(!this.Evt._OnSlcResultsChange){var a=this;this.Evt._OnSlcResultsChange=function(){a.ChangeResultsPerPage(),this.blur(),this.parentNode&&tf_isIE&&this.parentNode.focus()}}var b=TF.Dom.create(this.fltTypeSlc,["id",this.prfxSlcResults+this.id]);b.className=this.resultsSlcCssClass;var c=this.resultsPerPage[0],d=this.resultsPerPage[1],e=TF.Dom.create("span",["id",this.prfxSlcResultsTxt+this.id]);e.className=this.resultsSpanCssClass,this.resultsPerPageTgtId||this.SetTopDiv();var f=this.resultsPerPageTgtId?tf_Id(this.resultsPerPageTgtId):this.rDiv;e.appendChild(TF.Dom.text(c)),f.appendChild(e),f.appendChild(b),this.resultsPerPageSlc=tf_Id(this.prfxSlcResults+this.id);for(var g=0;g<, <=, >, >=, =, *, !, {, }, ||,&&, [empty], [nonempty], rgx:
These operators are described here:
http://tablefilter.free.fr/#operators
',this.helpInstrHtml=a.help_instructions_html||null,this.helpInstrBtnText=a.help_instructions_btn_text||"?",this.helpInstrBtnHtml=a.help_instructions_btn_html||null,this.helpInstrBtnCssClass=a.help_instructions_btn_css_class||"helpBtn",this.helpInstrContCssClass=a.help_instructions_container_css_class||"helpCont",this.helpInstrBtnEl=null,this.helpInstrContEl=null,this.helpInstrDefaultHtml='

HTML Table Filter Generator v. '+this.version+'

http://tablefilter.free.fr
©2009-'+this.year+' Max Guglielmi.
";var b=TF.Dom.create("span",["id",this.prfxHelpSpan+this.id]),c=TF.Dom.create("div",["id",this.prfxHelpDiv+this.id]);this.helpInstrTgtId||this.SetTopDiv();var d=this.helpInstrTgtId?tf_Id(this.helpInstrTgtId):this.rDiv;d.appendChild(b);var e=this.helpInstrContTgtId?tf_Id(this.helpInstrContTgtId):b;if(this.helpInstrBtnHtml){b.innerHTML=this.helpInstrBtnHtml;var f=b.firstChild;f.onclick=this.Evt._OnHelpBtnClick,e.appendChild(c)}else{e.appendChild(c);var g=TF.Dom.create("a",["href","javascript:void(0);"]);g.className=this.helpInstrBtnCssClass,g.appendChild(TF.Dom.text(this.helpInstrBtnText)),b.appendChild(g),g.onclick=this.Evt._OnHelpBtnClick}this.helpInstrHtml?(this.helpInstrContTgtId&&e.appendChild(c),c.innerHTML=this.helpInstrHtml,this.helpInstrContTgtId||(c.className=this.helpInstrContCssClass,c.ondblclick=this.Evt._OnHelpBtnClick)):(c.innerHTML=this.helpInstrText,c.className=this.helpInstrContCssClass,c.ondblclick=this.Evt._OnHelpBtnClick),c.innerHTML+=this.helpInstrDefaultHtml,this.helpInstrContEl=c,this.helpInstrBtnEl=b}},RemoveHelpInstructions:function(){this.helpInstrBtnEl&&(this.helpInstrBtnEl.parentNode.removeChild(this.helpInstrBtnEl),this.helpInstrBtnEl=null,this.helpInstrContEl&&(this.helpInstrContEl.parentNode.removeChild(this.helpInstrContEl),this.helpInstrContEl=null))},_ToggleHelp:function(){if(this.helpInstrContEl){var a=this.helpInstrContEl.style.display;if(""===a||"none"===a){this.helpInstrContEl.style.display="block";var b=TF.Dom.position(this.helpInstrBtnEl).left;this.helpInstrContTgtId||(this.helpInstrContEl.style.left=b-this.helpInstrContEl.clientWidth+25+"px")}else this.helpInstrContEl.style.display="none"}},ChangePage:function(a){this.EvtManager(this.Evt.name.changepage,{pgIndex:a})},_ChangePage:function(a){this.paging&&(a||(a=this.pageSelectorType===this.fltTypeSlc?this.pagingSlc.options.selectedIndex:this.pagingSlc.value-1),a>=0&&a<=this.nbPages-1&&(this.onBeforeChangePage&&this.onBeforeChangePage.call(null,this,a),this.currentPageNb=parseInt(a,10)+1,this.pageSelectorType===this.fltTypeSlc?this.pagingSlc.options[a].selected=!0:this.pagingSlc.value=this.currentPageNb,this.rememberPageNb&&this.RememberPageNb(this.pgNbCookie),this.startPagingRow=this.pageSelectorType===this.fltTypeSlc?this.pagingSlc.value:a*this.pagingLength,this.GroupByPage(),this.onAfterChangePage&&this.onAfterChangePage.call(null,this,a)))},ChangeResultsPerPage:function(){this.EvtManager(this.Evt.name.changeresultsperpage)},_ChangeResultsPerPage:function(){if(this.paging){var a=this.resultsPerPageSlc,b=this.pageSelectorType==this.fltTypeSlc?this.pagingSlc.selectedIndex:parseInt(this.pagingSlc.value-1,10);if(this.pagingLength=parseInt(a.options[a.selectedIndex].value,10),this.startPagingRow=this.pagingLength*b,!isNaN(this.pagingLength)){if(this.startPagingRow>=this.nbFilterableRows&&(this.startPagingRow=this.nbFilterableRows-this.pagingLength),this.SetPagingInfo(),this.pageSelectorType===this.fltTypeSlc){var c=this.pagingSlc.options.length-1<=b?this.pagingSlc.options.length-1:b;this.pagingSlc.options[c].selected=!0}this.rememberPageLen&&this.RememberPageLength(this.pgLenCookie)}}},ResetPage:function(){this.EvtManager(this.Evt.name.resetpage)},_ResetPage:function(a){var b=tf_ReadCookie(a);""!==b&&this.ChangePage(b-1)},ResetPageLength:function(){this.EvtManager(this.Evt.name.resetpagelength)},_ResetPageLength:function(a){if(this.paging){var b=tf_ReadCookie(a);""!==b&&(this.resultsPerPageSlc.options[b].selected=!0,this.ChangeResultsPerPage())}},AddPaging:function(a){this.hasGrid&&!this.paging&&(this.paging=!0,this.isPagingRemoved=!0,this.SetPaging(),this.ResetValues(),a&&this.Filter())},PopulateSelect:function(a,b,c){this.EvtManager(this.Evt.name.populateselect,{slcIndex:a,slcExternal:b,slcId:c})},_PopulateSelect:function(a,b,c,d){function e(){if("innerhtml"===m)o+='";else{var a=tf_CreateOpt(j.enableSlcResetFilter?j.displayAllText:"","");if(j.enableSlcResetFilter||(a.style.display="none"),i.appendChild(a),j.enableEmptyOption){var b=tf_CreateOpt(j.emptyText,j.emOperator);i.appendChild(b)}if(j.enableNonEmptyOption){var c=tf_CreateOpt(j.nonEmptyText,j.nmOperator);i.appendChild(c)}}}function f(){var c=i.value;i.innerHTML="",e();for(var d=0;d"+g+""}else{var l;l=j.fillSlcOnDemand&&c==n[d]&&j["col"+a]===j.fltTypeSlc?tf_CreateOpt(g,f,!0):j["col"+a]!=j.fltTypeMulti?tf_CreateOpt(g,f," "!==r[a]&&f==r[a]?!0:!1):tf_CreateOpt(g,f,s.tf_Has(n[d].tf_MatchCase(j.matchCase),j.matchCase)||-1!==s.toString().indexOf(f)?!0:!1),h&&(l.disabled=!0),i.appendChild(l)}}"innerhtml"===m&&(i.innerHTML+=o),i.setAttribute("filled","1")}c=void 0===c?!1:c;var g=this.fltIds[a];if((tf_Id(g)||c)&&(tf_Id(d)||!c)){var h,i=tf_Id(c?d:g),j=this,k=this.tbl.rows,l=this.matchCase,m=TF.Str.lower(this.slcFillingMethod),n=[],o="",p=this.hasCustomSlcOptions&&this.customSlcOptions.cols.tf_Has(a),q=[];b&&this.activeFilterId&&(h=this.activeFilterId.split("_")[0],h=h.split(this.prfxFlt)[1]);var r=[],s=[];this.rememberGridValues&&(r=tf_CookieValueArray(this.fltsValuesCookie,this.separator),r&&!TF.Str.isEmpty(r.toString())&&(p?s.push(r[a]):s=r[a].split(" "+j.orOperator+" ")));var t=null,u=null;b&&this.disableExcludedOptions&&(t=[],u=[]);for(var v=this.refRow;vy;y++)if(a===y&&(!b||b&&this.disableExcludedOptions)||a==y&&b&&(""==k[v].style.display&&!this.paging||this.paging&&(!this.validRowsIndex||this.validRowsIndex&&this.validRowsIndex.tf_Has(v))&&(void 0==h||h==a||h!=a&&this.validRowsIndex.tf_Has(v)))){var z=this.GetCellData(y,w[y]),A=z.tf_MatchCase(l);if(n.tf_Has(A,l)||n.push(z),b&&this.disableExcludedOptions){var B=u[y];B||(B=this.GetFilteredDataCol(y)),B.tf_Has(A,l)||t.tf_Has(A,l)||this.isFirstLoad||t.push(z)}}}if(p){var C=this.__getCustomValues(a);n=C[0],q=C[1]}if(this.sortSlc&&!p&&(l?(n.sort(),t&&t.sort()):(n.sort(tf_IgnoreCaseSort),t&&t.sort(tf_IgnoreCaseSort))),this.sortNumAsc&&this.sortNumAsc.tf_Has(a))try{n.sort(tf_NumSortAsc),t&&t.sort(tf_NumSortAsc),p&&q.sort(tf_NumSortAsc)}catch(D){n.sort(),t&&t.sort(),p&&q.sort()}if(this.sortNumDesc&&this.sortNumDesc.tf_Has(a))try{n.sort(tf_NumSortDesc),t&&t.sort(tf_NumSortDesc),p&&q.sort(tf_NumSortDesc)}catch(D){n.sort(),t&&t.sort(),p&&q.sort()}f()}},__deferMultipleSelection:function(a,b,c){if("select"===TF.Str.lower(a.nodeName)){var d=void 0===c?!1:c,e=this;window.setTimeout(function(){a.options[0].selected=!1,a.options[b].selected=""===a.options[b].value?!1:!0,d&&e.Filter()},.1)}},__getCustomValues:function(a){if(a){var b=this.hasCustomSlcOptions&&this.customSlcOptions.cols.tf_Has(a);if(b){for(var c=[],d=[],e=this.customSlcOptions.cols.tf_IndexByValue(a),f=this.customSlcOptions.values[e],g=this.customSlcOptions.texts[e],h=this.customSlcOptions.sorts[e],i=0;i0&&(j.hasCustomSlcOptions&&j.customSlcOptions.cols.tf_Has(a)?g.push(i):g=i.split(" "+j.orOperator+" ")); -for(var k=0;kt;t++)if(a===t&&(!this.refreshFilters||this.refreshFilters&&this.disableExcludedOptions)||a===t&&this.refreshFilters&&(""===k[q].style.display&&!this.paging||this.paging&&(!i||i===a||i!=a&&this.validRowsIndex.tf_Has(q)))){var u=this.GetCellData(t,r[t]),v=u.tf_MatchCase(this.matchCase);l.tf_Has(v,this.matchCase)||l.push(u);var w=p[t];this.refreshFilters&&this.disableExcludedOptions&&(w||(p[t]=this.GetFilteredDataCol(t)),w.tf_Has(v,this.matchCase)||o.tf_Has(v,this.matchCase)||this.isFirstLoad||o.push(u))}}if(m){var x=this.__getCustomValues(a);l=x[0],n=x[1]}if(this.sortSlc&&!m&&(this.matchCase?(l.sort(),o&&o.sort()):(l.sort(tf_IgnoreCaseSort),o&&o.sort(tf_IgnoreCaseSort))),this.sortNumAsc&&this.sortNumAsc.tf_Has(a))try{l.sort(tf_NumSortAsc),o&&o.sort(tf_NumSortAsc),m&&n.sort(tf_NumSortAsc)}catch(y){l.sort(),o&&o.sort(),m&&n.sort()}if(this.sortNumDesc&&this.sortNumDesc.tf_Has(a))try{l.sort(tf_NumSortDesc),o&&o.sort(tf_NumSortDesc),m&&n.sort(tf_NumSortDesc)}catch(y){l.sort(),o&&o.sort(),m&&n.sort()}if(e(this.separator),this.fillSlcOnDemand&&(g.innerHTML=""),g.appendChild(h),g.setAttribute("filled","1"),j.rememberGridValues&&tf_isIE){var z=h.getAttribute("indexes");if(z)for(var A=z.split(","),B=0;B':null);var b=TF.Dom.create("span",["id",this.prfxResetSpan+this.id]);this.btnResetTgtId||this.SetTopDiv();var c=this.btnResetTgtId?tf_Id(this.btnResetTgtId):this.rDiv;if(c.appendChild(b),this.btnResetHtml){b.innerHTML=this.btnResetHtml;var d=b.firstChild;d.onclick=this.Evt._Clear}else{var e=TF.Dom.create("a",["href","javascript:void(0);"]);e.className=this.btnResetCssClass,e.appendChild(TF.Dom.text(this.btnResetText)),b.appendChild(e),e.onclick=this.Evt._Clear}this.btnResetEl=tf_Id(this.prfxResetSpan+this.id).firstChild}},RemoveResetBtn:function(){if(this.hasGrid&&this.btnResetEl){var a=tf_Id(this.prfxResetSpan+this.id);a&&a.parentNode.removeChild(a),this.btnResetEl=null}},SetStatusBar:function(){if(this.hasGrid||this.isFirstLoad){var a=this.fObj;this.statusBarTgtId=a.status_bar_target_id||null,this.statusBarDiv=null,this.statusBarSpan=null,this.statusBarSpanText=null,this.statusBarText=a.status_bar_text||"",this.statusBarCssClass=a.status_bar_css_class||"status",this.statusBarCloseDelay=250;var b=TF.Dom.create("div",["id",this.prfxStatus+this.id]);b.className=this.statusBarCssClass;var c=TF.Dom.create("span",["id",this.prfxStatusSpan+this.id]),d=TF.Dom.create("span",["id",this.prfxStatusTxt+this.id]);d.appendChild(TF.Dom.text(this.statusBarText)),this.onBeforeShowMsg=tf_IsFn(a.on_before_show_msg)?a.on_before_show_msg:null,this.onAfterShowMsg=tf_IsFn(a.on_after_show_msg)?a.on_after_show_msg:null,this.statusBarTgtId||this.SetTopDiv();var e=this.statusBarTgtId?tf_Id(this.statusBarTgtId):this.lDiv;this.statusBarDiv&&tf_isIE&&(this.statusBarDiv.outerHTML=""),this.statusBarTgtId?(e.appendChild(d),e.appendChild(c)):(b.appendChild(d),b.appendChild(c),e.appendChild(b)),this.statusBarDiv=tf_Id(this.prfxStatus+this.id),this.statusBarSpan=tf_Id(this.prfxStatusSpan+this.id),this.statusBarSpanText=tf_Id(this.prfxStatusTxt+this.id)}},RemoveStatusBar:function(){(this.hasGrid||this.statusBarDiv)&&(this.statusBarDiv.innerHTML="",this.statusBarDiv.parentNode.removeChild(this.statusBarDiv),this.statusBarSpan=null,this.statusBarSpanText=null,this.statusBarDiv=null)},StatusMsg:function(a){a||this.StatusMsg(""),this.status&&this.WinStatusMsg(a),this.statusBar&&this.StatusBarMsg(a)},WinStatusMsg:function(a){this.status&&(this.onBeforeShowMsg&&this.onBeforeShowMsg.call(null,this,a),window.status=a,this.onAfterShowMsg&&this.onAfterShowMsg.call(null,this,a))},StatusBarMsg:function(a){function b(){c.statusBarSpan.innerHTML=a,c.onAfterShowMsg&&c.onAfterShowMsg.call(null,c,a)}if(this.statusBar&&this.statusBarSpan){this.onBeforeShowMsg&&this.onBeforeShowMsg.call(null,this,a);var c=this,d=""===a?this.statusBarCloseDelay:1;window.setTimeout(b,d)}},SetRowsCounter:function(){if((this.hasGrid||this.isFirstLoad)&&!this.rowsCounterSpan){var a=this.fObj;this.rowsCounterTgtId=a.rows_counter_target_id||null,this.rowsCounterDiv=null,this.rowsCounterSpan=null,this.rowsCounterText=a.rows_counter_text||"Rows: ",this.fromToTextSeparator=a.from_to_text_separator||"-",this.overText=a.over_text||" / ",this.totRowsCssClass=a.tot_rows_css_class||"tot",this.onBeforeRefreshCounter=tf_IsFn(a.on_before_refresh_counter)?a.on_before_refresh_counter:null,this.onAfterRefreshCounter=tf_IsFn(a.on_after_refresh_counter)?a.on_after_refresh_counter:null;var b=TF.Dom.create("div",["id",this.prfxCounter+this.id]);b.className=this.totRowsCssClass;var c=TF.Dom.create("span",["id",this.prfxTotRows+this.id]),d=TF.Dom.create("span",["id",this.prfxTotRowsTxt+this.id]);d.appendChild(TF.Dom.text(this.rowsCounterText)),this.rowsCounterTgtId||this.SetTopDiv();var e=this.rowsCounterTgtId?tf_Id(this.rowsCounterTgtId):this.lDiv;this.rowsCounterDiv&&tf_isIE&&(this.rowsCounterDiv.outerHTML=""),this.rowsCounterTgtId?(e.appendChild(d),e.appendChild(c)):(b.appendChild(d),b.appendChild(c),e.appendChild(b)),this.rowsCounterDiv=tf_Id(this.prfxCounter+this.id),this.rowsCounterSpan=tf_Id(this.prfxTotRows+this.id),this.RefreshNbRows()}},RemoveRowsCounter:function(){this.hasGrid&&this.rowsCounterSpan&&(!this.rowsCounterTgtId&&this.rowsCounterDiv?tf_isIE?this.rowsCounterDiv.outerHTML="":this.rowsCounterDiv.parentNode.removeChild(this.rowsCounterDiv):tf_Id(this.rowsCounterTgtId).innerHTML="",this.rowsCounterSpan=null,this.rowsCounterDiv=null)},RefreshNbRows:function(a){if(this.rowsCounterSpan){this.onBeforeRefreshCounter&&this.onBeforeRefreshCounter.call(null,this,this.rowsCounterSpan);var b;if(this.paging){var c=parseInt(this.startPagingRow,10)+(this.nbVisibleRows>0?1:0),d=c+this.pagingLength-1<=this.nbVisibleRows?c+this.pagingLength-1:this.nbVisibleRows;b=c+this.fromToTextSeparator+d+this.overText+this.nbVisibleRows}else b=a&&""!==a?a:this.nbFilterableRows-this.nbHiddenRows-(this.hasVisibleRows?this.visibleRows.length:0);this.rowsCounterSpan.innerHTML=b,this.onAfterRefreshCounter&&this.onAfterRefreshCounter.call(null,this,this.rowsCounterSpan,b)}},SetWatermark:function(a){if(this.fltGrid||""!==this.inpWatermark){a=void 0===a?!0:a;for(var b=0;b0&&this.tbl.removeChild(t[0]),this.headTbl.style.width=this.tbl.style.width,this.headTbl.style.tableLayout="fixed",this.tbl.style.tableLayout="fixed",this.headTbl.cellPadding=this.tbl.cellPadding,this.headTbl.cellSpacing=this.tbl.cellSpacing,this.headTblCont.style.width=this.tblCont.clientWidth+"px",this.SetColWidths(),this.tbl.style.width="",(tf_isIE||tf_isIE7)&&(this.headTbl.style.width="");var u=this;if(this.tblCont.onscroll=function(){u.headTblCont.scrollLeft=this.scrollLeft;var a=this;if(!u.isPointerXOverwritten)try{TF.Evt.pointerX=function(b){b=b||window.event;var c=tf_StandardBody().scrollLeft+a.scrollLeft;return b.pageX+a.scrollLeft||b.clientX+c},u.isPointerXOverwritten=!0}catch(b){u.isPointerXOverwritten=!1}},a.sort!==!1&&(this.sort=!0,this.sortConfig.asyncSort=!0,this.sortConfig.triggerIds=j),this.gridEnableColResizer&&(this.hasExtensions?this.__containsStr("colsresizer",TF.Str.lower(this.extensions.src.toString()))||(this.extensions.name.push("ColumnsResizer_"+this.id),this.extensions.src.push(this.gridColResizerPath),this.extensions.description.push("Columns Resizing"),this.extensions.initialize.push(function(a){a.SetColsResizer("ColumnsResizer_"+a.id)})):(this.extensions={name:["ColumnsResizer_"+this.id],src:[this.gridColResizerPath],description:["Columns Resizing"],initialize:[function(a){a.SetColsResizer("ColumnsResizer_"+a.id)}]},this.hasExtensions=!0)),a.col_resizer_cols_headers_table=this.headTbl.getAttribute("id"),a.col_resizer_cols_headers_index=this.gridHeadRowIndex,a.col_resizer_width_adjustment=0,a.col_enable_text_ellipsis=!1,u.tblHasColTag=tf_Tag(u.tbl,"col").length>0?!0:!1,!tf_isIE&&!tf_isIE7){var v=function(a){if(a){for(var b=a.nbCells-1;b>=0;b--){var c=TF.Dom.create("col",["id",a.id+"_col_"+b]);a.tbl.firstChild.parentNode.insertBefore(c,a.tbl.firstChild),c.style.width=a.colWidth[b],a.gridColElms[b]=c}a.tblHasColTag=!0}};if(u.tblHasColTag)for(var w=tf_Tag(u.tbl,"col"),x=0;x0?z[0].insertRow(0):u.tbl.insertRow(0),y.style.height="0px";for(var A=0;A0?z[0].moveRow(a.leadColWidthsRow.rowIndex,0):a.tbl.moveRow(a.leadColWidthsRow.rowIndex,0)}D&&D.call(null,a,b)}}var E=tf_IsFn(a.on_after_col_resized)?a.on_after_col_resized:null;a.on_after_col_resized=function(a,b){if(b){var c=a.crWColsRow.cells[b].style.width,d=a.gridColElms[b];d.style.width=c;var e=a.crWColsRow.cells[b].clientWidth,f=a.crWRowDataTbl.cells[b].clientWidth;(tf_isIE||tf_isIE7)&&(a.tbl.style.width=a.headTbl.clientWidth+"px"),e==f||tf_isIE||tf_isIE7||(a.headTbl.style.width=a.tbl.clientWidth+"px"),E&&E.call(null,a,b)}},this.tbl.clientWidth!==this.headTbl.clientWidth&&(this.tbl.style.width=this.headTbl.clientWidth+"px")}},RemoveGridLayout:function(){if(this.gridLayout){var a=this.tbl.parentNode.removeChild(this.tbl);this.tblMainCont.parentNode.insertBefore(a,this.tblMainCont),this.tblMainCont.parentNode.removeChild(this.tblMainCont),this.tblMainCont=null,this.headTblCont=null,this.headTbl=null,this.tblCont=null,this.tbl.outerHTML=this.sourceTblHtml,this.tbl=tf_Id(this.id)}},SetPopupFilterIcons:function(){function a(a){var b=a||window.event,d=parseInt(this.getAttribute("ci"),10);if(c.CloseAllPopupFilters(d),c.TogglePopupFilter(d),c.popUpFltAdjustToContainer){var e=c.popUpFltElms[d],f=c.GetHeaderElement(d),g=.95*f.clientWidth;if(!tf_isNotIE){var h=TF.Dom.position(f).left;e.style.left=h+"px"}e.style.width=parseInt(g,10)+"px"}TF.Event.cancel(b),TF.Event.stop(b)}if(this.popUpFilters){this.isExternalFlt=!0;var b=this.fObj;this.popUpImgFlt=b.popup_filters_image||this.themesPath+"icn_filter.gif",this.popUpImgFltActive=b.popup_filters_image_active||this.themesPath+"icn_filterActive.gif",this.popUpImgFltHtml=b.popup_filters_image_html||'Column filter',this.popUpDivCssClass=b.popup_div_css_class||"popUpFilter",this.onBeforePopUpOpen=tf_IsFn(b.on_before_popup_filter_open)?b.on_before_popup_filter_open:null,this.onAfterPopUpOpen=tf_IsFn(b.on_after_popup_filter_open)?b.on_after_popup_filter_open:null,this.onBeforePopUpClose=tf_IsFn(b.on_before_popup_filter_close)?b.on_before_popup_filter_close:null,this.onAfterPopUpClose=tf_IsFn(b.on_after_popup_filter_close)?b.on_after_popup_filter_close:null,this.externalFltTgtIds=[],this.popUpFltSpans=[],this.popUpFltImgs=[],this.popUpFltElms=this.popUpFltElmCache||[],this.popUpFltAdjustToContainer=!0;for(var c=this,d=0;de;e++){var f=a?e:this.validRowsIndex[e];this.SetRowBg(f,d),d++}},RemoveAlternateRows:function(){if(this.hasGrid){for(var a=(this.tbl.rows,this.refRow);a= offsetParent.offsetHeight ? 0 - parentNode.parentNode.offsetHeight + offsetParent.offsetHeight + offsetParent.scrollTop : 0);"}}}},RemoveFixedHeaders:function(){if(this.hasGrid&&this.fixedHeaders)if(this.contDiv){this.contDiv.parentNode.insertBefore(this.tbl,this.contDiv),this.contDiv.parentNode.removeChild(this.contDiv),this.contDiv=null;var a=tf_Tag(this.tbl,"thead");if(0===a.length)return;var b=tf_Tag(a[0],"tr");if(0===b.length)return;for(var c=0;cv):L?(w=tf_FormatDate(a.replace(i,""),D),e=w>=v):N?(w=tf_FormatDate(a.replace(j,""),D),e=v>=w):M?(w=tf_FormatDate(a.replace(l,""),D),e=v>w):O?(w=tf_FormatDate(a.replace(m,""),D),e=v.toString()!=w.toString()):P?(w=tf_FormatDate(a.replace(o,""),D),e=v.toString()==w.toString()):n.test(a)?e=f.__containsStr(a.replace(n,""),b,null,!1):tf_IsValidDate(a,D)?(w=tf_FormatDate(a,D),e=v.toString()==w.toString()):H?e=TF.Str.isEmpty(b):I&&(e=!TF.Str.isEmpty(b));else if(f.hasColNbFormat&&f.colNbFormat[c]?(g=tf_RemoveNbFormat(b,f.colNbFormat[c]),h=f.colNbFormat[c]):","===f.thousandsSeparator&&"."===f.decimalSeparator?(g=tf_RemoveNbFormat(b,"us"),h="us"):(g=tf_RemoveNbFormat(b,"eu"),h="eu"),y)e=g<=tf_RemoveNbFormat(a.replace(i,""),h);else if(A)e=g>=tf_RemoveNbFormat(a.replace(j,""),h);else if(x)e=gtf_RemoveNbFormat(a.replace(l,""),h);else if(B)e=f.__containsStr(a.replace(m,""),b)?!1:!0;else if(E)e=f.__containsStr(a.replace(n,""),b,null,!1);else if(C)e=f.__containsStr(a.replace(o,""),b,null,!0);else if(F)e=0===b.indexOf(a.replace(p,""))?!0:!1;else if(G){var Q=a.replace(q,"");e=b.lastIndexOf(Q,b.length-1)===b.length-1-(Q.length-1)&&b.lastIndexOf(Q,b.length-1)>-1?!0:!1}else if(H)e=TF.Str.isEmpty(b);else if(I)e=!TF.Str.isEmpty(b);else if(J)try{var R=a.replace(u,""),S=new RegExp(R);e=S.test(b)}catch(T){e=!1}else{var U=d["col_"+c];e=f.__containsStr(a,b,U?U:this.fltTypeInp)}return e}if(this.fltGrid&&(this.hasGrid||this.isFirstLoad)){this.onBeforeFilter&&this.onBeforeFilter.call(null,this),""!==this.inpWatermark&&this.SetWatermark(!1);var c=this.tbl.rows,d=this.fObj||{},e=0;this.validRowsIndex=[];var f=this;this.highlightKeywords&&this.UnhighlightAll(),this.popUpFilters&&this.SetAllPopupFiltersIcon(),this.markActiveColumns&&this.ClearActiveColumns(),this.searchArgs=this.GetFiltersValue();for(var g,h,i=new RegExp(this.leOperator),j=new RegExp(this.geOperator),k=new RegExp(this.lwOperator),l=new RegExp(this.grOperator),m=new RegExp(this.dfOperator),n=new RegExp(TF.Str.rgxEsc(this.lkOperator)),o=new RegExp(this.eqOperator),p=new RegExp(this.stOperator),q=new RegExp(this.enOperator),r=new RegExp(this.anOperator),s=(new RegExp(this.curExp),this.emOperator),t=this.nmOperator,u=new RegExp(TF.Str.rgxEsc(this.rgxOperator)),v=this.refRow;vB;B++){var C=this.searchArgs[this.singleSearchFlt?0:B],D=this.hasColDateType?this.colDateType[B]:this.defaultDateType;if(""!==C){var E=this.GetCellData(B,w[B]).tf_MatchCase(this.matchCase),F=C.split(this.orOperator),G=F.length>1?!0:!1,H=C.split(this.anOperator),I=H.length>1?!0:!1;if(G||I){for(var J,K=!1,L=G?F:H,M=0;Mj;j++)if(j===a&&""===d[f].style.display){var k=TF.Str.lower(this.GetCellData(j,h[j])),l=this.colNbFormat?this.colNbFormat[a]:null,m=b?tf_RemoveNbFormat(k,l):k;e.push(m)}}return e}},GetFilterValue:function(a){if(this.fltGrid){var b,c=this.GetFilterElement(a);if(!c)return"";var d=this["col"+a];if(d!==this.fltTypeMulti&&d!==this.fltTypeCheckList)b=c.value;else if(d===this.fltTypeMulti){b="";for(var e=0;e=jj;jj++)ucolIndex[jj]===colIndex[ii]&&(saved=1);0===saved&&(ucolMax++,ucolIndex[ucolMax]=colIndex[ii])}if("object"==TF.Str.lower(typeof labelId)&&"object"==TF.Str.lower(typeof colIndex)&&"object"==TF.Str.lower(typeof operation))for(var row=this.tbl.rows,colvalues=[],ucol=0;ucolMax>=ucol;ucol++){colvalues.push(this.GetColValues(ucolIndex[ucol],!0,excludeRow));for(var result,nbvalues=0,temp,meanValue=0,sumValue=0,minValue=null,maxValue=null,q1Value=null,medValue=null,q3Value=null,meanFlag=0,sumFlag=0,minFlag=0,maxFlag=0,q1Flag=0,medFlag=0,q3Flag=0,theList=[],opsThisCol=[],decThisCol=[],labThisCol=[],oTypeThisCol=[],mThisCol=-1,k=0;kmaxValue?parseFloat(cvalue):maxValue))}if(1===meanFlag&&(meanValue=sumValue/nbvalues),1===medFlag){var aux=0;nbvalues%2===1?(aux=Math.floor(nbvalues/2),medValue=theList[aux]):medValue=(theList[nbvalues/2]+theList[nbvalues/2-1])/2}var posa;if(1===q1Flag&&(posa=0,posa=Math.floor(nbvalues/4),q1Value=4*posa==nbvalues?(theList[posa-1]+theList[posa])/2:theList[posa]),1===q3Flag){posa=0;var posb=0;posa=Math.floor(nbvalues/4),4*posa===nbvalues?(posb=3*posa,q3Value=(theList[posb]+theList[posb-1])/2):q3Value=theList[nbvalues-posa-1]}for(var i=0;mThisCol>=i;i++){switch(opsThisCol[i]){case"mean":result=meanValue;break;case"sum":result=sumValue;break;case"min":result=minValue;break;case"max":result=maxValue;break;case"median":result=medValue;break;case"q1":result=q1Value;break;case"q3":result=q3Value}var precision=decThisCol[i]&&!isNaN(decThisCol[i])?decThisCol[i]:2;if(oTypeThisCol&&result){if(result=result.toFixed(precision),tf_Id(labThisCol[i]))switch(TF.Str.lower(oTypeThisCol)){case"innerhtml":tf_Id(labThisCol[i]).innerHTML=isNaN(result)||!isFinite(result)||0===nbvalues?".":result;break;case"setvalue":tf_Id(labThisCol[i]).value=result;break;case"createtextnode":var oldnode=tf_Id(labThisCol[i]).firstChild,txtnode=TF.Dom.text(result);tf_Id(labThisCol[i]).replaceChild(txtnode,oldnode)}}else try{tf_Id(labThisCol[i]).innerHTML=isNaN(result)||!isFinite(result)||0===nbvalues?".":result.toFixed(precision)}catch(e){}}totRowIndex&&row[totRowIndex[ucol]]&&(row[totRowIndex[ucol]].style.display="")}this.onAfterOperation&&this.onAfterOperation.call(null,this)}},UnhighlightAll:function(){if(this.highlightKeywords&&this.searchArgs){for(var a=0;a]+>/g, ''); + s = s.replace(/^\s+/, '').replace(/\s+$/, ''); + return s/*.tf_Trim()*/; + }; + + /** + * Creates an html element with given collection of attributes + * @param {String} tag a string of the html tag to create + * @param {Array} an undetermined number of arrays containing the with 2 + * items, the attribute name and its value ['id','myId'] + * @return {Object} created element + */ + TF.Dom.create = function(tag){ + if(!tag || tag===''){ + return; + } + + var el = document.createElement(tag), + args = arguments; + + if(args.length > 1){ + for(var i=0; i1){ + for(var i=0; i 1){ + this.filtersRowIndex = this.headersRow+1; + } else { + this.filtersRowIndex = 1; + this.headersRow = 0; + } + } + + //defines tag of the cells containing filters (td/th) + this.fltCellTag = f.filters_cell_tag!=='th' || + f.filters_cell_tag!=='td' ? 'td' : f.filters_cell_tag; + + //stores filters ids + this.fltIds = []; + //stores filters DOM elements + this.fltElms = []; + //stores filters values + this.searchArgs = null; + //stores table data + this.tblData = []; + //stores valid rows indexes (rows visible upon filtering) + this.validRowsIndex = null; + //stores filters row element + this.fltGridEl = null; + //is first load boolean + this.isFirstLoad = true; + //container div for paging elements, reset btn etc. + this.infDiv = null; + //div for rows counter + this.lDiv = null; + //div for reset button and results per page select + this.rDiv = null; + //div for paging elements + this.mDiv = null; + //table container div for fixed headers (IE only) + this.contDiv = null; + + //defines css class for div containing paging elements, rows counter etc. + this.infDivCssClass = f.inf_div_css_class || 'inf'; + //defines css class for left div + this.lDivCssClass = f.left_div_css_class || 'ldiv'; + //defines css class for right div + this.rDivCssClass = f.right_div_css_class || 'rdiv'; + //defines css class for mid div + this.mDivCssClass = f.middle_div_css_class || 'mdiv'; + //table container div css class + this.contDivCssClass = f.content_div_css_class || 'cont'; + + /*** filters' grid appearance ***/ + //stylesheet file + this.stylesheet = f.stylesheet || this.basePath+'filtergrid.css'; + this.stylesheetId = this.id + '_style'; + //defines css class for filters row + this.fltsRowCssClass = f.flts_row_css_class || 'fltrow'; + //enables/disables icons (paging, reset button) + this.enableIcons = f.enable_icons===false ? false : true; + //enables/disbles rows alternating bg colors + this.alternateBgs = f.alternate_rows===true ? true : false; + //defines widths of columns + this.hasColWidth = f.col_width===true ? true : false; + this.colWidth = this.hasColWidth ? f.col_width : null; + //enables/disables fixed headers + this.fixedHeaders = f.fixed_headers===true ? true : false; + //tbody height if fixed headers enabled + this.tBodyH = !isNaN(f.tbody_height) ? f.tbody_height : 200; + //defines css class for filters + this.fltCssClass = f.flt_css_class || 'flt'; + //defines css class for multiple selects filters + this.fltMultiCssClass = f.flt_multi_css_class || 'flt_multi'; + //defines css class for filters + this.fltSmallCssClass = f.flt_small_css_class || 'flt_s'; + //defines css class for single-filter + this.singleFltCssClass = f.single_flt_css_class || 'single_flt'; + this.isStartBgAlternate = true; + //defines css class for even rows + this.rowBgEvenCssClass = f.even_row_css_class || 'even'; + //defines css class for odd rows + this.rowBgOddCssClass = f.odd_row_css_class || 'odd'; + + /*** filters' grid behaviours ***/ + //enables/disables enter key + this.enterKey = f.enter_key===false ? false : true; + //enables/disables alternative fn call + this.isModFilterFn = f.mod_filter_fn===true ? true : false; + // used by tf_DetectKey fn + this.modFilterFn = this.isModFilterFn ? f.mod_filter_fn : null; + //calls function before filtering starts + this.onBeforeFilter = TF.Types.isFn(f.on_before_filter) ? + f.on_before_filter : null; + //calls function after filtering + this.onAfterFilter = TF.Types.isFn(f.on_after_filter) ? + f.on_after_filter : null; + //enables/disables case sensitivity + this.matchCase = f.match_case===true ? true : false; + //enables/disbles exact match for search + this.exactMatch = f.exact_match===true ? true : false; + //refreshes drop-down lists upon validation + this.refreshFilters = f.refresh_filters===true ? true : false; + //wheter excluded options are disabled + this.disableExcludedOptions = f.disable_excluded_options===true ? + true : false; + //stores active filter element + this.activeFlt = null; + //id of active filter + this.activeFilterId = null; + //enables/disbles column operation(sum,mean) + this.hasColOperation = f.col_operation===true ? true : false; + this.colOperation = null; + //enables always visible rows + this.hasVisibleRows = f.rows_always_visible===true ? true : false; + //array containing always visible rows + this.visibleRows = this.hasVisibleRows ? f.rows_always_visible : []; + //defines search type: include or exclude + this.searchType = f.search_type || 'include'; + //enables/disables external filters generation + this.isExternalFlt = f.external_flt_grid===true ? true : false; + //array containing ids of external elements containing filters + this.externalFltTgtIds = f.external_flt_grid_ids || null; + //stores filters elements if isExternalFlt is true + this.externalFltEls = []; + //delays any filtering process if loader true + this.execDelay = !isNaN(f.exec_delay) ? parseInt(f.exec_delay,10) : 100; + //enables/disables status messages + this.status = f.status===true ? true : false; + //calls function when filters grid loaded + this.onFiltersLoaded = TF.Types.isFn(f.on_filters_loaded) ? + f.on_filters_loaded : null; + //enables/disables single filter search + this.singleSearchFlt = f.single_search_filter===true ? true : false; + //calls function after row is validated + this.onRowValidated = TF.Types.isFn(f.on_row_validated) ? + f.on_row_validated : null; + //array defining columns for customCellData event + this.customCellDataCols = f.custom_cell_data_cols ? + f.custom_cell_data_cols : []; + //calls custom function for retrieving cell data + this.customCellData = TF.Types.isFn(f.custom_cell_data) ? + f.custom_cell_data : null; + //input watermark text array + this.inpWatermark = f.input_watermark || ''; + //defines css class for input watermark + this.inpWatermarkCssClass = f.input_watermark_css_class || + 'fltWatermark'; + this.isInpWatermarkArray = TF.Types.isArray(f.input_watermark); + //id of toolbar container element + this.toolBarTgtId = f.toolbar_target_id || null; + //enables/disables help div + this.helpInstructions = f.help_instructions || null; + //popup filters + this.popUpFilters = f.popup_filters===true ? true : false; + //active columns color + this.markActiveColumns = f.mark_active_columns===true ? true : false; + //defines css class for active column header + this.activeColumnsCssClass = f.active_columns_css_class || + 'activeHeader'; + //calls function before active column header is marked + this.onBeforeActiveColumn = TF.Types.isFn(f.on_before_active_column) ? + f.on_before_active_column : null; + //calls function after active column header is marked + this.onAfterActiveColumn = TF.Types.isFn(f.on_after_active_column) ? + f.on_after_active_column : null; + + /*** select filter's customisation and behaviours ***/ + //defines 1st option text + this.displayAllText = f.display_all_text || ''; + this.enableSlcResetFilter = f.enable_slc_reset_filter===false ? + false : true; + //enables/disables empty option in combo-box filters + this.enableEmptyOption = f.enable_empty_option===true ? true : false; + //defines empty option text + this.emptyText = f.empty_text || '(Empty)'; + //enables/disables non empty option in combo-box filters + this.enableNonEmptyOption = f.enable_non_empty_option===true ? + true : false; + //defines empty option text + this.nonEmptyText = f.non_empty_text || '(Non empty)'; + //enables/disables onChange event on combo-box + this.onSlcChange = f.on_change===false ? false : true; + //enables/disables select options sorting + this.sortSlc = f.sort_select===false ? false : true; + //enables/disables ascending numeric options sorting + this.isSortNumAsc = f.sort_num_asc===true ? true : false; + this.sortNumAsc = this.isSortNumAsc ? f.sort_num_asc : null; + //enables/disables descending numeric options sorting + this.isSortNumDesc = f.sort_num_desc===true ? true : false; + this.sortNumDesc = this.isSortNumDesc ? f.sort_num_desc : null; + //sets select filling method: 'innerHTML' or 'createElement' + this.slcFillingMethod = f.slc_filling_method || 'createElement'; + //enabled selects are populated on demand + this.fillSlcOnDemand = f.fill_slc_on_demand===true ? true : false; + //IE only, tooltip text appearing on select before it is populated + this.activateSlcTooltip = f.activate_slc_tooltip || + 'Click to activate'; + //tooltip text appearing on multiple select + this.multipleSlcTooltip = f.multiple_slc_tooltip || + 'Use Ctrl key for multiple selections'; + this.hasCustomSlcOptions = TF.Types.isObj(f.custom_slc_options) ? + true : false; + this.customSlcOptions = tf_isArray(f.custom_slc_options) ? + f.custom_slc_options : null; + //calls function before col operation + this.onBeforeOperation = TF.Types.isFn(f.on_before_operation) ? + f.on_before_operation : null; + //calls function after col operation + this.onAfterOperation = TF.Types.isFn(f.on_after_operation) ? + f.on_after_operation : null; + + /*** checklist customisation and behaviours ***/ + this.checkListDiv = []; //checklist container div + //defines css class for div containing checklist filter + this.checkListDivCssClass = f.div_checklist_css_class || + 'div_checklist'; + //defines css class for checklist filters + this.checkListCssClass = f.checklist_css_class || 'flt_checklist'; + //defines css class for checklist item (li) + this.checkListItemCssClass = f.checklist_item_css_class || + 'flt_checklist_item'; + //defines css class for selected checklist item (li) + this.checkListSlcItemCssClass = f.checklist_selected_item_css_class || + 'flt_checklist_slc_item'; + //Load on demand text + this.activateCheckListTxt = f.activate_checklist_text || + 'Click to load filter data'; + //defines css class for checklist filters + this.checkListItemDisabledCssClass = + f.checklist_item_disabled_css_class || + 'flt_checklist_item_disabled'; + this.enableCheckListResetFilter = + f.enable_checklist_reset_filter===false ? false : true; + + /*** Filter operators ***/ + this.rgxOperator = f.regexp_operator || 'rgx:'; + this.emOperator = f.empty_operator || '[empty]'; + this.nmOperator = f.nonempty_operator || '[nonempty]'; + this.orOperator = f.or_operator || '||'; + this.anOperator = f.and_operator || '&&'; + this.grOperator = f.greater_operator || '>'; + this.lwOperator = f.lower_operator || '<'; + this.leOperator = f.lower_equal_operator || '<='; + this.geOperator = f.greater_equal_operator || '>='; + this.dfOperator = f.different_operator || '!'; + this.lkOperator = f.like_operator || '*'; + this.eqOperator = f.equal_operator || '='; + this.stOperator = f.start_with_operator || '{'; + this.enOperator = f.end_with_operator || '}'; + this.curExp = f.cur_exp || '^[¥£€$]'; + this.separator = f.separator || ','; + + /*** rows counter ***/ + //show/hides rows counter + this.rowsCounter = f.rows_counter===true ? true : false; + + /*** status bar ***/ + //show/hides status bar + this.statusBar = f.status_bar===true ? true : false; + + /*** loader ***/ + //enables/disables loader/spinner indicator + this.loader = f.loader===true ? true : false; + + /*** validation - reset buttons/links ***/ + //show/hides filter's validation button + this.displayBtn = f.btn===true ? true : false; + //defines validation button text + this.btnText = f.btn_text || (!this.enableIcons ? 'Go' : ''); + //defines css class for validation button + this.btnCssClass = f.btn_css_class || + (!this.enableIcons ? 'btnflt' : 'btnflt_icon'); + //show/hides reset link + this.btnReset = f.btn_reset===true ? true : false; + //defines css class for reset button + this.btnResetCssClass = f.btn_reset_css_class || 'reset'; + //callback function before filters are cleared + this.onBeforeReset = TF.Types.isFn(f.on_before_reset) ? + f.on_before_reset : null; + //callback function after filters are cleared + this.onAfterReset = TF.Types.isFn(f.on_after_reset) ? + f.on_after_reset : null; + + /*** paging ***/ + //enables/disables table paging + this.paging = f.paging===true ? true : false; + //enables/disables results per page drop-down + this.hasResultsPerPage = f.results_per_page===true ? true : false; + //css class for paging buttons (previous,next,etc.) + this.btnPageCssClass = f.paging_btn_css_class || 'pgInp'; + //stores paging select element + this.pagingSlc = null; + //stores results per page text and values + this.resultsPerPage = null; + //results per page select element + this.resultsPerPageSlc = null; + //indicates if paging elements were previously removed + this.isPagingRemoved = false; + 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 ***/ + //enables/disables default table sorting + this.sort = f.sort===true ? true : false; + //indicates if sort is set (used in tfAdapter.sortabletable.js) + this.isSortEnabled = false; + //indicates if tables was sorted + this.sorted = false; + this.sortConfig = 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 = + tf_isArray(this.sortConfig['sort_types']) ? + 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']===true ? true : false; + this.sortConfig.triggerIds = + tf_isArray(this.sortConfig['sort_trigger_ids']) ? + f.sort_config.sort_trigger_ids : []; + + /*** ezEditTable extension ***/ + //enables/disables table selection feature + this.selectable = f.selectable===true ? true : false; + //enables/disables editable table feature + this.editable = f.editable===true ? true : false; + this.ezEditTableConfig = f.ezEditTable_config || {}; + this.ezEditTableConfig.name = + this.ezEditTableConfig['name']!==undefined ? + f.ezEditTable_config.name : 'ezedittable'; + this.ezEditTableConfig.src = this.ezEditTableConfig['src']!==undefined ? + f.ezEditTable_config.src : + this.basePath+'ezEditTable/ezEditTable.js'; + //ezEditTable stylesheet not imported by default as filtergrid.css + //applies + this.ezEditTableConfig.loadStylesheet = + this.ezEditTableConfig['loadStylesheet']===true ? true : false; + this.ezEditTableConfig.stylesheet = + this.ezEditTableConfig['stylesheet'] || + this.basePath+'ezEditTable/ezEditTable.css'; + this.ezEditTableConfig.stylesheetName = + this.ezEditTableConfig['stylesheetName']!==undefined ? + f.ezEditTable_config.stylesheetName : 'ezEditTableCss'; + this.ezEditTableConfig.err = 'Failed to instantiate EditTable ' + + 'object.\n"ezEditTable" module may not be available.'; + + /*** onkeyup event ***/ + //enables/disables onkeyup event, table is filtered when user stops + //typing + this.onKeyUp = f.on_keyup===true ? true : false; + //onkeyup delay timer (msecs) + this.onKeyUpDelay = !isNaN(f.on_keyup_delay) ? + f.on_keyup_delay : 900; + this.isUserTyping = null; //typing indicator + this.onKeyUpTimer = undefined; + + /*** keyword highlighting ***/ + //enables/disables keyword highlighting + this.highlightKeywords = f.highlight_keywords===true ? true : false; + //defines css class for highlighting + this.highlightCssClass = f.highlight_css_class || 'keyword'; + this.highlightedNodes = []; + + /*** data types ***/ + //defines default date type (european DMY) + this.defaultDateType = f.default_date_type || 'DMY'; + //defines default thousands separator + //US = ',' EU = '.' + this.thousandsSeparator = f.thousands_separator || ','; + //defines default decimal separator + //US & javascript = '.' EU = ',' + this.decimalSeparator = f.decimal_separator || '.'; + //enables number format per column + this.hasColNbFormat = f.col_number_format===true ? true : false; + //array containing columns nb formats + this.colNbFormat = tf_isArray(this.hasColNbFormat) ? + f.col_number_format : null; + //enables date type per column + this.hasColDateType = f.col_date_type===true ? true : false; + //array containing columns date type + this.colDateType = tf_isArray(this.hasColDateType) ? + f.col_date_type : null; + + /*** status messages ***/ + //filtering + this.msgFilter = f.msg_filter || 'Filtering data...'; + //populating drop-downs + this.msgPopulate = f.msg_populate || 'Populating filter...'; + //populating drop-downs + this.msgPopulateCheckList = f.msg_populate_checklist || + 'Populating list...'; + //changing paging page + this.msgChangePage = f.msg_change_page || 'Collecting paging data...'; + //clearing filters + this.msgClear = f.msg_clear || 'Clearing filters...'; + //changing nb results/page + this.msgChangeResults = f.msg_change_results || + 'Changing results per page...'; + //re-setting grid values + this.msgResetValues = f.msg_reset_grid_values || + 'Re-setting filters values...'; + //re-setting page + this.msgResetPage = f.msg_reset_page || 'Re-setting page...'; + //re-setting page length + this.msgResetPageLength = f.msg_reset_page_length || + 'Re-setting page length...'; + //table sorting + this.msgSort = f.msg_sort || 'Sorting data...'; + //extensions loading + this.msgLoadExtensions = f.msg_load_extensions || + 'Loading extensions...'; + //themes loading + this.msgLoadThemes = f.msg_load_themes || 'Loading theme(s)...'; + + /*** ids prefixes ***/ + //css class name added to table + this.prfxTf = 'TF'; + //filters (inputs - selects) + this.prfxFlt = 'flt'; + //validation button + this.prfxValButton = 'btn'; + //container div for paging elements, rows counter etc. + this.prfxInfDiv = 'inf_'; + //left div + this.prfxLDiv = 'ldiv_'; + //right div + this.prfxRDiv = 'rdiv_'; + //middle div + this.prfxMDiv = 'mdiv_'; + //table container if fixed headers enabled + this.prfxContentDiv = 'cont_'; + //checklist filter container div + this.prfxCheckListDiv = 'chkdiv_'; + //pages select + this.prfxSlcPages = 'slcPages_'; + //results per page select + this.prfxSlcResults = 'slcResults_'; + //label preciding results per page select + this.prfxSlcResultsTxt = 'slcResultsTxt_'; + //span containing next page button + this.prfxBtnNextSpan = 'btnNextSpan_'; + //span containing previous page button + this.prfxBtnPrevSpan = 'btnPrevSpan_'; + //span containing last page button + this.prfxBtnLastSpan = 'btnLastSpan_'; + //span containing first page button + this.prfxBtnFirstSpan = 'btnFirstSpan_'; + //next button + this.prfxBtnNext = 'btnNext_'; + //previous button + this.prfxBtnPrev = 'btnPrev_'; + //last button + this.prfxBtnLast = 'btnLast_'; + //first button + this.prfxBtnFirst = 'btnFirst_'; + //span for tot nb pages + this.prfxPgSpan = 'pgspan_'; + //span preceding pages select (contains 'Page') + this.prfxPgBeforeSpan = 'pgbeforespan_'; + //span following pages select (contains ' of ') + this.prfxPgAfterSpan = 'pgafterspan_'; + //rows counter div + this.prfxCounter = 'counter_'; + //nb displayed rows label + this.prfxTotRows = 'totrows_span_'; + //label preceding nb rows label + this.prfxTotRowsTxt = 'totRowsTextSpan_'; + //span containing reset button + this.prfxResetSpan = 'resetspan_'; + //loader div + this.prfxLoader = 'load_'; + //status bar div + this.prfxStatus = 'status_'; + //status bar label + this.prfxStatusSpan = 'statusSpan_'; + //text preceding status bar label + this.prfxStatusTxt = 'statusText_'; + //filter values cookie + this.prfxCookieFltsValues = 'tf_flts_'; + //page nb cookie + this.prfxCookiePageNb = 'tf_pgnb_'; + //page length cookie + this.prfxCookiePageLen = 'tf_pglen_'; + //div containing grid elements if grid_layout true + this.prfxMainTblCont = 'gridCont_'; + //div containing table if grid_layout true + this.prfxTblCont = 'tblCont_'; + //div containing headers table if grid_layout true + this.prfxHeadTblCont = 'tblHeadCont_'; + //headers' table if grid_layout true + this.prfxHeadTbl = 'tblHead_'; + //id of td containing the filter if grid_layout true + this.prfxGridFltTd = '_td_'; + //id of th containing column header if grid_layout true + this.prfxGridTh = 'tblHeadTh_'; + //id prefix for help elements + this.prfxHelpSpan = 'helpSpan_'; + //id prefix for help elements + this.prfxHelpDiv = 'helpDiv_'; + //id prefix for pop-up filter span + this.prfxPopUpSpan = 'popUpSpan_'; + //id prefix for pop-up div containing filter + this.prfxPopUpDiv = 'popUpDiv_'; + + /*** cookies ***/ + this.hasStoredValues = false; + //remembers filters values on page load + this.rememberGridValues = f.remember_grid_values===true ? + true : false; + //cookie storing filter values + this.fltsValuesCookie = this.prfxCookieFltsValues + this.id; + //remembers page nb on page load + this.rememberPageNb = this.paging && f.remember_page_number ? + true : false; + //cookie storing page nb + this.pgNbCookie = this.prfxCookiePageNb + this.id; + //remembers page length on page load + this.rememberPageLen = this.paging && f.remember_page_length ? + true : false; + //cookie storing page length + this.pgLenCookie = this.prfxCookiePageLen + this.id; + //cookie duration + this.cookieDuration = !isNaN(f.set_cookie_duration) ? + parseInt(f.set_cookie_duration, 10) :100000; + + /*** extensions ***/ + //imports external script + this.hasExtensions = f.extensions===true ? true : false; + this.extensions = this.hasExtensions ? f.extensions : null; + + /*** themes ***/ + this.enableDefaultTheme = f.enable_default_theme===true ? + true : false; + //imports themes + this.hasThemes = (f.enable_default_theme || + (f.themes && TF.Types.isObj(f.themes))) ? true : false; + this.themes = this.hasThemes ? f.themes : null; + //themes path + this.themesPath = f.themes_path || this.basePath+'TF_Themes/'; + + /***(deprecated: backward compatibility) ***/ + //imports external script + this.hasBindScript = f.bind_script===true ? true : false; + 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' + }, + getKeyCode: function(evt){ + return evt.charCode ? evt.charCode : + (evt.keyCode ? evt.keyCode: (evt.which ? evt.which : 0)); + }, + /*==================================================== + - Detects key for a given element + =====================================================*/ + _DetectKey: function(e) { + if(!o.enterKey){ return; } + var evt = e || window.event; + if(evt){ + var key = o.Evt.getKeyCode(evt); + if(key===13){ + o._Filter(); + TF.Event.cancel(evt); + TF.Event.stop(evt); + } else { + o.isUserTyping = true; + window.clearInterval(o.onKeyUpTimer); + o.onKeyUpTimer = undefined; + } + }//if evt + }, + /*==================================================== + - onkeyup event for text filters + =====================================================*/ + _OnKeyUp: function(e) { + if(!o.onKeyUp) return; + var evt = e || window.event; + var key = o.Evt.getKeyCode(evt); + o.isUserTyping = false; + + function filter() { + window.clearInterval(o.onKeyUpTimer); + o.onKeyUpTimer = undefined; + if(!o.isUserTyping) + { + o.Filter(); + o.isUserTyping = null; + } + } + + if(key!==13 && key!==9 && key!==27 && key!==38 && key!==40) { + if(o.onKeyUpTimer===undefined){ + o.onKeyUpTimer = window.setInterval(filter, o.onKeyUpDelay); + } + } else { + window.clearInterval(o.onKeyUpTimer); + o.onKeyUpTimer = undefined; + } + }, + /*==================================================== + - onkeydown event for input filters + =====================================================*/ + _OnKeyDown: function(e) { + if(!o.onKeyUp) { return; } + o.isUserTyping = true; + }, + /*==================================================== + - onblur event for input filters + =====================================================*/ + _OnInpBlur: function(e) { + 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.Dom.addClass(this, o.inpWatermarkCssClass); + } + if(o.ezEditTable){ + if(o.editable) o.ezEditTable.Editable.Set(); + if(o.selectable) o.ezEditTable.Selection.Set(); + } + }, + /*==================================================== + - onfocus event for input filters + =====================================================*/ + _OnInpFocus: function(e) { + 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.Dom.removeClass(this, o.inpWatermarkCssClass); + } + } else { + var inpWatermark = o.inpWatermark[this.getAttribute('ct')]; + if(this.value === inpWatermark && inpWatermark !== ''){ + this.value = ''; + TF.Dom.removeClass(this, o.inpWatermarkCssClass); + } + } + if(o.popUpFilters){ + TF.Event.cancel(evt); + TF.Event.stop(evt); + } + if(o.ezEditTable){ + if(o.editable) o.ezEditTable.Editable.Remove(); + if(o.selectable) o.ezEditTable.Selection.Remove(); + } + }, + /*==================================================== + - onfocus event for select filters + =====================================================*/ + _OnSlcFocus: function(e) { + 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.Event.cancel(evt); + TF.Event.stop(evt); + } + }, + /*==================================================== + - onchange event for select filters + =====================================================*/ + _OnSlcChange: function(e) { + var colIndex = o.activeFlt.getAttribute('colIndex'); + //Checks filter is a checklist and caller is not null + if(o.activeFlt && colIndex && + o['col'+colIndex]===o.fltTypeCheckList && + !o.Evt._OnSlcChange.caller){ return; } + var evt = e || window.event; + if(o.popUpFilters){ TF.Event.stop(evt); } + if(o.onSlcChange){ o.Filter(); } + }, + /*==================================================== + - onblur event for select filters + =====================================================*/ + _OnSlcBlur: function(e) {}, + /*==================================================== + - onchange event for checklist filters + =====================================================*/ + _OnCheckListChange: function(e) { + //Checks caller is not null + if(!o.Evt._OnCheckListChange.caller){ return; } + o.Evt._OnSlcChange(e); + }, + /*==================================================== + - onclick event for checklist filters + =====================================================*/ + _OnCheckListClick: function() { + if(o.fillSlcOnDemand && this.getAttribute('filled') === '0') + { + var ct = this.getAttribute('ct'); + o.PopulateCheckList(ct); + o.checkListDiv[ct].onclick = null; + o.checkListDiv[ct].title = ''; + } + }, + /*==================================================== + - onclick event for checklist filter container + =====================================================*/ + _OnCheckListFocus: function(e) { + o.activeFilterId = this.firstChild.getAttribute('id'); + o.activeFlt = tf_Id(o.activeFilterId); + }, + _OnCheckListBlur: function(e){}, + /*==================================================== + - onclick event for validation button + (btn property) + =====================================================*/ + _OnBtnClick: function() { + o.Filter(); + }, + _OnSlcPagesChangeEvt: null, //used by sort adapter + /*==================================================== + - onclick event slc parent node (enables filters) + IE only + =====================================================*/ + _EnableSlc: function() { + this.firstChild.disabled = false; + this.firstChild.focus(); + this.onclick = null; + }, + /*==================================================== + - clears filters + =====================================================*/ + _Clear: function() { + o.ClearFilters(); + }, + /*==================================================== + - Help button onclick event + =====================================================*/ + _OnHelpBtnClick: function() { + o._ToggleHelp(); + }, + _Paging: { //used by sort adapter + nextEvt: null, + prevEvt: null, + lastEvt: null, + firstEvt: null + } + }; +} + +TF.prototype = { + AddGrid: function(){ this._AddGrid();}, + Init: function(){ this.AddGrid(); }, + Initialize: function(){ this.AddGrid(); }, + init: function(){ this.AddGrid(); }, + initialize: function(){ this.AddGrid(); }, + /*==================================================== + - adds row with filtering grid bar and sets grid + behaviours and layout + =====================================================*/ + _AddGrid: function(){ + if(this.hasGrid) return; + if(this.gridLayout){ + this.refRow = this.startRow===null ? 0 : this.startRow; + } + if(this.popUpFilters && + ((this.filtersRowIndex === 0 && this.headersRow === 1) || + this.gridLayout)){ + this.headersRow = 0; + } + var f = this.fObj || {}, + 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'] || this.resultsPerPage; + if(this.resultsPerPage.length<2){ + this.hasResultsPerPage = false; + } else { + this.pagingLength = this.resultsPerPage[1][0]; + } + } + + //filters grid is not generated + if(!this.fltGrid){ + 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){ + var fltrow; + if(!this.gridLayout){ + 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'; + + //Paging buttons + this.btnPrevPageHtml = ''; + this.btnNextPageHtml = ''; + this.btnFirstPageHtml = ''; + this.btnLastPageHtml = ''; + + //Loader + this.loader = true; + this.loaderHtml = '
'; + this.loaderText = null; + }, + + /*==================================================== + - removes a filter grid + =====================================================*/ + RemoveGrid: function(){ + 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){ + 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(); + } + if(this.editable || this.selectable){ + this.RemoveEditable(); + } + //this loop shows all rows and removes validRow attribute + for(var j=this.refRow; j 0 && !ezEditConfig.startRow){ + startRow = undefined; + } + //otherwise startRow config property if any or TableFilter refRow + else{ + startRow = ezEditConfig.startRow || o.refRow; + } + + ezEditConfig.scroll_into_view = ezEditConfig.scroll_into_view===false ? + false : true; + ezEditConfig.base_path = ezEditConfig.base_path || + o.basePath + 'ezEditTable/'; + ezEditConfig.editable = o.editable = o.fObj.editable; + ezEditConfig.selection = o.selectable = o.fObj.selectable; + + if(o.selectable){ + ezEditConfig.default_selection = + ezEditConfig.default_selection || 'row'; + } + //CSS Styles + ezEditConfig.active_cell_css = ezEditConfig.active_cell_css || + 'ezETSelectedCell'; + + o._lastValidRowIndex = 0; + o._lastRowIndex = 0; + + if(o.selectable){ + //Row navigation needs to be calculated according to TableFilter's + //validRowsIndex array + var onAfterSelection = function(et, selectedElm, e){ + //table is not filtered + if(!o.validRowsIndex){ + return; + } + var validIndexes = o.validRowsIndex, + validIdxLen = validIndexes.length, + row = et.defaultSelection !== 'row' ? + selectedElm.parentNode : selectedElm, + //cell for default_selection = 'both' or 'cell' + cell = selectedElm.nodeName==='TD' ? selectedElm : null, + keyCode = e !== undefined ? et.Event.GetKey(e) : 0, + isRowValid = validIndexes.tf_Has(row.rowIndex), + nextRowIndex, + //pgup/pgdown keys + d = (keyCode === 34 || keyCode === 33 ? + (o.pagingLength || et.nbRowsPerPage) : 1); + + //If next row is not valid, next valid filtered row needs to be + //calculated + if(!isRowValid){ + //Selection direction up/down + if(row.rowIndex>o._lastRowIndex){ + //last row + if(row.rowIndex >= validIndexes[validIdxLen-1]){ + nextRowIndex = validIndexes[validIdxLen-1]; + } else { + var calcRowIndex = (o._lastValidRowIndex + d); + if(calcRowIndex > (validIdxLen-1)){ + nextRowIndex = validIndexes[validIdxLen-1]; + } else { + nextRowIndex = validIndexes[calcRowIndex]; + } + } + } else{ + //first row + if(row.rowIndex <= validIndexes[0]){ + nextRowIndex = validIndexes[0]; + } else { + var v = validIndexes[o._lastValidRowIndex - d]; + nextRowIndex = v ? v : validIndexes[0]; + } + } + o._lastRowIndex = row.rowIndex; + DoSelection(nextRowIndex); + } else { + //If filtered row is valid, special calculation for + //pgup/pgdown keys + if(keyCode!==34 && keyCode!==33){ + o._lastValidRowIndex = validIndexes.tf_IndexByValue( + row.rowIndex); + o._lastRowIndex = row.rowIndex; + } else { + if(keyCode === 34){ //pgdown + //last row + if((o._lastValidRowIndex + d) <= (validIdxLen-1)){ + nextRowIndex = validIndexes[ + o._lastValidRowIndex + d]; + } else { + nextRowIndex = [validIdxLen-1]; + } + } else { //pgup + //first row + if((o._lastValidRowIndex - d) <= validIndexes[0]){ + nextRowIndex = validIndexes[0]; + } else { + nextRowIndex = validIndexes[ + o._lastValidRowIndex - d]; + } + } + o._lastRowIndex = nextRowIndex; + o._lastValidRowIndex = validIndexes.tf_IndexByValue( + nextRowIndex); + DoSelection(nextRowIndex); + } + } + + //Next valid filtered row needs to be selected + var DoSelection = function(nextRowIndex){ + if(et.defaultSelection === 'row'){ + et.Selection.SelectRowByIndex(nextRowIndex); + } else { + et.ClearSelections(); + var cellIndex = selectedElm.cellIndex, + row = o.tbl.rows[nextRowIndex]; + if(et.defaultSelection === 'both'){ + et.Selection.SelectRowByIndex(nextRowIndex); + } + if(row){ + et.Selection.SelectCell(row.cells[cellIndex]); + } + } + //Table is filtered + if(o.validRowsIndex.length !== o.GetRowsNb()){ + var r = o.tbl.rows[nextRowIndex]; + if(r){ + r.scrollIntoView(false); + } + if(cell){ + if(cell.cellIndex===(o.GetCellsNb()-1) && + o.gridLayout){ + o.tblCont.scrollLeft = 100000000; + } + else if(cell.cellIndex===0 && o.gridLayout){ + o.tblCont.scrollLeft = 0; + } else { + cell.scrollIntoView(false); + } + } + } + }; + }; + + //Page navigation has to be enforced whenever selected row is out of + //the current page range + var onBeforeSelection = function(et, selectedElm, e){ + var row = et.defaultSelection !== 'row' ? + selectedElm.parentNode : selectedElm; + if(o.paging){ + if(o.nbPages>1){ + //page length is re-assigned in case it has changed + et.nbRowsPerPage = o.pagingLength; + var validIndexes = o.validRowsIndex, + validIdxLen = validIndexes.length, + pagingEndRow = parseInt(o.startPagingRow,10) + + parseInt(o.pagingLength,10); + var rowIndex = row.rowIndex; + if((rowIndex === validIndexes[validIdxLen-1]) && + o.currentPageNb!=o.nbPages){ + o.SetPage('last'); + } + else if((rowIndex == validIndexes[0]) && + o.currentPageNb!==1){ + o.SetPage('first'); + } + else if(rowIndex > validIndexes[pagingEndRow-1] && + rowIndex < validIndexes[validIdxLen-1]){ + o.SetPage('next'); + } + else if(rowIndex < validIndexes[o.startPagingRow] && + rowIndex > validIndexes[0]){ + o.SetPage('previous'); + } + } + } + }; + + //Selected row needs to be visible when paging is activated + if(o.paging){ + o.onAfterChangePage = function(tf, i){ + var et = tf.ezEditTable; + var row = et.Selection.GetActiveRow(); + if(row){ + row.scrollIntoView(false); + } + var cell = et.Selection.GetActiveCell(); + if(cell){ + cell.scrollIntoView(false); + } + }; + } + + //Rows navigation when rows are filtered is performed with the + //EditTable row selection callback events + if(ezEditConfig.default_selection==='row'){ + var fnB = ezEditConfig.on_before_selected_row; + ezEditConfig.on_before_selected_row = function(){ + onBeforeSelection(arguments[0], arguments[1], arguments[2]); + if(fnB){ + fnB.call( + null, arguments[0], arguments[1], arguments[2]); + } + }; + var fnA = ezEditConfig.on_after_selected_row; + ezEditConfig.on_after_selected_row = function(){ + onAfterSelection(arguments[0], arguments[1], arguments[2]); + if(fnA){ + fnA.call( + null, arguments[0], arguments[1], arguments[2]); + } + }; + } else { + var fnD = ezEditConfig.on_before_selected_cell; + ezEditConfig.on_before_selected_cell = function(){ + onBeforeSelection(arguments[0], arguments[1], arguments[2]); + if(fnD){ + fnD.call( + null, arguments[0], arguments[1], arguments[2]); + } + }; + var fnC = ezEditConfig.on_after_selected_cell; + ezEditConfig.on_after_selected_cell = function(){ + onAfterSelection(arguments[0], arguments[1], arguments[2]); + if(fnC){ + fnC.call( + null, arguments[0], arguments[1], arguments[2]); + } + }; + } + } + if(o.editable){ + //Added or removed rows, TF rows number needs to be re-calculated + var fnE = ezEditConfig.on_added_dom_row; + ezEditConfig.on_added_dom_row = function(){ + o.nbFilterableRows++; + if(!o.paging){ o.RefreshNbRows(); } + else { + o.nbRows++; + o.nbVisibleRows++; + o.nbFilterableRows++; + o.paging=false; + o.RemovePaging(); + o.AddPaging(false); + } + if(o.alternateBgs){ + o.SetAlternateRows(); + } + if(fnE){ + fnE.call(null, arguments[0], arguments[1], arguments[2]); + } + }; + if(ezEditConfig.actions && ezEditConfig.actions['delete']){ + var fnF = ezEditConfig.actions['delete'].on_after_submit; + ezEditConfig.actions['delete'].on_after_submit = function(){ + o.nbFilterableRows--; + if(!o.paging){ o.RefreshNbRows(); } + else { + o.nbRows--; + o.nbVisibleRows--; + o.nbFilterableRows--; + o.paging=false; + o.RemovePaging(); + o.AddPaging(false); + } + if(o.alternateBgs){ + o.SetAlternateRows(); + } + if(fnF){ + fnF.call(null, arguments[0], arguments[1]); + } + }; + } + } + + try{ + o.ezEditTable = new EditTable(o.id, ezEditConfig, startRow); + o.ezEditTable.Init(); + } catch(e) { console.log(ezEditConfig.err); } + }, + + /*==================================================== + - Generates paging elements: + - pages drop-down list + - previous, next, first, last buttons + =====================================================*/ + SetPaging: function(){ + if(!this.hasGrid && !this.isFirstLoad || !this.paging || + (!this.isPagingRemoved && !this.isFirstLoad)){ + return; + } + + var f = this.fObj; + //id of container element + this.pagingTgtId = f.paging_target_id || null; + //defines table paging length + this.pagingLength = !isNaN(f.paging_length) ? f.paging_length : 10; + //id of container element + this.resultsPerPageTgtId = f.results_per_page_target_id || null; + //css class for paging select element + this.pgSlcCssClass = f.paging_slc_css_class || 'pgSlc'; + //css class for paging input element + this.pgInpCssClass = f.paging_inp_css_class || 'pgNbInp'; + //defines css class for results per page select + this.resultsSlcCssClass = f.results_slc_css_class || 'rspg'; + //css class for label preceding results per page select + this.resultsSpanCssClass = f.results_span_css_class || 'rspgSpan'; + //nb visible rows + this.nbVisibleRows = 0; + //nb hidden rows + this.nbHiddenRows = 0; + //1st row index of current page + this.startPagingRow = 0; + //total nb of pages + this.nbPages = 0; + //defines next page button text + this.btnNextPageText = f.btn_next_page_text || '>'; + //defines previous page button text + this.btnPrevPageText = f.btn_prev_page_text || '<'; + //defines last page button text + this.btnLastPageText = f.btn_last_page_text || '>|'; + //defines first page button text + this.btnFirstPageText = f.btn_first_page_text || '|<'; + //defines next page button html + this.btnNextPageHtml = f.btn_next_page_html || + (!this.enableIcons ? null : + ''); + //defines previous page button html + this.btnPrevPageHtml = f.btn_prev_page_html || + (!this.enableIcons ? null : + ''); + //defines last page button html + this.btnFirstPageHtml = f.btn_first_page_html || + (!this.enableIcons ? null : + ''); + //defines previous page button html + this.btnLastPageHtml = f.btn_last_page_html || + (!this.enableIcons ? null : + ''); + //defines text preceeding page selector drop-down + this.pageText = f.page_text || ' Page '; + //defines text after page selector drop-down + this.ofText = f.of_text || ' of '; + //css class for span containing tot nb of pages + this.nbPgSpanCssClass = f.nb_pages_css_class || 'nbpg'; + //enables/disables paging buttons + this.hasPagingBtns = f.paging_btns===false ? false : true; + //stores paging buttons events + this.pagingBtnEvents = null; + //defines previous page button html + this.pageSelectorType = f.page_selector_type || this.fltTypeSlc; + //calls function before page is changed + this.onBeforeChangePage = TF.Types.isFn(f.on_before_change_page) ? + f.on_before_change_page : null; + //calls function before page is changed + this.onAfterChangePage = TF.Types.isFn(f.on_after_change_page) ? + f.on_after_change_page : null; + var start_row = this.refRow; + var nrows = this.nbRows; + //calculates page nb + this.nbPages = Math.ceil((nrows-start_row)/this.pagingLength); + + //Paging elements events + if(!this.Evt._Paging.next){ + var o = this; + this.Evt._Paging = {// paging buttons events + slcIndex: function(){ + return (o.pageSelectorType===o.fltTypeSlc) ? + o.pagingSlc.options.selectedIndex : + parseInt(o.pagingSlc.value,10)-1; + }, + nbOpts: function(){ + return (o.pageSelectorType===o.fltTypeSlc) ? + parseInt(o.pagingSlc.options.length,10)-1 : + (o.nbPages-1); + }, + next: function(){ + if(o.Evt._Paging.nextEvt){ + o.Evt._Paging.nextEvt(); + } + var nextIndex = + o.Evt._Paging.slcIndex()0 ? + o.Evt._Paging.slcIndex()-1 : o.Evt._Paging.nbOpts(); + o.ChangePage(prevIndex); + }, + last: function(){ + if(o.Evt._Paging.lastEvt) o.Evt._Paging.lastEvt(); + o.ChangePage(o.Evt._Paging.nbOpts()); + }, + first: function(){ + if(o.Evt._Paging.firstEvt){ + o.Evt._Paging.firstEvt(); + } + o.ChangePage(0); + }, + _detectKey: function(e){ + var evt = e || window.event; + if(evt){ + var key = o.Evt.getKeyCode(e); + if(key===13){ + if(o.sorted){ + o.Filter(); + o.ChangePage(o.Evt._Paging.slcIndex()); + } else{ + o.ChangePage(); + } + this.blur(); + } + } + }, + nextEvt: null, + prevEvt: null, + lastEvt: null, + firstEvt: null + }; + } + + /*==================================================== + - onchange event for paging select + =====================================================*/ + if(!this.Evt._OnSlcPagesChange){ + this.Evt._OnSlcPagesChange = function(){ + if(o.Evt._Paging._OnSlcPagesChangeEvt){ + o.Evt._Paging._OnSlcPagesChangeEvt(); + } + o.ChangePage(); + this.blur(); + //ie only: blur is not enough... + if(this.parentNode && tf_isIE){ + this.parentNode.focus(); + } + }; + } + + var slcPages; + + // Paging drop-down list selector + if(this.pageSelectorType === this.fltTypeSlc){ + slcPages = TF.Dom.create( + this.fltTypeSlc, ['id',this.prfxSlcPages+this.id]); + slcPages.className = this.pgSlcCssClass; + slcPages.onchange = this.Evt._OnSlcPagesChange; + } + + // Paging input selector + if(this.pageSelectorType === this.fltTypeInp){ + slcPages = TF.Dom.create( + this.fltTypeInp, + ['id',this.prfxSlcPages+this.id], + ['value',this.currentPageNb] + ); + slcPages.className = this.pgInpCssClass; + slcPages.onkeypress = this.Evt._Paging._detectKey; + } + + // btns containers + var btnNextSpan = TF.Dom.create( + 'span',['id',this.prfxBtnNextSpan+this.id]); + var btnPrevSpan = TF.Dom.create( + 'span',['id',this.prfxBtnPrevSpan+this.id]); + var btnLastSpan = TF.Dom.create( + 'span',['id',this.prfxBtnLastSpan+this.id]); + var btnFirstSpan = TF.Dom.create( + 'span',['id',this.prfxBtnFirstSpan+this.id]); + + if(this.hasPagingBtns){ + // Next button + if(!this.btnNextPageHtml){ + var btn_next = TF.Dom.create( + this.fltTypeInp,['id',this.prfxBtnNext+this.id], + ['type','button'], + ['value',this.btnNextPageText], + ['title','Next'] + ); + btn_next.className = this.btnPageCssClass; + btn_next.onclick = this.Evt._Paging.next; + btnNextSpan.appendChild(btn_next); + } else { + btnNextSpan.innerHTML = this.btnNextPageHtml; + btnNextSpan.onclick = this.Evt._Paging.next; + } + // Previous button + if(!this.btnPrevPageHtml){ + var btn_prev = TF.Dom.create( + this.fltTypeInp, + ['id',this.prfxBtnPrev+this.id], + ['type','button'], + ['value',this.btnPrevPageText], + ['title','Previous'] + ); + btn_prev.className = this.btnPageCssClass; + btn_prev.onclick = this.Evt._Paging.prev; + btnPrevSpan.appendChild(btn_prev); + } else { + btnPrevSpan.innerHTML = this.btnPrevPageHtml; + btnPrevSpan.onclick = this.Evt._Paging.prev; + } + // Last button + if(!this.btnLastPageHtml){ + var btn_last = TF.Dom.create( + this.fltTypeInp, + ['id',this.prfxBtnLast+this.id], + ['type','button'], + ['value',this.btnLastPageText], + ['title','Last'] + ); + btn_last.className = this.btnPageCssClass; + btn_last.onclick = this.Evt._Paging.last; + btnLastSpan.appendChild(btn_last); + } else { + btnLastSpan.innerHTML = this.btnLastPageHtml; + btnLastSpan.onclick = this.Evt._Paging.last; + } + // First button + if(!this.btnFirstPageHtml){ + var btn_first = TF.Dom.create( + this.fltTypeInp, + ['id',this.prfxBtnFirst+this.id], + ['type','button'], + ['value',this.btnFirstPageText], + ['title','First'] + ); + btn_first.className = this.btnPageCssClass; + btn_first.onclick = this.Evt._Paging.first; + btnFirstSpan.appendChild(btn_first); + } else { + btnFirstSpan.innerHTML = this.btnFirstPageHtml; + btnFirstSpan.onclick = this.Evt._Paging.first; + } + } + + // paging elements (buttons+drop-down list) are added to defined element + if(!this.pagingTgtId){ + this.SetTopDiv(); + } + var targetEl = !this.pagingTgtId ? this.mDiv : tf_Id(this.pagingTgtId); + + /*** + if paging previously removed this prevents IE memory leak with + removeChild used in RemovePaging method. For more info refer to + http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2840253&SiteID=1 + ***/ + if (targetEl.innerHTML!==''){ + targetEl.innerHTML = ''; + } + /*** ***/ + + targetEl.appendChild(btnFirstSpan); + targetEl.appendChild(btnPrevSpan); + + var pgBeforeSpan = TF.Dom.create( + 'span',['id',this.prfxPgBeforeSpan+this.id] ); + pgBeforeSpan.appendChild( TF.Dom.text(this.pageText) ); + pgBeforeSpan.className = this.nbPgSpanCssClass; + targetEl.appendChild(pgBeforeSpan); + targetEl.appendChild(slcPages); + var pgAfterSpan = TF.Dom.create( + 'span',['id',this.prfxPgAfterSpan+this.id]); + pgAfterSpan.appendChild( TF.Dom.text(this.ofText) ); + pgAfterSpan.className = this.nbPgSpanCssClass; + targetEl.appendChild(pgAfterSpan); + var pgspan = TF.Dom.create( 'span',['id',this.prfxPgSpan+this.id] ); + pgspan.className = this.nbPgSpanCssClass; + pgspan.appendChild( TF.Dom.text(' '+this.nbPages+' ') ); + targetEl.appendChild(pgspan); + targetEl.appendChild(btnNextSpan); + targetEl.appendChild(btnLastSpan); + this.pagingSlc = tf_Id(this.prfxSlcPages+this.id); + + // if this.rememberGridValues==true this.SetPagingInfo() is called + // in ResetGridValues() method + if(!this.rememberGridValues || this.isPagingRemoved){ + this.SetPagingInfo(); + } + if(!this.fltGrid){ + this.ValidateAllRows(); + this.SetPagingInfo(this.validRowsIndex); + } + + this.pagingBtnEvents = this.Evt._Paging; + this.isPagingRemoved = false; + }, + + /*==================================================== + - Removes paging elements + =====================================================*/ + RemovePaging: function(){ + if(!this.hasGrid || !this.pagingSlc){ + return; + } + + // btns containers + var btnNextSpan, btnPrevSpan, btnLastSpan, btnFirstSpan; + var pgBeforeSpan, pgAfterSpan, pgspan; + btnNextSpan = tf_Id(this.prfxBtnNextSpan+this.id); + btnPrevSpan = tf_Id(this.prfxBtnPrevSpan+this.id); + btnLastSpan = tf_Id(this.prfxBtnLastSpan+this.id); + btnFirstSpan = tf_Id(this.prfxBtnFirstSpan+this.id); + //span containing 'Page' text + pgBeforeSpan = tf_Id(this.prfxPgBeforeSpan+this.id); + //span containing 'of' text + pgAfterSpan = tf_Id(this.prfxPgAfterSpan+this.id); + //span containing nb of pages + pgspan = tf_Id(this.prfxPgSpan+this.id); + + this.pagingSlc.parentNode.removeChild(this.pagingSlc); + + if(btnNextSpan){ + btnNextSpan.parentNode.removeChild( btnNextSpan ); + } + + if(btnPrevSpan){ + btnPrevSpan.parentNode.removeChild( btnPrevSpan ); + } + + if(btnLastSpan){ + btnLastSpan.parentNode.removeChild( btnLastSpan ); + } + + if(btnFirstSpan){ + btnFirstSpan.parentNode.removeChild( btnFirstSpan ); + } + + if(pgBeforeSpan){ + pgBeforeSpan.parentNode.removeChild( pgBeforeSpan ); + } + + if(pgAfterSpan){ + pgAfterSpan.parentNode.removeChild( pgAfterSpan ); + } + + if(pgspan){ + pgspan.parentNode.removeChild( pgspan ); + } + + this.pagingBtnEvents = null; + this.pagingSlc = null; + this.isPagingRemoved = true; + }, + + /*==================================================== + - calculates page # according to valid rows + - refreshes paging select according to page # + - Calls GroupByPage method + =====================================================*/ + SetPagingInfo: function(validRows){ + var rows = this.tbl.rows; + var mdiv = !this.pagingTgtId ? this.mDiv : tf_Id(this.pagingTgtId); + var pgspan = tf_Id(this.prfxPgSpan+this.id); + //stores valid rows indexes + if(validRows && validRows.length>0){ + this.validRowsIndex = validRows; + } else { + //re-sets valid rows indexes array + this.validRowsIndex = []; + + //counts rows to be grouped + for(var j=this.refRow; j0){ + mdiv.style.visibility = 'visible'; + if(this.pageSelectorType===this.fltTypeSlc){ + for(var z=0; z