﻿//<![CDATA[
/***************************************************************************
	USATO PER L'AUTOCOMPLETAMENTO DEI CAMPI COMUNE E CAP (AREA CLIENTI)
----------------------------------------------------------------------------
	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.0s',
    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:		'#E7E7E7',
	INPDISABLED_RGB:	'rgb(231, 231, 231)',
	INPDISABLEDCOLOR:	'#BFBFBF',
	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,
	actualSelectedArr:	null,
	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;*/
							/* -------------------------------------------- PARTE PER DEBUG [begin] */
							/*jQuery(function(){
								jQuery('#clienti_cap,#clienti_comune,#autocompleted').each(function(){ // visto che non posso modificare l'attributo "type" direttamente...
									var copia = jQuery(this).clone(); // ...sostituisco gli elementi interessati con le loro copie visibili
									copia.attr('type','text');
									jQuery(this).replaceWith(copia);
								});
							});*/
							// TEST PROBLEMA CLICK SU SCROLL IN IE
							/*jQuery('#autocomp')
								.scroll(function(){		document.title += ' - scroll - ';
									jQuery.stopImmediatePropagation();
									jQuery.stopPropagation();
									jQuery.preventDefault();
									
									jQuery(this).stopImmediatePropagation();
									jQuery(this).stopPropagation();
									jQuery(this).preventDefault();
									
									return false;
								})
								.click(function(){		document.title += ' - click - ';
									jQuery.stopImmediatePropagation();
									jQuery.stopPropagation();
									jQuery.preventDefault();
									
									jQuery(this).stopImmediatePropagation();
									jQuery(this).stopPropagation();
									jQuery(this).preventDefault();
									
									return false;
								});*/
							/* -------------------------------------------- PARTE PER DEBUG [end] */
						},
	curinit:     	  	function() { ODac.curpos=0; },
	addList:    	   	function(n,l) { ODac.list[n]=l; },
	l4it:      	    	function(an,s) {				/*document.title = 'l4it';*/
							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) {				/*document.title = 'l4it_exact';*/
							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); },
	hideCount:			0,
	hide:        	  	function(e) {					/*document.title = 'hide:'+(ODac.hideCount++);*/
/*							try{
								var targ;
								if (!e) var e = window.event;
						/*
								if (e.target) targ = e.target;
								else if (e.srcElement) targ = e.srcElement;
								if (targ.nodeType == 3) // defeat Safari bug
									targ = targ.parentNode;
								* /
								/*document.title = 'targ: '+targ* /
						/*
								e.cancelBubble = true;
								if (e.stopPropagation) e.stopPropagation();
							}catch(er){/*document.title = 'errore: '+er.message;* /}
*/
							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;
									//cap.style.borderColor='000';
									jQuery("label[for^='clienti_cap___']").css({
																				   'color':'000'
																			});
								}
								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;
									//com.style.borderColor='000';
									jQuery("label[for^='clienti_comune___']").css({
																				   'color':'000'
																			});
								}
							}
						},
	eventStop:			function(e) {
							if (!e) var e = window.event;
							e.cancelBubble = true;
							if (e.stopPropagation) e.stopPropagation();
						},
	clickSel:			function(tid,idx) {					/*document.title = 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 inp,arr;
									//var f = [{i:ODac.INPUT_CAP,a:'arr1'},{i:ODac.INPUT_COM,a:'arr2'}];
									var f = [{i:ODac.INPUT_CAP,a:ODac.actualSelectedArr},{i:ODac.INPUT_COM,a:ODac.actualSelectedArr}];
									for(var j=0;j<f.length;j++) {
										inp = f[j].i;
										arr = f[j].a;
										c = ODac.$(f[j].i+ODac.TS);
										if (!ODac.l4it(f[j].a,c.value)){
											ODac.valueERR(c);
											return false;
										}
									}
									var c_reale = ODac.$(inp.replace('___',''));
									if (c.value != '' && c.value!=c_reale.value) {
										var new_val = '';
										for(var mi=0; mi<ODac.mlist.length; mi++) {
											if (c.value.toLowerCase() == ODac.mlist[mi].toLowerCase()) {
												new_val = ODac.mlist[mi];
											}
										}
										if (new_val=='') {
											ODac.valueERR(c);
											return false;
										}
										c_reale.value = new_val;
									}
								}
								ODac.valueOK(c);
								return true;//return false;//
							/*}
							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) {		/* metodo chiamato in fase di richiesta completamento / selezione match del campo */
							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
							ODac.actualSelectedArr = arrname;
							if (ODac.TS!=0) {
								var cap = ODac.$(ODac.INPUT_CAP+ODac.TS);
								var com = ODac.$(ODac.INPUT_COM+ODac.TS);
								//var cap_label = jQuery("label[for^='clienti_cap___']");
								//var comune_label = jQuery("label[for^='clienti_comune___']");
								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;
										//cap.style.borderColor='000';
										jQuery("label[for^='clienti_cap___']").css({
																					   'color':'000'
																				});
										if (cap.value.length>0) {
											com.style.backgroundColor=ODac.INPDISABLED;
											//com.style.borderColor=ODac.INPDISABLEDCOLOR;
											jQuery("label[for^='clienti_comune___']").css({
																					   'color':ODac.INPDISABLEDCOLOR
																				});
											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;
										//com.style.borderColor='000';
										jQuery("label[for^='clienti_comune___']").css({
																					   'color':'000'
																				});
										if (com.value.length>0) {
											cap.style.backgroundColor=ODac.INPDISABLED;
											//cap.style.borderColor=ODac.INPDISABLEDCOLOR;
											jQuery("label[for^='clienti_cap___']").css({
																					   'color':ODac.INPDISABLEDCOLOR
																				});
											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);
										}
									}
								}
							}
						}
}
//]]>
