/**
 * @author Robert
 */
 
var fbTablePlugin = new Class({
 	setOptions: function(tableform, options) {
		window.addEvent('domready', function(){
			this.tableform = $(tableform);
		}.bind(this));
		this.options = {};
		Object.extend(this.options, options || {});
	}
});

var TableFilter = new Class({
 	
 	initialize:function(){
 		this.filters = $H({});
		this.options = Object.extend({
      'container': '',
			'type':'table',
			'id':''
    }, arguments[0] ||
    {});
		
		this.container = $(this.options.container);
		if($type(this.container) === false){
			return;
		}
		var c = this.container.getElement('.clearFilters');
		if($type(c) !== false){
			c.removeEvents();
			c.addEvent('click', function(e){
				new Event(e).stop();
				
				this.container.getElements('.fabrik_filter').each(function(f){
					if(f.getTag() == 'select'){
						f.selectedIndex = 0;
					}else{
						f.value = '';
					}
				});
				new Element('input', {'name':'resetfilters', 'value':1, 'type':'hidden', 'type':'hidden'}).injectInside(this.container);
				if (this.options.type == 'table') {
					oPackage.submitfabrikTable(this.options.id, 'filter');
				}else{
					this.container.getElement('form[name=filter]').submit();
				}
			}.bind(this));
		}
 	},
 	
 	addFilter:function(plugin, f){
 		if(this.filters.hasKey(plugin) === false){
 			this.filters.set(plugin, []);
 		}
 		this.filters.get(plugin).push(f);
 	},
 	
 	update: function(){
 		this.filters.each(function(fs, plugin){
 			fs.each(function(f){
 				f.update();
 			}.bind(this));
 		}.bind(this));
 	}
});

TableFilter.implement(new Events);
TableFilter.implement(new Options);
 
