PageSourceSearch

https://winners.day/scripts/JS-Libraries/IC3-FormFunctions/IC3-FormFunctions.js?6.3.45

js winners.day collected 2026-10-02 00:19:55 UTC 46,150 bytes, 1,297 lines download raw bytes

1//----------------------------------------------- INTPUT ERASE
2var last_erase_value='';
3function eraseIn(elem){
4	last_erase_value=elem.value;
5	elem.value='';
6}	
7function eraseOut(elem){
8	if(elem.value==''){
9		elem.value=last_erase_value;
10		last_erase_value='';
11	};
12}
13//==================================================================================================================
14//============================================================================================ FORMULARIOS (actions)
15//==================================================================================================================
16function reemplazar(str,find,repl){
17	return str.replace(new RegExp(find,"g"),repl);
18}
19function jsonEscape(str){
20    return JSON.parse( str.replace(/[\r\n]+/g, "<br>").replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r").replace(/\t/g, "\\\\t") );
21}
22function escapeToCodeLine(str){
23	//return str.replace(/\'/g, "\\'")
24	//return str.replace(/\'/g, "\'");
25	//return str.replace(/\"/g, """).replace(/\'/g, "'").replace(/\´/g, "´");
26	//return str.replace(/\"/g, "\\\"").replace(/\'/g, "\\\\'").replace(/\´/g, "ccc");
27	//console.log(str);
28	return str.replace(/\"/g, "").replace(/\n/g, "<br>").replace(/\'/g, "").replace(/\´/g, "").replace(/\"/g, "").replace(/\'/g, "").replace(/\´/g, "");
29}
30/*
31//Metodo Encode
32function codificarEntidad(str) {
33	return str.replace(/\"/g, """).replace(/\'/g, "'").replace(/\´/g, "´");
34}
35//Metodo Decode
36function descodificarEntidad(str) {
37	return str.replace(/\&/g, "&").replace(/\"/g, "\"").replace(/\'/g, "'").replace(/\´/g, "´");
38}*/
39
40//------------------------------------------------------------- Multifield to Text
41function multiFieldToText(destino,val){
42	if(val!=='' && val!=='|||'){
43		var sal='';
44
45		var troceo=val.split('|||');
46		var total_troceo=troceo.length;
47
48		sal+='<ul class="lista_multiform">';
49
50		for(var i=0; i<total_troceo; i+=2){
51			var campo=troceo[i];
52			var valor=troceo[i+1];
53			if(campo==''){
54				sal+='<li>'+linkDetect(valor)+'</li>';
55			}else{
56				sal+='<li><strong>'+campo+':</strong> '+linkDetect(valor)+'</li>';
57			}
58		}
59
60		sal+='</ul>';
61		//---------
62		document.getElementById(destino).innerHTML=sal;
63	}
64}
65
66//------------------------------------------------------------ Multifield edition
67function initMultiField(id, place1, place2, valores){	
68
69	if(valores==''){valores='|||'}
70	var arr_multiform=valores.split('|||');
71	var total_multiform=arr_multiform.length;
72	
73	for(var i=0; i<total_multiform; i+=2){
74		var campo=arr_multiform[i];
75		var valor=arr_multiform[i+1];
76		addMultiField(id,place1,place2,campo,valor);
77	};
78
79	if(total_multiform==2){
80		if(!document.getElementById(id).dataset.showfirstfield){document.getElementById(id).childNodes[0].style.display='none';};
81		document.getElementById(id).childNodes[1].className='col-4 col-sm-2';
82		document.getElementById(id).childNodes[2].style.display='none';
83	};
84
85}
86
87function addMultiField(id, place1, place2, campo, valor){
88	//var lines=parseInt(document.getElementById(id).dataset.number); lines++;
89	place1=(place1)?place1:'';
90	place2=(place2)?place2:'';
91	campo=(campo)?campo:'';
92	valor=(valor)?valor:'';
93
94	var sal='';	
95	//---------
96	var child1=document.createElement("DIV");
97	child1.className='col-4 col-sm-1';
98	child1.innerHTML='<input class="sub" type="text" maxlength="40" placeholder="'+place1+'..." value="'+campo+'" style="font-weight:bold">';
99
100	var child2=document.createElement("DIV");
101	child2.className='col-3 col-sm-1';
102	child2.innerHTML='<input class="sub" type="text" placeholder="'+place2+'..." value="'+valor+'">';
103	
104	var child3=document.createElement("DIV");
105	child3.setAttribute('class','align-self-center'); //child3.style.display='none';
106	child3.innerHTML='<button class="b_del toTransparent" onClick="delMultiField(this)"></button>';
107	//---------
108	document.getElementById(id).appendChild(child1);
109	document.getElementById(id).appendChild(child2);
110	document.getElementById(id).appendChild(child3);
111	//---------
112	var padre=document.getElementById(id);
113	if(padre.childNodes.length>3){
114		padre.childNodes[0].style.display='';
115		padre.childNodes[1].className='col-3 col-sm-1';
116		padre.childNodes[2].style.display='';
117	}
118}
119
120function delMultiField(elem){
121	var padre=elem.parentNode.parentNode;
122	padre.removeChild(elem.parentNode.previousSibling.previousSibling);
123	padre.removeChild(elem.parentNode.previousSibling);
124	padre.removeChild(elem.parentNode);
125
126	var hijos=padre.childNodes.length;
127
128	if(hijos==3){
129		if(!padre.dataset.showfirstfield){
130			padre.childNodes[0].style.display='none';
131			padre.childNodes[1].className='col-3';
132		}else{
133			padre.childNodes[1].className='col-3 col-sm-1';
134		};
135		
136		padre.childNodes[2].style.display='none';
137	};
138}
139
140//------------------------------------------------------------ Input Tags
141function initInputTags(id, tags){
142	var sal='';
143	//---------
144	var total=0;
145	document.getElementById(id).dataset.cantidad='0';
146	var max=parseInt(document.getElementById(id).dataset.max);
147	//---------
148	if(tags!==''){
149		var arr_tags=tags.split(', ');
150		var total=arr_tags.length;
151		if(total>max){total=max}
152
153		document.getElementById(id).dataset.cantidad=total;		
154
155		//--------		
156		for(var i=0; i<total; i++){
157			var tag=arr_tags[i];
158			tag=tag.charAt(0).toUpperCase() + tag.slice(1);
159			sal+='<span class="tag-label" data-value="'+tag+'">'+tag+'<span class="tag-remove" onClick="inputTagsDel(event)">x</span></span>';
160		};
161	}
162	sal+='<input id="input-'+id+'" class="tag-input" type="text" placeholder="Nueva etiqueta..." onblur="inputTagCreate(event)" onkeyup="inputTagsWrite(event)">';
163	document.getElementById(id).innerHTML=sal;
164	//---------------
165	inputTagsMax(id,'');
166}
167
168function inputTagCreate(e){
169
170	var elemento=e.target;
171	var texto=elemento.value;
172
173	if(texto!==''){
174		var tag=texto.split(',')[0].toLowerCase();
175  		elemento.value='';
176  		//----------
177  		var newItem = document.createElement("SPAN");
178  		newItem.className='tag-label';
179  		newItem.dataset.value=tag;
180  		var tag2=tag.charAt(0).toUpperCase() + tag.slice(1);
181  		newItem.innerHTML=tag2+'<span class="tag-remove" onClick="inputTagsDel(event)">x</span>';
182
183  		var padre=elemento.parentNode;
184  		var totalhijos=padre.childNodes.length;
185  		padre.insertBefore(newItem, padre.childNodes[totalhijos-1]);
186  		autoTags=false;
187  		//--------
188		inputTagsMax(padre.id,'mas');
189	}
190}
191
192
193function inputTagsWrite(e){
194	var tcl=(document.all)?e.keyCode:e.which;
195
196	//Si pulsamos coma o enter
197  	if(tcl==188 || tcl==13){
198  		inputTagCreate(e);
199
200  		/*
201  		var elemento=e.target;
202
203  		if(tcl==188){//Si es la coma
204  			var tag=elemento.value.slice(0,-1).toLowerCase();
205  		}else{//Si es el enter
206  			var tag=elemento.value.toLowerCase();
207  		} 		
208
209  		elemento.value='';
210  		//----------
211  		var newItem = document.createElement("SPAN");
212  		newItem.className='tag-label';
213  		newItem.dataset.value=tag;
214  		var tag2=tag.charAt(0).toUpperCase() + tag.slice(1);
215  		newItem.innerHTML=tag2+'<span class="tag-remove" onClick="inputTagsDel(event)">x</span>';
216
217  		var padre=elemento.parentNode;
218  		var totalhijos=padre.childNodes.length;
219  		padre.insertBefore(newItem, padre.childNodes[totalhijos-1]);
220  		autoTags=false;
221  		//--------
222		inputTagsMax(padre.id,'mas');*/
223  	};
224}
225
226function inputTagsDel(e){
227	var elemento=e.target.parentNode;
228	var padre=elemento.parentNode;
229	padre.removeChild(elemento);
230	autoTags=false;
231	//--------
232	inputTagsMax(padre.id,'menos');
233}
234
235function inputTagsMax(id,masmenos){
236	var actual=parseInt(document.getElementById(id).dataset.cantidad);
237	var max=parseInt(document.getElementById(id).dataset.max);
238	//----------
239	if(masmenos=='mas'){actual++;
240		document.getElementById(id).dataset.cantidad=actual;
241	}else if(masmenos=='menos'){
242		actual--;
243		document.getElementById(id).dataset.cantidad=actual;
244	}
245	//----------
246	if(actual<max){
247		document.getElementById('input-'+id).style.display='';
248	}else{
249		document.getElementById('input-'+id).style.display='none';
250	};
251	//----------
252	document.getElementById(id+'-resume').innerHTML=actual+' de '+max+' máximo';
253}
254
255function inputTagsClean(id){
256	var padre=document.getElementById(id);
257	padre.dataset.cantidad='0';
258	//------- Vaciamos
259	while (padre.childNodes[1]) {
260  		padre.removeChild(padre.firstChild);
261	}
262	//-------
263	var max=padre.dataset.max;
264	document.getElementById(id+'-resume').innerHTML='0 de '+max+' máximo';
265	document.getElementById('input-'+id).style.display='';
266}
267
268//==================================================================================================================
269//============================================================================================ FORMULARIOS (validate and return data)
270//==================================================================================================================
271function errorForm(msg){
272	notify('error','top',msg);
273}
274function closeErrorForm(){	
275	if(document.getElementById('emergent_top').style.top=='0px'){emergentClose('top');}
276}
277function clearForm(idForm){
278	var frm=document.getElementById(idForm).querySelectorAll('[data-type]');
279	var total_campos=frm.length;
280	for(var v=0; v<total_campos; v++){
281		var elem=frm[v];
282		//------- PROPIEDADES DEL CAMPO
283		var dataType=''; //Tipo de campo		
284		//------- Tipo
285		if(elem.dataset.type){dataType=elem.dataset.type;}else{dataType=elem.type;}
286		
287		if(dataType=='combo'){	
288			newComboReset(elem.id);
289		}else if(dataType=='checkbox'){
290			elem.checked=false;
291		}else{
292			elem.value='';
293		}
294	}
295};
296
297function validateForm(idForm){
298	var datos=new FormData();
299	var errores=0; var lastVar=''; var lastValue=''; var lastRepeat=0;
300
301	//------------------------------ Validamos y recopilamos datos a enviar
302	var frm=[];
303	var frm_inicial=document.getElementById(idForm).querySelectorAll('[data-type]');
304	
305	//------- Seleccionar sólo elementos visibles
306	for(var v=0; v<frm_inicial.length; v++){
307		if( $(frm_inicial[v]).is(":visible") ){ //console.log( frm_inicial[v].dataset.label );
308			frm.push( frm_inicial[v] );
309		}
310	}
311
312	var total_campos=frm.length;
313	//------------------------------
314	for(var v=0; v<total_campos; v++){
315		var elem=frm[v];
316		var contenedor_padre=elem.parentNode;
317		var es_fc=$(contenedor_padre).hasClass('fc');
318
319		//------- PROPIEDADES DEL CAMPO
320		var dataType=''; //Tipo de campo		
321     	var dataLabel=''; //Nombre del campo
322		var dataVar=''; //Nombre de variable
323		var dataValue=''; //Valor del campo	(el valor se recoge según el tipo de campo)	
324		var dataRequired=false; //Obligatorio?
325		var confirmationField=''; //Campo confirmación
326		var transfer=true;
327		
328		//------- Tipo
329		if(elem.dataset.type){dataType=elem.dataset.type;}else{dataType=elem.type;}		
330		//------- Label
331		if(elem.dataset.label){dataLabel=elem.dataset.label;}else{dataLabel=elem.getAttribute('placeholder').split('...')[0];}		
332		//------- Nombre de variable
333		if(elem.dataset.var){dataVar=elem.dataset.var;}else{dataVar=elem.getAttribute('id').split('frm_')[1];}		
334		//------- Requerido
335		if(elem.dataset.required){if(elem.dataset.required=='true'){dataRequired=true;};}else{dataRequired=elem.required;}
336		//------- Campo confirmación
337		if(elem.dataset.confirm){confirmationField=elem.dataset.confirm;}
338
339		//-------------------------------- EVALUAR EL TIPO DE CAMPO
340		switch(dataType){
341			case 'number':
342				dataValue=elem.value;
343				if(dataValue==''){
344					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
345				}else{
346					var num_resultado = numberValidation(elem.value);
347					if(num_resultado == 'error'){
348						errores++; 
349						errorForm( getText(lng.campo_debe_ser_numero) );
350					}else{
351						dataValue=num_resultado.toString();
352					}
353				};
354			break;
355			case 'text':
356				dataValue=elem.value;
357				if(dataValue==''){
358					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
359				};
360			break;
361			case 'textarea':
362				dataValue=elem.value;
363				if(dataValue==''){
364					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
365				};
366			break;
367			case 'editablearea':
368				dataValue=elem.innerHTML;
369				var tmpvaledar=dataValue.substr(-4);
370				if(tmpvaledar=='<br>'){dataValue=dataValue.substr(0,dataValue.length-4);};
371				//-----
372				if(dataValue==''){
373					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
374				};	
375			break;
376			case 'email':
377				dataValue=elem.value;
378				if(dataValue==''){
379					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
380				}else{
381					var validationValue=emailValidation(elem.value);
382					//----------------------- Confirm
383					if(confirmationField!=='' && validationValue=='ok'){
384						if(elem.value!==document.getElementById(confirmationField).value){
385							validationValue='error_confirmacion';
386						}
387					}
388					//-----------------------
389					if(validationValue=='ok'){
390						break;
391					}else{
392						switch(validationValue){
393							case '': errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); break;
394							case 'error': errorForm( getText(lng.campo_no_tiene_formato_valido,[dataLabel]) ); break;
395							case 'error_confirmacion': errorForm( getText(lng.campos_error_confirmacion_m,[dataLabel]) ); break;
396							default: errorForm( getText(lng.campo_no_tiene_formato_valido,[dataLabel]) ); break;
397						};
398						errores++;
399						//elem.value='';
400						if(confirmationField!==''){document.getElementById(confirmationField).value='';};
401					}
402				};
403			break;
404			case 'password':
405				dataValue=elem.value;
406				if(dataValue==''){
407					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
408				}else{
409					var validationValue=passValidation(elem.value);
410					//----------------------- Confirm
411					if(confirmationField!=='' && validationValue=='ok'){
412						if(elem.value!==document.getElementById(confirmationField).value){
413							validationValue='error_confirmacion';
414						}
415					}
416					//-----------------------
417					if(validationValue=='ok'){
418						break;
419					}else{
420						switch(validationValue){
421							case '': errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); break;
422							case 'error': errorForm( getText(lng.campo_contrasena_insegura,[dataLabel]) ); break;
423							case 'error_confirmacion': errorForm( getText(lng.campos_error_confirmacion_f,[dataLabel]) ); break;
424							default: errorForm( getText(lng.campo_minimo_caracteres,[dataLabel,validationValue]) ); break;
425						};
426						errores++;
427						elem.value='';
428						if(confirmationField!==''){document.getElementById(confirmationField).value='';};
429					}					
430				};
431			break;			
432			case 'date':
433				dataValue=elem.value;
434				if(dataValue==''){
435					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
436				}else{
437					switch(dateValidation(elem.value)){
438						case '': errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); break;
439						case 'error': errores++; errorForm( getText(lng.campo_fecha_formato,[dataLabel]) ); break;
440						case 'ok': break;
441					}
442				};
443			break;			
444			case 'dni':
445				dataValue=elem.value;
446				if(dataValue==''){
447					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
448				}else{
449					switch(dniValidation(dataValue)){
450						case '': errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); break;
451						case 'error': errores++; errorForm( getText(lng.campo_dni_formato,[dataLabel]) ); break;
452						case 'incorrecto': errores++; errorForm( getText(lng.campo_dni_inexistente,[dataLabel]) ); break;
453						case 'ok': break;
454					};
455				};
456			break;
457			case 'dni_nif_cif':
458				dataValue=elem.value;
459				if(dataValue==''){
460					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
461				}else{
462					switch(dninifcifValidation(dataValue)){
463						case '': errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); break;
464						case 'error': errores++; errorForm( getText(lng.campo_dni_nif_cif_formato,[dataLabel]) ); break;
465						case 'ok': break;
466					};
467				};
468			break;
469			case 'tel':
470				dataValue=elem.value;
471				if(dataValue==''){
472					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
473				}else{
474					switch(telValidation(elem.value)){
475						case '': errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); break;
476						case 'error': errores++; errorForm( getText(lng.campo_telefono_formato,[dataLabel]) ); break;
477						case 'ok': break;
478					}
479				};
480			break;
481			case 'url':
482				dataValue=elem.value;
483				if(dataValue==''){
484					if(dataRequired==true){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); }
485				}else{
486					if(dataValue.indexOf('http:')==-1){dataValue='https://'+dataValue};
487					elem.value=dataValue;
488					//-------
489					switch(urlValidation(dataValue)){
490						case '': errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) ); break;
491						case 'error': errores++; errorForm( getText(lng.campo_url_formato,[dataLabel]) ); break;
492						case 'ok': break;
493					}
494				};
495			break;
496			case 'combo':				
497				dataValue=elem.getAttribute('data-value');				
498				if(dataValue==''){
499					if(dataRequired==true){errores++; errorForm( getText(lng.campo_desplegable_seleccionar,[dataLabel]) ); }
500				};
501			break;
502			case 'select':
503				dataValue=elem.value;
504				if(dataValue==''){
505					if(dataRequired==true){errores++; errorForm( getText(lng.campo_desplegable_seleccionar,[dataLabel]) ); }
506				}; //dataValue=elem.options[elem.selectedIndex].text;
507			break;
508			case 'select_value':
509			     dataValue=elem.value;
510				if(dataValue==''){
511					if(dataRequired==true){errores++; errorForm( getText(lng.campo_desplegable_seleccionar,[dataLabel]) ); }
512				}; //dataValue=elem.options[elem.selectedIndex].text;			
513			break;
514			case 'checkbox':
515				if(elem.checked==true){
516					dataValue='true';
517				}else{
518					dataValue='false';
519					if(dataRequired==true){errores++; errorForm( getText(lng.campo_check_seleccionado,[dataLabel]) ); }
520				};
521			break;
522			case 'radio':
523				var val=radioTest(elem.getAttribute('name'));
524				if(val!==''){
525					dataValue=val;
526				}else{
527					dataValue='false';
528					if(dataRequired==true){errores++; errorForm( getText(lng.campo_radio_seleccionar,[dataLabel]) ); }
529				};
530			break;
531			case 'image':
532				if(elem.dataset.idfile!=='new'){
533					transfer=false;
534				}else{
535					if(elem.dataset.src){
536						datos.append(dataVar+'-b',elem.dataset.src);
537					};
538					if(elem.dataset.proporcion){
539						datos.append(dataVar+'-proporcion',elem.dataset.proporcion);
540					};
541				};
542				if(elem.getAttribute('src')){
543					dataValue=elem.getAttribute('src');
544				}else{
545					dataValue=elem.style.backgroundImage.slice(5,-2);
546				};				
547				if(dataValue=='' || elem.dataset.idfile=='no'){
548					if(dataRequired==true){errores++; errorForm( getText(lng.campo_imagen_seleccionar,[dataLabel]) ); }
549				};
550			break;
551			case 'video':
552				if(elem.dataset.idfile!=='new'){
553					transfer=false;
554				}else{
555					if(elem.dataset.titulo){
556						datos.append(dataVar+'-titulo',elem.dataset.titulo);
557					};
558					if(elem.dataset.descripcion){
559						datos.append(dataVar+'-descripcion',elem.dataset.descripcion);
560					};
561				};
562				if(elem.dataset.enlace){
563					dataValue=elem.dataset.enlace;
564				}else{
565					dataValue=elem.style.backgroundImage.slice(5,-2);
566				};
567				if(dataValue==''){
568					if(dataRequired==true){errores++; errorForm( getText(lng.campo_video_seleccionar,[dataLabel]) ); }
569				};
570			break;
571			case 'multiform':
572				var multivalues='';
573				for(var i=0; i<elem.childNodes.length; i+=3){
574					var campo=elem.childNodes[i].childNodes[0].value;
575					var valor=elem.childNodes[i+1].childNodes[0].value;
576					multivalues+=campo+'|||'+valor+'|||';
577				}
578				dataValue=multivalues.slice(0, -3);
579				if(dataRequired==true && dataValue=='|||'){errores++; errorForm( getText(lng.campo_rellenar_correctamente,[dataLabel]) );}
580			break;
581			case 'tags':
582				for(var i=0; i<elem.childNodes.length-1; i++){
583					dataValue+=elem.childNodes[i].dataset.value+', ';
584				};
585				dataValue=normalize( dataValue.slice(0,-2).toLowerCase() );
586			break;
587			};
588
589			//============ SI HAY ERRORES
590			if(errores>0){
591				//elem.focus();
592
593				if(dataType=='multiform'){
594					var elemvinculado=elem.childNodes[1].firstChild;
595					elemvinculado.classList.add('marked_error');
596					elemvinculado.addEventListener('focus',function(){ 
597						elemvinculado.classList.remove("marked_error");
598						emergentClose('top');
599					});
600
601				}else{
602					
603					if(dataType!=='combo' && dataType!=='checkbox' && dataType!=='radio' && dataType!=='image'){
604						//Marcamos el campo como erróneo
605						elem.classList.add('marked_error');
606						
607						if(validationValue=='error_confirmacion'){
608							var elem_confirm=document.getElementById(confirmationField);
609							elem_confirm.classList.add('marked_error');
610						}
611					};
612					//Al hacer click sobre el elemento lo desmarcamos y cerramos el mensaje de error
613					if(dataType!=='radio'){
614						elem.addEventListener('focus',function(){ 
615							elem.classList.remove("marked_error");
616							if(elem.dataset.confirm){
617								var elem_confirm=document.getElementById(confirmationField);
618								elem_confirm.classList.remove("marked_error");
619							}
620							emergentClose('top');
621						});
622
623						if(confirmationField!==''){
624							var elem_confirm=document.getElementById(confirmationField);
625							elem_confirm.addEventListener('focus',function(){ 
626								elem.classList.remove("marked_error");
627								elem_confirm.classList.remove("marked_error");
628								emergentClose('top');
629							});
630						};
631					}else{
632						elem.parentNode.parentNode.parentNode.addEventListener('click',function(){
633							elem.classList.remove("marked_error");
634							emergentClose('top');
635						});
636					};
637				};
638
639				break;
640
641			}else{//------- SI NO HAY ERRORES
642
643				if(transfer==true && dataVar!==''){
644					//----------------------------------------------- Grupos de valores					
645					if(dataVar!==lastVar){
646						if(v!==0){datos.append(lastVar,lastValue);};
647						lastValue=dataValue;
648						lastVar=dataVar;						
649					}else{
650						if(dataType!=='radio'){lastValue+='|||'+dataValue};
651					};
652					
653					//------ Cierre final
654					if(v==total_campos-1){ /*console.log(total_campos+'---2: '+lastVar+' -- '+lastValue);*/
655						datos.append(lastVar,lastValue);
656					};
657				};
658			};
659	};//FIN BUCLE	
660	
661	//----------------- Si no hay errores devolvemos datos compliados
662	if(errores==0){return datos;}else{return 'error';};
663};
664//==================================================================================================================
665//============================================================================================ Validaciones
666//==================================================================================================================
667function showConfirmationField(elem,when='password'){
668	var valor=elem.value;
669	var tipo=elem.getAttribute('type');
670	var state='';
671	var show_registration_conditions=false;
672	//--------
673	if(tipo=='email'){state=emailValidation(valor)}
674	if(tipo=='password'){state=passValidation(valor)}
675	if(state=='ok'){
676		document.getElementById(elem.dataset.confirm).parentNode.style.display='';
677		if(tipo=='email' && when=='email'){
678			show_registration_conditions=true;
679		}else if(tipo=='password' && when=='password'){
680			show_registration_conditions=true;
681		};
682		//---------
683		if(show_registration_conditions==true && document.getElementById('registration_conditions_area')){
684			document.getElementById('registration_conditions_area').style.display='';
685		};
686	}else{
687		document.getElementById(elem.dataset.confirm).parentNode.style.display='none';
688	}
689}
690
691//----------------------------------- tel
692function numberValidation(num){
693	if(num==''){return ''}else{
694		num=replaceAll(num,' ','');
695		num=replaceAll(num,',','.');
696		num=parseFloat(num);
697		if(!isNaN(parseFloat(num)) && isFinite(num)){return num;}else{return 'error';}
698	}
699};
700//----------------------------------- Pass
701function passValidation(pass){
702	if(pass==''){return ''}else if(pass.length<5){
703		return '5';
704	}else{
705		var expr = /^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{5,})/; //May, Min, Nums y 5 carácteres
706		if ( !expr.test(pass) ){return 'error';}else{return 'ok';}
707	}
708};
709
710//----------------------------------- DNI
711function dniValidation(dni){
712	if(dni==''){return ''}else{
713	  var numero;
714	  var letr;
715	  var letra;
716	  var expresion_regular_dni = /^\d{8}[a-zA-Z]$/;
717
718	  if(expresion_regular_dni.test (dni) == true){
719		 numero = dni.substr(0,dni.length-1);
720		 letr = dni.substr(dni.length-1,1);
721		 numero = numero % 23;
722		 letra='TRWAGMYFPDXBNJZSQVHLCKET';
723		 letra=letra.substring(numero,numero+1);
724		if (letra!=letr.toUpperCase()) {
725		   return 'incorrecto';
726		 }else{
727		   return 'ok';
728		 }
729	  }else{
730		 return 'error';
731	   }
732	};
733};
734//----------------------------------- DNI/NIF/CIF
735function dninifcifValidation(dninifcif){
736	if(dninifcif==''){return ''}else{
737	  if(dninifcif.length<8){return 'error';}else{return 'ok';}
738	};
739};
740//----------------------------------- e-mail
741function emailValidation(email){
742	if(email==''){return ''}else{
743		var expr = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
744		if ( !expr.test(email) ){return 'error';}else{return 'ok';}
745	}
746};
747
748//----------------------------------- tel
749function telValidation(tel){
750	if(tel==''){return ''}else{
751		tel=replaceAll(tel,' ','');
752		if(tel.length<9){return 'error';}else{return 'ok';}
753		//var expr = /^((\+?34([ \t|\-])?)?[9|6|7|8]((\d{1}([ \t|\-])?[0-9]{3})|(\d{2}([ \t|\-])?[0-9]{2}))([ \t|\-])?[0-9]{2}([ \t|\-])?[0-9]{2})$/;
754		//if ( !expr.test(tel) ){return 'error';}else{return 'ok';}
755	}
756};
757
758//----------------------------------- URL
759function urlValidation(url){	
760	if(url=='' || url=='http://'){return ''}else{
761		var expr = /((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z0-9\&\.\/\?\:@\-_=#])*/g;
762		if ( !expr.test(url) ){return 'error';}else{return 'ok';}
763	}
764}
765
766//----------------------------------- Date
767function dateValidation(date){
768	if(date==''){return ''}else{
769		var sal=replaceAll(date,'-','/');
770		var td=sal.split('/');
771		//-----
772		if(td.length<3){
773			return 'error';
774			}else{
775			if(td[0].length<4 && td[2].length==4){sal=td[0]+'/'+td[1]+'/'+td[2];}
776			if(td[2].length<4 && td[0].length==4){sal=td[2]+'/'+td[1]+'/'+td[0];}
777			//-----
778			var expr = /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Enero|Marzo|Mayo|Julio|Agosto|Octubre|Diciembre)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Enero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Septiembre|Octubre|Noviembre|Diciembre))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2}
778)$|^(?:29(\/|-|\.)(?:0?2|(?:Febrero))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Enero|Febrero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Septiembre))|(?:1[0-2]|(?:Octubre|Noviembre|Diciembre)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/; //Comprueba años bisiestos y demás...
779			if( !expr.test(sal) ){return 'error';}else{return 'ok';}
780		};
781	}
782};
783
784function dateReverse(date){
785	if(date==''){return ''}else{
786		var sal=replaceAll(date,'-','/');
787		var td=sal.split('/');
788		//-----
789		if(td[0].length<4 && td[2].length==4){sal=td[0]+'/'+td[1]+'/'+td[2];}
790		if(td[2].length<4 && td[0].length==4){sal=td[2]+'/'+td[1]+'/'+td[0];}
791		//-----
792		return sal;
793	}
794};
795
796function toDate(id_elem){
797	var valor=replaceAll(document.getElementById(id_elem).value,'-','/')
798	//-------------------
799	var td=valor.split('/'); var t1=''; var t2=''; var t3='';
800	var sal=valor;
801	if(td.length==3){
802		if(td[0].length==1){t1='0'+td[0];}else{t1=td[0];}
803		if(td[1].length==1){t2='0'+td[1];}else{t2=td[1];}
804		if(td[2].length==1){t3='0'+td[2];}else{t3=td[2];}
805		//----
806		if(t1.length<4 && t3.length==4){sal=t1+'/'+t2+'/'+t3;}
807		if(t3.length<4 && t1.length==4){sal=t3+'/'+t2+'/'+t1;}
808	};
809	document.getElementById(id_elem).value=sal;
810}
811
812//----------------------------------- toDecimal
813function toDecimal(valor){
814	valor=valor.trim();
815	
816	if(valor==''){return 0;}else{
817		valor=valor.replace(',','.');
818		valor=valor.replace('\'','.');
819		//------------------------------
820		var troceo=valor.split('.');
821		var total_troceo=troceo.length-1;
822		var longitud_ultimo_troceo=troceo[total_troceo].length;
823		var entero='';
824		var decimales='';
825		//------------------------------
826		if(total_troceo>0 && longitud_ultimo_troceo<3){
827			entero=valor.slice(0,-(longitud_ultimo_troceo+1));
828			entero=replaceAll(entero,'.','');
829			decimales='.'+troceo[total_troceo];
830			valor=entero+decimales;
831		}else{
832			valor=replaceAll(valor,'.','');
833		}
834		//------------------------------
835		if( isNaN(valor)==false ){
836			return parseFloat(valor);
837		}else{
838			return 0;
839		};
840	};
841}
842//-------
843function replaceAll(text, busca, reemplaza){
844  while (text.toString().indexOf(busca) != -1){
845      text = text.toString().replace(busca,reemplaza);
846  };
847  return text;
848};
849  
850//==================================================================================================================
851//============================================================================================ COMPONENTES =========
852//==================================================================================================================
853//----------------------------------------------- CheckRADIO
854function radioTest(radioName){
855    var radios=document.getElementsByName(radioName);
856    var v='';
857    for(var i=0; i<radios.length; i++){
858		if(radios[i].checked){v=radios[i].value; break;}    
859    };
860    return v;
861};
862function radioSet(radioName,valor){	
863    var radios=document.getElementsByName(radioName);
864    for(var i=0; i<radios.length; i++){
865		if(radios[i].value==valor){radios[i].checked=true; break;}    
866    };
867};
868
869//----------------------------------------------- SET VALUE FOR SELECT
870function selectSet(id, valueToSelect){    
871    document.getElementById(id).value=valueToSelect;
872}
873//----------------------------------------------- GET TEXT FROM SELECT
874function selectGetText(id) {
875    var elt = document.getElementById(id);
876    if (elt.selectedIndex == -1){return '';}else{return elt.options[elt.selectedIndex].text;};
877};
878
879//----------------------------------------------- SWITCH
880function switcher(elem){
881	if(typeof(elem) === 'string'){elem=document.getElementById(elem);}
882	//--------
883	if(elem.classList.contains('off')){
884		elem.classList.remove('off'); elem.classList.add('on'); return true;
885	}else{
886		elem.classList.remove('on'); elem.classList.add('off'); return false;
887	}
888};
889function switcherTest(id){
890	if(document.getElementById(id).classList.contains('on')){return true;}else{return false;};
891};
892function switcherSet(id,state){
893	var elem=document.getElementById(id);
894	if(state==true){elem.classList.remove('off'); elem.classList.add('on'); return true;}else{elem.classList.remove('on'); elem.classList.add('off'); return false;};
895};
896
897//----------------------------------------------- TEXTAREA RESIZE
898function textAreaResize(id,nm){
899	nm=(nm)?nm:0; //Num modal to resize
900	var el = document.getElementById(id);
901	setTimeout(function(){
902		el.style.height='auto';
903		el.style.height = (el.scrollHeight+2)+'px';
904	    if(nm!==0){modalSize(nm)}
905	},0);
906}
907//--------------------------------------------------------------------------------------------------------------------------------------------------
908//----------------------------------------------------------------------------------------------- FECHA (Combos) -----------------------------------
909//--------------------------------------------------------------------------------------------------------------------------------------------------
910function setDate(prefix, datehour, years, intervalo_minutos){
911	datehour=(datehour)?datehour:'0000-00-00 00:00:00';
912	years=(years)?years:-100;
913	intervalo_minutos=(intervalo_minutos)?intervalo_minutos:5;
914	var ano='0000'; var mes='00'; var dia='00'; var hora=''; var minuto='';
915
916	//------------- Cortar fecha y hora
917	var troceo=datehour.split(' ');
918	var date=troceo[0];
919	if(troceo.length==2){var th=troceo[1].split(':'); hora=th[0]; minuto=th[1];}
920		
921	//---------
922	if(date!=='0000-00-00'){
923		var troceo=date.split('-');
924		ano=parseInt(troceo[0]); mes=troceo[1]; dia=troceo[2];
925	}
926	//--------- Llenamos días
927	var sal='<option value="" disabled hidden selected>'+lng['dia']+'</option>';
928	for(var i=1; i<32; i++){
929		var d=i.toString();
930		if(i<10){d='0'+d;};
931		sal+='<option value="'+d+'"';
932		if(dia==d){sal+=' selected';}
933		sal+='>'+d+'</option>';
934	}
935	document.getElementById(prefix+'-dia').innerHTML=sal;
936	if(dia!=='00'){document.getElementById(prefix+'-dia').value=dia;};
937
938	//--------- Llenamos meses
939	sal='<option value="" disabled hidden selected>'+lng['mes']+'</option>';
940	for(var i=0; i<12; i++){
941		var m=(i+1).toString();
942		if(i<9){m='0'+m;}; //Está correcto en 9 por que a la i se le suma 1
943		sal+='<option value="'+m+'"';
944		if(mes==m){sal+=' selected';}
945		sal+='>'+lng['meses'][i]+'</option>';		
946	}
947	document.getElementById(prefix+'-mes').innerHTML=sal;
948	if(mes!=='00'){document.getElementById(prefix+'-mes').value=mes;};
949
950    //--------- Llenamos años
951    var faa=parseInt(fechaActualAno);
952    sal='<option value="" disabled hidden selected>'+lng['ano']+'</option>';
953
954    if(years<0){
955    	years=years*-1;
956    	for(var i=faa; i>faa-years; i--){
957	    	sal+='<option value="'+i+'"';
958	    	if(ano==i){sal+=' selected';}
959	    	sal+='>'+i+'</option>';
960	    }
961    }else{
962    	for(var i=faa; i<faa+years; i++){
963	    	sal+='<option value="'+i+'"';
964	    	if(ano==i){sal+=' selected';}
965	    	sal+='>'+i+'</option>';
966	    }
967    }
968    
969	document.getElementById(prefix+'-ano').innerHTML=sal;
970	if(ano!=='00'){document.getElementById(prefix+'-ano').value=ano;};
971
972	//--------------------------------------------------- Llenamos horas
973	if(document.getElementById(prefix+'-hora')){
974		var sal='<option value="" disabled hidden selected>'+lng['hora']+'</option>';
975		for(var i=0; i<24; i++){
976			var h=i.toString();
977			if(i<10){h='0'+h;};
978			sal+='<option value="'+h+'"';
979			if(hora==h){sal+=' selected';}
980			sal+='>'+h+'</option>';
981		}
982		document.getElementById(prefix+'-hora').innerHTML=sal;
983		//----------------------------------------------- Llenamos minutos
984		var sal='<option value="" disabled hidden selected>'+lng['minuto']+'</option>';
985		for(var i=0; i<60; i+=intervalo_minutos){
986			var m=i.toString();
987			if(i<10){m='0'+m;};
988			sal+='<option value="'+m+'"';
989			if(minuto==m){sal+=' selected';}
990			sal+='>'+m+'</option>';
991		}
992		document.getElementById(prefix+'-minuto').innerHTML=sal;
993	}
994}
995
996
997//--------------------------------------------------------------------------------------------------------------------------------------------------
998//----------------------------------------------------------------------------------------------- LOCALIZACIÓN (Combos) ----------------------------
999//--------------------------------------------------------------------------------------------------------------------------------------------------
1000/*
1001var datos=new FormData();
1002datos.append('q','g37G3oLoc471onsS1');
1003datos.append('level',level);
1004//------------------------------ Envío y recepción
1005var solicitud=new XMLHttpRequest();
1006solicitud.addEventListener('load', fin_geoNamesLocation, false); //Función a ejecutar tras el envío y recepción
1007solicitud.open("POST", 'scripts/Q.php', true);
1008solicitud.send(datos);
1009*/
1010var geoLevel=0;
1011function geoNamesLocation(level,idgeo){
1012	
1013	if(idgeo=='reload'){
1014		if(level==1){
1015			geoNamesLocation(0,'6295630'); //Cargar continentes
1016		}else{
1017			geoNamesLocation(level-1, document.getElementById('geoLevel-'+(level-2)).value);
1018		}
1019	}else{
1020		geoLevel=level;		
1021
1022		if(level<5){
1023			//---------------------------------------------- Reseteamos niveles posteriores
1024			for(var i=geoLevel; i<5; i++){
1025				document.getElementById('geoLevel-'+i).innerHTML='<option value="" selected disabled hidden>'+lng.selecciona_una_opcion+'...</option>';
1026				document.getElementById('geoLevel-'+i).parentNode.style.display='none';
1027			};
1028
1029			//---------------------------------------------- Enviamos datos		
1030		    var datos=new FormData();
1031		    //datos.append(idgeo, idgeo);
1032		    //--------------------------------
1033		    var solicitud=new XMLHttpRequest();
1034		    //solicitud.addEventListener('loadstart', inicio_envio, false);
1035		    //solicitud.addEventListener('progress', progreso_envio, false);
1036		    solicitud.addEventListener('error', error_geoNamesLocation, false);
1037		    solicitud.addEventListener('load', fin_geoNamesLocation, false);
1038		    //solicitud.open("POST", 'http://www.geonames.org/childrenJSON?geonameId='+idgeo+'&callback=listPlaces&style=long', true);
1039		    solicitud.open("POST", 'https://www.geonames.org/childrenJSON?geonameId='+idgeo+'&style=short&orderby=name&lang='+Preferences['lng'], true);
1040		    solicitud.send(datos);
1041		};
1042		geo_getInfo();
1043	}
1044}
1045function error_geoNamesLocation(e){
1046	notify('error','modal',lng['campos_geolocation_error']+lng['contacto_bug'])
1047}
1048
1049function fin_geoNamesLocation(e){
1050    var geoData=JSON.parse(e.target.responseText);
1051    var total_resultados=geoData.geonames.length; //geoData.totalResultsCount
1052
1053	if(total_resultados>1){document.getElementById('geoLevel-'+geoLevel).parentNode.style.display='block';}
1054    //--------------------
1055    if(total_resultados>0){    	
1056	    for(var i=0; i<total_resultados; i++){
1057	    	var valor=geoData.geonames[i].geonameId;
1058	    	var nombre=geoData.geonames[i].name;
1059
1060	    	//if(geoLevel==2 && nombre=='Valencia'){nombre='Valencia (Comunidad Valenciana)';}
1061	    	if(geoLevel==2 && nombre=='Valencia'){nombre='Comunidad Valenciana';}
1062	    	//---------
1063	    	var opt = document.createElement('option');
1064		    opt.value = valor;
1065		    opt.dataset.lng = geoData.geonames[i].lng;
1066		    opt.dataset.lat = geoData.geonames[i].lat;
1067		    if(total_resultados==1){opt.selected=true;}//Si solo hay un resultado lo seleccionamos
1068		    opt.innerHTML = nombre;
1069		    document.getElementById('geoLevel-'+geoLevel).appendChild(opt);
1070	    }
1071	    //--------
1072
1073	    if(total_resultados==1){geoNamesLocation(geoLevel+1,valor);}
1074	};  
1075};
1076
1077function geo_getInfo(){
1078	geo='|';
1079	//--------------- Datos campos
1080	for(var i=0; i<geoLevel; i++){
1081		var slct=document.getElementById('geoLevel-'+i);
1082		var name=slct.options[slct.selectedIndex].text;
1083		var id=slct.value;
1084		var lng=slct.options[slct.selectedIndex].dataset.lng;
1085		var lat=slct.options[slct.selectedIndex].dataset.lat;
1086		//----
1087		geo+=name+'|'+id+'|'+lng+'|'+lat+'|';
1088		if(i==geoLevel-1){geoLng=lng; geoLat=lat;}
1089	};
1090}
1091
1092function setGeo(geo){
1093	if(geo!==''){
1094		var level=0;
1095		var troceo=geo.slice(1,-1).split('|');
1096		for(var i=0; i<troceo.length; i+=4){
1097			var name=troceo[i];
1098			var id=troceo[i+1];
1099			var lng=troceo[i+2];
1100			var lat=troceo[i+3];			
1101			//----
1102			var container=document.getElementById('geoLevel-'+level);
1103			container.innerHTML='<option value="reload">Cargar listado...</option><option value="'+id+'" data-lng="'+lng+'" data-lat="'+lat+'" selected>'+name+'</option>';
1104			//if(i!==0){if(name!==troceo[i-1]){container.parentNode.style.display='block';}};
1105			container.parentNode.style.display='block';
1106			level++;
1107		};
1108
1109		if( document.getElementById('geoLevel-'+level) ){
1110			var container=document.getElementById('geoLevel-'+level);
1111			container.innerHTML='<option value=""></option><option value="reload">Cargar listado...</option>';
1112			container.parentNode.style.display='block';
1113		};
1114	}
1115}
1116
1117//*****************************************************************************************************************
1118//****************************************************************************** GET LOCALIZACIÓN *****************
1119//*****************************************************************************************************************
1120function simpleUbicationURL(migeo){
1121	var troceo=migeo.slice(1,-1).split('|');
1122    var total_troceo=troceo.length;
1123    var n1=troceo[total_troceo-4];
1124    var n2=troceo[total_troceo-8];
1125    var sal=n1;
1126    if(n1!==n2 && n2!==undefined){
1127    	sal+='-'+n2;
1128    }
1129    return keywords_filter(sal,'-');
1130}
1131
1132function simpleUbication(migeo){
1133	var troceo=migeo.slice(1,-1).split('|');
1134    var total_troceo=troceo.length;
1135    var n1=troceo[total_troceo-4];
1136    var n2=troceo[total_troceo-8];
1137    var sal='<b>'+n1+'</b>';
1138    if(n1!==n2 && n2!==undefined){
1139    	sal+=' ('+n2+')';
1140    }
1141    return sal;
1142}
1143
1144function showUbication(migeo,lim){
1145	lim=(lim)?lim:0;
1146
1147    var troceo=migeo.slice(1,-1).split('|');
1148    var total_troceo=troceo.length;
1149    
1150    if(lim!==0){
1151   		lim=total_troceo-(lim*4);
1152   	}
1153
1154    var sal='';
1155    var lugar_anterior='';
1156	var desde=total_troceo-1;
1157
1158    for(var i=desde; i>lim; i-=4){
1159    	var lugar=troceo[i-3];
1160
1161    	if(lugar_anterior!=lugar){
1162	    	if (i!=desde){
1163		    	if(sal!=''){
1164			    	sal = lugar + ' > ' + sal;
1165			    }else{
1166			    	sal = lugar + sal;
1167			    }
1168			}else{
1169				//sal = '<strong class="purple-text text-darken-1">'+troceo[i]+'</strong>' + sal;
1170				sal = '<strong>
1170'+lugar+'</strong>' + sal;
1171			}
1172		}
1173        lugar_anterior = lugar;
1174    };
1175    return sal;
1176}
1177
1178//*****************************************************************************************************************
1179//****************************************************************************** OBTENER DISTANCIA ****************
1180//*****************************************************************************************************************
1181//------------------------------- Funcion que a partir de grados devuelve radianes 
1182function deg2rad(deg) {
1183  return deg * (Math.PI/180);
1184}
1185//----------------- Funcion que a partir de las latitudes y longitudes de dos puntos, obtiene su distancia en KMS
1186function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
1187  var R = 6371; // Radius of the earth in km
1188  var dLat = deg2rad(lat2-lat1);  // deg2rad below
1189  var dLon = deg2rad(lon2-lon1); 
1190  var a = 
1191    Math.sin(dLat/2) * Math.sin(dLat/2) +
1192    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
1193    Math.sin(dLon/2) * Math.sin(dLon/2)
1194    ; 
1195  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
1196  var d = R * c; // Distance in km
1197  return Math.floor(d);
1198}
1199
1200/* ------------------------------------------------------------------------------------------------------------------------ */
1201/* ------------------------------------------------------------------------ TEXTO/CONTADORES/KEYWORDS --------------------- */
1202/* ------------------------------------------------------------------------------------------------------------------------ */
1203//var keywordsBlackList=Array(); Se define en Global JS Inicial
1204
1205//------ pasa una palabra a singular
1206function toSingular(palabra){
1207    var palabra_singular = palabra;
1208    palabra = palabra.toLowerCase();
1209
1210    var terminacion_1=palabra.slice(-1);
1211    var terminacion_2=palabra.slice(-2);
1212    var last_3=palabra.slice(palabra.length-3,-2);
1213   
1214    if (last_3=='n' || last_3=='t'){ //acaba en 's'
1215    	if(terminacion_2=='es'){ //acaba en 'es'
1216    		palabra_singular = palabra.slice(0,-2); //elimina el 'es'
1217    	}
1218    }else if(terminacion_1 == 's'){
1219		palabra_singular = palabra.slice(0,-1); //elimina la 's'
1220	}
1221    return palabra_singular;
1222}
1223
1224function normalize(text) { //Minúsculas sin acentos ni carácteres especiales
1225    var chars={
1226		"á":"a", "é":"e", "í":"i", "ó":"o", "ú":"u",
1227		"à":"a", "è":"e", "ì":"i", "ò":"o", "ù":"u", "ñ":"ñ",
1228		"Á":"A", "É":"E", "Í":"I", "Ó":"O", "Ú":"U",
1229		"À":"A", "È":"E", "Ì":"I", "Ò":"O", "Ù":"U", "Ñ":"Ñ"}
1230	var expr=/[áàéèíìóòúùñ]/ig;
1231	var res=text.replace(expr,function(e){return chars[e]});
1232	return res;
1233}
1234
1235//----------------------------------------------------------- FILTRO KEYWORDS
1236function keywords_filter(cadena, part_cadena=', ', max_length_word=4){
1237	var quitar_final=part_cadena.length;
1238	//---------------- Eliminamos mayúsculas, acentos y demás marcajes en letras...
1239	cadena=normalize(cadena.toLowerCase());
1240	//---------------- Sustituimos signos de puntuación como comas, interrogaciones, etc... por espacios
1241	cadena=cadena.replace(/[^A-Za-z0-9ñ\s]+/g, ' '); //Permitimos también la Ñ
1242
1243	//$cad = preg_replace('/[^a-z0-9ñ]+/', ' ', $cad);
1244	//--------------------- Eliminamos espacios innecesarios al principio y final de la cadena
1245	cadena=cadena.replace(/^\s+|\s+$/g, "");
1246	//--------------------- Eliminamos también espacios innecesarios entre palabras
1247	cadena=cadena.replace(/\s+/gi,'|');
1248	//---------------- Eliminamos las palabras que no nos interesan
1249	var cadena_final='';
1250	var cadena_partida=cadena.split('|');
1251	
1252	var devolver='';
1253	for(var i=0; i<cadena_partida.length; i++){
1254		var palabra=cadena_partida[i];
1255		var libre=true;
1256		//-------------------------
1257		if(palabra.length<4){
1258			libre=false;
1259		}else{	
1260			for(var j=0; j<keywordsBlackList.length; j++){
1261				if(cadena_partida[i]==keywordsBlackList[j]){
1262					libre=false;
1263					break;	
1264					};
1265				};
1266		};
1267		//-------------------------
1268		if(libre==true){
1269			//palabra=toSingular(palabra);
1270			devolver+=palabra+part_cadena;
1271			};
1272		};
1273
1274	var rtn = devolver.substring(0, devolver.length-quitar_final);
1275
1276	return rtn;
1277	};
1278
1279/* ------------------------------------------------------------------------------------------------------------------------ */
1280/* ----------------------------------------------------------------------------------- OTROS/VARIOS ----------------------- */
1281/* ------------------------------------------------------------------------------------------------------------------------ */
1282//--------------------------------------- RGB to Hex
1283function hex(cv){
1284    var parts = cv.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
1285    delete(parts[0]);
1286    for (var i = 1; i <= 3; ++i) {
1287        parts[i] = parseInt(parts[i]).toString(16);
1288        if (parts[i].length == 1) parts[i] = '0' + parts[i];
1289    }
1290    return '#' + parts.join('');
1291}
1292
1293
1294function linkDetect(text,cls='light-green-text text-darken-2'){
1295  	var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
1296  	return text.replace(exp,'<a href="$1" target="_blank" class="b_txt underline toTransparent '+cls+'">$1</a>'); 
1297}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.