searchManager = new Class({
		
	initialize: function( options ) {
		this.options = Object.extend({
			admin:       false,
			txtApply: 'Apply',
			txtClear: 'Clear'
		}, arguments[0] || {});
		this.admin = false;
		this.boxes = $A();
	},
	
	reset:function(){
		var table = $$('.filtertable')[0];
		tbody = table.getElement('tbody');
    tbody.getElements('tr').each(function(tr){
      tr.remove();
    });
	},
			
	addBox: function( oBox ) {
		this.boxes.push( oBox );
	},
	
	addFilterOption: function( filterTable ){
		this.boxes.each( function( oBox ){
			if(oBox.el.id == filterTable){
				oBox.addFilterOption( );
			}
		});
	},
	
	getBoxSQL: function(){
		var ok = true;
		this.boxes.each( function(box){
			if(!box.getSQL()){
				ok = false;
			}
		})
		return ok;
	}
})

//@TODO: check this with mootools - not fully updated!!!
		
searchBox = new Class({
	initialize: function( el, fields, addFirst, apply, label ) {
		this.el = $(el);
		this.options = Object.extend({
			admin:       false,
			txtApply: 'Apply',
			txtClear: 'Clear',
			txtClose: 'Close',
			headings: ['Join', 'Field', 'Condition', 'Value', 'Active', 'Delete'],
			filterJoinDd: 'todo - $oTable->getFilterJoinDd()!',
			filterCondDd: 'todo -  $oTable->getFilterConditionDd();'
		}, arguments[5] || {});
		
		this.fields = fields
		this.counter = 0;
		this.setUp( addFirst, apply, label);
	},
	
	setUp: function( addFirst, apply, label ){
		if(apply){
			var apply = new Element('input', {
   						 'events':{
						 	'click':function(e){
								//test as we need this to observe it?
							}
							},'type': 'button',
							'name':'applyAdvFabrikFilter',
			    'class': 'button fabrikFilter',
			    'value': this.options.txtApply
			});
			apply.injectAfter(this.el);
		}
		var cancel = new Element('input', {
	  		'type': 'button',
		    'class': 'button',
		    'value': this.options.txtClear,
		    'id': 'advancedFilterTable-clearall'
		});
		cancel.injectAfter(this.el);
		
		var close = new Element('input', {
  			'type': 'button',
		    'class': 'button',
		    'value': this.options.txtClose,
		    'id': 'advancedFilterTable-close'
		});
		close.injectAfter(this.el);
		
		this.onClearAllClick =  this.reset.bindAsEventListener(this);
		this.onDeleteClick = this.deleteFilterOption.bindAsEventListener(this);
		this.onClose = this.close.bindAsEventListener(this);
		$("advancedFilterTable-clearall").addEvent( "click", this.onClearAllClick);
		$('advancedFilterTable-close').addEvent('click', this.onClose);
		this.addHeadings();
 		if( addFirst ){
 			this.addFilterOption( );
 		}
 		var heading = new Element('h3', {}).appendText(label);
		heading.injectTop(this.el);
 		var s = new Element('div', {
 		'styles': {
			'cursor': 'move',
			'border': '1px solid #666666',
			'height' : '7px',
			'background-color' : '#666666'
		   },
		   'id': 'advancedFilterTable-handle'
		});
		s.injectTop(this.el.parentNode);
 		new Drag.Move(this.el.parentNode, {handle:$('advancedFilterTable-handle')});
	},
	
	addHeadings: function(){
		var tr = new Element('tr', { 'class': 'title'});
		this.options.headings.each( function (h){
			var th = new Element('th', {}).appendText(h);
	 		tr.appendChild(th);
		});
 		tr.injectTop(this.el.getElementsByTagName('tbody')[0]);
	},
	
	close: function(e){
		this.el.getParent().hide();
	},
	
	toggle: function(e){
		if(this.counter == 0){
			this.addFilterOption();
		}
	},
	
	reset: function(){
		var tBody = $E('tbody', this.el);
		this.counter = 0;
		tBody.empty();
		this.addHeadings();		
		this.addFilterOption( );
	},
	
	deleteFilterOption: function( e ){
		var e = new Event(e);
		var element = e.target;
		$(element.id).removeEvent( "click", this.onDeleteClick);
    	var tr = element.parentNode.parentNode;
    	var table = tr.parentNode;
    	table.removeChild(tr);
    	e.stop();
	},
	
	addFilterOption: function( selJoin, selFilter, selCondition, selValue ){
		var selJoin = selJoin ? selJoin : '';
		var selFilter = selFilter ? selFilter : '';
		var selCondition = selCondition ? selCondition : '';
		var selValue = selValue ? selValue : '';
		if( this.counter == 0){
			var joinDd = 'WHERE';
		}else{
			var joinDd = this.options.filterJoinDd; 
		}
		var conditionsDd = this.options.filterCondDd; 				
		var tr = document.createElement('tr');
		var td = document.createElement('td');
		var td1 = document.createElement('td');
		var td2 = document.createElement('td');
		var td3 = document.createElement('td');
		var td4 = document.createElement('td');
		var td5 = document.createElement('td');
		
		td.innerHTML = joinDd ;
		td2.innerHTML = conditionsDd;
		td1.innerHTML = this.fields;
		td3.innerHTML = '<input type="field" name="value" value="' + selValue + '" />';
		if( selJoin!='' || selFilter!='' || selCondition!='' || selValue!=''){
			var checked = true;
		}else{
			var checked = false;
		}
		td4.innerHTML = '<input type="checkbox" checked="' + checked + '" name="active[]" id="activate_' + this.counter + '""  />';
		td5.innerHTML = "<a href=\"#\" id=\"advancedFilterTable-del-" + this.counter + '" >[-]</a>';
		tr.appendChild(td);
		tr.appendChild(td1);
		tr.appendChild(td2);
		tr.appendChild(td3);
		tr.appendChild(td4);
		tr.appendChild(td5);
		
		var cNodes = $A(this.el.childNodes);
		var tBody = this.el.getElementsByTagName('tbody')[0]			
		tBody.appendChild(tr);
		
		$("advancedFilterTable-del-" + this.counter).addEvent( "click", this.onDeleteClick);
		
		//set default values 
		if( selJoin != '' ){
			var sels = $A(td.getElementsByTagName('SELECT'));
			if(sels.length >= 1){
				for(i=0;i<sels[0].length;i++){
					if(sels[0][i].value == selJoin){
						sels[0].options.selectedIndex = i;
					}
				}
			}
		}
		if( selFilter != '' ){
			var sels = $A(td1.getElementsByTagName('SELECT'));
			if(sels.length >= 1){
				for(i=0;i<sels[0].length;i++){
					if(sels[0][i].value == selFilter){
						sels[0].options.selectedIndex = i;
					}
				}
			}
		}				

		if( selCondition != '' ){
			var sels = $A(td2.getElementsByTagName('SELECT'));
			if(sels.length >= 1){
				for(i=0;i<sels[0].length;i++){
					if(sels[0][i].innerHTML == selCondition){
						sels[0].options.selectedIndex = i;
					}
				}
			}
		}				
			
		this.counter ++;		
	},
	
	getSQL: function(){
		var tBody = $E('tbody', this.el);
		var trs = $$('#advancedFilterTable tr').slice(1);
		var str = '';
		ok = true;
		trs.each( function(tr){
			var chbox = tr.getElement('input[name^=active]');
			if(chbox.checked){
				var tmpstr = '';
				var fType = '';
				var dds = $A(tr.getElementsByTagName('SELECT'));
				dds.each( function(dd){
					if(dd.name == "conditions"){
						fType = dd.options[dd.options.selectedIndex].innerHTML;
					}
					var thisstr = (dd).getValue();
					if( thisstr == ''){
						ok = false;
					}else{
						tmpstr = tmpstr + thisstr + ' ';
					}
				})
				if(ok){
					var field = tr.getElement('input[name=value]');
					if(field.value != ''){
						var fVal = field.value;
						switch (fType) {
					      case 'BEGINS WITH':
					      	fVal = fVal + "%";
					      	break;
					      case 'CONTAINS':
					      	fVal = "%" + fVal + "%";
					      	break;
					      case 'ENDS WITH':
					      	fVal = " %" + fVal;
					     	break;
					      default:
					      	break;
					    }
						str = str + tmpstr + '"' + fVal + '" ';
					}else{
					}
				}
			}
		})
		val = this.el.id.replace('advancedFilterTable', 'advancedFilterContainer');
		$(val).value = str;
		return ok;
	}
});

