﻿//<![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);
									}
								}
							}
						}
					}
}
//]]>