X-Git-Url: http://git.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fweb%2Fhtdocs%2Fluci-static%2Fresources%2Fcbi.js;h=2bcfb8c3dfffc373e3e07d8f06c9c675eb2dbcd7;hp=62dada464e276acfc41b87cb27ac544f010e7b49;hb=489279bb9a4d9984315bc0e0f97a56fea800bbcd;hpb=6d02d50d461356343b742a2914b85e2d6d0ba5e1 diff --git a/libs/web/htdocs/luci-static/resources/cbi.js b/libs/web/htdocs/luci-static/resources/cbi.js index 62dada464e..2bcfb8c3df 100644 --- a/libs/web/htdocs/luci-static/resources/cbi.js +++ b/libs/web/htdocs/luci-static/resources/cbi.js @@ -27,6 +27,16 @@ var cbi_validators = { return (cbi_validators.integer(v) && (v >= 0)); }, + 'float': function(v) + { + return !isNaN(parseFloat(v)); + }, + + 'ufloat': function(v) + { + return (cbi_validators['float'](v) && (v >= 0)); + }, + 'ipaddr': function(v) { return cbi_validators.ip4addr(v) || cbi_validators.ip6addr(v); @@ -131,8 +141,8 @@ var cbi_validators = { }, 'hostname': function(v) - { - return (v.match(/^[a-zA-Z_][a-zA-Z0-9_\-.]*$/) != null); + { if ( v.length <= 253 ) + return (v.match(/^[a-zA-Z0-9][a-zA-Z0-9\-.]*[a-zA-Z0-9]$/) != null); }, 'wpakey': function(v) @@ -392,16 +402,24 @@ function cbi_filebrowser(id, url, defpath) { browser.focus(); } -function cbi_dynlist_init(name) +function cbi_dynlist_init(name, respath) { function cbi_dynlist_renumber(e) { - var count = 1; - var childs = e.parentNode.childNodes; - - for( var i = 0; i < childs.length; i++ ) - if( childs[i].name == name ) - childs[i].id = name + '.' + (count++); + /* in a perfect world, we could just getElementsByName() - but not if + * MSIE is involved... */ + var inputs = [ ]; // = document.getElementsByName(name); + for (var i = 0; i < e.parentNode.childNodes.length; i++) + if (e.parentNode.childNodes[i].name == name) + inputs.push(e.parentNode.childNodes[i]); + + for (var i = 0; i < inputs.length; i++) + { + inputs[i].id = name + '.' + (i + 1); + inputs[i].nextSibling.src = respath + ( + (i+1) < inputs.length ? '/cbi/remove.gif' : '/cbi/add.gif' + ); + } e.focus(); } @@ -470,6 +488,7 @@ function cbi_dynlist_init(name) if (se.value.length == 0 && jump) { + se.parentNode.removeChild(se.nextSibling.nextSibling); se.parentNode.removeChild(se.nextSibling); se.parentNode.removeChild(se); @@ -478,6 +497,9 @@ function cbi_dynlist_init(name) if (ev.preventDefault) ev.preventDefault(); + /* IE Quirk, needs double focus somehow */ + jump.focus(); + return false; } @@ -489,17 +511,22 @@ function cbi_dynlist_init(name) n.name = se.name; n.type = se.type; + var b = document.createElement('img'); + cbi_bind(n, 'keydown', cbi_dynlist_keydown); cbi_bind(n, 'keypress', cbi_dynlist_keypress); + cbi_bind(b, 'click', cbi_dynlist_btnclick); if (next) { se.parentNode.insertBefore(n, next); + se.parentNode.insertBefore(b, next); se.parentNode.insertBefore(document.createElement('br'), next); } else { se.parentNode.appendChild(n); + se.parentNode.appendChild(b); se.parentNode.appendChild(document.createElement('br')); } @@ -530,11 +557,45 @@ function cbi_dynlist_init(name) return true; } + function cbi_dynlist_btnclick(ev) + { + ev = ev ? ev : window.event; + + var se = ev.target ? ev.target : ev.srcElement; + + if (se.src.indexOf('remove') > -1) + { + se.previousSibling.value = ''; + + cbi_dynlist_keydown({ + target: se.previousSibling, + keyCode: 8 + }); + } + else + { + cbi_dynlist_keydown({ + target: se.previousSibling, + keyCode: 13 + }); + } + + return false; + } + var inputs = document.getElementsByName(name); for( var i = 0; i < inputs.length; i++ ) { + var btn = document.createElement('img'); + btn.src = respath + ( + (i+1) < inputs.length ? '/cbi/remove.gif' : '/cbi/add.gif' + ); + + inputs[i].parentNode.insertBefore(btn, inputs[i].nextSibling); + cbi_bind(inputs[i], 'keydown', cbi_dynlist_keydown); cbi_bind(inputs[i], 'keypress', cbi_dynlist_keypress); + cbi_bind(btn, 'click', cbi_dynlist_btnclick); } } @@ -708,6 +769,56 @@ function cbi_validate_field(cbid, optional, type) } } +function cbi_row_swap(elem, up, store) +{ + var tr = elem.parentNode; + while (tr && tr.nodeName.toLowerCase() != 'tr') + tr = tr.parentNode; + + if (!tr) + return false; + + var table = tr.parentNode; + while (table && table.nodeName.toLowerCase() != 'table') + table = table.parentNode; + + if (!table) + return false; + + var s = up ? 3 : 2; + var e = up ? table.rows.length : table.rows.length - 1; + + for (var idx = s; idx < e; idx++) + { + if (table.rows[idx] == tr) + { + if (up) + tr.parentNode.insertBefore(table.rows[idx], table.rows[idx-1]); + else + tr.parentNode.insertBefore(table.rows[idx+1], table.rows[idx]); + + break; + } + } + + var ids = [ ]; + for (idx = 2; idx < table.rows.length; idx++) + { + table.rows[idx].className = table.rows[idx].className.replace( + /cbi-rowstyle-[12]/, 'cbi-rowstyle-' + (1 + (idx % 2)) + ); + + if (table.rows[idx].id && table.rows[idx].id.match(/-([^\-]+)$/) ) + ids.push(RegExp.$1); + } + + var input = document.getElementById(store); + if (input) + input.value = ids.join(' '); + + return false; +} + if( ! String.serialize ) String.serialize = function(o) { @@ -778,7 +889,7 @@ if( ! String.format ) var str = arguments[0]; var out = ''; - var re = /^(([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X|q|h|j))/; + var re = /^(([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X|q|h|j|t))/; var a = b = [], numSubstitutions = 0, numMatches = 0; while( a = re.exec(str) ) @@ -839,7 +950,7 @@ if( ! String.format ) case 'f': subst = (precision > -1) - ? Math.round((parseFloat(param) || 0.0) * Math.pow(10, precision)) / Math.pow(10, precision) + ? ((parseFloat(param) || 0.0)).toFixed(precision) : (parseFloat(param) || 0.0); break; @@ -870,6 +981,33 @@ if( ! String.format ) case 'j': subst = String.serialize(param); break; + + case 't': + var td = 0; + var th = 0; + var tm = 0; + var ts = (param || 0); + + if (ts > 60) { + tm = Math.floor(ts / 60); + ts = (ts % 60); + } + + if (tm > 60) { + th = Math.floor(tm / 60); + tm = (tm % 60); + } + + if (th > 24) { + td = Math.floor(th / 24); + th = (th % 24); + } + + subst = (td > 0) + ? String.format('%dd %dh %dm %ds', td, th, tm, ts) + : String.format('%dh %dm %ds', th, tm, ts); + + break; } } }