var neteditAjaxTable = new Class({
	Implements: Options,
	
	options: {
		divId:'table-ajax',
		prefix:'data-',
		tots:{},
		selects:{},
		radios:{},
    	actionSearch: '',
    	actionUpdate: '',
    	actionDelete: '',
    	actionExcel: '',
    	alertDelete: 'Sei sicuro?',
    	
    	onDblClick: null,	/* IMPORTANTE - funzione da chiamare quando faccio click su din una riga */
    	onSearch: null,	/* IMPORTANTE - funzione da chiamare quando faccio una ricerca */
    	onSearchComplete: null,	/* IMPORTANTE - funzione da chiamare quando ha finito di effettuare una ricerca */
    	onSave: null,	/* IMPORTANTE - funzione da chiamare prima di salvare */
    	onSaveComplete: null,	/* IMPORTANTE - funzione da chiamare quando ha finito un salvataggio */
    	onInsert: null,
    	    	
    	insertButton: true,
    	excelButton: true,
    	updateButton: true,
    	deleteButton: true,
    	
    	htmButtonSortAsc: '<img src="imgs/16x16/s_asc.png" alt="ASC" border="0" align="absmiddle" >',
    	htmButtonSortDesc: '<img src="imgs/16x16/s_desc.png" alt="DESC" border="0" align="absmiddle" >',
    	htmButtonUpdate: '<img src="imgs/16x16/edit.png" alt="Modifica" border="0" align="absmiddle" >',
    	htmButtonDelete: '<img src="imgs/16x16/delete.png" alt="Elimina" border="0" align="absmiddle" >',
    	htmButtonInsert: '<img src="imgs/16x16/add.png" alt="Inserisci" border="0" align="absmiddle" >',
    	htmButtonExcel: '<img src="imgs/16x16/excel.gif" alt="Esporta in Excel" border="0" align="absmiddle" >',
    	
    	keyPaging: 'pag',
    	appendPaging: true,
    	keyOrder: 'order',
    	keySort: 'sort',
    	nPerPage: 10,
    	htmButtonNext: '<img src="imgs/16x16/next.png" alt="Avanti" border="0" align="absmiddle" >',
    	htmButtonPrev: '<img src="imgs/16x16/prev.png" alt="Indietro" border="0" align="absmiddle" >',
    	
    	rowBgcolorEven: '#F0F8FF',
    	rowBgcolorOdd: '#ffffff'
    },

    initialize: function(options){
 
    	this.rows = [];
    	this.setOptions(options);
    	this.trInUpdate = null;
    	this.primaryKeySel = 0;
    	
    	this.currentPage = 1;
    	this.currentOrder = '';
    	this.currentSort = '';
    	this.nRows = 0;
    	this.lastActionSearch = '';
    	
    	this.addButtonsUpdate();
    	this.addEventsUpdate();
    	
    	this.addButtonsDelete();
    	this.addEventsDelete();    	
    	
    	this.addButtonsInsert();
    	this.addEventsInsert();
    	
    	this.addButtonsExcel();
    	this.addEventsExcel();
    	
    	this.addEventsDblClick();
    	
    	this.addButtonsPaging();
    	this.addEventsPaging();
    	
    	this.addHrefOrder();
    	this.addEventsOrder();
    	
    	this.hiddenLinksHeader();
    	
    	var divLoading = $(this.options.prefix+'loading');
    	if(divLoading){
    		divLoading.setStyle('position','relative');
    		divLoading.setStyle('text-align','center');
    	}
    },
    
    hiddenLinksHeader: function(){
    	
    	var mainDiv = $(this.options.divId);
    	var trs = mainDiv.getElements('tr');
    	var nTrs = trs.length;
    	
    	var trHeader = trs[0];
    	
    	var tds = trHeader.getChildren();
    	$each(tds, function(td, index){
    		var className = td.get('class');
			if(className==this.options.prefix+'link'){
				var elements = td.getChildren();
				$each(elements, function(element, index){
					element.setStyle('visibility','hidden');
				});
			}
    	}.bind(this));
    },
    
    addHrefOrder: function(){
    	var divSortAsc = new Element('div', {'id':this.options.prefix+'sortASC', style:'display:none'});
    	divSortAsc.set('html', this.options.htmButtonSortAsc);
    	
    	var divSortDesc = new Element('div', {'id':this.options.prefix+'sortDESC', style:'display:none'});
    	divSortDesc.set('html', this.options.htmButtonSortDesc);
    	    	
    	var mainDiv = $(this.options.divId);
    	
    	divSortAsc.inject(mainDiv, 'before');
    	divSortDesc.inject(mainDiv, 'before');
    	
    	var trs = mainDiv.getElements('tr');
    	var nTrs = trs.length;
    	
    	var trHeader = trs[0];
    	
    	var tds = trHeader.getChildren();

    	$each(tds, function(td, index){
			var name = td.get('rel');
			var className = td.get('class');
			if(name && className!=this.options.prefix+'link'){
				var col = td.get('html');
				var html = '<a href="#" class="'+this.options.prefix+'order">'+col+'</a>';
				td.set('html', html);
			}
		}.bind(this));
    },

    addEventsOrder: function(){
    	var aLinkOrder = $$('#'+this.options.divId+' .'+this.options.prefix+'order');
    	
    	$each(aLinkOrder, function(a, index){
			a.addEvent('click', function(e){
			    this.orderByCol(e);
			    return false;
			}.bind(this));
		}.bind(this));
    },
    
    orderByCol: function(e){
    	var event = new Event(e);
    	var td = $(event.target).getParent();
    	var name = td.get('rel');
    	if(name){
    		name = this._getFieldName(name);
    		if(this.currentOrder==name){
    			if(this.currentSort == 'ASC'){
    				
    				this.currentSort = 'DESC';
    				this.setImgSortDesc(td);
    			}else{
    				this.currentSort = 'ASC';
    				this.setImgSortAsc(td);
    			}
    		}else{
    			this.currentSort = 'ASC';
    			this.setImgSortAsc(td);
    		}
    		this.currentOrder = name;
    		this.search(null, null, null);
    	}
    },
    
    setImgSortAsc: function(td){
    	var coordinates = td.getCoordinates();
    	var divSortAsc = $(this.options.prefix+'sortASC');
    	divSortAsc.inject(td);
    	divSortAsc.set('style','display:block; position:relative; float:right; top:-10px');
    	var divSortDesc = $(this.options.prefix+'sortDESC');
    	divSortDesc.set('style','display:none;');
    	
    },
    
    setImgSortDesc: function(td){
    	var coordinates = td.getCoordinates();
    	var divSortAsc = $(this.options.prefix+'sortASC');
    	divSortAsc.set('style','display:none;');
    	var divSortDesc = $(this.options.prefix+'sortDESC');
    	divSortDesc.set('style','display:block; position:relative; float:right; top:-10px');
    	divSortDesc.inject(td);
    },
    
    addButtonsPaging: function(){
    	var html = '';
    	if(this.currentPage>1 && this.options.appendPaging==false){
    		html += '<a href="#" accesskey="A" title="[ALT + P]" class="'+this.options.prefix+'paging-prev">'+this.options.htmButtonPrev+'</a> &nbsp; ';
    	}
    	html += 'Pag. '+this.currentPage+' &nbsp; ';
    	
    	if(this.nRows>(this._getNPerPage()*this.currentPage)){
	    	html += '<a href="#" accesskey="A" title="[ALT + N]" class="'+this.options.prefix+'paging-next">'+this.options.htmButtonNext+'</a>';
    	}
    	var tdButtonPaging = $$('#'+this.options.divId+' .'+this.options.prefix+'paging');
    	$each(tdButtonPaging, function(td, index){
		    td.set('html', html);
		});
    },
    
    addEventsPaging: function(){
    	if(this.currentPage>1 && this.options.appendPaging==false){
    		this.addEventsPagingPrev();
    	}
    	this.addEventsPagingNext();
    },
    
    addEventsPagingNext: function(){
    	if(this.nRows>(this._getNPerPage()*this.currentPage)){
	    	var aLinkPageNext = $$('#'+this.options.divId+' .'+this.options.prefix+'paging-next');
	    	$each(aLinkPageNext, function(a, index){
				a.addEvent('click', function(e){
				    this.nextPage(e);
				    return false;
				}.bind(this));
			}.bind(this));
   		}
    },
    
    addEventsPagingPrev: function(){
    	var aLinkPagePrev = $$('#'+this.options.divId+' .'+this.options.prefix+'paging-prev');
    	$each(aLinkPagePrev, function(a, index){
			a.addEvent('click', function(e){
			    this.prevPage(e);
			    return false;
			}.bind(this));
		}.bind(this));
    },
      
    addEventsDblClick: function(tr){
    	if(tr){
    		tr.addEvent('dblclick', function(e){
			    this.clickRow(e);
			    return false;
			}.bind(this));
    	}else{
    		trs = $$('#'+this.options.divId+' td');
    		$each(trs, function(tr, index){
	    		tr.addEvent('dblclick', function(e){
				    this.clickRow(e);
				    return false;
				}.bind(this));
	    	}.bind(this));
    	}
    },
    
    addButtonsInsert: function(){
    	if(this.options.insertButton){
	    	var html = '<a href="#" accesskey="A" title="[ALT + A]">'+this.options.htmButtonInsert+'</a>';
	    	var tdButtonInsert = $$('#'+this.options.divId+' .'+this.options.prefix+'button-insert');
	    	$each(tdButtonInsert, function(td, index){
			    td.set('html', html);
			});
    	}
    },
    
    addEventsInsert: function(){
    	if(this.options.insertButton){
	    	var aButtonInsert = $$('#'+this.options.divId+' .'+this.options.prefix+'button-insert a');
	    	$each(aButtonInsert, function(a, index){
				a.addEvent('click', function(e){
				    this.addTrInUpdateMode(e);
				    return false;
				}.bind(this));
			}.bind(this));
	    }
    },
    
    addButtonsExcel: function(){
    	///var html = '<a href="#" accesskey="S" title="[ALT + S]">'+this.options.htmButtonExcel+'</a>';
    	if(this.options.excelButton){
	    	var a = new Element('a', {'id':this.options.prefix+'button-excel', 'href':'#'});
	    	a.set('html', this.options.htmButtonExcel);
	    	var tdButtonInsert = $$('#'+this.options.divId+' .'+this.options.prefix+'button-insert');
	    	$each(tdButtonInsert, function(td, index){
	    		a.inject(td);
			});
    	}
    },
    
    addEventsExcel: function(){
    	var aButtonExcel = $(this.options.prefix+'button-excel');
    	if(aButtonExcel){
			aButtonExcel.addEvent('click', function(e){
			    this.excel(e);
			    return false;
			}.bind(this));
    	}
    },
    
    addButtonsUpdate: function(tr){
    	if(this.options.updateButton){
    		var html = '<a href="#">'+this.options.htmButtonUpdate+'</a>';
	    	if(tr){
	    		var tdButtonUpdate = tr.getElements('.'+this.options.prefix+'button-update');
	    	}else{
		    	var tdButtonUpdate = $$('#'+this.options.divId+' .'+this.options.prefix+'button-update');
	    	}
	    	$each(tdButtonUpdate, function(td, index){
			    td.set('html', html);
			});
	    }
    },
        
    addEventsUpdate: function(tr){
    	if(tr){
    		var aButtonUpdate = tr.getElements('.'+this.options.prefix+'button-update a');
    	}else{
	    	var aButtonUpdate = $$('#'+this.options.divId+' .'+this.options.prefix+'button-update a');
    	}
    	$each(aButtonUpdate, function(a, index){
			a.addEvent('click', function(e){
			    this.trInUpdateModeEvent(e);
			    return false;
			}.bind(this));
		}.bind(this));	
    },
    
    addButtonsDelete: function(tr){
    	if(this.options.deleteButton){
	    	var html = '<a href="#">'+this.options.htmButtonDelete+'</a>';
	    	if(tr){
	    		var tdButtonDelete = tr.getElements('.'+this.options.prefix+'button-delete');
	    	}else{
		    	var tdButtonDelete = $$('#'+this.options.divId+' .'+this.options.prefix+'button-delete');
	    	}
	    	$each(tdButtonDelete, function(td, index){
	    		var tr = td.getParent();
	    		var tds = tr.getElements('.'+this.options.prefix+'button-insert');
	    		if(tds.length==0){
			    	td.set('html', html);
	    		}
			}.bind(this));
    	}
    },
    
    addEventsDelete: function(tr){
    	if(tr){
    		var aButtonDelete = tr.getElements('.'+this.options.prefix+'button-delete a');
    	}else{
	    	var aButtonDelete = $$('#'+this.options.divId+' .'+this.options.prefix+'button-delete a');
    	}
    	
    	$each(aButtonDelete, function(a, index){
			a.addEvent('click', function(e){
			    this.remove(e);
			    return false;
			}.bind(this));
		}.bind(this));
    },
    
    /* 
    display tr in view mode
    */
    trInViewMode:function(tr){
    	var tbody = tr.getParent();
    	var table = tbody.getParent();
    	var form = table.getParent();
    	
    	// elimina il form attorno alla table se esiste
    	if(form.get('tag')=='form'){
    		var table = form.getChildren();
			table.replaces(form);
    	}
    	
    	// elimina ogni input type submit e reset
    	$each($$('#'+this.options.divId+' .'+this.options.prefix+'button-update input'), function(input, index){
    		input.dispose();
    	});
    	
    	// mostra i bottoni di modifica e cancella
    	$each(tr.getElements('.'+this.options.prefix+'button-update a'), function(a, index){
    		a.setStyle('display','block');
    	});
    	$each(tr.getElements('.'+this.options.prefix+'button-delete a'), function(a, index){
    		a.setStyle('display','block');
    	});
    	
    	// cicla sui td e reimposta i valori presi dalle input
    	var dataText = tr.getElements('.'+this.options.prefix+'text');
    	$each(dataText, function(td, index){
    		var input = td.getElement('input');
    		if(input){
	    		var html = input.get('value');
			    td.set('html', html);
    		}
		}.bind(this));
		
		// cicla sulle select e reimposta l'opzione selezionata
		var dataSelect = tr.getElements('.'+this.options.prefix+'select');
    	$each(dataSelect, function(td, index){
    		var select = td.getElement('select');
    		if(select){
	    		var html = select.options[select.selectedIndex].text;
	    		var valueSel = select.get('value');
			    td.set('html', html);
			    td.setAttribute('sel', valueSel);
    		}
		}.bind(this));
		
		// cicla sulle radio e reimposta l'opzione selezionata
		var dataRadio = tr.getElements('.'+this.options.prefix+'radio');
    	$each(dataRadio, function(td, index){
    		var radios = td.getElements('input');
    		var html = '';
    		var valueSel = '';
    		$each(radios, function(radio, index){    			
    			if(radio.get('checked')){
    				 valueSel = radio.get('value');
    				 /* da rivedere */
    				 html = radio.nextSibling.nodeValue.trim();
    			}
    		}.bind(this));
    		
			td.set('html', html);
			td.setAttribute('sel', valueSel);
		}.bind(this));
		
		var primaryKeyName = '';
		var primaryKey = '0';
		// trova la chiave primaria e la inserisce
		var dataPrimary = tr.getElements('.'+this.options.prefix+'primarykey');
    	$each(dataPrimary, function(td, index){
    		primaryKeyName = td.get('rel');
    		var input = td.getElement('input');
    		if(input){
	    		primaryKey = input.get('value');
			    td.set('html', primaryKey);
    		}
		}.bind(this));
		    	
		// cicla sui td e reimposta i valori presi dalle input
    	var dataLink = tr.getElements('.'+this.options.prefix+'link');
    	$each(dataLink, function(td, index){
    		var link = '';
    		var elements = td.getChildren();
			$each(elements, function(element, index){
				element.setStyle('visibility','');
			});
		   	var baseLink = td.get('rel');
		   	var key = td.get('key');
		   	if(key){
		   		link = baseLink+'&'+key+'='+primaryKey;
		   	}else{
		   		link = baseLink+'&'+primaryKeyName+'='+primaryKey;
		   	}
		   	var linkName = td.get('html');
		   	var target = td.get('target');
		    td.set('html', '<a href="'+link+'" '+(target!=''?'target="'+target+'"':'')+'>'+linkName+'</a>');
		}.bind(this));
    },
    
    /*
    display l'ultimo tr in edit in view mode
    */
    lastTrInViewMode:function(){
    	if(this.trInUpdate){
    		
    		var dataPrimary = this.trInUpdate.getElements('.'+this.options.prefix+'primarykey input');
    		if(dataPrimary.length>0){
		    	$each(dataPrimary, function(input, index){
		    		// controlla se l'ultimo tr era un update o un insert
				    if(input.get('value')=='0'){
				    	this.trInUpdate.dispose();
				    }else{
				    	this.trInViewMode(this.trInUpdate);
				    }
				}.bind(this));
    		}else{
    			this.trInViewMode(this.trInUpdate);
    		}
    		this.trInUpdate = null;
    	}
    },
    
    trInUpdateModeEvent: function(e){
    	var event = new Event(e);
    	var a = $(event.target).getParent();
    	var td = a.getParent();
    	var tr = td.getParent();
    	this.trInUpdateMode(tr);
    },
    
    trInUpdateMode: function(tr){
    	this.lastTrInViewMode();
    
    	var tds = tr.getChildren('.'+this.options.prefix+'button-update');
		var td = tds[0];
    	var tbody = tr.getParent();
    	var table = tbody.getParent();
    	var div = table.getParent();
    	
    	$each(tr.getElements('.'+this.options.prefix+'button-update a'), function(a, index){
    		a.setStyle('display','none');
    	});
    	$each(tr.getElements('.'+this.options.prefix+'button-delete a'), function(a, index){
    		a.setStyle('display','none');
    	});
    	
    	var buttonSubmit  = new Element('input',{type:'submit', title:'[ALT + S]', accesskey:'S', value:'Salva'});
    	buttonSubmit.inject(td);
    	
    	var buttonCancel  = new Element('input',{type:'reset', value:'Annulla'});
    	buttonCancel.inject(td);
    	buttonCancel.addEvent('click', function(e){
			 this.cancel(e);
			 return false;
		}.bind(this));
    	
    	var form  = new Element('form', {method:'post', action: this.options.actionUpdate});
    	form.addEvent('submit', function(e){
			 this.save(e);
			 return false;
		}.bind(this));
    	table.inject(form);
    	form.inject(div);
    	
    	this.trInUpdate = tr;
    	
    	var dataPrimary = tr.getElements('.'+this.options.prefix+'primarykey');
    	$each(dataPrimary, function(td, index){
    		this.primaryKeySel = td.get('html');
    		var name = td.get('rel');
    		var html = '<input type="hidden" name="'+name+'" value="'+this.primaryKeySel+'">';
		    td.set('html', html);
		}.bind(this));
		
    	var dataText = tr.getElements('.'+this.options.prefix+'text');
    	$each(dataText, function(td, index){
    		var value = td.get('html');
    		var name = td.get('rel');
    		var html = '<input type="text" name="'+name+'" value="'+value+'" style="width:95%">';
		    td.set('html', html);
		});
		
		var dataLink = tr.getElements('.'+this.options.prefix+'link');
    	$each(dataLink, function(td, index){
			var elements = td.getChildren();
			$each(elements, function(element, index){
				element.setStyle('visibility','');
			});
		});
		
		var dataSelect = tr.getElements('.'+this.options.prefix+'select');
    	$each(dataSelect, function(td, index){
    		var value = td.get('html');
    		var name = td.get('rel');
    		var no_primary_key = td.get('no_primary_key');
    		
    		var valueSel = td.get('sel');
    		var html = '<select name="'+name+'">';
    		
    		if(this.options.selects.has(name)){
	    		var options = this.options.selects.get(name);

	    		$each(options, function(option, key){
	    			if($type(key)=='string'){
	    				if(no_primary_key){
	    					if(key!=this.primaryKeySel){
	    						html += '<option value="'+key+'" '+(key==valueSel?'SELECTED':'')+'>'+option+'</option>';
	    					}
	    				}else{
	    					html += '<option value="'+key+'" '+(key==valueSel?'SELECTED':'')+'>'+option+'</option>';
	    				}
	    			}else{
	    				html += '<option '+(option==valueSel?'SELECTED':'')+'>'+option+'</option>';
	    			}
	    		}.bind(this));
	    		
	    		html += '</select>';
    		}
    		td.set('html', html);
		}.bind(this));
		
		var dataRadio = tr.getElements('.'+this.options.prefix+'radio');
    	$each(dataRadio, function(td, index){
    		var value = td.get('html');
    		var name = td.get('rel');
    		var valueSel = td.get('sel');
    		var html = '';
    		
    		if(this.options.radios.has(name)){
	    		var options = this.options.radios.get(name);
	
	    		$each(options, function(display, key){
	    			if($type(key)=='string'){
	    				html += '<input type="radio" name="'+name+'" value="'+key+'" '+(key==valueSel?'CHECKED':'')+'> '+display+' ';
		    		}else{
		    			html += '<input type="radio" name="'+name+'" value="'+display+'" '+(display==valueSel?'CHECKED':'')+'> '+display+' ';
		    		}
	    		}.bind(this));
    		}
    		td.set('html', html);
		}.bind(this));
		
		
    	
    },
    
    save: function(e){
    	var event = new Event(e);
    	var form = $(event.target);
    	
    	if(this.options.onSave){
	    	this.options.onSave(form);
	    }
	    	
    	this.options.actionUpdate = this.options.actionUpdate.replace(/\&amp;/g,'&');
    	form.send(this.options.actionUpdate);
    	var request = form.get('send');
    	request.onSuccess = function(txt, xml){
    		try{
	    		var id = eval('(' + txt + ')');
	    		var dataPrimary = $$('#'+this.options.divId+' .'+this.options.prefix+'primarykey input'); // da rivedere
	    		$each(dataPrimary, function(input, index){
				    input.set('value', id);
				}.bind(this));
	    		this.lastTrInViewMode();
	    		
	    		if(this.options.onSaveComplete){
		    		this.options.onSaveComplete(id);
		    	}
    		}catch(e){
    			alert(e);
    		}
    	}.bind(this);
    },
    
    cancel:function(e){
    	var event = new Event(e);  
    	var input = $(event.target);
    	input.form.reset();
    	this.lastTrInViewMode();
    },
    
    remove :function(e){
    	var event = new Event(e);
    	var a = $(event.target).getParent();
    	
    	var tr = a.getParent().getParent();
    	
    	if(confirm(this.options.alertDelete)){
    		var dataPrimary = tr.getElements('.'+this.options.prefix+'primarykey');
	    	$each(dataPrimary, function(td, index){
	    		var value = td.get('html');
	    		var name = td.get('rel');
	    		var url = this.options.actionDelete+'&'+name+'='+value;
	    		netedit.ajax.getData( 
					url.replace(/\&amp;/g,'&'),
					{
						method: 'get',
						onComplete: this.respDelete.bind(this),
						onRequest : function() {
							netedit.ajax.showLoading(this.options.prefix+'loading');
						}.bind(this)
					}
				);
			}.bind(this));
			tr.dispose();
    	}
    	
    },
    
    respDelete: function(txt){
    	netedit.ajax.hideLoading();
    },
    
    addTrInUpdateMode: function(e){
    	this.lastTrInViewMode();
    	
    	if(this.options.onInsert){
			this.options.onInsert(e);
		}
    
    	var event = new Event(e);
    	var a = $(event.target).getParent();
    	var td = a.getParent();
    	var tr = td.getParent();
    	
		var newTr = $(tr).clone().inject(tr,'after');
		// rimuove ogni stile dal tr intestazione
	    newTr.removeProperties('prevcolor','style','class');
		
	    var dataText = newTr.getElements('.'+this.options.prefix+'text');
    	$each(dataText, function(td, index){
    		
    		var defaultValue = td.get('sel');
    	
		    td.set('html', defaultValue);
		});
		
		var dataLabel = newTr.getElements('.'+this.options.prefix+'label');
    	$each(dataLabel, function(td, index){
    		td.set('html', '');
		});
		
		var dataLink = newTr.getElements('.'+this.options.prefix+'link');
    	$each(dataLink, function(td, index){
			var elements = td.getChildren();
			$each(elements, function(element, index){
				element.setStyle('visibility','');
			});
		});
		
		 var dataImg = newTr.getElements('.'+this.options.prefix+'img');
    	$each(dataImg, function(td, index){
    		td.set('html', '');
		}.bind(this));
		
		var dataPrimary = newTr.getElements('.'+this.options.prefix+'primarykey');
    	$each(dataPrimary, function(td, index){
		    td.set('html', '0');
		});
		
		$each(newTr.getElements('.'+this.options.prefix+'button-insert'), function(newTr, index){
		    newTr.set('class', ''+this.options.prefix+'button-update');
		    newTr.set('html', '');
	   
	    }.bind(this));
	    
	    $each(newTr.getElements('.delete'), function(newTr, index){
		    newTr.set('class', ''+this.options.prefix+'button-delete');
		    newTr.set('html', '');

		}.bind(this));
		
		this.addButtonsUpdate(newTr);
		this.addButtonsDelete(newTr);
		
		this.addEventsDblClick(newTr);
		this.addEventsDelete(newTr);
    	this.addEventsUpdate(newTr);
    	
		this.trInUpdateMode(newTr);
		
		netedit.tableBindEvents();
    },
    
    respSearch: function(txt){
    	try{

	    	var resp = eval('(' + txt + ')');
	    	this.lastTrInViewMode();
	    
	    	var mainDiv = $(this.options.divId);
	    	var trs = mainDiv.getElements('tr');
	    	var nTrs = trs.length;
	    	
	    	var trHeader = trs[0];
	    	var trFooter = trs[nTrs-1];
	    	
	    	if(this.options.appendPaging==false || this.currentPage==1){
		    	this._deleteAllRows();
	    	}
	    	
	    	$each(resp, function(row, i){
	    		if(i=='n-rows'){
	    			var tdButtonPaging = $$('#'+this.options.divId+' .'+this.options.prefix+'n-rows');
			    	$each(tdButtonPaging, function(td, index){
			    		this.nRows = row;
					    td.set('html', 'Righe: '+row);
					}.bind(this));
					
					
	    			
	    		}else{
	    			this.rows[i] = row;
		    		var newTr = $(trHeader).clone().inject(trFooter,'before');
					// rimuove ogni stile dal tr intestazione
				    newTr.removeProperties('prevcolor','style','class');
				    //newTr.set('class',(i%2?'odd':'even'));
				    newTr.setStyle('background',(i%2?this.options.rowBgcolorEven:this.options.rowBgcolorOdd));
				    
				    var dataImg = newTr.getElements('.'+this.options.prefix+'img');
			    	$each(dataImg, function(td, index){
			    		if(td.get('rel')){
						   	var name = this._getFieldName(td.get('rel'));
						   	if($type(row[name])=='string'){
						   		if(row[name]!=''){
						    		td.set('html', '<img src="'+row[name]+'">');
						   		}else{
						   			td.set('html', '');
						   		}
						   	}
			    		}
					}.bind(this));
					
				    var dataLabel = newTr.getElements('.'+this.options.prefix+'label');
			    	$each(dataLabel, function(td, index){
			    		
			    		if(td.get('rel')){
						   	var name = this._getFieldName(td.get('rel'));
						   	if($type(row[name])=='string'){
						    	td.set('html', row[name]);
						   	}else if($type(row[name])=='array'){
						   		var fieldname = td.get('txt');
				    			if(fieldname){
				    				var html = '';
							   		try{
					    				html = eval('row[name]'+fieldname);
					    			}catch(e){
					    				
					    			}
							   		td.set('html', html);
				    			}else{
							   		var html = '';
							   		$each(row[name], function(objRow, indexObj){
							   			html += '<dl>';
							   			$each(objRow, function(objField, indexField){
							   				html += '<dt>'+indexField+'</dt><dd>'+objField+'</dd>';
							   			}.bind(this));
							   			html += '</dl>';
							   		}.bind(this));
							   		td.set('html', html);
				    			}
						   	}else{
						   		td.set('html', '');
						   	}
			    		}
					}.bind(this));
					
					var dataText = newTr.getElements('.'+this.options.prefix+'text');
			    	$each(dataText, function(td, index){
					   	var name = this._getFieldName(td.get('rel'));
					    td.set('html', row[name]);
					}.bind(this));
					
					var primaryKeyName = '';
					var primaryKey = '0';
					var dataPrimary = newTr.getElements('.'+this.options.prefix+'primarykey');
			    	$each(dataPrimary, function(td, index){
			    		primaryKeyName = td.get('rel');
			    		var name = this._getFieldName(primaryKeyName);
			    		primaryKey = row[name];
					    td.set('html', primaryKey);
					}.bind(this));
					
					var dataLink = newTr.getElements('.'+this.options.prefix+'link');
			    	$each(dataLink, function(td, index){
			    		var link = '';
					   	var elements = td.getChildren();
						$each(elements, function(element, index){
							element.setStyle('visibility','');
						});
					   	var baseLink = td.get('rel');
					   	var key = td.get('key');
					   	if(key){
					   		link = baseLink+'&'+key+'='+primaryKey;
					   	}else{
					   		link = baseLink+'&'+primaryKeyName+'='+primaryKey;
					   	}
					   	var linkName = td.get('html');
						var target = td.get('target');
		    			td.set('html', '<a href="'+link+'" '+((target!='' && target!=undefined)?'target="'+target+'"':'')+'>'+linkName+'</a>');
					}.bind(this));
					
					
					var dataSelect = newTr.getElements('.'+this.options.prefix+'select');
			    	$each(dataSelect, function(td, index){
			    		var name = this._getFieldName(td.get('rel'));
			    		td.setAttribute('sel', row[name]);
			    		
			    		var fieldname = td.get('txt');
			    		if(fieldname){
			    			var txtValue = row[name];
			    			try{
			    				txtValue = eval('row'+fieldname);
			    			}catch(e){
			    				
			    			}
					    	td.set('html', txtValue);
			    		}else{
			    			td.set('html', row[name]);
			    		}
			    	}.bind(this));
			    	
			    	// cicla sulle radio e reimposta l'opzione selezionata
					var dataRadio = newTr.getElements('.'+this.options.prefix+'radio');
			    	$each(dataRadio, function(td, index){
			    		var name = this._getFieldName(td.get('rel'));
			    		
					    td.set('html', row[name]);
					    td.setAttribute('sel', row[name]);
					}.bind(this));
					
					$each(newTr.getElements('.'+this.options.prefix+'button-insert'), function(newTr, index){
					    newTr.set('class', ''+this.options.prefix+'button-update');
					    newTr.set('html', '');
				    }.bind(this));
				    
				    $each(newTr.getElements('.delete'), function(newTr, index){
					    newTr.set('class', ''+this.options.prefix+'button-delete');
					    newTr.set('html', '');
					}.bind(this));
					
					this.addButtonsUpdate(newTr);
					this.addButtonsDelete(newTr);
					
					this.addEventsDblClick(newTr);
					this.addEventsDelete(newTr);
			    	this.addEventsUpdate(newTr);
	    		}
	    	}.bind(this));
	    	
	    	this.addButtonsPaging();
	    	this.addEventsPaging();
	    	
	    	this.renderTots(resp);
	    	
	    	netedit.ajax.hideLoading();
	    	
	    	netedit.tableBindEvents();
	    	if(this.options.onSearchComplete){
	    		this.options.onSearchComplete(resp);
	    	}
	    	
	    	if(this.options.appendPaging && this.currentPage>1){
		    	var myFx = new Fx.Scroll(window).toElement(trFooter, 'y');
	    	}
    	}catch(e){
    		alert('Error in respSearch:\n'+e);
    		if($(this.options.prefix+'loading')){
    			$(this.options.prefix+'loading').set('html', txt);
    		}
    	}
    },
    
    searchByForm: function(form){
	    form = $(form);
    	this.currentPage = 1;
    	var url = this.options.actionSearch;
    	form.set('action', url.replace(/\&amp;/g,'&'));
     	form.set('send', {
     			onComplete: this.respSearch.bind(this),
     			onRequest : function() {
     				this._deleteAllRows();
					netedit.ajax.showLoading(this.options.prefix+'loading');
				}.bind(this)
     		}
     	); 
    	var sendFormn = form.send();
    	this.lastActionSearch = url+'&'+form.toQueryString();
    	if(this.options.onSearch){
    		this.options.onSearch();
    	}
    	return false;
    },
    
    search: function(key, value, page){
    	if(page!=null){
    		this.currentPage = page;
    	}else{
    		this.currentPage = 1;
    	}
    	
    	var url = '';
    	
    	if(key!=null & value!=null){
    		// url ajax di ricerca
    		url = this.options.actionSearch+'&'+key+'='+value;
    	}else{
    		if(this.lastActionSearch!=''){
    			url = this.lastActionSearch;
    		}else{
    			url = this.options.actionSearch;
    		}
    	}
    	// salva l'url
    	this.lastActionSearch = url;
    	// aggiunge il paging
    	
    	url = url+'&'+this.options.keyPaging+'='+this.currentPage;
    	
    	if(this.currentOrder!=''){
    		url = url+'&'+this.options.keyOrder+'='+this.currentOrder;
    		url = url+'&'+this.options.keySort+'='+this.currentSort;
    	}
    	
		netedit.ajax.getData( 
			url.replace(/\&amp;/g,'&'),
			{
				method: 'get',
				onComplete: this.respSearch.bind(this),
				onRequest : function() {
					if(this.options.appendPaging==false || this.currentPage==1){
						this._deleteAllRows();
					}
					netedit.ajax.showLoading(this.options.prefix+'loading');
				}.bind(this)
			}
		);
		if(this.options.onSearch){
    		this.options.onSearch();
    	}
    },
    
    clickRow: function(e){
    	var event = new Event(e);
    	var tr = $(event.target).getParent();
    
    	if(this.options.onDblClick){
    		var row = {};
    	
    		
			var id = 0;
			var dataPrimary = tr.getElements('.'+this.options.prefix+'primarykey');
	    	$each(dataPrimary, function(td, index){
	    		var name = this._getFieldName(td.get('rel'));
			    id = td.get('html');
			}.bind(this));
		
			$each(this.rows, function(r, index){
				if(r.id==id){
					row = r;
				}
			
			}.bind(this));
    			
    		
    		var dataText = tr.getElements('.'+this.options.prefix+'text');
	    	$each(dataText, function(td, index){
			   	var name = this._getFieldName(td.get('rel'));
			    row[name] = td.get('html');
			}.bind(this));
			
			var dataPrimary = tr.getElements('.'+this.options.prefix+'primarykey');
	    	$each(dataPrimary, function(td, index){
	    		var name = this._getFieldName(td.get('rel'));
			    row[name] = td.get('html');
			}.bind(this));
			
			var dataSelect = tr.getElements('.'+this.options.prefix+'select');
	    	$each(dataSelect, function(td, index){
	    		var name = this._getFieldName(td.get('rel'));
			    row[name] = td.get('sel');
	    	}.bind(this));
	    	
	    	// cicla sulle radio e reimposta l'opzione selezionata
			var dataRadio = tr.getElements('.'+this.options.prefix+'radio');
	    	$each(dataRadio, function(td, index){
	    		var name = this._getFieldName(td.get('rel'));
	    		row[name] = td.get('sel');
			}.bind(this));
			
    		this.options.onDblClick(row);
    	}
    },
    
    prevPage: function(e){
    	var event = new Event(e);
    	this.search(null, null, this.currentPage-1);
    },
    
    nextPage: function(e){
    	var event = new Event(e);
    	this.search(null, null, this.currentPage+1);
    },
    
    excel: function(e){
    	var event = new Event(e);
    	var mainDiv = $(this.options.divId);
    	var html = mainDiv.get('html');
    	html = netedit.removeTags(html, 'img');
    	var formExcel = $(this.options.prefix+'formExcel');
    	if(!formExcel){
    		var url = this.options.actionExcel.replace(/\&amp;/g,'&'),
    	
    		formExcel = new Element('form', {id: this.options.prefix+'formExcel', method:'POST', target:'_blank', action:url, style:'display:none'});
    		formExcel.inject(document.body);
    	}
    	formExcel.set('html','<textarea name="excel">'+html+'</textarea>');
    	formExcel.submit();
    },
    
    renderTots:function(resp){
    	var tots = this.options.tots;
    	if($H(tots).getLength()>0){
	    	$each(resp, function(row, i){
				if(i=='n-rows'){
					
				}else{
					$each(tots, function(tot, k){
						tots[k] += row[k].toFloat()
					});
				}
			}.bind(this));
			var mainDiv = $(this.options.divId);
			var trs = mainDiv.getElements('tr');
			var nTrs = trs.length;
			var trHeader = trs[0];
		    var trFooter = trs[nTrs-1];
			var newTr = $(trHeader).clone().inject(trFooter,'before');
			
			var tds = newTr.getElements('td');
			$each(tds, function(td, index){
				if(td.get('rel')){
				   	var name = this._getFieldName(td.get('rel'));
				   	if(!!(tots[name] || tots[name] === 0)){
				    	td.set('html', tots[name]);
				   	}else{
				   		td.set('html', '');
				   	}
				}else{
					td.set('html', '');
				}
			}.bind(this));
    	}
    },
    
    _getFieldName: function(name){
		if(name.contains('[')){
	    	start = name.indexOf("[");
	    	end = name.indexOf("]");
	    	name = name.substring(start+1,end);
	    }
	    
	    return name;
    },
    
    _getNVisibleRows: function(){
    	var mainDiv = $(this.options.divId);
    	var trs = mainDiv.getElements('tr');
    	var nTrs = trs.length;
    	return (nTrs-2);
    },
    
    _getNPerPage: function(){
    	var typeNPerPage = $type(this.options.nPerPage);
    	
		if(typeNPerPage=='element'){
			return this.options.nPerPage.value;
		}else{
			return this.options.nPerPage;
		}
		
    },
    
    _deleteAllRows: function(){
		// elimina tutti i tr tranne il primo (header) e l'ultimo (footer)
		var mainDiv = $(this.options.divId);
		var trs = mainDiv.getElements('tr');
		var nTrs = trs.length;
	
		$each(trs, function(tr, index){
			if(index!=0 && (nTrs-1)!=index){
				tr.dispose();
			}
		}.bind(this));
    }
});


