diff --git a/src/index.html b/src/index.html index d44fe4a8..31769f78 100644 --- a/src/index.html +++ b/src/index.html @@ -1,7 +1,7 @@ - + HTML Table Filter Generator @@ -68,8 +68,9 @@ diff --git a/src/tablefilter_all.js b/src/tablefilter_all.js index c7de9078..d370a6aa 100644 --- a/src/tablefilter_all.js +++ b/src/tablefilter_all.js @@ -1,8 +1,8 @@ -/*------------------------------------------------------------------------ +/* ------------------------------------------------------------------------ - HTML Table Filter Generator v2.5 - By Max Guglielmi (tablefilter.free.fr) - Licensed under the MIT License --------------------------------------------------------------------------- +--------------------------------------------------------------------------- Copyright (c) 2009-2014 Max Guglielmi Permission is hereby granted, free of charge, to any person obtaining @@ -23,13 +23,13 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------------- +--------------------------------------------------------------------------- - Special credit to: Cedric Wartel, cnx.claude@free.fr, Florent Hirchy, Váry Péter, Anthony Maes, Nuovella Williams, Fuggerbit, Venkata Seshagiri Rao Raya, Piepiax, Manuel Kern, Baladhandayutham for active contribution and/or inspiration -------------------------------------------------------------------------*/ +------------------------------------------------------------------------ */ /** * TF object constructor @@ -2259,25 +2259,30 @@ TF.prototype = { var o = this; this.Evt._Paging = {// paging buttons events slcIndex: function(){ - return (o.pageSelectorType==o.fltTypeSlc) ? + 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)-1 - : (o.nbPages-1); + 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(); + if(o.Evt._Paging.prevEvt){ + o.Evt._Paging.prevEvt(); + } + var prevIndex = o.Evt._Paging.slcIndex()>0 ? + o.Evt._Paging.slcIndex()-1 : o.Evt._Paging.nbOpts(); o.ChangePage(prevIndex); }, last: function(){ @@ -2285,22 +2290,25 @@ TF.prototype = { o.ChangePage(o.Evt._Paging.nbOpts()); }, first: function(){ - if(o.Evt._Paging.firstEvt) o.Evt._Paging.firstEvt(); + if(o.Evt._Paging.firstEvt){ + o.Evt._Paging.firstEvt(); + } o.ChangePage(0); }, - _detectKey: function(e) - { - var evt=(e)?e:(window.event)?window.event:null; - if(evt) - { - var key=(evt.charCode)?evt.charCode: - ((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0)); - if(key=='13'){ - if(o.sorted){ o.Filter(); o.ChangePage(o.Evt._Paging.slcIndex()); } - else o.ChangePage(); + _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(); } - }//if evt + } }, nextEvt: null, prevEvt: null, @@ -2309,34 +2317,36 @@ TF.prototype = { }; } - if(!this.Evt._OnSlcPagesChange) - { - this.Evt._OnSlcPagesChange = function() - /*==================================================== - - onchange event for paging select - =====================================================*/ - { - if(o.Evt._Paging._OnSlcPagesChangeEvt) + /*==================================================== + - 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) + if(this.parentNode && tf_isIE){ this.parentNode.focus(); - } + } + }; } + var slcPages; + // Paging drop-down list selector - if(this.pageSelectorType == this.fltTypeSlc) - { - var slcPages = tf_CreateElm( this.fltTypeSlc, ['id',this.prfxSlcPages+this.id] ); + if(this.pageSelectorType === this.fltTypeSlc){ + slcPages = tf_CreateElm( + this.fltTypeSlc, ['id',this.prfxSlcPages+this.id]); slcPages.className = this.pgSlcCssClass; slcPages.onchange = this.Evt._OnSlcPagesChange; } + // Paging input selector - if(this.pageSelectorType == this.fltTypeInp) - { - var slcPages = tf_CreateElm( + if(this.pageSelectorType === this.fltTypeInp){ + slcPages = tf_CreateElm( this.fltTypeInp, ['id',this.prfxSlcPages+this.id], ['value',this.currentPageNb] @@ -2345,18 +2355,25 @@ TF.prototype = { slcPages.onkeypress = this.Evt._Paging._detectKey; } - var btnNextSpan, btnPrevSpan, btnLastSpan, btnFirstSpan;// btns containers - btnNextSpan = tf_CreateElm('span',['id',this.prfxBtnNextSpan+this.id]); - btnPrevSpan = tf_CreateElm('span',['id',this.prfxBtnPrevSpan+this.id]); - btnLastSpan = tf_CreateElm('span',['id',this.prfxBtnLastSpan+this.id]); - btnFirstSpan = tf_CreateElm('span',['id',this.prfxBtnFirstSpan+this.id]); + // btns containers + var btnNextSpan = tf_CreateElm( + 'span',['id',this.prfxBtnNextSpan+this.id]); + var btnPrevSpan = tf_CreateElm( + 'span',['id',this.prfxBtnPrevSpan+this.id]); + var btnLastSpan = tf_CreateElm( + 'span',['id',this.prfxBtnLastSpan+this.id]); + var btnFirstSpan = tf_CreateElm( + 'span',['id',this.prfxBtnFirstSpan+this.id]); - if(this.hasPagingBtns) - { - if(this.btnNextPageHtml==null) - {// Next button - var btn_next = tf_CreateElm( this.fltTypeInp,['id',this.prfxBtnNext+this.id], - ['type','button'],['value',this.btnNextPageText],['title','Next'] ); + if(this.hasPagingBtns){ + // Next button + if(!this.btnNextPageHtml){ + var btn_next = tf_CreateElm( + 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); @@ -2364,11 +2381,15 @@ TF.prototype = { btnNextSpan.innerHTML = this.btnNextPageHtml; btnNextSpan.onclick = this.Evt._Paging.next; } - - if(this.btnPrevPageHtml==null) - {// Previous button - var btn_prev = tf_CreateElm( this.fltTypeInp,['id',this.prfxBtnPrev+this.id], - ['type','button'],['value',this.btnPrevPageText],['title','Previous'] ); + // Previous button + if(!this.btnPrevPageHtml){ + var btn_prev = tf_CreateElm( + 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); @@ -2376,11 +2397,15 @@ TF.prototype = { btnPrevSpan.innerHTML = this.btnPrevPageHtml; btnPrevSpan.onclick = this.Evt._Paging.prev; } - - if(this.btnLastPageHtml==null) - {// Last button - var btn_last = tf_CreateElm( this.fltTypeInp,['id',this.prfxBtnLast+this.id], - ['type','button'],['value',this.btnLastPageText],['title','Last'] ); + // Last button + if(!this.btnLastPageHtml){ + var btn_last = tf_CreateElm( + 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); @@ -2388,11 +2413,15 @@ TF.prototype = { btnLastSpan.innerHTML = this.btnLastPageHtml; btnLastSpan.onclick = this.Evt._Paging.last; } - - if(this.btnFirstPageHtml==null) - {// First button - var btn_first = tf_CreateElm( this.fltTypeInp,['id',this.prfxBtnFirst+this.id], - ['type','button'],['value',this.btnFirstPageText],['title','First'] ); + // First button + if(!this.btnFirstPageHtml){ + var btn_first = tf_CreateElm( + 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); @@ -2400,27 +2429,35 @@ TF.prototype = { btnFirstSpan.innerHTML = this.btnFirstPageHtml; btnFirstSpan.onclick = this.Evt._Paging.first; } - }//if this.hasPagingBtns + } // paging elements (buttons+drop-down list) are added to defined element - if(this.pagingTgtId==null) this.SetTopDiv(); - var targetEl = ( this.pagingTgtId==null ) ? this.mDiv : tf_Id( this.pagingTgtId ); + 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 = ''; + /*** + 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_CreateElm( 'span',['id',this.prfxPgBeforeSpan+this.id] ); + var pgBeforeSpan = tf_CreateElm( + 'span',['id',this.prfxPgBeforeSpan+this.id] ); pgBeforeSpan.appendChild( tf_CreateText(this.pageText) ); pgBeforeSpan.className = this.nbPgSpanCssClass; targetEl.appendChild(pgBeforeSpan); targetEl.appendChild(slcPages); - var pgAfterSpan = tf_CreateElm( 'span',['id',this.prfxPgAfterSpan+this.id] ); + var pgAfterSpan = tf_CreateElm( + 'span',['id',this.prfxPgAfterSpan+this.id]); pgAfterSpan.appendChild( tf_CreateText(this.ofText) ); pgAfterSpan.className = this.nbPgSpanCssClass; targetEl.appendChild(pgAfterSpan) @@ -2430,14 +2467,14 @@ TF.prototype = { targetEl.appendChild(pgspan); targetEl.appendChild(btnNextSpan); targetEl.appendChild(btnLastSpan); - this.pagingSlc = tf_Id(this.prfxSlcPages+this.id); //to be easily re-used + this.pagingSlc = tf_Id(this.prfxSlcPages+this.id); // if this.rememberGridValues==true this.SetPagingInfo() is called // in ResetGridValues() method - if( !this.rememberGridValues || this.isPagingRemoved ) + if(!this.rememberGridValues || this.isPagingRemoved){ this.SetPagingInfo(); - if( !this.fltGrid ) - { + } + if(!this.fltGrid){ this.ValidateAllRows(); this.SetPagingInfo(this.validRowsIndex); } @@ -2446,196 +2483,239 @@ TF.prototype = { this.isPagingRemoved = false; }, - RemovePaging: function() /*==================================================== - Removes paging elements =====================================================*/ - { - if(!this.hasGrid) return; - if( this.pagingSlc==null ) return; - var btnNextSpan, btnPrevSpan, btnLastSpan, btnFirstSpan;// btns containers + 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); - pgBeforeSpan = tf_Id(this.prfxPgBeforeSpan+this.id);//span containing 'Page' text - pgAfterSpan = tf_Id(this.prfxPgAfterSpan+this.id);//span containing 'of' text - pgspan = tf_Id(this.prfxPgSpan+this.id);//span containing nb of pages + //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!=null ) + if(btnNextSpan){ btnNextSpan.parentNode.removeChild( btnNextSpan ); + } - if( btnPrevSpan!=null ) + if(btnPrevSpan){ btnPrevSpan.parentNode.removeChild( btnPrevSpan ); + } - if( btnLastSpan!=null ) + if(btnLastSpan){ btnLastSpan.parentNode.removeChild( btnLastSpan ); + } - if( btnFirstSpan!=null ) + if(btnFirstSpan){ btnFirstSpan.parentNode.removeChild( btnFirstSpan ); + } - if( pgBeforeSpan!=null ) + if(pgBeforeSpan){ pgBeforeSpan.parentNode.removeChild( pgBeforeSpan ); + } - if( pgAfterSpan!=null ) + if(pgAfterSpan){ pgAfterSpan.parentNode.removeChild( pgAfterSpan ); + } - if( pgspan!=null ) + if(pgspan){ pgspan.parentNode.removeChild( pgspan ); + } this.pagingBtnEvents = null; this.pagingSlc = null; this.isPagingRemoved = true; }, - SetPagingInfo: function( validRows ) /*==================================================== - calculates page # according to valid rows - refreshes paging select according to page # - Calls GroupByPage method =====================================================*/ - { - var row = this.tbl.rows; - var mdiv = ( this.pagingTgtId==null ) ? this.mDiv : tf_Id( this.pagingTgtId ); + 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 = []; - if( validRows!=undefined ) this.validRowsIndex = validRows;//stores valid rows index - else - { - this.validRowsIndex = [];//re-sets valid rows index - - for(var j=this.refRow; j0 ) - { + if(this.nbPages>0){ mdiv.style.visibility = 'visible'; - if(this.pageSelectorType==this.fltTypeSlc) - for(var z=0; z