@@ -41,27 +41,21 @@ Nette.addEvent = function(element, on, callback) {
4141 * Returns the value of form element.
4242 */
4343Nette . getValue = function ( elem ) {
44- var i , len ;
44+ var i ;
4545 if ( ! elem ) {
4646 return null ;
4747
4848 } else if ( ! elem . tagName ) { // RadioNodeList, HTMLCollection, array
49- var multi = elem [ 0 ] && ! ! elem [ 0 ] . name . match ( / \[ \] $ / ) ,
50- res = [ ] ;
49+ return elem [ 0 ] ? Nette . getValue ( elem [ 0 ] ) : null ;
5150
52- for ( i = 0 , len = elem . length ; i < len ; i ++ ) {
53- if ( elem [ i ] . type in { checkbox : 1 , radio : 1 } && ! elem [ i ] . checked ) {
54- continue ;
55- } else if ( multi ) {
56- res . push ( elem [ i ] . value ) ;
57- } else {
58- return elem [ i ] . value ;
51+ } else if ( elem . type === 'radio' ) {
52+ var elements = elem . form . elements ; // prevents problem with name 'item' or 'namedItem'
53+ for ( i = 0 ; i < elements . length ; i ++ ) {
54+ if ( elements [ i ] . name === elem . name && elements [ i ] . checked ) {
55+ return elements [ i ] . value ;
5956 }
6057 }
61- return multi ? res : null ;
62-
63- } else if ( elem . name && ! elem . form . elements . namedItem ( elem . name ) . tagName ) { // multi element
64- return Nette . getValue ( elem . form . elements . namedItem ( elem . name ) ) ;
58+ return null ;
6559
6660 } else if ( elem . type === 'file' ) {
6761 return elem . files || elem . value ;
@@ -75,22 +69,27 @@ Nette.getValue = function(elem) {
7569 return index < 0 ? null : options [ index ] . value ;
7670 }
7771
78- for ( i = 0 , len = options . length ; i < len ; i ++ ) {
72+ for ( i = 0 ; i < options . length ; i ++ ) {
7973 if ( options [ i ] . selected ) {
8074 values . push ( options [ i ] . value ) ;
8175 }
8276 }
8377 return values ;
8478
85- } else if ( elem . name && elem . name . match ( / \[ \] $ / ) ) { // multi element with single option
86- return Nette . getValue ( [ elem ] ) ;
79+ } else if ( elem . name && elem . name . match ( / \[ \] $ / ) ) { // multiple elements []
80+ var elements = elem . form . elements [ elem . name ] . tagName ? [ elem ] : elem . form . elements [ elem . name ] ,
81+ values = [ ] ;
82+
83+ for ( i = 0 ; i < elements . length ; i ++ ) {
84+ if ( elements [ i ] . type !== 'checkbox' || elements [ i ] . checked ) {
85+ values . push ( elements [ i ] . value ) ;
86+ }
87+ }
88+ return values ;
8789
8890 } else if ( elem . type === 'checkbox' ) {
8991 return elem . checked ;
9092
91- } else if ( elem . type === 'radio' ) {
92- return elem . checked && elem . value ;
93-
9493 } else if ( elem . tagName . toLowerCase ( ) === 'textarea' ) {
9594 return elem . value . replace ( "\r" , '' ) ;
9695
@@ -215,9 +214,8 @@ Nette.validateForm = function(sender) {
215214 */
216215Nette . isDisabled = function ( elem ) {
217216 if ( elem . type === 'radio' ) {
218- elem = elem . form . elements . namedItem ( elem . name ) . tagName ? [ elem ] : elem . form . elements . namedItem ( elem . name ) ;
219- for ( var i = 0 ; i < elem . length ; i ++ ) {
220- if ( ! elem [ i ] . disabled ) {
217+ for ( var i = 0 , elements = elem . form . elements ; i < elements . length ; i ++ ) {
218+ if ( elements [ i ] . name === elem . name && ! elements [ i ] . disabled ) {
221219 return false ;
222220 }
223221 }
0 commit comments