﻿//<![CDATA[
/*******************************************************************
	Funzione da richiamare:
	ODac.autocomplete(this,event,'NOMEARRAY'[,WIDTH]);
	Esempi:
		ODac.autocomplete(this,event,'citta');
		ODac.autocomplete(this,event,'cap',80);
	
	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 ODac = {
    VERSION:        '1.0r',
    WINNAME:       	'autocomp',
    WINCLASS:      	'autocompletelist',
    ITEMNAME:      	'acl',
    ITEMCLASS:     	'autocompleteitem',
    ITEMCLASSSEL:  	'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_CAP:		'clienti_cap___',
	INPUT_COM:		'clienti_comune___',
	STATUSOK:		false,
	WIDTH:			-1,
	HEIGHT_MIN:	20,
	HEIGHT_MAX:	300,
    DELAY:         	-1,
	MINACT:        	1,
	RESNUM:        	-1,
    DIFF:          	2,
	BACKS:         	8,
	DEL:           	46,
	UP: 	        38,
	DOWN:  	    	40,
	ENTER:         	13,
	ASCMIN:        	48,
	ASCMAX:        	122,
	curpos:        	0,
	TS:				0,
	list:			{},
	mlist:			null,
//	mapping:		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 (ODac.TS==0) {
							ODac.TS = parseInt(t.id.split(ODac.INPUT_SPLIT)[1]);							
							t.setAttribute('autocomplete','off');
							//t.style.backgroundColor = ODac.VALUEOK;
						}
						/*var w = ODac.getWidHei();
						ODac.HEIGHT_MAX = w.height-ODac.$('box_comune_form').offsetTop-100;						
						if (ODac.HEIGHT_MAX<ODac.HEIGHT_MIN*5) ODac.HEIGHT_MAX = ODac.HEIGHT_MIN*5;*/
					},
	curinit:       	function() { ODac.curpos=0; },
	addList:       	function(n,l) { ODac.list[n]=l; },
	l4it:          	function(an,s) {
	                    ODac.mlist = new Array();
						var c=0;
	                    for(i=0; i<ODac.list[an].length; i++) {
							if (ODac.RESNUM!=-1 && c>=ODac.RESNUM) break;
	                        if ((ODac.list[an][i].toLowerCase()).indexOf(s.toLowerCase())==0) {
	                           	(ODac.mlist).push(ODac.list[an][i]);
	                           	c++;
							}
						}
						if (c==0) return false;
						return true;
					},
	l4it_exact:    	function(an,s) {
	                    ODac.mlist = new Array();
						var c=0;
	                    for(i=0; i<ODac.list[an].length; i++) {
							if (ODac.RESNUM!=-1 && c>=ODac.RESNUM) break;
	                        if (ODac.list[an][i].toLowerCase()== s.toLowerCase()) {
	                           	(ODac.mlist).push(ODac.list[an][i]);
	                           	c++;
							}
						}
						if (c==0) return false;
						return true;
					},
	win:           	function() { return ODac.$(ODac.WINNAME); },
	hide:          	function() {
						ODac.win().style.display = 'none';
	                    ODac.win().style.width   = '0px';
						ODac.win().style.height  = '0px';
						if (ODac.TS!=0) {
							var cap = ODac.$(ODac.INPUT_CAP+ODac.TS)
							var com = ODac.$(ODac.INPUT_COM+ODac.TS);
							if (com.value.length==0) {
								var back = ''+cap.style.backgroundColor;
								if (back != ODac.VALUEERR && back != ODac.VALUEERR_RGB)
									cap.style.backgroundColor=ODac.VALUEOK;
								cap.readOnly=false;
							}
							if (cap.value.length==0) {
								var back = ''+com.style.backgroundColor;
								if (back != ODac.VALUEERR && back != ODac.VALUEERR_RGB)
									com.style.backgroundColor=ODac.VALUEOK;
								com.readOnly=false;
							}
						}
					},
	eventStop:		function(e) {
						if (!e) var e = window.event;
						e.cancelBubble = true;
						if (e.stopPropagation) e.stopPropagation();
					},
	clickSel:		function(tid,idx) {
						var t = ODac.$(tid);
						ODac.curpos = idx;
						o = ODac.$(ODac.ITEMNAME+ODac.curpos);
						if ((ODac.win()).style.display!='none') {
							if (ODac.mlist!=null && ODac.mlist!='undefined') {
								if (ODac.curpos>=0 && ODac.curpos<(ODac.mlist).length && (ODac.mlist).length>1){
									var s = ODac.getValue(t);
									t.value = ODac.$(ODac.ITEMNAME+ODac.curpos).innerHTML;
									ODac.assign(t,s,ODac.$(ODac.ITEMNAME+ODac.curpos).innerHTML);
									ODac.hide();
								}
							}
						}
						else {
							if (ODac.TS!=0) {
								var v1 = ODac.$(ODac.INPUT_CAP+ODac.TS).value;
								var v2 = ODac.$(ODac.INPUT_COM+ODac.TS).value;
								if (v1.length>0 || v2.length>0)
									ODac.$('submit').click();
							}
						}
					},
	moveSel:		function(idx) {
						var o = ODac.$(ODac.ITEMNAME+ODac.curpos);
						o.className = ODac.ITEMCLASS;
						ODac.curpos = idx;
						o = ODac.$(ODac.ITEMNAME+ODac.curpos);
						o.className = ODac.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;
					    ODac.setSel(t,s.length,v.length);
						// ------------------------------ aggiungo il codice per impostare il relativo campo nascosto
						var valarr = null;
						try{
							valarr = (t.id).split(ODac.INPUT_SPLIT);
							if (valarr.length==2)
								(ODac.$(valarr[0])).value = v;
						}catch(e){ };
						/*
						if ((t.id).indexOf('comune')>=0) { // devo settare cap
							var mycap = ODac.mapping[v].split(',')[0];
							if (valarr != null) {
								var capid1 = valarr[0].replace('comune','cap');
								var capid2 = capid1+ODac.INPUT_SPLIT+valarr[1];
								ODac.$(capid1).value = mycap;
								ODac.$(capid2).value = mycap;
							}
						}
						else {	// devo settare comune
							if (valarr != null) {
								var mycom;
								for(mycom in ODac.mapping) if ((ODac.mapping[mycom]).indexOf(v)>=0) break;
								var comid1 = valarr[0].replace('cap','comune');
								var comid2 = comid1+ODac.INPUT_SPLIT+valarr[1];
								ODac.$(comid1).value = mycom;
								ODac.$(comid2).value = mycom;
							}
						}*/
					},
	getValue:      	function(t) { return ''+t.value; },
	valueOK:       	function(t) {
						t.style.backgroundColor = ODac.VALUEOK;
						ODac.STATUSOK = true;
					},
	valueERR:      	function(t) {
						t.style.backgroundColor = ODac.VALUEERR;
						ODac.STATUSOK = false;
					},
	validAsk:		function() {
						if (ODac.STATUSOK) {
							if (ODac.TS!=0) {
								var c,v;
								var f = [{i:ODac.INPUT_CAP,a:'arr1'},{i:ODac.INPUT_COM,a:'arr2'}];
								for(var j=0;j<f.length;j++) {
									c = ODac.$(f[j].i+ODac.TS);
									if (!ODac.l4it(f[j].a,c.value)){
										ODac.valueERR(c);
										return false;
									}
								}
							}
							return true;
						}
						else { return false; }
					},
	getHeights:		function(limit) {
						var realHeight=0;
						for(var q=0; q<limit; q++) { realHeight += ODac.$(''+ODac.ITEMNAME+q).offsetHeight; }
						return realHeight;
					},
	completa:     	function(t,arrname,cwid) {
						var s = ODac.getValue(t);
						if (s.length>=ODac.MINACT) {
						    var ret = ODac.l4it(arrname, s);
						    if (ODac.VALUEOK != ODac.VALUEERR) {
						    	if (!ret && s.length>0) ODac.valueERR(t);
								else ODac.valueOK(t);
							}
						    var len = (ODac.mlist).length;
						    if (len>0) {
						        var ac = ODac.win();
								if (len==1) { ODac.assign(t,s,ODac.mlist[0]); }
								else {
								    ODac.curinit();
								    var cls = ODac.ITEMCLASSSEL;
								    var out = '';
									var i;
									for(i=0;i<len;i++) {
										out += '<div id="'+ODac.ITEMNAME+i+'" class="'+cls+'" onmousedown="ODac.clickSel(\''+t.id+'\','+i+');" onmouseover="ODac.moveSel('+i+');">'+ODac.mlist[i]+'</div>';
										cls = ODac.ITEMCLASS;
									}
									ac.innerHTML = out;
									if (BrowserDetect.browser=='Opera') {
										ac.style.top = (t.offsetTop +t.offsetHeight +ODac.DIFF) +'px';
										ac.style.left = (t.offsetLeft) +'px';
		 							} else {
		 								ac.style.top = (t.offsetTop +t.scrollTop +t.offsetHeight +ODac.DIFF) +'px';
										ac.style.left = (t.offsetLeft +t.scrollLeft) +'px';
									}
									ac.style.display = 'block';
									ac.style.height = '10000px';
									if (cwid==null){
										if (ODac.WIDTH != -1) { ac.style.width = ODac.WIDTH +'px'; }
										else { ac.style.width = (t.offsetWidth -ODac.DIFF)  +'px'; }
									} else { ac.style.width = cwid +'px'; }
									var realHeight = ODac.getHeights((ODac.mlist).length);
									if (realHeight<ODac.HEIGHT_MIN)	realHeight = ODac.HEIGHT_MIN;
									if (realHeight>ODac.HEIGHT_MAX) realHeight = ODac.HEIGHT_MAX;
									ac.style.height = realHeight +'px';
									if (cwid==null){
										if (ODac.WIDTH != -1) { ac.style.width = ODac.WIDTH +'px'; }
										else { ac.style.width = (t.offsetWidth -ODac.DIFF)  +'px'; }
									} else { ac.style.width = cwid +'px'; }
									ac.scrollTop = 0;
									ac.style.display = 'block';
									ODac.curinit();
								}
						    }
						}
						else { ODac.hide(); }
					},
	scrollit:     	function() {
						var w  = ODac.win();
						var wh = w.offsetHeight;
						var wt = w.scrollTop;
						var h  = ODac.$(''+ODac.ITEMNAME+ODac.curpos).offsetHeight;
						var it = ODac.getHeights(ODac.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) {
						var k=0+e.keyCode;
						if (k==ODac.ENTER) { ODac.eventStop(e); return false; }
						else { return true; }
					},
	autocomplete:	function(t,e,arrname) {	// con parametro opzionale la width specifica del caso						
						if (ODac.TS!=0) {
							var cap = ODac.$(ODac.INPUT_CAP+ODac.TS);
							var com = ODac.$(ODac.INPUT_COM+ODac.TS);
							if ((''+t.id).indexOf('cap')>=0) {
								if (com.value.length==0) {
									var back = ''+cap.style.backgroundColor;
									if (back != ODac.VALUEERR && back != ODac.VALUEERR_RGB)
										cap.style.backgroundColor=ODac.VALUEOK;
									cap.readOnly=false;
									if (cap.value.length>0) {
										com.style.backgroundColor=ODac.INPDISABLED;
										com.readOnly=true;
									}
								}
							}
							else {
								if (cap.value.length==0) {
									var back = ''+com.style.backgroundColor;
									if (back != ODac.VALUEERR && back != ODac.VALUEERR_RGB)
										com.style.backgroundColor=ODac.VALUEOK;
									com.readOnly=false;
									if (com.value.length>0) {
										cap.style.backgroundColor=ODac.INPDISABLED;
										cap.readOnly=true;
									}
								}
							}
						}
						var custWidth = null;
						if (arguments.length>=4) custWidth = arguments[3];
	                    var k=0+e.keyCode;
	                    if (k>=ODac.ASCMIN && k<=ODac.ASCMAX) {
	                    	ODac.hide();
							ODac.completa(t,arrname,custWidth);
						}
						else {
						    if (k==ODac.DOWN) {
								if (ODac.mlist!=null && ODac.mlist!='undefined') {
							    	if ((ODac.mlist).length>0 && ODac.curpos<(ODac.mlist).length-1) {
							    		var o = ODac.$(ODac.ITEMNAME+ODac.curpos);
										o.className = ODac.ITEMCLASS;
							        	ODac.curpos++;
							        	o = ODac.$(ODac.ITEMNAME+ODac.curpos);
									    o.className = ODac.ITEMCLASSSEL;
									    ODac.scrollit();
									}
								}
							}
							else if (k==ODac.UP) {
								if (ODac.mlist!=null && ODac.mlist!='undefined') {
									if ((ODac.mlist).length>0 && ODac.curpos>0) {
										var o = ODac.$(ODac.ITEMNAME+ODac.curpos);
										o.className = ODac.ITEMCLASS;
										ODac.curpos--;
										o = ODac.$(ODac.ITEMNAME+ODac.curpos);
										o.className = ODac.ITEMCLASSSEL;
										ODac.scrollit();
									}
								}
							}
							else if (k==ODac.ENTER) {
								if ((ODac.win()).style.display!='none') {
									if (ODac.mlist!=null && ODac.mlist!='undefined') {
									    if (ODac.curpos>=0 && ODac.curpos<(ODac.mlist).length && (ODac.mlist).length>1){
									    	var s = ODac.getValue(t);
									    	t.value = ODac.$(ODac.ITEMNAME+ODac.curpos).innerHTML;
									    	ODac.assign(t,s,ODac.$(ODac.ITEMNAME+ODac.curpos).innerHTML);
									    	ODac.hide();
										}
									}
								}
								else {
									if (ODac.TS!=0) {
										var v1 = ODac.$(ODac.INPUT_CAP+ODac.TS).value;
										var v2 = ODac.$(ODac.INPUT_COM+ODac.TS).value;
										if (v1.length>0 || v2.length>0)
											ODac.$('submit').click();
									}
								}
							}
							else if (k==ODac.BACKS || k==ODac.DEL) {
							    if (ODac.DELAY!=-1) window.setTimeout(function(){ODac.completa(t,arrname,custWidth);},ODac.DELAY);
								/*if (ODac.getValue(t)==0) {
									ODac.valueOK(t);
									ODac.hide();
								}*/
								if (ODac.getValue(t).length==0) {
									ODac.valueOK(t);
									ODac.hide();
								}
								else {
									if(!ODac.l4it_exact(arrname,t.value)) {
										ODac.valueERR(t);
									}
								}
							}
						}
					}
}
//]]>
