var neteditSearch = new Class({
	Implements: Options,
	
    options: {
        firstLiIsNew				: false,
		autoHideSuggestions			: true,
		autocompleteArrowKeys		: true,
		autocompletePointerHover	: true,
		loopArrowKeys				: true,
		selFunction					: null,
		
		checkExistUrl				: '',
		checkExistFKey				: 'foreignKey',
		checkExistFKValue			: '0',
		checkExistAFKey				: 'associationForeignKey',
		
		searchContainerId			: "searchContainer",
		minLenght					: 2,
		liClass						: "liNeteditSearchClass",
		liHoverClass          		: "liNeteditSearchClassHover",
		liID						: "liNeteditSearchID",
		ulID						: "ulNeteditSearchID",
		ulClass						: "ulNeteditSearchClass",
		keySearch					: "q",
		keyRecordValue 				: "id",
		keyRecordText 				: "name",
		url 						: "",
		inputID						: "HABTMsearch",
		
		trPrefixID					: "HABTMtr_",
		trFooterID					: "HABTMtr_bottom",
		inputHiddenAdd				: "HABTM[product_field][add][]",
		inputHiddenDel				: "HABTM[product_field][del][]",
		inputHiddenDelAll			: "HABTM[product_field][del_all]",
		divHiddenDelID				: "inputs_hidden",
		aDelClass					: "aNeteditDelClass"
    },

	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){
    	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{
	    		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('keyup', function(e){
    		var event = new Event(e);
    		var query  = this.inputSearch.value;
    		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) {  // Any key except "Enter".
    				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;
	        				
	        				}.bind(this),
	        				onRequest : function() {
								netedit.ajax.showLoading(this.options.searchContainerId);
							}.bind(this)}
	        			);
        			}
    			}else{  // "Enter" 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));
    },
    
    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;
				}
	    		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.remove();
				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 = '<?=String::uriOnlyModule(String::arrayModule('products','products_fields','searchJSON'))?>'

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