oSearchManager = new searchManager();

fabrikTable = new Class( {
		
	initialize: function( id ) {
		this.id = id;
		this.options = Object.extend({
			admin:       false,
			formName: 'fabrikTableForm',
			hightLight: '#ccffff',
			emptyMsg: 'No records found',
			primaryKey : '',
			headings: [],
			Itemid: 0,
			formid:0,
			canEdit: true,
			isMambot:false,
			canView: true,
			page:'index.php'
		}, arguments[1] || {});
		 
		this.nav = Object.extend({
			limit: 10,
			total: 10,
			limitstart:0
		}, arguments[2] || {});
		
		this.nav.displayed_pages 	= 10;
		this.nav.total_pages 	= Math.ceil( this.nav.total / this.nav.limit );
 		this.nav.page			= Math.ceil( (this.nav.limitstart+1) / this.nav.limit );
 		this.nav.start_loop 	= (Math.floor((this.nav.page-1)/this.nav.displayed_pages))*this.nav.displayed_pages+1;
 		if (this.nav.start_loop + this.nav.displayed_pages - 1 < this.nav.total_pages) {
 			this.nav.stop_loop = this.nav.start_loop + this.nav.displayed_pages - 1;
 		} else {
 			this.nav.stop_loop = this.nav.total_pages;
 		}
		this.nav.end_page = (this.nav.total_pages-1) * this.nav.limit;
		this.nav.nextPage =  this.nav.page * this.nav.limit;
		this.nav.previousPage = (this.nav.page - 2) * this.nav.limit;
		//domready not called from within mambot
		if( this.options.isMambot){
			window.addEvent('load', function() {
				this._domready();
			}.bind(this));
		}else{
			//already inside domready
				this._domready();
		}
		window.addEvent('load', function() {
			this.watchAdvFilterSubmit();
		}.bind(this));
		
				//clear filter list
		var c = this.form.getElement('.clearFilters');
		if(c){
			c.addEvent('click', function(e){
				this.submitfabrikTable( 'resetFilters');
			}.bind(this))
		}
	},
	
	_domready: function(id){
			this.getForm();
			this.table = $('table_' + id);
			if(this.table){
				this.tbody = this.table.getElementsByTagName('tbody')[0];
			}
			this.watchNav();
			this.watchDelete();
			this.watchEmpty();
			this.watchOrderHeadings();
			this.watchFilterSubmit();
	},
	
	//highlight active row, deselect others 
	setActive: function(activeTr){
		$ES('.fabrik_row', this.table).each(function(tr){
			tr.removeClass('activeRow');
		})
		activeTr.addClass('activeRow')
	},
	
	getForm: function(){
		this.form = $(this.options.formName);
	},
		
	submitfabrikTable: function(task){
		this.getForm();
		var ok = true;
		if(task == 'resetFilters'){
			var filters = this.form.getElements('.fabrik_filter');
			(filters).each(function(f){
				if(f.getTag() == 'select'){
					f.selectedIndex = 0;
				}else{
					f.value = '';
				}
			})
			
			oSearchManager.reset();
		}
		
		if(task == 'filter'){
			ok = oSearchManager.getBoxSQL();
			if(!ok){
				alert('Please fill in all fields in the advanced search form');
			}else{
				if(this.form.limitstart){
					this.form.limitstart.value = 0;
				}
			}
		}else{
			if(task != ''){
				this.form.task.value = task;	
			}
		}
		if(ok){
			this.form.submit();
		}
		return false;
	},
	
	fabrikNav: function(limitStart){
		this.form.limitstart.value = limitStart;			
		this.submitfabrikTable('');
		return false;	
	},
	
	fabrikNavOrder: function(orderby, orderdir){
		this.form.orderby.value = orderby;
		this.form.orderdir.value = orderdir;
		this.submitfabrikTable('');
		return false;
	},
	
	fabrikNavLimit:function(pageLimit){
		this.form.pagelimit.value = pageLimit;
		this.submitfabrikTable('');
		return false;	
	},
	
	stripe: function(){
		var trs = $ES('.fabrik_row',this.table) ;
		for(i=0;i<trs.length;i++){
			if(i != 0){ //ignore heading
			var row = 'oddRow' + (i % 2);
				trs[i].addClass(row);
			}
		}
	},
	
	checkEmpty: function(){
		var trs = $ES('tr',this.table) ;
			if(trs.length == 2){
			this.addRow({'label':this.options.emptyMsg});
		}
	},
	
	watchCheckAll: function(e){
		var checkAll = $('table_' + this.id + '_checkAll');
		if(checkAll){
			
			//change event doenst work in IE 7 - mousedown does but means label doesnt trigger the event
			checkAll.addEvent( 'mousedown', function(e){
			var chkBoxes = $(this.options.formName).getElements('input[name^=ids]');
			var c = checkAll.checked ?  '' : 'checked';
			for(var i=0;i<chkBoxes.length;i++){
				chkBoxes[i].checked=c;
			}
			var event = new Event(e);
			event.stop();
			}.bind(this));
		}
	},
	
	watchDelete: function(e){
		// $$$ hugh - make sure there is a Delete button before trying to bind to it!
		var delete_button = $E('input[name=delete]', this.form);
		if (delete_button) {
			delete_button.addEvent('click', function(e){
				e = new Event(e);
				e.stop();
				this.submitfabrikTable('delete');
			}.bind(this))
		}
	},
	
	watchEmpty: function(e){
		var b = $E('input[name=doempty]', this.form);
		if (b) {
			b.addEvent('click', function(e){
				e = new Event(e).stop();
				if( confirm("Do you really want to delete all records and reset this tables key to 0?")){
					this.submitfabrikTable('empty');
				}
			}.bind(this))
		}
	},
		
	watchFilterSubmit: function(e){
		var b = $E('input[name=filter]', this.form);
		if(b){
			b.addEvent('click', function(e){
				this.submitfabrikTable('filter');
				e = new Event(e);
				e.stop();
			}.bind(this))
		}else{
			//var f = $ES('input.fabrikFilter, select.fabrikFilter button.fabrikFilter', this.form);
			var f = $ES('.fabrikFilter', this.form);
			f.each(function(field){
				field.addEvent('change', function(e){
					this.submitfabrikTable('filter');
					e = new Event(e);
					e.stop();
				}.bind(this))
			}.bind(this))
		}
	},
	
	watchAdvFilterSubmit:function(e){
		var f = $ES('input[name=applyAdvFabrikFilter]', this.form);
		f.each(function(field){
			field.addEvent('click', function(e){
				this.submitfabrikTable('filter');
				e = new Event(e);
				e.stop();
			}.bind(this))
		}.bind(this))
	},
	
	watchOrderHeadings: function(){
		this.options.headings.each(function(col){
			if(col.orderdir != "" && $('farbikOrder_' + col.id)){
				$('farbikOrder_' + col.id).addEvent('click', function(e){
					e = new Event(e);
					this.fabrikNavOrder(col.id, col.orderdir);
					e.stop();
					return false;
				}.bind(this))
			}
		}.bind(this))
	},
	
	watchNav: function(e){
		var limitBox = $('table_' + this.id + '_limit');
		if(limitBox){
			limitBox.addEvent( 'change', function(e){
				this.submitfabrikTable('');
			}.bind(this));
		}
		//limit dd
		
		if($('table_' + this.id + '_nav-limit')){
			$('table_' + this.id + '_nav-limit').addEvent('change', function(e){
				e = new Event(e).stop();
				this.fabrikNavLimit($(e.target).getValue());
			}.bind(this));
		}
		//start nav button
		if($('table_' + this.id + '_nav-start')){
			$('table_' + this.id + '_nav-start').addEvent('click', function(e){
				e = new Event(e).stop();
				this.fabrikNav(0);
				return false;
			}.bind(this));
		}
		
		//previous nav button
		if($('table_' + this.id + '_nav-previous')){
			$('table_' + this.id + '_nav-previous').addEvent('click', function(e){
				e = new Event(e).stop();
				this.fabrikNav(this.nav.previousPage);
				return false;
			}.bind(this));
		}
		
		//individaul page buttons
		for (var i=this.nav.start_loop; i <= this.nav.stop_loop; i++) {
			if($('table_' + this.id + '_nav-' + i)){
				$('table_' + this.id + '_nav-' + i).addEvent('click', function(e){
					e = new Event(e).stop();
					var p = e.target.parentNode;
					var id = p.id.replace('table_' + this.id + '_nav-', '');
					this.fabrikNav((id - 1) * this.nav.limit);
					return false;
				}.bind(this));
			}
		}
		//next page nav button
		if($('table_' + this.id + '_nav-next')){
			$('table_' + this.id + '_nav-next').addEvent('click', function(e){
				e = new Event(e).stop();
				this.fabrikNav(this.nav.nextPage );
				return false;
			}.bind(this));
		}
		
		//end nav button
		if($('table_' + this.id + '_nav-end')){
			$('table_' + this.id + '_nav-end').addEvent('click', function(e){
				e = new Event(e).stop();
				this.fabrikNav(this.nav.end_page);
				return false;
			}.bind(this));
		}
		
		var addRecord = $('table_' + this.id + '_addRecord');
		if($(addRecord)){
			addRecord.addEvent('click', function(e){
				e = new Event(e).stop();
				oPackage.startLoading();
				oPackage.sendMessage( 'table_' + this.id, 'clearForm', 'ok', '' );
				e.stop();
			})
		}
		this.watchCheckAll();
	}
	
});
