X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcbi%2Fhtdocs%2Fluci-static%2Fresources%2Fcbi.js;h=4af6e58d9b5a234268db37bf62f82bd6e1313aff;hp=08ee593356eb3570cf02cc94a62753ff1b581cb5;hb=7b23839dce0c09953142a5af946ab642027bc3c5;hpb=565cc95f0db46e4d1e0bb947115af2d762c3b859 diff --git a/libs/cbi/htdocs/luci-static/resources/cbi.js b/libs/cbi/htdocs/luci-static/resources/cbi.js index 08ee59335..4af6e58d9 100644 --- a/libs/cbi/htdocs/luci-static/resources/cbi.js +++ b/libs/cbi/htdocs/luci-static/resources/cbi.js @@ -2,21 +2,168 @@ LuCI - Lua Configuration Interface Copyright 2008 Steven Barth - Copyright 2008-2009 Jo-Philipp Wich + Copyright 2008-2010 Jo-Philipp Wich Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - - $Id$ */ var cbi_d = []; var cbi_t = []; var cbi_c = []; +var cbi_validators = { + + 'integer': function(v) + { + return (v.match(/^-?[0-9]+$/) != null); + }, + + 'uinteger': function(v) + { + return (cbi_validators.integer(v) && (v >= 0)); + }, + + 'ipaddr': function(v) + { + return cbi_validators.ip4addr(v) || cbi_validators.ip6addr(v); + }, + + 'ip4addr': function(v) + { + if( v.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\/(\d+))?$/) ) + { + return (RegExp.$1 >= 0) && (RegExp.$1 <= 255) && + (RegExp.$2 >= 0) && (RegExp.$2 <= 255) && + (RegExp.$3 >= 0) && (RegExp.$3 <= 255) && + (RegExp.$4 >= 0) && (RegExp.$4 <= 255) && + (!RegExp.$5 || ((RegExp.$6 >= 0) && (RegExp.$6 <= 32))) + ; + } + + return false; + }, + + 'ip6addr': function(v) + { + if( v.match(/^([a-fA-F0-9:.]+)(\/(\d+))?$/) ) + { + if( !RegExp.$2 || ((RegExp.$3 >= 0) && (RegExp.$3 <= 128)) ) + { + var addr = RegExp.$1; + + if( addr == '::' ) + { + return true; + } + + if( addr.indexOf('.') > 0 ) + { + var off = addr.lastIndexOf(':'); + + if( !(off && cbi_validators.ip4addr(addr.substr(off+1))) ) + return false; + + addr = addr.substr(0, off) + ':0:0'; + } + + if( addr.indexOf('::') < 0 ) + { + return (addr.match(/^(?:[a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}$/) != null); + } + + var fields = 0; + + for( var i = 0, last = 0, comp = false; i <= addr.length; i++ ) + { + if( (addr.charAt(i) == ':') || (i == addr.length) ) + { + if( (i == last) && !comp ) + { + comp = true; + } + else + { + var f = addr.substring(last, i); + if( !(f && f.match(/^[a-fA-F0-9]{1,4}$/)) ) + return false; + } + + fields++; + last = i + 1; + } + } + + return (fields == 8); + } + } + + return false; + }, + + 'port': function(v) + { + return cbi_validators.integer(v) && (v >= 0) && (v <= 65535); + }, + + 'portrange': function(v) + { + if( v.match(/^(\d+)-(\d+)$/) ) + { + var p1 = RegExp.$1; + var p2 = RegExp.$2; + + return cbi_validators.port(p1) && + cbi_validators.port(p2) && + (parseInt(p1) <= parseInt(p2)) + ; + } + else + { + return cbi_validators.port(v); + } + }, + + 'macaddr': function(v) + { + return (v.match(/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/) != null); + }, + + 'host': function(v) + { + return cbi_validators.hostname(v) || cbi_validators.ipaddr(v); + }, + + 'hostname': function(v) + { + return (v.match(/^[a-zA-Z_][a-zA-Z0-9_\-.]*$/) != null); + }, + + 'wpakey': function(v) + { + if( v.length == 64 ) + return (v.match(/^[a-fA-F0-9]{64}$/) != null); + else + return (v.length >= 8) && (v.length <= 63); + }, + + 'wepkey': function(v) + { + if( v.substr(0,2) == 's:' ) + v = v.substr(2); + + if( (v.length == 10) || (v.length == 26) ) + return (v.match(/^[a-fA-F0-9]{10,26}$/) != null); + else + return (v.length == 5) || (v.length == 13); + }, + +}; + + function cbi_d_add(field, dep, next) { var obj = document.getElementById(field); if (obj) { @@ -45,7 +192,18 @@ function cbi_d_checkvalue(target, ref) { var t = document.getElementById(target); var value; - if (!t || !t.value) { + if (!t) { + var tl = document.getElementsByName(target); + + if( tl.length > 0 && tl[0].type == 'radio' ) + for( var i = 0; i < tl.length; i++ ) + if( tl[i].checked ) { + value = tl[i].value; + break; + } + + value = value ? value : ""; + } else if (!t.value) { value = ""; } else { value = t.value; @@ -91,7 +249,7 @@ function cbi_d_update() { if (node && node.parentNode && !cbi_d_check(entry.deps)) { node.parentNode.removeChild(node); - state = (state || !node.parentNode); + state = true; if( entry.parent ) cbi_c[entry.parent]--; } else if ((!node || !node.parentNode) && cbi_d_check(entry.deps)) { @@ -100,7 +258,7 @@ function cbi_d_update() { } else { next.parentNode.insertBefore(entry.node, next); } - state = (state || (node && node.parentNode)) + state = true; if( entry.parent ) cbi_c[entry.parent]++; } @@ -146,6 +304,9 @@ function cbi_combobox(id, values, def, man) { var sel = document.createElement("select"); sel.id = selid; sel.className = 'cbi-input-select'; + if (obj.className && obj.className.match(/cbi-input-invalid/)) { + sel.className += ' cbi-input-invalid'; + } if (obj.nextSibling) { obj.parentNode.insertBefore(sel, obj.nextSibling); } else { @@ -193,6 +354,8 @@ function cbi_combobox(id, values, def, man) { obj.focus(); } else { obj.value = sel.options[sel.selectedIndex].value; + sel.className = (!obj.validate || obj.validate()) + ? 'cbi-input-select' : 'cbi-input-select cbi-input-invalid'; } try { @@ -288,3 +451,68 @@ function cbi_t_update() { } } + +function cbi_validate_form(form, errmsg) +{ + if( form.cbi_validators ) + { + for( var i = 0; i < form.cbi_validators.length; i++ ) + { + var validator = form.cbi_validators[i]; + if( !validator() && errmsg ) + { + alert(errmsg); + return false; + } + } + } + + return true; +} + +function cbi_validate_reset(form) +{ + window.setTimeout( + function() { cbi_validate_form(form, null) }, 100 + ); + + return true; +} + +function cbi_validate_field(cbid, optional, type) +{ + var field = document.getElementById(cbid); + var vldcb = cbi_validators[type]; + + if( field && vldcb ) + { + var validator = function(reset) + { + // is not detached + if( field.form ) + { + field.className = field.className.replace(/ cbi-input-invalid/g, ''); + + // validate value + var value = (field.options) ? field.options[field.options.selectedIndex].value : field.value; + if( !(((value.length == 0) && optional) || vldcb(value)) ) + { + // invalid + field.className += ' cbi-input-invalid'; + return false; + } + } + + return true; + }; + + if( ! field.form.cbi_validators ) + field.form.cbi_validators = [ ]; + + field.form.cbi_validators.push(validator); + field.onblur = field.onkeyup = field.validate = validator; + + validator(); + } +} +