var fabrikTable = new Class({

  initialize: function(id){
    this.id = id;
    this.listenTo = $A([]);
    this.options = Object.extend({
      'admin': false,
			'filterMethod':'onchange',
      'postMethod': 'post',
      'form': 'tableform_' + this.id,
      'hightLight': '#ccffff',
      'emptyMsg': 'No records found',
      'primaryKey': '',
      'headings': [],
      'labels':{},
      'Itemid': 0,
      'formid': 0,
      'canEdit': true,
      'canView': true,
      'page': 'index.php',
      'formels':[], //elements that only appear in the form
      'data': [], //[{col:val, col:val},...] (depreciated)
      'rowtemplate':''
    }, arguments[1] ||
    {});

   this.translate = Object.extend({
	 	'select_rows':'Select some rows for deletion',
		'confirm_drop':"Do you really want to delete all records and reset this tables key to 0?",
		'yes':'Yes',
		'no':'No',
		'select_colums_to_export':'Select the columns to export',
		'include_filters':'Include filters:',
		'include_data':'Inclde data:',
		'inlcude_raw_data':'Include raw data:',
		'include_calculations':'Include calculations:',
		'export':'Export',
		'start':'Start',
		'prev':'Prev',
		'next':'Next',
		'end':'End',
		'page':'Page',
		'of':'of',
		'loading':'loading',
		'records':'records',
		'savingto':'Saving to'
		}, arguments[2] || {});
		
		window.addEvent('domready', function(){
			this.getForm();
	    this.table = $('table_' + id);
	    if (this.table) {
	      this.tbody = this.table.getElement('tbody');
				// $$$ rob mootools 1.2 has bug where we cant setHTML on table
				//means that there is an issue if table contains no data
				if (window.ie) {
					this.options.rowtemplate = this.table.getElement('.fabrik_row');
				}
	    }
			this.watchAll();
			
		}.bind(this));
  },
	
	watchAll: function()
	{
		this.watchNav();
		this.watchRows();
		this.watchFilters();
		this.watchOrder();
		this.watchEmpty();
		this.watchButtons();
	},
	
	watchButtons: function()
	{
		this.exportWindowOpts = {
			id: 'exportcsv',
			title: 'Export CSV',
			loadMethod:'html',
			minimizable:false,
			width: 320,
			height: 120,
			content:''		
		};
	
		if(this.form.getElements('.csvExportButton')){
			this.form.getElements('.csvExportButton').each(function(b){
				if(b.hasClass('custom') === false){
					b.addEvent('click', function(e){
						e = new Event(e).stop();
						var thisc = this.makeCSVExportForm();
						this.form.getElements('.fabrik_filter').each(function(f){
							var fc = new Element('input', {'type':'hidden','name':f.name,'id':f.id,'value':f.getValue()});
							fc.injectInside(thisc);
						}.bind(this));
						this.exportWindowOpts.content = thisc;
						
						this.exportWindowOpts.onContentLoaded = function(){
							(function(){oPackage.resizeMocha('exportcsv')}).delay(700);
						}
						if(this.options.mooversion > 1.1){
							var win = new MochaUI.Window(this.exportWindowOpts);
						}else{
							document.mochaDesktop.newWindow(this.exportWindowOpts);
						}
					}.bind(this));
				}
			}.bind(this));
		}
	},
	
	makeCSVExportForm:function(){
		//cant build via dom as ie7 doesn't accept checked status 
		var rad = "<input type='radio' value='1' name='incfilters' checked='checked' />" + this.translate.yes;
		var rad2 = "<input type='radio' value='1' name='incraw' checked='checked' />" + this.translate.yes;
		var rad3 = "<input type='radio' value='1' name='inccalcs' checked='checked' />" + this.translate.yes;
		var rad4 = "<input type='radio' value='1' name='inctabledata' checked='checked' />" + this.translate.yes;
	
		var url = 'index.php?option=com_fabrik&view=table&tableid='+this.id+'&format=csv';

		var divopts = {'styles':{'width':'200px','float':'left'}};
		var c = new Element('form', {'action':url, 'method':'post'}).adopt([
			
		new Element('div', divopts).appendText(this.translate.include_filters),
		new Element('label').setHTML(rad),
		new Element('label').adopt([
			new Element('input', {'type':'radio','name':'incfilters','value':'0'}), 
			new Element('span').appendText(this.translate.no)
		]),
		new Element('br'),
		new Element('div', divopts).appendText(this.translate.include_data),
		new Element('label').setHTML(rad4),
		new Element('label').adopt([
			new Element('input', {'type':'radio','name':'inctabledata','value':'0'}), 
			new Element('span').appendText(this.translate.no)
		]),
		new Element('br'),
		new Element('div', divopts).appendText(this.translate.inlcude_raw_data),
		new Element('label').setHTML(rad2),
		new Element('label').adopt([
			new Element('input', {'type':'radio','name':'incraw','value':'0'}), 
			new Element('span').appendText(this.translate.no)
		]),
		new Element('br'),
		new Element('div', divopts).appendText(this.translate.include_calculations),
		new Element('label').setHTML(rad3),
		new Element('label').adopt([
			new Element('input', {'type':'radio','name':'inccalcs','value':'0'}), 
			new Element('span').appendText(this.translate.no)
		])
		]);
		new Element('h4').appendText(this.translate.select_colums_to_export).injectInside(c);
		var g = '';
		var i = 0;
		$H(this.options.labels).each(function(label, k){
			if (k.substr(0, 7) != 'fabrik_') {
	  		var newg = k.split('___')[0];
				if(newg !== g){
					g = newg;
					new Element('h5').setText(g).injectInside(c);
				}
				var rad = "<input type='radio' value='1' name='fields["+i+"]' checked='checked' />" + this.translate.yes;
			  label =  label.replace(/<\/?[^>]+(>|$)/g, "");
				var r = new Element('div', divopts).appendText(label);
				r.injectInside(c);
				new Element('label').setHTML(rad).injectInside(c);
				new Element('label').adopt([
				new Element('input', {'type':'radio','name':'fields['+i+']','value':'0'}), 
				new Element('span').appendText(this.translate.no)
				]).injectInside(c);
				new Element('br').injectInside(c);
	  	}
			i++;
		}.bind(this)); 
		
		//elements not shown in table
		if(this.options.formels.length > 0){ 
			new Element('h5').setText('Form fields').injectInside(c);
			this.options.formels.each(function(el){
				var rad = "<input type='radio' value='1' name='fields["+el.name+"]' checked='checked' />" + this.translate.yes;
				var r = new Element('div', divopts).appendText(el.label);
				r.injectInside(c);
				new Element('label').setHTML(rad).injectInside(c);
					new Element('label').adopt([
					new Element('input', {'type':'radio','name':'fields['+el.name+']','value':'0'}), 
					new Element('span').appendText(this.translate.no)
					]).injectInside(c);
					new Element('br').injectInside(c);	
			}.bind(this));
		}
		
		new Element('div', {'styles':{'text-align':'right'}}).adopt(
			new Element('input', {'type':'button','name':'submit','value':this.translate['export'], 'class':'button', events:{
				'click':function(e){
					e = new Event(e);
					e.stop();
					e.target.disabled = true;
					new Element('div', {'id': 'csvmsg'}).setHTML(this.translate['loading']+' <br /><span id="csvcount">0</span> / <span id="csvtotal"></span> '+this.translate['records'] + '.<br/> '+this.translate['savingto']+' <span id="csvfile"></span>').injectBefore(e.target);
					var url = 'index.php?option=com_fabrik&c=table&view=table&format=csv&tableid='+this.id+'&task=viewTable';
					this.triggerCSVImport(0, url);
				}.bind(this)
				
			}})
		).injectInside(c);
		new Element('input', {'type':'hidden','name':'view','value':'table'}).injectInside(c);
		new Element('input', {'type':'hidden','name':'option','value':'com_fabrik'}).injectInside(c);
		new Element('input', {'type':'hidden','name':'tableid','value':this.id}).injectInside(c);
		new Element('input', {'type':'hidden','name':'format','value':'csv'}).injectInside(c);
		new Element('input', {'type':'hidden','name':'c','value':'table'}).injectInside(c);
		return c;
	},
	
	triggerCSVImport:function(start, url){
		var opts = {};
		if ($type($('exportcsv')) !== false) {
		$A(['incfilters', 'inctabledata', 'incraw', 'inccalcs']).each(function(v){
			var inputs = $('exportcsv').getElements('input[name=' + v + ']');
			if (inputs.length > 0) {
				opts[v] = inputs.filter(function(i){
					return i.checked;
				})[0].value;
			}
		});
		}
		var thisurl = url +'&start='+start;
		var myAjax = new Ajax(thisurl, {
            method: 'post',
						data:opts,
            onComplete: function(res){
							res = Json.evaluate(res);
							if ($type($('csvcount')) !== false) $('csvcount').setText(res.count);
							if ($type($('csvtotal')) !== false) $('csvtotal').setText(res.total);
							if ($type($('csvfile')) !== false) $('csvfile').setText(res.file);
              if (res.count < res.total) {
								this.triggerCSVImport(res.count, url);
							}else{
								window.location=oPackage.options.liveSite+'index.php?option=com_fabrik&view=table&format=csv&tableid='+this.id+'&start='+res.count;
								if ($type($('csvmsg')) !== false) $('csvmsg').setText('CSV file now downloading');
								var mv = this.options.mooversion;
								(function(){
									var id = 'exportcsv';
									if ( mv > 1.1) {
										if(mv == 1.2){
											id = $(id);
										}
										MochaUI.closeWindow(id);
									} else {
										document.mochaDesktop.closeWindow(id);
									}
									}).delay(1500);
							}
            }.bind(this)
          });
		myAjax.request();
	},
	
	addPlugins:function(a){
		this.plugins = a;
	},
	
	watchEmpty: function(e){
		var b = $E('input[name=doempty]', this.options.form);
		if (b) {
			b.addEvent('click', function(e){
				var event = new Event(e).stop();
				if( confirm(this.translate.confirm_drop)){
					oPackage.submitfabrikTable(this.id,'doempty');
				}
			}.bind(this));
		}
	},
	
	watchOrder: function(){
		var hs = $(this.options.form).getElementsBySelector('.fabrikorder, .fabrikorder-asc, .fabrikorder-desc');
		hs.removeEvents('click');
		hs.each(function(h){
			h.addEvent('click', function(event){
				var e = new Event(event);
				
				var orderdir = '';
				var newOrderClass = '';
				// $$$ rob in pageadaycalendar.com h was null so reset to e.target
				var h = $(e.target);
				var td = h.findClassUp('fabrik_ordercell');
				if (h.tagName !== 'a') {
					var h = td.getElement('a');
				}
				switch(h.className){
					case 'fabrikorder-asc':
						newOrderClass = 'fabrikorder-desc';
						orderdir = 'desc';
						break;
					case 'fabrikorder-desc':
						newOrderClass = 'fabrikorder';
						orderdir = "-";
						break;
					case 'fabrikorder':
						newOrderClass = 'fabrikorder-asc';
						orderdir = 'asc';
						break;
				}
				td = td.className.split(' ')[2].replace('_order', '').replace(/^\s+/g,'').replace(/\s+$/g,'');//chrome and safari you need to trim whitespace
				h.className = newOrderClass;
				this.fabrikNavOrder(td, orderdir);
				e.stop();
			}.bind(this));
		}.bind(this));
	
	},
	
	watchFilters: function(){
		var e = '';
		if (this.options.filterMethod != 'submitform') {
			$(this.options.form).getElements('.fabrik_filter').each(function(f){
				e = f.getTag() == 'select' ? 'change' : 'blur';
				f.removeEvent(e);
				f.addEvent(e, function(e){
					new Event(e).stop();
					oPackage.submitfabrikTable(this.id, 'filter');
				}.bind(this));
			}.bind(this));
		}else{
			var f = $(this.options.form).getElement('.fabrik_filter_submit');
			if (f) {
				f.removeEvents();
				f.addEvent('click', function(e){
					oPackage.submitfabrikTable(this.id, 'filter');
				}.bind(this));
			}
		}
		$(this.options.form).getElements('.fabrik_filter').addEvent('keydown', function(e){
			e = new Event(e);
			if (e.code == 13) {
				e.stop();
  			oPackage.submitfabrikTable(this.id, 'filter');
			}
		}.bind(this));
	},
  
  //highlight active row, deselect others 
  setActive: function(activeTr){
    this.table.getElements('.fabrik_row').each(function(tr){
      tr.removeClass('activeRow');
    });
    activeTr.addClass('activeRow');
  },
  
  watchRows: function(){
    if(!this.table){
			return;
		}
    this.rows = this.table.getElements('.fabrik_row');
		this.links = this.table.getElements('.fabrik___rowlink');
    if (this.options.postMethod != 'post') {
      var view = '';
      if (this.options.canEdit == 1) {
        view = 'form';
      }
      else {
        if (this.options.canView == 1) {
          view = 'details';
        }
      }
      //@TODO this isnt working when in CB plugin mode
      var editopts = {
        option: 'com_fabrik',
        'Itemid': this.options.Itemid,
        'view': view,
        'tableid': this.id,
        'fabrik': this.options.formid,
        'rowid': 0,
        'format': 'raw',
        '_senderBlock': 'table_' + this.id
      };
      this.links.each(function(link){
        link.addEvent('click', function(e){
          var tr = link.findUp('tr');
					this.setActive(tr);
          oPackage.startLoading();
          editopts.rowid = tr.id.replace('table_' + this.id + '_row_', '');
          var url = "index.php?" + Object.toQueryString(editopts);
          var myAjax = new Ajax(url, {
            method: 'get',
            onComplete: function(res){
              oPackage.sendMessage('table_' + this.id, 'update', 'ok', res);
            }.bind(this)
          });
          myAjax.request();
          e = new Event(e);
          e.stop();
        }.bind(this));
      }.bind(this));
    }
    
    //view details 
    
    this.links = this.table.getElements('.fabrik___viewrowlink');
    if (this.options.postMethod != 'post') {
      view =  'details';
      opts = {
        option: 'com_fabrik',
        'Itemid': this.options.Itemid,
        'view': view,
        'tableid': this.id,
        'fabrik': this.options.formid,
        'rowid': 0,
        'format': 'raw',
        '_senderBlock': 'table_' + this.id
      };
      this.links.each(function(link){
        link.addEvent('click', function(e){
          var tr = link.findUp('tr');
					this.setActive(tr);
          oPackage.startLoading();
          opts.rowid = tr.id.replace('table_' + this.id + '_row_', '');
          var url = "index.php?" + Object.toQueryString(opts);
          var myAjax = new Ajax(url, {
            method: 'get',
            onComplete: function(res){
              oPackage.sendMessage('table_' + this.id, 'update', 'ok', res);
            }.bind(this)
          });
          myAjax.request();
          e = new Event(e);
          e.stop();
        }.bind(this));
      }.bind(this));
    }
  },
  
  getForm: function(){
		if (!this.form) {
			this.form = $(this.options.form);
		}
  },
  
  submitfabrikTable: function(task){
    this.getForm();
		if (task == 'delete') {
			var ok = false;
			this.form.getElements('input[name^=ids]').each(function(c){
				if(c.checked){
					ok = true;
				}
			});
			if(!ok){
				alert(this.translate.select_rows);
				oPackage.stopLoading('table_' + this.id);
				return false;
			}
		}
    if (task == 'filter') {
			this.form.task.value = task;
      if (this.form['limitstart' + this.id]) {
        this.form.getElement('#limitstart' + this.id).value = 0;
      }
    }
    else {
      if (task !== '') {
        this.form.task.value = task;
      }
    }
    if (this.options.postMethod == 'ajax') {

	    //for module & mambot
			// $$$ rob with modules only set view/option if ajax on
			$('tableform_'+this.id).getElement('input[name=option]').value = 'com_fabrik';
			$('tableform_'+this.id).getElement('input[name=view]').value = 'table';

      $('table_' + this.id + '_format').value = 'raw';
       
      //oPackage.startLoading();
      if(this.options.mooversion > 1.1){
      	this.form.set('send', {onComplete: function(json){
      		oPackage.sendMessage('table_' + this.id, task, 'ok', json);
        }.bind(this)});

      	this.form.send();
      }else{
	      this.form.send({
	        onComplete: function(json){
	          oPackage.sendMessage('table_' + this.id, task, 'ok', json);
	        }.bind(this)
	      });
      }
    }
    else {
      this.form.submit();
    }
    return false;
  },
  
  fabrikNav: function(limitStart){
    this.form.getElement('#limitstart' + this.id).value = limitStart;
    //cant do filter as that resets limitstart to 0
    oPackage.submitfabrikTable(this.id, 'navigate');
    return false;
  },
  
  fabrikNavOrder: function(orderby, orderdir){
  	this.form.orderby.value = orderby;
    this.form.orderdir.value = orderdir;
    oPackage.submitfabrikTable(this.id, 'order');
  },
  
  removeRows: function(rowids){
    //@TODO: try to do this with FX.Elements 
    for (i = 0; i < rowids.length; i++) {
      var row = $('table_' + this.id + '_row_' + rowids[i]);
      var highlight = new Fx.Styles(row, {
        duration: 1000
      });
      highlight.start({
        'backgroundColor': this.options.hightLight
      }).chain(function(){
        this.start({
          'opacity': 0
        });
      }).chain(function(){
        row.remove();
        this.checkEmpty();
      }.bind(this));
    }
  },
  
  editRow: function(){
  
  },
  
  clearRows: function(){
  	this.table.getElements('.fabrik_row').each(function(tr){
      tr.remove();
    });
  },
  
	
  updateRows: function(data){
		if (data.id == this.id && data.model == 'table') {
			var header = this.table.getElements('.fabrik___heading').getLast();
			var headings = new Hash(data.headings);
			headings.each(function(data, key){
				key = "." + key + '_heading';
					try{
						if ($type(header.getElement(key)) !== false) {
						header.getElement(key).setHTML(data);
						}
					}catch(err){
						fconsole(err);
					}
			});
			
			this.clearRows();
			var counter = 0;
			var rowcounter = 0;
			trs = [];
			data.data.each(function(groupData, groupKey){
				for(i=0;i<groupData.length;i++){
					if ($type(this.options.rowtemplate) == 'string') {
						var container =(!this.options.rowtemplate.match(/\<tr/)) ? 'div' : 'table';
						var thisrowtemplate = new Element(container);
		  			thisrowtemplate.setHTML(this.options.rowtemplate);
				  }else{
						container = this.options.rowtemplate.getTag() == 'tr' ? 'table' : 'div'; 
						var thisrowtemplate = new Element(container);
						//ie tmp fix for mt 1.2 setHTML on table issue
						thisrowtemplate.adopt(this.options.rowtemplate.clone());
					}
					row = $H(groupData[i]);
					$H(row.data).each(function(val, key){
						var rowk = '.fabrik_row___' + key;
						var cell = thisrowtemplate.getElement(rowk);
						if ($type(cell) !== false) {
							cell.setHTML(val);
						}
						rowcounter ++;
          }.bind(this));
					//thisrowtemplate.getElement('.fabrik_row').id = 'table_' + this.id + '_row_' + row.get('__pk_val');
					thisrowtemplate.getElement('.fabrik_row').id = row.id;
					if ($type(this.options.rowtemplate) == 'string') {
						var c = thisrowtemplate.getElement('.fabrik_row').clone();
						c.id = row.id;
				  	c.injectInside(this.tbody);
				  }else{
						var r = thisrowtemplate.getElement('.fabrik_row');
						r.injectInside(this.tbody);
						thisrowtemplate.empty();
					}
					counter ++;
				}
      }.bind(this));
			
			var fabrikDataContainer = this.table.findClassUp('fabrikDataContainer');
			var emptyDataMessage = this.table.findClassUp('fabrikForm').getElement('.emptyDataMessage');
			if (rowcounter == 0) {
				if($type(fabrikDataContainer)!== false)
					fabrikDataContainer.setStyle('display', 'none');
				if($type(emptyDataMessage)!== false)
					emptyDataMessage.setStyle('display', '');	
			}else{
				if($type(fabrikDataContainer)!== false)
					fabrikDataContainer.setStyle('display', '');
				if($type(emptyDataMessage)!== false)
					emptyDataMessage.setStyle('display', 'none');	
			}
			
			//this.tbody.adopt(trs);
			if ($type(this.form.getElement('.pagination')) !== false) {
		  	this.form.getElement('.pagination').empty();
		  	if (data.nav['pages.total'] > 1) {
		  		var lis = [];
		  		
		  		var ls = 'limitstart' + this.id;
		  		lis.push(new Element('li').adopt(new Element('span', {
		  			'class': 'pagenav'
		  		})).setText('<<'));
		  		if (data.nav['pages.current'] == 1) {
		  		
		  			lis.push(new Element('li').adopt(new Element('span', {
		  				'class': 'pagenav'
		  			})).setText(this.translate.start));
		  			lis.push(new Element('li').adopt(new Element('span', {
		  				'class': 'pagenav'
		  			})).setText(this.translate.prev));
		  		} else {
		  			lis.push(new Element('li').adopt(new Element('a', {
		  				'class': 'pagenav',
		  				href: '?&' + ls + '=0'
		  			}).setText(this.translate.start)));
		  			lis.push(new Element('li').adopt(new Element('a', {
		  				'class': 'pagenav',
		  				href: '?&' + ls + '=0'
		  			}).setText(this.translate.prev)));
		  		}
		  		for (var p = 0; p < data.nav['pages.total']; p++) {
		  			limitstart = p * data.nav.limit;
		  			if (p + 1 == data.nav['pages.current']) {
		  				lis.push(new Element('li').adopt(new Element('span', {
		  					'class': 'pagenav'
		  				})).setText(p + 1));
		  			} else {
		  				lis.push(new Element('li').adopt(new Element('a', {
		  					'class': 'pagenav',
		  					href: '?&' + ls + '=' + limitstart
		  				}).setText(p + 1)));
		  			}
		  		}
		  		
		  		if (data.nav['pages.current'] == data.nav['pages.total']) {
		  			lis.push(new Element('li').adopt(new Element('span', {
		  				'class': 'pagenav'
		  			})).setText(this.translate.next));
		  			lis.push(new Element('li').adopt(new Element('span', {
		  				'class': 'pagenav'
		  			})).setText(this.translate.end));
		  			
		  		} else {
		  			limitstart = (data.nav['pages.total'] - 1) * data.nav.limit;
		  			lis.push(new Element('li').adopt(new Element('a', {
		  				'class': 'pagenav',
		  				href: '?&' + ls + '=' + limitstart
		  			}).setText(this.translate.next)));
		  			lis.push(new Element('li').adopt(new Element('a', {
		  				'class': 'pagenav',
		  				href: '?&' + ls + '=' + limitstart
		  			}).setText(this.translate.end)));
		  		}
		  		lis.push(new Element('li').adopt(new Element('span', {
		  			'class': 'pagenav'
		  		})).setText('>>'));
		  		this.form.getElement('.pagination').adopt(lis);
		  	}
		  	
		  	this.form.getElement('.counter').setText(this.translate.page + ' ' + data.nav['pages.current'] + ' ' + this.translate.of + ' ' + data.nav['pages.total']);
		  }
      this.watchAll();
		}
		 this.stripe();
  },
  
  addRow: function(obj){
    var r = new Element('tr', {
      'class': 'oddRow1'
    });
    var x = {
      test: 'hi'
    };
    for (var i in obj) {
      if (this.options.headings.indexOf(i) != -1) {
        var td = new Element('td', {}).appendText(obj[i]);
        //td.colSpan = c;
        r.appendChild(td);
      }
    }
    r.injectInside(this.tbody);
  },
  
  addRows: function(aData){
    for (i = 0; i < aData.length; i++) {
      for (j = 0; j < aData[i].length; j++) {
        this.addRow(aData[i][j]);
      }
    }
    this.stripe();
  },
  
  stripe: function(){
  	var trs = this.table.getElements('.fabrik_row');
    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 = this.table.getElements('tr');
    if (trs.length == 2) {
      this.addRow({
        'label': this.options.emptyMsg
      });
    }
  },
  
  watchCheckAll: function(e){
    var checkAll = document.getElements('.table_' + this.id + '_checkAll');
    if (checkAll) {
      checkAll.addEvent('change', function(e){
    	var event = new Event(e);
   	  	var c = $(event.target); 
        var chkBoxes = c.findClassUp('fabrikTable').getElements('input[name^=ids]');
				var c = !c.checked ? '' : 'checked';
        for (var i = 0; i < chkBoxes.length; i++) {
          chkBoxes[i].checked = c;
					this.toggleJoinKeysChx(chkBoxes[i])
        }
        event.stop();
      }.bind(this));
    }
		this.form.getElements('input[name^=ids]').each(function(i){
			i.addEvent('change', function(e){
				this.toggleJoinKeysChx(i);
			}.bind(this));
		}.bind(this));
  },
	
	toggleJoinKeysChx:function(i)
	{
		i.getParent().getElements('input[class=fabrik_joinedkey]').each(function(c){
			c.checked = i.checked;
		});
	},
  
  watchNav: function(e){
  	var limitBox = this.form.getElement('#limit'+ this.id);
    if (limitBox) {
    	limitBox.removeEvents();
      limitBox.addEvent('change', function(e){
        oPackage.submitfabrikTable(this.id, 'filter');
      }.bind(this));
    }
    var addRecord = $('table_' + this.id + '_addRecord');
    
    if ($(addRecord) && (this.options.postMethod != 'post')) {
    	addRecord.removeEvents();
      addRecord.addEvent('click', function(e){
        e = new Event(e);
        oPackage.startLoading();
        oPackage.sendMessage('table_' + this.id, 'clearForm', 'ok', '');
        e.stop();
      }.bind(this));
    }
		
		if($('fabrik__swaptable')){
			$('fabrik__swaptable').addEvent('change', function(event){
				var e = new Event(event);
				var v = e.target;
				window.location = 'index.php?option=com_fabrik&c=table&task=viewTable&cid=' + v.getValue();
			}.bind(this));
		}
		if(this.options.postMethod != 'post'){
			if($type(this.form.getElement('.pagination')) !== false){
				this.form.getElement('.pagination').getElements('.pagenav').each(function(a){
					a.addEvent('click', function(e){
						new Event(e).stop();
						if(a.getTag() == 'a'){
							var o = a.href.toObject();
							this.fabrikNav(o['limitstart' + this.id]);
						}
					}.bind(this));
				}.bind(this));
			}
		}
    this.watchCheckAll();
		
		//clear filter list
	/*	var c = this.form.getElement('.clearFilters');
		if(c){
			c.removeEvents();
			c.addEvent('click', function(e){
				new Event(e).stop();
				this.form.getElements('.fabrik_filter').each(function(f){
					if(f.getTag() == 'select'){
						f.selectedIndex = 0;
					}else{
						f.value = '';
					}
				});
				oPackage.submitfabrikTable(this.id, 'filter');
			}.bind(this));
		}*/
  },
  
  //todo: refractor addlistento into block class 
  addListenTo: function(blockId){
    this.listenTo.push(blockId);
  },
  
  receiveMessage: function(senderBlock, task, taskStatus, data){
    if (this.listenTo.indexOf(senderBlock) != -1) {
      switch (task) {
        case 'delete':
          this.removeRows(data);
          this.stripe();
          break;
        case 'processForm':
          this.addRows(data);
          break;
        case 'navigate':
        case 'filter':
        case 'updateRows':
        case 'order':
        	//only update rows if no errors returned
        	if ($H(data.errors).keys().length === 0){
          	this.updateRows(data);
          }
          break;
      }
    }
  }
});
