var neteditSearch = new Class({
	Implements: Options,
	
    options: {
        firstLiIsNew				: false, 	/* se č true mette come prima riga nuovo*/
		autoHideSuggestions			: true,  	/* ? */
		autocompleteArrowKeys		: false,		/* quando vado su o giu con le frecce mi riempie l'inpute text con il valore selezionato con le frecce*/
		autocompletePointerHover	: false,		/* quando vado su o giu con il mouse(over) mi riempie l'inpute text con il valore selezionato con il mouse*/
		loopArrowKeys				: true,		/* quando sono sull'ultimo elemento in basso e premo di nuovo giu va al primo*/
		selFunction					: null,		/* IMPORTANTE - funzione da chiamare quando faccio click o enter sull'elemento*/
		
		findWhenKeyUp				: true,
		autoClickLi					: false,
		
		checkExistUrl				: '',
		checkExistFKey				: 'foreignKey',
		checkExistFKValue			: '0',
		checkExistAFKey				: 'associationForeignKey',
		
		searchContainerId			: "searchContainer",				/*IMPORTANTE - id del div che verrą riempito con i risultati della ricerca*/
		minLenght					: 2,								/*IMPORTANTE - numero di caratteri minimo dopo il quale effettua la ricerca*/
		liClass						: "liNeteditSearchClass",			/*classe css: riga dei risultati della ricerca*/
		liHoverClass          		: "liNeteditSearchClassHover",		/*classe css: riga selezionata dei risultati della ricerca*/
		liID						: "liNeteditSearchID",				/*id: riga dei risultati della ricerca*/
		ulID						: "ulNeteditSearchID",				/*id: ul dei risultati della ricerca*/
		ulClass						: "ulNeteditSearchClass",			/*classe css: ul dei risultati della ricerca*/
		keySearch					: "q",								/*IMPORTANTE - nome della chiave di ricerca GET*/
		keyRecordValue 				: "id",								/*IMPORTANTE - nome della chiave id della riga*/
		keyRecordText 				: "name",							/*IMPORTANTE - nome della chiave testo della riga*/							
		url 						: "",								/*IMPORTANTE - url richiesta AJAX*/
		inputID						: "HABTMsearch",					/*IMPORTANTE - id dell'input di ricerca*/
		/* ----------- riempire solo se voglio la funzionalitą rimpie Tabella (molti a molti)------------- */
		trPrefixID					: "HABTMtr_",						/*IMPORTANTE - id del prefisso del tr quando il risultato selezionato viene aggiunto alla tabella*/
		trFooterID					: "HABTMtr_bottom",					/*IMPORTANTE - id del prefisso dell'ultimo tr in basso che serve come riferimento: i tr verranno inseriti sopra questo*/
		inputHiddenAdd				: "HABTM[product_field][add][]",	/*IMPORTANTE - */
		inputHiddenDel				: "HABTM[product_field][del][]",	/*IMPORTANTE - */
		inputHiddenDelAll			: "HABTM[product_field][del_all]",	/*IMPORTANTE - */
		divHiddenDelID				: "inputs_hidden",					/*IMPORTANTE - */
		aDelClass					: "aNeteditDelClass"				/*IMPORTANTE - */
    },

	initialize: function(options){
		this.setOptions(options);
		this.liNew 			= "<li class='" + this.options.liClass + "' id='" + this.options.liID + "-0'>- Nuovo -</li>";
		this.start	 		= "<ul class='" + this.options.ulClass + "' id='" + this.options.ulID + "'>";
        this.end      		= "</ul>";
        this.aux            = "";
        this.middle 		= "";
        this.currli         = -1;
        this.prevli         = 0;
        this.lisize         = 0;
        this.response 		= {};
        this.selectedRecord = null;
        this.inputSearch	= null;
        this.splitID		= null;
        
        if (this.options.autoHideSuggestions) {
        	$$("*").each(function(el){
        		el.addEvent('click', function(e){
		    		this.emptySuggestions();
		    	}.bind(this));
		    }.bind(this));
        }
        
    	this.emptySuggestions();
        	
        this.bindEventsInput();
        this.bindEventsDel();
    },
    
    clickLi: function(liID){
    	if(liID==''){
    		if(this.options.autoClickLi && this.options.selFunction){
				this.options.selFunction(null);
				this.inputSearch.value = "";
    			this.emptySuggestions();
			}
    	}else{
	    	this.splitID = liID.split('-');
			if(this.splitID[0] != this.options.liID){
				alert("ERROR:\n liID: "+this.options.liID);
			}else{
				if(this.splitID[1]==0 && this.options.firstLiIsNew){
					if(this.options.selFunction){
						this.options.selFunction(null);
						//this.inputSearch.value = "";
		    			this.emptySuggestions();
					}
				}else{
					if(this.response){
			    		this.response.each(function(record, i) {
			    			if(record[this.options.keyRecordValue]==this.splitID[1]){
			    				this.selectedRecord = record;
			    				if(this.options.selFunction){
			    					this.options.selFunction(this.selectedRecord);
			    				}else{
			    					this.addItem(this.selectedRecord[this.options.keyRecordValue], this.selectedRecord[this.options.keyRecordText]);
			    				}
			    				//this.inputSearch.value = "";
			    				this.emptySuggestions();
			    			}
			    		}.bind(this));
					}
				}
			}
    	}
    },
    
    emptySuggestions: function(){
    	var container = $(this.options.searchContainerId);
    	if(container){
		    container.set('html','');
	    	currli = -1;
    	}else{
    		alert("ERROR:\n Container: "+this.options.searchContainerId+" non trovato!");
    	}
    },
    
    bindEventsInput: function(){
    	this.inputSearch = $(this.options.inputID);
    	
    	this.inputSearch.addEvent('blur', function(e){
    		if(!this.options.findWhenKeyUp) this.find();
    	}.bind(this));
    	    	
    	this.inputSearch.addEvent('keyup', function(e){
    		var event = new Event(e);
    		if($(this.options.ulID)){
    			this.lisize = $(this.options.ulID).getChildren().length;
    		}
    		if ((event.code >= 37) && (event.code <= 40)) {
    			event.stop();
    			event.stopPropagation();
    			event.preventDefault();

    			if (this.lisize > 0) {
                    this.prevli = (this.currli == -1) ? 0 : this.currli;
                    if ((event.code == 39) || (event.code == 40)) { // "Down" and "Right" keys, moving forward in the suggestions list.
                        if (this.options.loopArrowKeys) {
                            this.currli = (this.currli == (this.lisize - 1)) ? 0 : (this.currli + 1);
                        }else {
                            this.currli = (this.currli == (this.lisize - 1)) ? (this.lisize - 1) : (this.currli + 1);
                        }
                    }else {                                    		// "Up" and "Left" keys, moving backwards in the suggestions list.
                        if (this.options.loopArrowKeys) {
                            this.currli = (this.currli <= 0) ? (this.lisize - 1) : (this.currli - 1);
                        }else {
                            this.currli = (this.currli <= 0) ? 0 : (this.currli - 1);
                        }
                    }
                    
                    if($(this.options.ulID)){
	                    $(this.options.ulID).getChildren().each(function(el, i){
							if(i==this.prevli){
								el.addClass(this.options.liClass);
								el.removeClass(this.options.liHoverClass);
							}
							if(i==this.currli){
								el.addClass(this.options.liHoverClass);
								el.removeClass(this.options.liClass);
							}
						}.bind(this));
	                   
	                    if (this.options.autocompleteArrowKeys) {
	                    	$(this.options.ulID).getChildren().each(function(el, i){
								if(i==this.currli){
	                        		this.inputSearch.value = el.innerHTML;
								}
							}.bind(this));
	                    }
                    }
                }
    		}else{
    			if (event.code != 13 && event.code != 9) {  // Any key except "Enter" e "Tab".
    				if(this.options.findWhenKeyUp) this.find();
    			}else{  // "Enter" or "Tab" key pressed.
					if(this.currli!=-1){
						event.stop();
		    			event.stopPropagation();
		    			event.preventDefault();
						$(this.options.ulID).getChildren().each(function(el, i){
							if(i==this.currli){
								this.clickLi(el.id);
							}
						}.bind(this));
					}
				}
    		}
    	}.bind(this));
    },
    
    find: function(){
    	var query  = this.inputSearch.value;
    	this.bindEventsList();
		if(query.length >= this.options.minLenght){
			netedit.ajax.getData(this.options.url+"&"+this.options.keySearch+"="+query, 
				{onComplete: function(txt){
    				netedit.ajax.hideLoading();
					this.response	= eval('(' + txt + ')');
    				this.middle     = "";
                    this.aux        = "";
                    if(this.options.firstLiIsNew){
                    	this.middle += this.liNew;
					}
    				if(this.response){
    					$each(this.response, function(record) {
    						this.aux = "<li class='" + this.options.liClass + "' id='" + this.options.liID + "-" + record[this.options.keyRecordValue] + "'>" + record[this.options.keyRecordText] + "</li>";
    						this.middle += this.aux;
    					}.bind(this));
    				}
    				
    				if (this.middle != "") {
    					
                    	$(this.options.searchContainerId).set('html',this.start + this.middle + this.end);
                       	this.bindEventsList();
                    }else if ($(this.options.searchContainerId).innerHTML != "") {
                    	this.emptySuggestions();
                    }
                    this.currli =-1;
					
                    
                    if(this.options.autoClickLi){
                    	if(this.inputSearch.value.length >= this.options.minLenght){
	                    	if(this.response){
		                    	var lisize = this.response.length;
		                    	if(lisize<=1){
			                    	if(this.options.firstLiIsNew){
			                    		this.currli = (lisize);
			                    	}else{
			                    		
			                    		this.currli = (lisize-1);
			                    		if(lisize==0){
			                    			this.clickLi('');
			                    		}
			                    	}
		                    	}
	                    	}else{
	                    		this.currli = 0;
	                    	}
	                    	
	                    	$(this.options.ulID).getChildren().each(function(el, i){
								if(i==this.currli){
									this.clickLi(el.id);
								}
							}.bind(this));
                    	}
                    }
                    
				}.bind(this),
				onRequest : function() {
					netedit.ajax.showLoading(this.options.searchContainerId);
				}.bind(this)}
			);
		}	
    },
    
    bindEventsList: function() {
    	var lis = $$("." + this.options.liClass);
    	var me = this;
    	if(lis){
	    	lis.each(function(li){
	    		li.addEvent('mouseout', function(e){
					var event = new Event(e);
					var elem = e.target;
					if(!elem){
						elem = e.srcElement;
					}
	                elem.addClass(me.options.liClass);
	                elem.removeClass(me.options.liHoverClass);
	            
				}.bind(me));
				
	    		li.addEvent('click', function(e){
		    		var event = new Event(e);
		    		var elem = e.target;
					if(!elem){
						elem = e.srcElement;
					}
		    		
		    		me.clickLi(elem.id);
		    		event.stop();
	    			event.stopPropagation();
	    			event.preventDefault();
		    	}.bind(me));
		    	
		    	li.addEvent('mouseover', function(e){
					var event = new Event(e);
					var elem = e.target;
					if(!elem){
						elem = e.srcElement;
					}
					
					if (me.options.autocompletePointerHover) {
	                    me.inputSearch.value = elem.innerHTML;
	                }
	                
	                if (me.currli != -1) {
	                	$(me.options.ulID).getChildren().each(function(el, i){
							if(i==me.currli){
								el.addClass(me.options.liClass);
								el.removeClass(me.options.liHoverClass);
							}
						}.bind(me));
	                }
	               
	                $(me.options.ulID).getChildren().each(function(el, i){
						if(elem==el){
							me.currli = i;
							elem.addClass(me.options.liHoverClass);
	                		elem.removeClass(me.options.liClass);
						}
					}.bind(me));
	                
				}.bind(me));
				
	    	}.bind(me));
    	}
    },
    
    addItem: function(id, text){
    	// controlla se esiste la riga
		var tr = $(this.options.trPrefixID+id);
		if(!tr){
			if(this.options.checkExistUrl!='' && this.options.checkExistFKValue!='0'){
				this.options.checkExistAFKValue = id;
				this.options.checkExistAFKText = text;
				netedit.ajax.getData(this.options.checkExistUrl+"&"+this.options.checkExistFKey+"="+this.options.checkExistFKValue+"&"+this.options.checkExistAFKey+"="+this.options.checkExistAFKValue, 
					{onComplete: function(txt){
						netedit.ajax.hideLoading();
						try{
							var resp = eval('(' + txt + ')');
							if(!resp){
								this.addItemTr(this.options.checkExistAFKValue, this.options.checkExistAFKText);	
							}
						}catch(e){
							alert(this.options.checkExistUrl+'\n'+e);
						}
					}.bind(this),
    				onRequest : function() {
						netedit.ajax.showLoading(this.options.searchContainerId);
					}.bind(this)}
				);
				
			}else{
				this.addItemTr(id, text);
			}
			return true;
		}
		return false;
    },
    
    addItemTr:function(id, text){
    	var tdArray = new Array;
		tdArray[0]= '<input type="hidden" name="'+this.options.inputHiddenAdd+'" value="'+id+'">'+text;
		tdArray[1]= '<a href="#" class="'+this.options.aDelClass+'" rel="'+id+'"><img src="libs/views/imgs/del.png" border=0></a>';
		
		netedit.addTr(this.options.trFooterID, tdArray, this.options.trPrefixID+id);
		
		this.bindEventsDel();
    },
    
    bindEventsDel: function(){
    	var me = this;
    	$$('.'+me.options.aDelClass).each(function(a){
			a.addEvent('click', function(e){
	    		var event = new Event(e);
	    		var elem = e.target;
				if(!elem){
					elem = e.srcElement;
				}
				if(elem.get('tag')=='img'){
					elem = elem.getParent();
				}
	    		var a = elem;
	    		var id = a.getAttribute('rel');
	    		me.delRow(id);
	    		
	    		event.stop();
    			event.stopPropagation();
    			event.preventDefault();
	    	}.bind(me));
		}.bind(me));
    },
    
    delRow: function(id){
		var tr = $(this.options.trPrefixID+id);
		if(tr){
			if(confirm('Sei sicuro di eliminare questa riga?')){
				
				tr.dispose();
				var label = $(this.options.divHiddenDelID);
				if(label){
					html = '<input type="hidden" name="'+this.options.inputHiddenDel+'" value="'+id+'">';
					label.set('html',label.innerHTML + html);
				}else{
					alert('ERROR:\n divHiddenDelID: '+this.options.divHiddenDelID+' non trovato!');
				}
			}
		}
	},
	
	delAllRow: function(){		
		if(confirm('Sei sicuro di eliminare tutti gli elementi?')){
			
			$$('.'+this.options.aDelClass).each(function(a){
				a.parentNode.parentNode.remove(true);
			});
			var tr = $(this.options.trFooterID);
			tr.firstElementChild.set('html','');
			tr.lastElementChild.set('html','');
			
			var label = $(this.options.divHiddenDelID);
			if(label){
				html = '<input type="hidden" name="'+this.options.inputHiddenDelAll+'" value="1">';
				label.set('html',label.innerHTML + html);
			}else{
				alert('ERROR:\n divHiddenDelID: '+this.options.divHiddenDelID+' non trovato!');
			}
		}
		return false;
	}
	
});
/**
 ********* ESEMPIO ********
<link rel="stylesheet" href="js/libs/mootools/netedit.search.css" type="text/css" media="screen" />
<script type="text/javascript" src="js/libs/mootools/netedit.search.js"></script>

window.addEvent('domready',function (){
	var url = '<?=dispatcher::urlAJAX(array('controller'=>'uniorario','sub_controller'=>'calendar','action'=>'searchJSON'))?>'

	myHABTM = new neteditSearch(
		{
			url 				: url.replace(/\&amp;/g,'&'),
			//selFunction		: selFunction,
			keySearch 			: "product_field[name]",
			searchContainerId	: "HABTMlist",
			keyRecordText		: "name_type"
		}
	);
});
*/