Chth.isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
Chth.filteredTable = function() {
	return {
		init: function(conf) {
			if ( ! conf || ! conf.sortedTable ) return;
			this.sTable = conf.sortedTable;
			this.filteredTableButtonId = conf.filteredTableButtonId ? conf.filteredTableButtonId : false;
			this.bodyCoverClass = conf.bodyCoverClass ? conf.bodyCoverClass : null;
			this.filterDivClass = conf.filterDivClass ? conf.filterDivClass : null;
			this.headLineClass  = conf.headLineClass  ? conf.headLineClass  : null;
			if ( this.filteredTableButtonId ) this.makeTableFiltered();
		},	
		makeTableFiltered: function() {
			var filtButton = document.getElementById(this.filteredTableButtonId);
			if ( filtButton ) {
				var _this = this;
				dean_addEvent(filtButton, 'click', function() {
					_this.showFilterDiv();
				});
			}
		},
		showFilterDiv: function() {
			if ( typeof(this.filterDiv) == 'undefined' ) {
				this.createFilterDiv();
			}
			var w = window.innerWidth  ? window.innerWidth  : document.documentElement.clientWidth;
			var h = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight;
			var fw = parseInt(this.filterDiv.style.width);
			var fh = parseInt(this.filterDiv.style.height);
			//var cH = document.body.parentNode.offsetHeight;
			var cH = document.body.parentNode.scrollHeight;
			var cW = document.body.parentNode.scrollWidth;
			var bH = document.body.scrollHeight;
			var top = Chth.isIE6 ? (cH-fh)/2 : (h-fh)/2; 
			var left = Chth.isIE6 ? (cW-fw)/2 : (w-fw)/2;
			this.filterDiv.style.top  = top+'px';
			this.filterDiv.style.left = left+'px';
			this.bodyCover.style.top = 0;
			
			var compatH = cH > h ? cH : h;
			if ( bH > compatH ) { compatH = bH; } 
			this.bodyCover.style.height = compatH+'px';
			this.bodyCover.style.width  = cW+'px';
		},
		createFilterDiv: function() {
			this.bodyCover = document.createElement('div');
			this.bodyCover.className = this.bodyCoverClass ? this.bodyCoverClass : 'bodyCover';
			document.body.appendChild(this.bodyCover);
			
			this.filterDiv = document.createElement('div');
			this.filterDiv.className = this.filterDivClass ? this.filterDivClass : 'filterDiv';
			this.filterDiv.style.width = '400px';
			this.filterDiv.style.height = '200px';
			document.body.appendChild(this.filterDiv);
			
			this.createFilterContent();
		},
		createFilterContent: function() {
			var filterWrapper = document.createElement('div');
			filterWrapper.className = 'filterWrapper';
			var headLine = document.createElement('div');
			headLine.innerHTML = 'Filter';
			headLine.className = this.headLineClass ? this.headLineClass : 'filterHeader';
			filterWrapper.appendChild(headLine);
			
			this.filterContent = document.createElement('div');
			filterWrapper.appendChild(this.filterContent);
			
			var oneRow = this.createFilterRow();
			filterWrapper.appendChild(oneRow);
			var hr = document.createElement('hr');
			//hr.style.width = '400px';
			filterWrapper.appendChild(hr);
			this.createFilterButtons(filterWrapper);
			this.filterDiv.appendChild(filterWrapper);
		},
		createFilterRow: function() {
			var row = document.createElement('div');
			row.style.whiteSpace='nowrap';
			if ( typeof(this.headRowContent) == 'undefined' ) {
				this.getHeadRowContent();
			}
			if ( typeof(this.filterNumberRows) == 'undefined' ) {
				this.filterNumberRows = 1; // for multirow filter
			}
			else { this.filterNumberRows; }
			var select1 = document.createElement('select');
			select1.id = 'filterFields_'+this.sTable.tableId+'_'+this.filterNumberRows;
			for ( var i=0;i<this.headRowContent.length;i++ ) {
				select1.options[select1.length] = new Option(
					this.headRowContent[i],
					this.headRowIndexes[this.headRowContent[i]]);
			}
			row.appendChild(select1);
			
			var select2 = document.createElement('select');
			select2.id = 'filterCondition_'+this.sTable.tableId+'_'+this.filterNumberRows;
			var equ = ['has','equal','start','end'];
			for ( var q=0;q<equ.length;q++ ) {
				select2.options[select2.length] = new Option(equ[q],q);
			}
			select2.style.marginLeft = '0.5em';
			row.appendChild(select2);
			var inp = document.createElement('input');
			inp.id = 'filterValue_'+this.sTable.tableId+'_'+this.filterNumberRows;
			inp.setAttribute('type','text');
			inp.setAttribute('maxlength', '100');
			inp.style.marginLeft = '0.5em';
			inp.style.width = '180px';
			row.appendChild(inp);
			return row;
		},
		getHeadRowContent: function() {
			this.headRowContent = [];
			this.headRowIndexes = {};
			var _this = this;
			var nosortRE = new RegExp('\\bsorttable_nosort\\b');
			forEach(this.sTable.headrow,function(item,ind){
				var cN = item.className;
				if ( ! nosortRE.test(cN) ) {
					item.myImg.innerHTML = '';
					var p = _this.sTable.getInnerText(item);
					_this.headRowContent.push(p);
					_this.headRowIndexes[p] = ind;
					
				}
			});
			//console.dir(this.headRowIndexes);
		},
		createFilterButtons: function(fW) {
			var buttonRow = document.createElement('div');
			fW.appendChild(buttonRow);
			var filter = document.createElement('button');
			filter.innerHTML = 'Filter';
			fW.appendChild(filter);
			var _this = this;
			dean_addEvent(filter,'click',function(){
				_this.filterSortedTable();
			});
			var close = document.createElement('button');
			fW.appendChild(close);
			close.innerHTML = 'Close';
			dean_addEvent(close,'click',function(){
				_this.closeFilter();
			});
			var clear = document.createElement('button');
			fW.appendChild(clear);
			clear.innerHTML = 'Clear';
			dean_addEvent(clear,'click',function(){
				_this.clearFilter();
			});
		},
		filterSortedTable: function() {
			for (var i=1;i<this.filterNumberRows+1;i++) {
				var field = document.getElementById('filterFields_'+this.sTable.tableId+'_'+i);
				var sI = field.selectedIndex;
				var column = field.options[sI].value;
	
				var inp = document.getElementById('filterValue_'+this.sTable.tableId+'_'+i);
				var pattern = inp.value.replace(/^\s+|\s+$/g, '');
				if ( pattern == '' ) {
					this.sTable.findRows('');
					this.closeFilter();
				}
				else {
					var cond  = document.getElementById('filterCondition_'+this.sTable.tableId+'_'+i);
					var condV = cond.options[cond.selectedIndex].value;
					var condV = parseInt(condV);
					switch ( condV ) {
						case 0: var patRE = new RegExp (pattern,'i'); break;
						case 1: var patRE = new RegExp ('\\b'+pattern+'\\b','i'); break;
						case 2: var patRE = new RegExp ('^'+pattern,'i','i'); break;
						case 3: var patRE = new RegExp (pattern+'$','i'); break;
						default: var patRE = new RegExp (pattern,'i'); break; break;
					}
					//console.log(inp.value);
					var rows = this.sTable.table.tBodies[0].rows;
					for (var i=0; i<rows.length; i++) {
						var text = this.sTable.getInnerText(rows[i].cells[column],true);
						var myClass = rows[i].className;
						var iFound = patRE.test(text);
						
						if ( ! iFound ) { // no match
							var s = myClass.replace(this.sTable.oddRE,'').replace(this.sTable.evenRE,'');
							if ( ! this.sTable.noDRE.test(s) ) {
								rows[i].className = s+' '+this.sTable.noDisplay;
							}
						}
						else {
							//if ( this.fresh_search ) {
								rows[i].className = myClass.replace(this.sTable.noDRE,'');
								//noRecordFound++;
							//}
						}
					}
					this.sTable.adjustClassName(this.sTable.table);
					this.closeFilter();
				}
			}
		},
		closeFilter: function(){
			this.filterDiv.style.top = '-9999px';
			this.bodyCover.style.top = '-9999px';
		},
		clearFilter: function(){
			for (var i=1;i<this.filterNumberRows+1;i++) {
				var field = document.getElementById('filterFields_'+this.sTable.tableId+'_'+i);
				field.selectedIndex = 0;
				var cond  = document.getElementById('filterCondition_'+this.sTable.tableId+'_'+i);
				cond.selectedIndex = 0;
				var inp = document.getElementById('filterValue_'+this.sTable.tableId+'_'+i);
				inp.value = '';
			}
		}
	};
};
