﻿//<![CDATA[
/*******************************************************************
	Il seguente oggetto è derivato da autocomplete.js
	Funzione da richiamare:
	ODacGen.autocomplete(this,event,'NOMEARRAY'[,WIDTH]);
	
	Legenda:
	WINNAME			nome div della lista di voci
	WINCLASS			classe CSS associata
	ITEMNAME			suffisso dei div degli elementi
	ITEMCLASS			classe CSS dei div non selezionati
	ITEMCLASSSEL		classe CSS dei div selezionati
	VALUEOK(_RGB)		colore dello sfondo in caso di valore
						presente in lista
	VALUEERR(_RGB)		colore dello sfondo in caso di errore
	INPDISABLED(_RGB)	colore sfondo campo disabilitato
	WIDTH				larghezza div dei suggerimenti
	HEIGHT_MIN			altezza minima div dei suggerimenti
	HEIGHT_MAX			altezza massima div dei suggerimenti
	DELAY           			ritardo nell'autocomplete su BACKSPACE e DEL
							-1 = disabilitato
	MINACT          			numero minimo di caratteri di attivazione
	RESNUM          			numero massimo di risultati in lista
							-1 = illimitato
*******************************************************************/
var ODacGen = {
    VERSION:        			'1.1',
    WINNAME:       				'aclgen_autocomp',
    WINCLASS:      				'aclgen_autocompletelist',
    ITEMNAME:      				'aclgen',
    ITEMCLASS:     				'aclgen_autocompleteitem',
    ITEMCLASSSEL:  				'aclgen_autocompleteitemsel',
    VALUEOK:       				'#fff',
	VALUEOK_RGB:				'rgb(255, 255, 255)',
	VALUEERR:      				'#faa',
	VALUEERR_RGB:  				'rgb(255, 170, 170)',
	INPDISABLED:				'#ddd',
	INPDISABLED_RGB:			'rgb(221, 221, 221)',
	INPUT_SPLIT:				'___',
	INPUT_BASEID:				'aclgen_ricerca',
	STATUSOK:					false,
	TID:						null,
	WIDTH:						-1,
	HEIGHT_MIN:					20,
	HEIGHT_MAX:					300,
	heightAdjust:				0,
    DELAY:        			 	1000,
	MINACT:       			 	1,
	RESNUM:        				-1,
    DIFF:          				2,
	BACKS:         				8,
	DEL:         				46,
	UP: 	       				38,
	DOWN:  	    				40,
	ENTER:        			 	13,
	ASCMIN:       			 	48,
	ASCMAX:        				122,
	curpos:        				0,
	AUTOCOMPLETESINGLERESULT:	false,
	VISUALFEEDBACK:				false,
	TS:							0,
	hideTimeout:				200,
	hideACL:					false,
	list:						null,
	mlist:						null,

	$:				function(id) {
						if (document.getElementById(id)!='undefined') {
							return document.getElementById(id);
						}
						return null;
					},
	inspect:       	function(o) {
						for (var t in o) {
							if ( ! confirm(t+":\n"+o[t])) {
								break;
							}
						}
					},
	getWidHei:		function() {
						var win = null;
						if (parseInt(navigator.appVersion) > 3) {
							win = {};
							if (''+navigator.appName == "Netscape") {
								win.width  = window.innerWidth;
								win.height = window.innerHeight;
							}
							if ((''+navigator.appName).indexOf("Microsoft") != -1) {
								win.width  = document.body.offsetWidth;
								win.height = document.body.offsetHeight;
							}
						}
						return win;
					},
	init:			function(t) {
						if (ODacGen.TS == 0) {
							ODacGen.TID = t.id;
							ODacGen.TS = parseInt(t.id.split(ODacGen.INPUT_SPLIT)[1]); // inizializzo il TimeStamp usato per evitare l'autocomplete dei browser (FF)
							t.setAttribute('autocomplete','off');
						}
					},
	curinit:       	function() {
						ODacGen.curpos=0;
					},
	addList:       	function(l) {
						ODacGen.list=l;
					},
	l4it:          	function(s) {
					  if (ODacGen.list) {
	                    ODacGen.mlist = new Array();
						var c=0;
	                    for(i=0; i<ODacGen.list.length; i++) {
							if (ODacGen.RESNUM != -1 && c >= ODacGen.RESNUM) {
								break;
							}
	                        if ((ODacGen.list[i].toLowerCase()).indexOf(s.toLowerCase()) == 0) {
	                           	(ODacGen.mlist).push(ODacGen.list[i]);
	                           	c++;
							}
						}
						if (c==0) {
							return false;
						}
						return true;
					  }
					  return false;
					},
	l4it_exact:    	function(s) {
					  if (ODacGen.list) {
	                    ODacGen.mlist = new Array();
						var c=0;
	                    for(i=0; i<ODacGen.list.length; i++) {
							if (ODacGen.RESNUM != -1 && c >= ODacGen.RESNUM) {
								break;
							}
	                        if (ODacGen.list[i].toLowerCase() == s.toLowerCase()) {
	                           	(ODacGen.mlist).push(ODacGen.list[i]);
	                           	c++;
							}
						}
						if (c==0) {
							return false;
						}
						return true;
					  }
					  return false;
					},
	win:           	function() {
						return ODacGen.$(ODacGen.WINNAME);
					},
	checkVal:		function() {
						if (ODacGen.TS != 0) {
							var myinput = ODacGen.$(ODacGen.INPUT_BASEID +ODacGen.INPUT_SPLIT +ODacGen.TS)
							if (myinput.value.length == 0) {
								ODacGen.valueOK(myinput);
							}
							else {
								if (! ODacGen.l4it(myinput.value)) {
									ODacGen.valueERR(myinput);
								}
							}
						}
					},
	checkVal_exact:	function() {
						if (ODacGen.TS != 0) {
							var myinput = ODacGen.$(ODacGen.INPUT_BASEID +ODacGen.INPUT_SPLIT +ODacGen.TS)
							if (myinput.value.length == 0) {
								ODacGen.valueOK(myinput);
							}
							else {
								if (! ODacGen.l4it_exact(myinput.value)) {
									ODacGen.valueERR(myinput);
								}
							}
						}
					},					
	hide:          	function() { //alert("caller is " + arguments.callee.caller.toString());
						ODacGen.win().style.display = 'none';
	                    ODacGen.win().style.width   = '0px';
						ODacGen.win().style.height  = '0px';
						var t = ODacGen.$(ODacGen.TID);
						var s = ODacGen.getValue(t);
						if (s.length >= ODacGen.MINACT) {
							ODacGen.checkVal_exact();
						}
						else {
							ODacGen.valueOK(t);
						}
					},
	canShow:		function() {
						if (ODacGen.TS != 0) {
							ODacGen.hideACL = false;
						}
					},
	mustHide:		function() {
						if (ODacGen.TS != 0) {
							ODacGen.hideACL = true;
							window.setTimeout(function() {
								if (ODacGen.hideACL == true) {
									ODacGen.hide();
								}
							}, ODacGen.hideTimeout);
						}
					},
	eventStop:		function(e) { //alert('1 - '+e);
						if (!e) {
							var e = window.event;
						} //alert('2 - '+e);
						e.cancelBubble = true;
						if (e.stopPropagation) {
							e.stopPropagation();
						}
					},
	clickSel:		function(tid,idx) {
						if (ODacGen.TS != 0) {
							var t = ODacGen.$(tid);
							ODacGen.curpos = idx;
							if ((ODacGen.win()).style.display != 'none') {
								if (ODacGen.mlist != null && ODacGen.mlist != 'undefined') {
									var lenMin = 0;
									if (ODacGen.AUTOCOMPLETESINGLERESULT) {
										lenMin = 1;
									}
									if (ODacGen.curpos >= 0 && ODacGen.curpos<(ODacGen.mlist).length && (ODacGen.mlist).length > lenMin) {
										var s = ODacGen.getValue(t);
										t.value = ODacGen.$(ODacGen.ITEMNAME+ODacGen.curpos).innerHTML;
										ODacGen.assign(t,s,ODacGen.$(ODacGen.ITEMNAME+ODacGen.curpos).innerHTML);
										ODacGen.hide();
									}
								}
							}
							else {
								var inpval = ODacGen.$(ODacGen.INPUT_BASEID +ODacGen.INPUT_SPLIT +ODacGen.TS).value;
								if (inpval.length > 0) {
									ODacGen.$(ODacGen.INPUT_BASEID +ODacGen.INPUT_SPLIT +'submit').click();
								}
							}
						}
					},
	moveSel:		function(idx) {
						var o = ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos);
						o.className = ODacGen.ITEMCLASS;
						ODacGen.curpos = idx;
						o = ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos);
						o.className = ODacGen.ITEMCLASSSEL;
					},					
	setSel:			function(i,s,e) {
						if (/gecko/i.test(navigator.userAgent)) {
							i.setSelectionRange(s,e);
						}
						else {
							if (/MSIE/.test(navigator.userAgent)) {
								var r = i.createTextRange();
								r.collapse(true);
								r.moveStart("character",s);
								r.moveEnd("character",e-s);
								r.select();
							}
						}
					},
	assign:        	function(t,s,v) {
						t.value = v;
					    ODacGen.setSel(t,s.length,v.length);
						// ------------------------------ aggiungo il codice per impostare il relativo campo nascosto
						var valarr = null;
						try {
							valarr = (t.id).split(ODacGen.INPUT_SPLIT);
							if (valarr.length == 2) {
								(ODacGen.$(valarr[0])).value = v;
							}
						}
						catch (e) {
							// EMPTY !!! #####
						};
					},
	getValue:      	function(t) {
						return ''+t.value;
					},
	valueOK:       	function(t) {
						if (ODacGen.VISUALFEEDBACK) {
							t.style.backgroundColor = ODacGen.VALUEOK;
							ODacGen.STATUSOK = true;
						}
					},
	valueERR:      	function(t) {
						if (ODacGen.VISUALFEEDBACK) {
							t.style.backgroundColor = ODacGen.VALUEERR;
							ODacGen.STATUSOK = false;
						}
					},
	validAsk:		function() {
						if (ODacGen.STATUSOK) {
							if (ODacGen.TS != 0) {
								var c,v;
								if ( ! ODacGen.l4it(c.value)) {
									ODacGen.valueERR(c);
									return false;
								}
							}
							return true;
						}
						else {
							return false;
						}
					},
	getHeights:		function(limit) {
						var realHeight=0;
						for (var q=0; q<limit; q++) {
							realHeight += ODacGen.$(''+ODacGen.ITEMNAME +q).offsetHeight +ODacGen.heightAdjust;
						}
						return realHeight;
					},
	completa:     	function(t,cwid) {
						//alert(t.parentNode.parentNode.parentNode.parentNode.parentNode.style.position+"\n offsetTop: "+t.parentNode.parentNode.parentNode.parentNode.parentNode.offsetTop+"\n offsetLeft:"+t.parentNode.parentNode.parentNode.parentNode.parentNode.offsetLeft+"\n scrollTop:"+t.scrollTop+"\n scrollLeft:"+t.scrollLeft);
						var aclgen_offsetTop = jQuery('.aclgen_autocomp_class').offset().top-0;
						var aclgen_offsetLeft = jQuery('.aclgen_autocomp_class').offset().left-22;//-20;

						var s = ODacGen.getValue(t);
						if (s.length >= ODacGen.MINACT) {
						    var ret = ODacGen.l4it(s);
						    if (ODacGen.VALUEOK != ODacGen.VALUEERR) {
						    	if 	(!ret && s.length>0) {
									ODacGen.valueERR(t);
								}
								else {
									ODacGen.valueOK(t);
								}
							}
						    var len = (ODacGen.mlist).length;
						    if (len > 0) {
						        var ac = ODacGen.win();
								if  (len == 1 && ODacGen.AUTOCOMPLETESINGLERESULT) {
									ODacGen.assign(t,s,ODacGen.mlist[0]);
								}
								else {
								    ODacGen.curinit();
								    var cls = ODacGen.ITEMCLASSSEL;
								    var out = '';
									var i;
									for(i=0; i<len; i++) {
										out += '<a style="display:block;" href="#" id="'+ODacGen.ITEMNAME+i+'" class="'+cls+'" onkeydown="this.focus();" onmousedown="ODacGen.clickSel(\''+t.id+'\','+i+');" onmouseover="ODacGen.moveSel('+i+');">'+ODacGen.mlist[i]+'</a>';
										cls = ODacGen.ITEMCLASS;
									}
									ac.innerHTML = out;
									if (''+BrowserDetect.browser == 'Opera') {
										//ac.style.top = (t.offsetTop +t.offsetHeight +ODacGen.DIFF) +'px';
										//ac.style.left = (t.offsetLeft -15) +'px';
										ac.style.top = (aclgen_offsetTop +t.offsetHeight +ODacGen.DIFF) +'px';
										ac.style.left = (aclgen_offsetLeft -15) +'px';
		 							}
									else {
		 								//ac.style.top = (t.offsetTop +t.scrollTop +t.offsetHeight +ODacGen.DIFF) +'px';
										//ac.style.left = (t.offsetLeft +t.scrollLeft -15) +'px';
										ac.style.top = (aclgen_offsetTop +t.scrollTop +t.offsetHeight +ODacGen.DIFF) +'px';
										ac.style.left = (aclgen_offsetLeft +t.scrollLeft -15) +'px';
									}
									ac.style.display = 'block';
									ac.style.height = '10000px';
									if (cwid == null){
										if (ODacGen.WIDTH != -1) {
											ac.style.width = ODacGen.WIDTH +'px';
										}
										else {
											ac.style.width = (t.offsetWidth -ODacGen.DIFF)  +'px';
										}
									}
									else {
										ac.style.width = cwid +'px';
									}
									var realHeight = ODacGen.getHeights((ODacGen.mlist).length);
									if  (realHeight<ODacGen.HEIGHT_MIN) {
										realHeight = ODacGen.HEIGHT_MIN;
									}
									if  (realHeight>ODacGen.HEIGHT_MAX) {
										realHeight = ODacGen.HEIGHT_MAX;
									}
									ac.style.height = realHeight +'px';
									if (cwid == null){
										if (ODacGen.WIDTH != -1) {
											ac.style.width = ODacGen.WIDTH +'px';
										}
										else {
											ac.style.width = (t.offsetWidth -ODacGen.DIFF)  +'px';
										}
									}
									else {
										ac.style.width = cwid +'px';
									}
									ac.scrollTop = 0;
									ac.style.display = 'block';
									ODacGen.curinit();
								}
						    }
						}
						else {
							ODacGen.hide();
						}
					},
	scrollit:     	function() {
						var w  = ODacGen.win();
						var wh = w.offsetHeight;
						var wt = w.scrollTop;
						var h  = ODacGen.$(''+ODacGen.ITEMNAME +ODacGen.curpos).offsetHeight;
						var it = ODacGen.getHeights(ODacGen.curpos+1);
						if (it < wt +h || it > wt +wh) {
							if (it<wt+h) {
								wt -= h;
								if (wt < h) {
									wt = 0;								
								}
							}
							else {
								wt += h;
								if (wt > wt +wh) {
									wt = wt +wh;
								}
							}
							w.scrollTop = wt;
						}						
					},
	filter:			function(t,e) {		//	onkeydown="return ODacGen.filter(this,event);"
						var k=0+e.keyCode;
						if (k == ODacGen.ENTER) {
							ODacGen.eventStop(e);
							return false;
						}
						return true;
					},
	autocomplete:	function(t, e, arr, custWidth, completeOnBackspace) {				// custWidth = null (no specific width!)
						if (ODacGen.list == null) {
							ODacGen.list = arr;
						}
						/* --- TO BE VERIEFIED!!! #####
						if (ODacGen.TS!=0) {
							var myinput = ODacGen.$(ODacGen.INPUT_BASEID+ODacGen.INPUT_SPLIT+ODacGen.TS)
							if (myinput.value.length==0) {
								var back = ''+myinput.style.backgroundColor;
								if (back != ODacGen.VALUEERR && back != ODacGen.VALUEERR_RGB) {
									ODacGen.valueOK(myinput);
								}
							}
						}*/
						ODacGen.checkVal();
	                    var k=0+e.keyCode;
	                    if (k >= ODacGen.ASCMIN && k <= ODacGen.ASCMAX) {
	                    	ODacGen.hide();
							ODacGen.completa(t,custWidth);
						}
						else {
						    if (k == ODacGen.DOWN) {
								if (ODacGen.mlist != null && ODacGen.mlist != 'undefined') {
							    	if ((ODacGen.mlist).length > 0 && ODacGen.curpos < (ODacGen.mlist).length-1) {
							    		var o = ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos);
										o.className = ODacGen.ITEMCLASS;
							        	ODacGen.curpos++;
							        	o = ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos);
									    o.className = ODacGen.ITEMCLASSSEL;
										/*var tmpo = o.clone(true);
										o.insertBefore(tmpo);
										tmpo.parentNode.removeChild(o);*/
									    ODacGen.scrollit();
									}
								}
							}
							else if (k == ODacGen.UP) {
								if (ODacGen.mlist != null && ODacGen.mlist != 'undefined') {
									if ((ODacGen.mlist).length > 0 && ODacGen.curpos > 0) {
										var o = ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos);
										o.className = ODacGen.ITEMCLASS;
										ODacGen.curpos--;
										o = ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos);
										o.className = ODacGen.ITEMCLASSSEL;
										ODacGen.scrollit();
									}
								}
							}
							else if (k == ODacGen.ENTER) {
								if ((ODacGen.win()).style.display != 'none') {
									if (ODacGen.mlist != null && ODacGen.mlist != 'undefined') {
									    if (ODacGen.curpos >= 0 && ODacGen.curpos<(ODacGen.mlist).length && (ODacGen.mlist).length > 1){
									    	var s = ODacGen.getValue(t);
									    	t.value = ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos).innerHTML;
									    	ODacGen.assign(t,s,ODacGen.$(ODacGen.ITEMNAME +ODacGen.curpos).innerHTML);
									    	ODacGen.hide();
											//alert('eventstop3');
											//ODacGen.eventStop(e);
										}
									}
								}
								else {
									if (ODacGen.TS != 0) {
										var inpval = ODacGen.$(ODacGen.INPUT_BASEID +ODacGen.INPUT_SPLIT +ODacGen.TS).value;
										if (inpval.length > 0) {
											ODacGen.$(ODacGen.INPUT_BASEID +ODacGen.INPUT_SPLIT +'submit').click();
										}
									}
								}
							}
							else if (k == ODacGen.BACKS || k == ODacGen.DEL) {
							    if (completeOnBackspace && ODacGen.DELAY != -1) {
									window.setTimeout(function(){
										ODacGen.completa(t, custWidth);
									},ODacGen.DELAY);
								}
								if (ODacGen.getValue(t).length==0) {
									ODacGen.valueOK(t);
									ODacGen.hide();
								}
								else {
									if(!ODacGen.l4it(t.value)) {	//_exact
										ODacGen.valueERR(t);
									}
								}
							}
						}
					}
}
//]]>