1// Javascript Form Validator 2var vsmlang; // Define el idioma en que se muestran los mensajes de error. 3var vsmfSubmitted = false; // Flag que indica si fue ejecutado el submit. 4var vsmfOnSubmitHandle = 'alert'; // Función llamada cuando se produce un error en un elemento del formulario al hacer submit. 5var vsmfOnBlurHandle = null; // Función llamada cuando se produce un error en un elemento del formulario al perder el foco. 6var vsmfOnFocusError = null; // Función llamada cuando se produce un error al querer enfocar el campo que produjo el error. 7var vsmfProcesses = 0; // Flag que indica la cantidad de procesos de validación pendiente. Incluye los llamados AJAX + vsmSubmit; 8var vsmfErrorDisplayed = false; // Flag que indica si ya se mostró un error. 9var vsmfForm = null; // Contiene el objeto tipo FORM con el formulario validado. En caso de que el submit deba hacerse asincronico al finalizar un llamado AJAX. 10var vsmfElement = null; // Contiene el objeto tipo INPUT con el último elemento validado. 11 12function vsmRequireValidation() { 13 // Llamado en los inputs que requieren validación 14 if(!vsmfSubmitted) vsmfErrorDisplayed = false; 15} 16 17function vsmSubmit(frm, lang, onSubmitHandle, onBlurHandle) { 18 // Define el idioma 19 lang = lang.toLowerCase(); 20 if (lang != 'en' && lang !='pt' && lang !='es') {vsmlang='en';} else {vsmlang=lang;} 21 // Resetea las variables 22 vsmfForm = frm; 23 vsmfErrorDisplayed = ''; 24 vsmfProcesses = 1; 25 vsmfSubmitted = true; 26 // Define los handlers 27 if(onSubmitHandle != undefined) vsmfOnSubmitHandle = onSubmitHandle; 28 if(onBlurHandle != undefined) vsmfOnBlurHandle = onBlurHandle; 29 // Desactiva el botón de submit 30 vsmSubmitButtonEnabled(false); 31 // Recorre los elementos del formulario y los valida 32 33 for(var index=0;index<frm.elements.length;index++) { 34 var el= frm.elements[index]; 35 if(!el.type) continue; 36 if(el.onblur && el.onblur !== "") el.onblur(); 37 if(vsmfErrorDisplayed) return false; 38 } 39 40 vsmfProcesses-=1; 41 if(vsmfProcesses==0 && vsmfSubmitted) {return true;} else {return false;} 42} 43 44function vsmSubmitButtonEnabled(value) { 45 // Activa o desactiva el botón de submit 46 var frm = vsmfForm; 47 for(var index= 0; index < frm.elements.length;index++) 48 if(frm.elements[index].type == 'submit' || frm.elements[index].type == 'image') frm.elements[index].disabled= !value; 49} 50 51function vsmFocusElement(element) { 52 // Intenta hacer foco en el elemento del formulario 53 try { 54 element.focus(); 55 } catch (error) { 56 if(vsmfOnFocusError) eval(vsmfOnFocusError+'()'); 57 } 58 // Determina si el elemento informa que el destaque de error debe hacerse sobre otro elemento a través del atributo highlight 59 var obj; 60 var highlight = element.getAttribute('highlight'); 61 if(highlight) obj = document.getElementById(highlight); 62 if(!obj) obj = element; 63 if(obj.className.indexOf('vsmformerror') == -1) obj.className+= ' vsmformerror'; 64} 65 66function vsmFieldDescription(fld) { 67 // Devuelve la descripción del campo 68 if(fld.title) return fld.title; 69 if(fld.id && document.getElementsByTagName) { 70 for(var i= 0, lbl= document.getElementsByTagName('LABEL'); i < lbl.length; i++) 71 if(lbl[i].htmlFor==fld.id) return lbl[i].nodeValue||lbl[i].textContent||lbl[i].innerText; 72 for(var i= 0, lbl= document.getElementsByTagName('label'); i < lbl.length; i++) 73 if(lbl[i].htmlFor==fld.id) return lbl[i].nodeValue||lbl[i].textContent||lbl[i].innerText; 74 } 75 return fld.name; 76} 77 78function vsmTrim(str) { 79 return str.replace(/^\s*|\s*$/g,""); 80} 81 82function vsmAjaxValidation(fld, url) { 83 // Dispara una validación ajax 84 if(vsmfSubmitted) vsmfProcesses+=1; 85 if(!vsmfErrorDisplayed && (vsmfSubmitted || vsmfOnBlurHandle)) vsm.ajaxCall(url, 'vsmAjaxValidationOK("'+fld.id+'")', 'vsmAjaxValidationError("'+fld.id+'")'); 86} 87 88function vsmAjaxValidationOK(response, fldid) { 89 if(response.length) document.getElementById(fldid).value = response; 90 if(vsmfSubmitted) { 91 vsmfProcesses-=1; 92 // Si no quedan llamados ajax pendientes envia el formulario 93 if(vsmfProcesses==0) vsmfForm.submit(); 94 } 95} 96 97function vsmAjaxValidationError(response, fldid) { 98 var fld = document.getElementById(fldid); 99 if(vsmfSubmitted) vsmfProcesses-=1; 100 // response devuelve un array json con value (nuevo valor del campo) y error mensaje de error 101 var e= eval('(' + response + ')'); 102 if(e['value']) fld.value = e['value']; 103 if(e['error']) vsmfShowError(fld, e['error']); 104} 105 106function vsmfShowError(fld,errorMsg) { 107 108 if(!vsmfErrorDisplayed) { 109 vsmfErrorDisplayed = true; 110 vsmfElement = fld; 111 if(vsmfSubmitted) { 112 if(vsmfOnSubmitHandle) eval(vsmfOnSubmitHandle+"(errorMsg)"); 113 vsmFocusElement(vsmfElement); 114 vsmSubmitButtonEnabled(true); 115 vsmfSubmitted=false; 116 } else { 117 if(vsmfOnBlurHandle) eval(vsmfOnBlurHandle+"(errorMsg)"); 118 } 119 } 120} 121 122function vsmOnInput(fld) { 123 if(fld.value) { 124 vsm.removeClass(fld.parentNode, 'empty'); 125 } else { 126 vsm.addClass(fld.parentNode, 'empty'); 127 } 128} 129 130/* Funciones de validación */ 131function vsmRequired(fld) { 132 if(fld.disabled) return; 133 switch(fld.type) { 134 case 'checkbox': 135 if(fld.checked) return true; 136 break; 137 case 'radio': 138 var radios = fld.form[fld.name]; 139 for(var i=0;i<radios.length;i++) { 140 if (radios[i].checked) return true; 141 } 142 break; 143 case 'select-one': 144 if(fld.selectedIndex!=-1 && fld.options[fld.selectedIndex].value!='') return true; 145 break; 146 default: 147 if(fld.value.length) return true; 148 break; 149 } 150 switch (vsmlang) { 151 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' no puede ser omitido.'; break; 152 case 'pt': var errorMsg= 'Deve preencher o campo '+vsmFieldDescription(fld)+'.'; break; 153 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field cannot be left blank.'; break; 154 } 155 vsmfShowError(fld, errorMsg); 156} 157 158function vsmConfirmation(fld, confirmfld) { 159 if(fld.disabled) return; 160 if(fld.value != confirmfld.value) { 161 switch (vsmlang) { 162 case 'es': var errorMsg= 'Los campos '+vsmFieldDescription(fld)+' y '+vsmFieldDescription(confirmfld)+' deben ser idénticos.'; break; 163 case 'pt': var errorMsg= 'Os campos '+vsmFieldDescription(fld)+' e '+vsmFieldDescription(confirmfld)+' devem ser iguais.'; break; 164 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field does not match the '+vsmFieldDescription(confirmfld)+' field.'; break; 165 } 166 vsmfShowError(fld, errorMsg); 167 } 168} 169 170function vsmLength(fld, min, max) { 171 if(fld.disabled) return; 172 var len= fld.value.length; 173 if(min > -1 && len < min) { 174 switch (vsmlang) { 175 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' debe tener al menos '+min+ ' caracteres; Actualmente tiene '+len+'.'; break; 176 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' deve conter no mínimo '+min+ ' caracteres; Atualmente contem '+len+'.'; break; 177 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field must be at least '+min+ ' characters long; it is currently '+len+' characters long.'; break; 178 } 179 vsmfShowError(fld, errorMsg); 180 return; 181 } 182 183 if(max > -1 && len > max) { 184 switch (vsmlang) { 185 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' debe tener un máximo de '+max+ ' caracteres; Actualmente tiene '+len+'.'; break; 186 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' deve conter no máximo '+max+ ' caracteres; Atualmente contem '+len+'.'; break; 187 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field must be no more than '+max+' characters long; it is currently '+len+' characters long.'; break; 188 } 189 vsmfShowError(fld, errorMsg); 190 return; 191 } 192} 193 194function vsmInteger(fld, min, max) { 195 // Controla que el campo sea entero entre los valores min y max 196 if(fld.disabled) return true; 197 if(fld.value && fld.value != parseInt(fld.value)) { 198 switch (vsmlang) { 199 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' debe ser numérico.'; break; 200 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' deve ser numérico.'; break; 201 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field must be a number.'; break; 202 } 203 vsmfShowError(fld, errorMsg); 204 return; 205 } 206 207 if(fld.value < min || fld.value > max) { 208 switch (vsmlang) { 209 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' debe ser numérico entre '+min+ ' y '+max+'.'; break; 210 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' deve ser numérico entre '+min+ ' y '+max+'.'; break; 211 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field must be a number between '+min+ ' and '+max+'.'; break; 212 } 213 vsmfShowError(fld, errorMsg); 214 return; 215 } 216} 217 218 219function vsmAllowChars(fld, chars) { 220 // provide a string of acceptable chars for a field 221 if(fld.disabled) return true; 222 var length = fld.value.length; 223 for(var i=0;i<length;i++) { 224 if(chars.indexOf(fld.value.charAt(i)) == -1) { 225 switch (vsmlang) { 226 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' contiene caracteres no permitidos.\r\n" '+fld.value.charAt(i)+' " no es un caracter permitido.\r\nLos caracteres permitidos son:\r\n'+chars; break; 227 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' contem caracteres não permitidos.\r\n" '+fld.value.charAt(i)+' " não é um caracter permitido.\r\nOs caracteres permitidos são:\r\n'+chars; break; 228 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' contain invali
228d characters. It may only contain the following characters:\r\n'+chars; break; 229 } 230 vsmfShowError(fld, errorMsg); 231 return; 232 } 233 } 234} 235 236function vsmDisallowChars(fld, chars){ 237 // provide a string of unacceptable chars for a field 238 if(fld.disabled) return true; 239 var length = fld.value.length; 240 for(var i=0;i<length;i++) { 241 if(chars.indexOf(fld.value.charAt(i)) != -1) { 242 switch (vsmlang) { 243 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' no puede contener ninguno de los siguientes caracteres:\r\n'+chars; break; 244 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' não pode conter nenhum dos seguintes caracteres:\r\n'+chars; break; 245 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field cannot contain any of the following characteres:\r\n'+chars; break; 246 } 247 vsmfShowError(fld, errorMsg); 248 return; 249 } 250 } 251} 252 253function vsmEmail(fld) { 254 if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 255 fld.value = vsmTrim(fld.value.toLowerCase()); 256 var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,8})+$/; 257 if (!filter.test(fld.value)) { 258 switch (vsmlang) { 259 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' no es una dirección de correo válida.'; break; 260 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' não é um endereço válido'; break; 261 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field must contain a valid email address.'; break; 262 } 263 vsmfShowError(fld, errorMsg); 264 return; 265 } 266} 267 268function vsmFile(fld, allowedfiletypes) { 269 var ok = true; 270 if(!fld.value.length||fld.disabled) return true; 271 if(typeof allowedfiletypes == 'undefined') allowedfiletypes = fld.getAttribute('data-vsm-file-types'); 272 // Obtiene la extension el archivo 273 var filepath = fld.value; 274 if(filepath.lastIndexOf(".") == -1) ok = false; 275 if (ok) { 276 var fileext = (filepath.substring(filepath.lastIndexOf(".")+1)).toLowerCase(); 277 if (allowedfiletypes && (allowedfiletypes+',').indexOf(fileext+',') == -1) ok = false; 278 } 279 280 if (!ok) { 281 switch(vsmlang) { 282 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' no contiene un archivo válido.\r\n\r\nTipos de archivos válidos:\r\n' + allowedfiletypes.toUpperCase(); break; 283 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' não é um arquivo válido.\r\n\r\nTipos de arquivos validos:\r\n' + allowedfiletypes.toUpperCase(); break; 284 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field must contain a valid file type.\r\n\r\nValid file types:\r\n' + allowedfiletypes.toUpperCase(); break; 285 } 286 vsmfShowError(fld, errorMsg); 287 return; 288 } else { 289 return true; 290 } 291} 292 293function vsmLabel(fld, objectType, objectID, settings, fieldlabel) { 294 // Valida si la clave única de un objeto es válida 295 /* 296 var newValue = ''; 297 fld.value = vsmTrim(fld.value); 298 for(var i=0;i<fld.value.length;i++) { 299 var car = fld.value.charAt(i).toLowerCase(); 300 if(String('abcdefghijklmnopqrstuvwxyz0123456789').indexOf(car) != -1) { 301 newValue+= car; 302 } else if (String(' -_;:,.').indexOf(car) != -1) { 303 newValue+= '-'; 304 } else if (String('áàâä').indexOf(car) != -1) { 305 newValue+= 'a'; 306 } else if (String('éèêë').indexOf(car) != -1) { 307 newValue+= 'e'; 308 } else if (String('íìîï').indexOf(car) != -1) { 309 newValue+= 'i'; 310 } else if (String('óòôö').indexOf(car) != -1) { 311 newValue+= 'o'; 312 } else if (String('úùûü').indexOf(car) != -1) { 313 newValue+= 'u'; 314 } else if (car == 'ñ') { 315 newValue+= 'n'; 316 } else if (car == 'ç') { 317 newValue+= 'c'; 318 } 319 } 320 fld.value = newValue; 321 */ 322 fld.value = vsmTrim(fld.value); 323 if(fld.value) { 324 var url = '/tools/ajax/validLabel.php?ot='+objectType+'&oid='+objectID+'&s='+settings+'&v='+escape(fld.value)+'&c='+fieldlabel+'&l='+vsmlang; 325 vsmAjaxValidation(fld, url); 326 } 327} 328 329 330function vsmDate(fld, format) { 331 // Esta ok si el campo está vacio o disabled 332 if(!fld.value.length||fld.disabled) return true; 333 // Normaliza la fecha quitando los espacios y convirtiendo cualquier separador en / 334 fld.value = vsmTrim(fld.value); 335 var d = fld.value.replace(/\D/g, '/'); 336 // Obtiene los valores separados por / 337 dateArray = d.split('/'); 338 if (dateArray.length == 3) { 339 format = format.toLowerCase(); 340 switch(format) { 341 case 'ymd': year=dateArray[0]; month = dateArray[1]; day = dateArray[2]; break; 342 case 'dmy': year=dateArray[2]; month = dateArray[1]; day = dateArray[0]; break; 343 case 'mdy': year=dateArray[2]; month = dateArray[0]; day = dateArray[1]; break; 344 } 345 ok = vsmValidDate(year, month, day); 346 if (ok) { 347 fld.value = d; 348 return; 349 } 350 351 } 352 switch (vsmlang) { 353 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(fld)+' no es una fecha válida.'; break; 354 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(fld)+' não é uma data válida'; break; 355 default: var errorMsg= 'The '+vsmFieldDescription(fld)+' field must contain a valid date.'; break; 356 } 357 vsmfShowError(fld, errorMsg); 358 return; 359} 360 361function vsmComboDate(yearfld, monthfld, dayfld, required) { 362 if (typeof(required)=='undefined') required = false; 363 if (yearfld.disabled || monthfld.disabled || dayfld.disabled) return true; 364 if (!yearfld.value.length && !monthfld.value.length && !dayfld.value.length) { 365 if (required) { 366 switch (vsmlang) { 367 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(yearfld)+' no puede quedar vacío.'; break; 368 case 'pt': var errorMsg= 'Deve preencher o campo '+vsmFieldDescription(yearfld)+'.'; break; 369 default: var errorMsg= 'The '+vsmFieldDescription(yearfld)+' field cannot be left blank.'; break; 370 } 371 vsmfShowError(dayfld, errorMsg); 372 return; 373 } else { 374 return; 375 } 376 } 377 ok = vsmValidDate(yearfld.value, monthfld.value, dayfld.value); 378 if (!ok) { 379 switch (vsmlang) { 380 case 'es': var errorMsg= 'El campo '+vsmFieldDescription(yearfld)+' no es una fecha válida.'; break; 381 case 'pt': var errorMsg= 'O campo '+vsmFieldDescription(yearfld)+' não é uma data válida'; break; 382 default: var errorMsg= 'The '+vsmFieldDescription(yearfld)+' field must contain a valid date.'; break; 383 } 384 vsmfShowError(dayfld, errorMsg); 385 return; 386 } 387} 388 389function vsmValidDate(year, month, day) { 390 if (!isNaN(day) && !isNaN(month) && !isNaN(year)) { 391 month = month-1; 392 var dteDate=new Date(year,month,day); 393 if ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear())) return true; 394 } 395 return false; 396} 397 398function vsmDependants(enabled, elements) { 399 // Para Activar/Desactivar campos 400 // convenience function to enable/disable dependant fields, passed in as an array 401 if(!elements.length) return true; 402 for(var i= 0; i < elements.length; i++) { 403 elements[i].disabled= !enabled; 404 } 405} 406
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.