/* 
-----------------------------
---------- ESEMPIO ----------
-----------------------------

<script>
window.addEvent("domready", function(){
	var myNeteditAjaxTable = new neteditAjaxTable(
		{
			selects: $H({'tabella[sesso]':{'m':'maschio','f':'femmina'}}),
			radios: $H({'tabella[radio]':{'0':'Presente','1':'eliminato'}}),
			prefix:'data-',
			divId:'table-ajax',
			actionUpdate:'',
			actionDelete:'',
			actionSearch:'',
			searchName:''
		}
	);
});
</script>

<div id="table-ajax">
	<div id="data-loading"></div>
	<table align="center" cellpadding="5" cellspacing="0" id="root">
		<tr class="netedit-header">
			<td class="data-button-insert"></td>
			<td class="data-button-delete"></td>
			<td class="data-primarykey" rel="tabella[id]">Id</td>
			<td class="data-text" rel="tabella[nome]">Nome</td>
			<td class="data-text" rel="tabella[cognome]">Cognome</td>
		</tr>
		<tr>
			<td class="data-button-update"></td>
			<td class="data-button-delete"></td>
			<td class="data-primarykey" rel="tabella[id]">1</td>
			<td class="data-text" rel="tabella[nome]">caio</td>		
			<td class="data-text" rel="tabella[cognome]">il suo cognome</td>
			<td class="data-select" rel="tabella[sesso]" sel="m">maschio</td>
			<td class="data-radio" rel="tabella[radio]" sel="0">Presente</td>
		</tr>
		<tr>
			<td class="data-n-rows" colspan="2"></td>
			<td class="data-paging" colspan="3"></td>
		</tr>
	</table>
</div>



*/
