1
+ function asignaVariables ( )
2
+ {
3
+ // Funcion que asigna variables que se usan a lo largo de las funciones
4
+ v = 1 ; nuevaBusqueda = 1 ; busqueda = null ; ultimaBusquedaNula = null ;
5
+ divLista = document . getElementById ( "lista" ) ;
6
+ inputLista = document . getElementById ( "input_2" ) ;
7
+ elementoSeleccionado = 0 ;
8
+ ultimoIdentificador = 0 ;
9
+ }
10
+
11
+ function nuevoAjax ( )
12
+ {
13
+ /* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por
14
+ lo que se puede copiar tal como esta aqui */
15
+ var xmlhttp = false ;
16
+ try
17
+ {
18
+ // Creacion del objeto AJAX para navegadores no IE
19
+ xmlhttp = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;
20
+ }
21
+ catch ( e )
22
+ {
23
+ try
24
+ {
25
+ // Creacion del objet AJAX para IE
26
+ xmlhttp = new ActiveXObject ( "Microsoft.XMLHTTP" ) ;
27
+ }
28
+ catch ( E ) { xmlhttp = false ; }
29
+ }
30
+ if ( ! xmlhttp && typeof XMLHttpRequest != "undefined" ) { xmlhttp = new XMLHttpRequest ( ) ; }
31
+
32
+ return xmlhttp ;
33
+ }
34
+
35
+ function eliminaEspacios ( cadena )
36
+ {
37
+ var x = 0 , y = cadena . length - 1 ;
38
+ while ( cadena . charAt ( x ) == " " ) x ++ ;
39
+ while ( cadena . charAt ( y ) == " " ) y -- ;
40
+ return cadena . substr ( x , y - x + 1 ) ;
41
+ }
42
+
43
+
44
+ function formateaLista ( valor )
45
+ {
46
+ // Funcion encargada de ir colocando en negrita las palabras y asignarle un ID a los elementos
47
+ var x = 0 , verificaExpresion = new RegExp ( "^(" + valor + ")" , "i" ) ;
48
+
49
+ while ( divLista . childNodes [ x ] != null )
50
+ {
51
+ // Asigo el ID para reconocerlo cuando se navega con el teclado
52
+ divLista . childNodes [ x ] . id = x + 1 ;
53
+ // Coloco en cada elemento de la lista en negrita lo que se haya ingresado en el input
54
+ divLista . childNodes [ x ] . innerHTML = divLista . childNodes [ x ] . innerHTML . replace ( verificaExpresion , "<b>$1</b>" ) ;
55
+ x ++ ;
56
+ }
57
+ }
58
+
59
+ function limpiaPalabra ( palabra )
60
+ {
61
+ // Funcion encargada de sacarle el codigo HTML de la negrita a las palabras
62
+ palabra = palabra . replace ( / < b > / i, "" ) ;
63
+ palabra = palabra . replace ( / < \/ b > / i, "" ) ;
64
+ return palabra ;
65
+ }
66
+
67
+ function coincideBusqueda ( palabraEntera , primerasLetras )
68
+ {
69
+ /* Funcion para verificar que las primeras letras de busquedaActual sean iguales al
70
+ contenido de busquedaAnterior. Se devuelve 1 si la verificacion es afirmativa */
71
+ if ( primerasLetras == null ) return 0 ;
72
+ var verificaExpresion = new RegExp ( "^(" + primerasLetras + ")" , "i" ) ;
73
+ if ( verificaExpresion . test ( palabraEntera ) ) return 1 ;
74
+ else return 0 ;
75
+ }
76
+
77
+ function nuevaCadenaNula ( valor )
78
+ {
79
+ /* Seteo cual fue la ultima busqueda que no arrojo resultados siempre y cuando la cadena
80
+ nueva no comience con las letras de la ultima cadena que no arrojo resultados */
81
+ if ( coincideBusqueda ( valor , ultimaBusquedaNula ) == 0 ) ultimaBusquedaNula = valor ;
82
+ }
83
+
84
+ function busquedaEnBD ( )
85
+ {
86
+ /* Funcion encargada de verificar si hay que buscar el nuevo valor ingresado en la base
87
+ de datos en funcion de los resultados obtenidos en la ultima busqueda y en base a que
88
+ la cadena bsucada anteriormente este dentro de la nueva cadena */
89
+ var valor = inputLista . value ;
90
+
91
+ if ( ( coincideBusqueda ( valor , busqueda ) == 1 && nuevaBusqueda == 0 ) || coincideBusqueda ( valor , ultimaBusquedaNula ) == 1 ) return 0 ;
92
+ else return 1 ;
93
+ }
94
+
95
+ function filtraLista ( valor )
96
+ {
97
+ // Funcion encargada de modificar la lista de nombres en base a la nueva busqueda
98
+ var x = 0 ;
99
+
100
+ while ( divLista . childNodes [ x ] != null )
101
+ {
102
+ // Saco la negrita a los elementos del listado
103
+ divLista . childNodes [ x ] . innerHTML = limpiaPalabra ( divLista . childNodes [ x ] . innerHTML ) ;
104
+ if ( coincideBusqueda ( limpiaPalabra ( divLista . childNodes [ x ] . innerHTML ) , valor ) == 0 )
105
+ {
106
+ /* Si remuevo el elemento x, el elemento posterior pasa a ocupar la posicion de
107
+ x, entonces quedaria sin revisar. Por eso disminuyo 1 valor a x */
108
+ divLista . removeChild ( divLista . childNodes [ x ] ) ;
109
+ x -- ;
110
+ }
111
+ x ++ ;
112
+ }
113
+ }
114
+
115
+ function reiniciaSeleccion ( )
116
+ {
117
+ mouseFuera ( ) ;
118
+ elementoSeleccionado = 0 ;
119
+ }
120
+
121
+ function navegaTeclado ( evento )
122
+ {
123
+ var teclaPresionada = ( document . all ) ? evento . keyCode : evento . which ;
124
+
125
+ switch ( teclaPresionada )
126
+ {
127
+ case 40 :
128
+ if ( elementoSeleccionado < divLista . childNodes . length )
129
+ {
130
+ mouseDentro ( document . getElementById ( parseInt ( elementoSeleccionado ) + 1 ) ) ;
131
+ }
132
+ return 0 ;
133
+
134
+ case 38 :
135
+ if ( elementoSeleccionado > 1 )
136
+ {
137
+ mouseDentro ( document . getElementById ( parseInt ( elementoSeleccionado ) - 1 ) ) ;
138
+ }
139
+ return 0 ;
140
+
141
+ case 13 :
142
+ if ( divLista . style . display == "block" && elementoSeleccionado != 0 )
143
+ {
144
+ clickLista ( document . getElementById ( elementoSeleccionado ) )
145
+ }
146
+ return 0 ;
147
+
148
+ default : return 1 ;
149
+ }
150
+ }
151
+
152
+ function rellenaLista ( )
153
+ {
154
+ var valor = inputLista . value ;
155
+
156
+ // Valido con una expresion regular el contenido de lo que el usuario ingresa
157
+ var reg = / ( ^ [ a - z A - Z 0 - 9 . @ ] { 2 , 40 } $ ) / ;
158
+ if ( ! reg . test ( valor ) ) divLista . style . display = "none" ;
159
+ else
160
+ {
161
+ if ( busquedaEnBD ( ) == 0 )
162
+ {
163
+ // Si no hay que buscar el valor en la BD
164
+ busqueda = valor ;
165
+
166
+ // Hago el filtrado de la nueva cadena ingresada
167
+ filtraLista ( valor ) ;
168
+ // Si no quedan elementos para mostrar en la lista
169
+ if ( divLista . childNodes [ 0 ] == null ) { divLista . style . display = "none" ; nuevaCadenaNula ( valor ) ; }
170
+ else { reiniciaSeleccion ( ) ; formateaLista ( valor ) ; }
171
+ }
172
+ else
173
+ {
174
+ /* Si se necesita verificar la base de datos, guardo el patron de busqueda con el que se
175
+ busco y luego recibo en una variable si existen mas resultados de los que se van a mostrar */
176
+ busqueda = valor ;
177
+
178
+ var ajax = nuevoAjax ( ) ;
179
+ ajax . open ( "POST" , "index_proceso.php?" , true ) ;
180
+ ajax . setRequestHeader ( "Content-Type" , "application/x-www-form-urlencoded" ) ;
181
+ ajax . send ( "busqueda=" + valor ) ;
182
+
183
+ ajax . onreadystatechange = function ( )
184
+ {
185
+ if ( ajax . readyState == 4 )
186
+ {
187
+ if ( ! ajax . responseText ) { divLista . style . display = "none" ; }
188
+ else
189
+ {
190
+ var respuesta = new Array ( 2 ) ;
191
+ respuesta = ajax . responseText . split ( "&" ) ;
192
+
193
+ /* Obtengo un valor que representa si tengo que ir a BD en las proximas
194
+ busquedas con cadena similar */
195
+ nuevaBusqueda = respuesta [ 0 ] ;
196
+
197
+ // Si se obtuvieron datos los muestro
198
+ if ( respuesta [ 1 ] != "vacio" )
199
+ {
200
+ divLista . style . display = "block" ; divLista . innerHTML = respuesta [ 1 ] ;
201
+ // Coloco en negrita las palabras
202
+ reiniciaSeleccion ( ) ;
203
+ formateaLista ( valor ) ;
204
+ }
205
+ // En caso contrario seteo la busqueda actual como una busqueda sin resultados
206
+ else nuevaCadenaNula ( valor ) ;
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
213
+
214
+ function clickLista ( elemento )
215
+
216
+ {
217
+ /* Se ejecuta cuando se hace clic en algun elemento de la lista. Se coloca en el input el
218
+ valor del elemento clickeado */
219
+ v = 1 ;
220
+ valor = limpiaPalabra ( elemento . innerHTML ) ;
221
+ busqueda = valor ; inputLista . value = valor ;
222
+ divLista . style . display = "none" ; elemento . className = "normal" ;
223
+ }
224
+
225
+ function mouseFuera ( )
226
+ {
227
+ // Des-selecciono el elemento actualmente seleccionado, si es que hay alguno
228
+ if ( elementoSeleccionado != 0 && document . getElementById ( elementoSeleccionado ) ) document . getElementById ( elementoSeleccionado ) . className = "normal" ;
229
+ }
230
+
231
+ function mouseDentro ( elemento )
232
+ {
233
+ mouseFuera ( ) ;
234
+ elemento . className = "resaltado" ;
235
+ // Establezco el nuevo elemento seleccionado
236
+ elementoSeleccionado = elemento . id ;
237
+ }
0 commit comments