11/**
22 * NetteForms - simple form validation.
33 *
4- * This file is part of the Nette Framework.
5- * Copyright (c) 2004, 2014 David Grudl (http://davidgrudl.com)
4+ * This file is part of the Nette Framework (http://nette.org)
5+ * Copyright (c) 2004 David Grudl (http://davidgrudl.com)
66 */
77
88var Nette = Nette || { } ;
@@ -54,7 +54,9 @@ Nette.getValue = function(elem) {
5454 return Nette . getValue ( [ elem ] ) ;
5555
5656 } else if ( elem . tagName . toLowerCase ( ) === 'select' ) {
57- var index = elem . selectedIndex , options = elem . options , values = [ ] ;
57+ var index = elem . selectedIndex ,
58+ options = elem . options ,
59+ values = [ ] ;
5860
5961 if ( elem . type === 'select-one' ) {
6062 return index < 0 ? null : options [ index ] . value ;
@@ -100,26 +102,23 @@ Nette.getEffectiveValue = function(elem) {
100102 * Validates form element against given rules.
101103 */
102104Nette . validateControl = function ( elem , rules , onlyCheck ) {
103- if ( ! elem . tagName ) { // RadioNodeList
104- elem = elem [ 0 ] ;
105- }
105+ elem = elem . tagName ? elem : elem [ 0 ] ; // RadioNodeList
106106 rules = rules || Nette . parseJSON ( elem . getAttribute ( 'data-nette-rules' ) ) ;
107107
108108 for ( var id = 0 , len = rules . length ; id < len ; id ++ ) {
109- var rule = rules [ id ] , op = rule . op . match ( / ( ~ ) ? ( [ ^ ? ] + ) / ) ;
109+ var rule = rules [ id ] ,
110+ op = rule . op . match ( / ( ~ ) ? ( [ ^ ? ] + ) / ) ,
111+ curElem = rule . control ? elem . form . elements [ rule . control ] : elem ;
112+
110113 rule . neg = op [ 1 ] ;
111114 rule . op = op [ 2 ] ;
112115 rule . condition = ! ! rule . rules ;
113- var el = rule . control ? elem . form . elements [ rule . control ] : elem ;
114- if ( ! el . tagName ) { // RadioNodeList
115- el = el [ 0 ] ;
116- }
116+ curElem = curElem . tagName ? curElem : curElem [ 0 ] ; // RadioNodeList
117117
118- var success = Nette . validateRule ( el , rule . op , rule . arg ) ;
118+ var success = Nette . validateRule ( curElem , rule . op , rule . arg ) ;
119119 if ( success === null ) {
120120 continue ;
121- }
122- if ( rule . neg ) {
121+ } else if ( rule . neg ) {
123122 success = ! success ;
124123 }
125124
@@ -128,15 +127,15 @@ Nette.validateControl = function(elem, rules, onlyCheck) {
128127 return false ;
129128 }
130129 } else if ( ! rule . condition && ! success ) {
131- if ( Nette . isDisabled ( el ) ) {
130+ if ( Nette . isDisabled ( curElem ) ) {
132131 continue ;
133132 }
134133 if ( ! onlyCheck ) {
135- var arr = Nette . isArray ( rule . arg ) ? rule . arg : [ rule . arg ] ;
136- var message = rule . msg . replace ( / % ( v a l u e | \d + ) / g, function ( foo , m ) {
137- return Nette . getValue ( m === 'value' ? el : elem . form . elements [ arr [ m ] . control ] ) ;
138- } ) ;
139- Nette . addError ( el , message ) ;
134+ var arr = Nette . isArray ( rule . arg ) ? rule . arg : [ rule . arg ] ,
135+ message = rule . msg . replace ( / % ( v a l u e | \d + ) / g, function ( foo , m ) {
136+ return Nette . getValue ( m === 'value' ? curElem : elem . form . elements [ arr [ m ] . control ] ) ;
137+ } ) ;
138+ Nette . addError ( curElem , message ) ;
140139 }
141140 return false ;
142141 }
@@ -149,7 +148,9 @@ Nette.validateControl = function(elem, rules, onlyCheck) {
149148 * Validates whole form.
150149 */
151150Nette . validateForm = function ( sender ) {
152- var form = sender . form || sender , scope = false ;
151+ var form = sender . form || sender ,
152+ scope = false ;
153+
153154 if ( form [ 'nette-submittedBy' ] && form [ 'nette-submittedBy' ] . getAttribute ( 'formnovalidate' ) !== null ) {
154155 var scopeArr = Nette . parseJSON ( form [ 'nette-submittedBy' ] . getAttribute ( 'data-nette-validation-scope' ) ) ;
155156 if ( scopeArr . length ) {
@@ -219,9 +220,9 @@ Nette.addError = function(elem, message) {
219220/**
220221 * Expand rule argument.
221222 */
222- Nette . expandRuleArgument = function ( elem , arg ) {
223+ Nette . expandRuleArgument = function ( form , arg ) {
223224 if ( arg && arg . control ) {
224- arg = Nette . getEffectiveValue ( elem . form . elements [ arg . control ] ) ;
225+ arg = Nette . getEffectiveValue ( form . elements [ arg . control ] ) ;
225226 }
226227 return arg ;
227228} ;
@@ -241,9 +242,11 @@ Nette.validateRule = function(elem, op, arg) {
241242
242243 var arr = Nette . isArray ( arg ) ? arg . slice ( 0 ) : [ arg ] ;
243244 for ( var i = 0 , len = arr . length ; i < len ; i ++ ) {
244- arr [ i ] = Nette . expandRuleArgument ( elem , arr [ i ] ) ;
245+ arr [ i ] = Nette . expandRuleArgument ( elem . form , arr [ i ] ) ;
245246 }
246- return Nette . validators [ op ] ? Nette . validators [ op ] ( elem , Nette . isArray ( arg ) ? arr : arr [ 0 ] , val ) : null ;
247+ return Nette . validators [ op ]
248+ ? Nette . validators [ op ] ( elem , Nette . isArray ( arg ) ? arr : arr [ 0 ] , val )
249+ : null ;
247250} ;
248251
249252
@@ -263,7 +266,6 @@ Nette.validators = {
263266 } ,
264267
265268 equal : function ( elem , arg , val ) {
266- /* jshint eqeqeq: false */
267269 if ( arg === undefined ) {
268270 return null ;
269271 }
@@ -272,6 +274,7 @@ Nette.validators = {
272274 loop:
273275 for ( var i1 = 0 , len1 = val . length ; i1 < len1 ; i1 ++ ) {
274276 for ( var i2 = 0 , len2 = arg . length ; i2 < len2 ; i2 ++ ) {
277+ /* jshint eqeqeq: false */
275278 if ( val [ i1 ] == arg [ i2 ] ) {
276279 continue loop;
277280 }
@@ -392,27 +395,30 @@ Nette.toggleForm = function(form, elem) {
392395 */
393396Nette . toggleControl = function ( elem , rules , topSuccess , firsttime ) {
394397 rules = rules || Nette . parseJSON ( elem . getAttribute ( 'data-nette-rules' ) ) ;
395- var has = false , hasProp = Object . prototype . hasOwnProperty , handler = function ( ) {
396- Nette . toggleForm ( elem . form , elem ) ;
397- } , handled = [ ] ;
398+
399+ var has = false ,
400+ success = topSuccess ,
401+ handled = [ ] ,
402+ handler = function ( ) {
403+ Nette . toggleForm ( elem . form , elem ) ;
404+ } ;
398405
399406 for ( var id = 0 , len = rules . length ; id < len ; id ++ ) {
400- var rule = rules [ id ] , op = rule . op . match ( / ( ~ ) ? ( [ ^ ? ] + ) / ) ;
401- rule . neg = op [ 1 ] ;
402- rule . op = op [ 2 ] ;
403- rule . condition = ! ! rule . rules ;
404- if ( ! rule . condition ) {
407+ var rule = rules [ id ] ,
408+ op = rule . op . match ( / ( ~ ) ? ( [ ^ ? ] + ) / ) ,
409+ curElem = rule . control ? elem . form . elements [ rule . control ] : elem ;
410+
411+ if ( ! rule . rules ) {
405412 continue ;
406413 }
407414
408- var el = rule . control ? elem . form . elements [ rule . control ] : elem ;
409- var success = topSuccess ;
410415 if ( success !== false ) {
411- success = Nette . validateRule ( el , rule . op , rule . arg ) ;
416+ rule . neg = op [ 1 ] ;
417+ rule . op = op [ 2 ] ;
418+ success = Nette . validateRule ( curElem , rule . op , rule . arg ) ;
412419 if ( success === null ) {
413420 continue ;
414- }
415- if ( rule . neg ) {
421+ } else if ( rule . neg ) {
416422 success = ! success ;
417423 }
418424 }
@@ -421,17 +427,17 @@ Nette.toggleControl = function(elem, rules, topSuccess, firsttime) {
421427 has = true ;
422428 if ( firsttime ) {
423429 var oldIE = ! document . addEventListener , // IE < 9
424- els = el . tagName ? [ el ] : el ; // is radiolist?
430+ els = curElem . tagName ? [ curElem ] : curElem ; // is radiolist?
425431
426432 for ( var i = 0 ; i < els . length ; i ++ ) {
427433 if ( ! Nette . inArray ( handled , els [ i ] ) ) {
428- Nette . addEvent ( els [ i ] , oldIE && el . type in { checkbox : 1 , radio : 1 } ? 'click' : 'change' , handler ) ;
434+ Nette . addEvent ( els [ i ] , oldIE && curElem . type in { checkbox : 1 , radio : 1 } ? 'click' : 'change' , handler ) ;
429435 handled . push ( els [ i ] ) ;
430436 }
431437 }
432438 }
433439 for ( var id2 in rule . toggle || [ ] ) {
434- if ( hasProp . call ( rule . toggle , id2 ) ) {
440+ if ( Object . prototype . hasOwnProperty . call ( rule . toggle , id2 ) ) {
435441 Nette . toggles [ id2 ] = Nette . toggles [ id2 ] || ( rule . toggle [ id2 ] ? success : ! success ) ;
436442 }
437443 }
@@ -500,7 +506,7 @@ Nette.isArray = function(arg) {
500506 * Search for a specified value within an array.
501507 */
502508Nette . inArray = function ( arr , val ) {
503- if ( Array . prototype . indexOf ) {
509+ if ( [ ] . indexOf ) {
504510 return arr . indexOf ( val ) > - 1 ;
505511 } else {
506512 for ( var i = 0 ; i < arr . length ; i ++ ) {
0 commit comments