@@ -101,9 +101,10 @@ Nette.getEffectiveValue = function(elem) {
101101/**
102102 * Validates form element against given rules.
103103 */
104- Nette . validateControl = function ( elem , rules , onlyCheck ) {
104+ Nette . validateControl = function ( elem , rules , onlyCheck , value ) {
105105 elem = elem . tagName ? elem : elem [ 0 ] ; // RadioNodeList
106106 rules = rules || Nette . parseJSON ( elem . getAttribute ( 'data-nette-rules' ) ) ;
107+ value = value === undefined ? { value : Nette . getEffectiveValue ( elem ) } : value ;
107108
108109 for ( var id = 0 , len = rules . length ; id < len ; id ++ ) {
109110 var rule = rules [ id ] ,
@@ -115,15 +116,17 @@ Nette.validateControl = function(elem, rules, onlyCheck) {
115116 rule . condition = ! ! rule . rules ;
116117 curElem = curElem . tagName ? curElem : curElem [ 0 ] ; // RadioNodeList
117118
118- var success = Nette . validateRule ( curElem , rule . op , rule . arg ) ;
119+ var curValue = elem === curElem ? value : { value : Nette . getEffectiveValue ( curElem ) } ,
120+ success = Nette . validateRule ( curElem , rule . op , rule . arg , curValue ) ;
121+
119122 if ( success === null ) {
120123 continue ;
121124 } else if ( rule . neg ) {
122125 success = ! success ;
123126 }
124127
125128 if ( rule . condition && success ) {
126- if ( ! Nette . validateControl ( elem , rule . rules , onlyCheck ) ) {
129+ if ( ! Nette . validateControl ( elem , rule . rules , onlyCheck , value ) ) {
127130 return false ;
128131 }
129132 } else if ( ! rule . condition && ! success ) {
@@ -231,8 +234,8 @@ Nette.expandRuleArgument = function(form, arg) {
231234/**
232235 * Validates single rule.
233236 */
234- Nette . validateRule = function ( elem , op , arg ) {
235- var val = Nette . getEffectiveValue ( elem ) ;
237+ Nette . validateRule = function ( elem , op , arg , value ) {
238+ value = value === undefined ? { value : Nette . getEffectiveValue ( elem ) } : value ;
236239
237240 if ( op . charAt ( 0 ) === ':' ) {
238241 op = op . substr ( 1 ) ;
@@ -245,7 +248,7 @@ Nette.validateRule = function(elem, op, arg) {
245248 arr [ i ] = Nette . expandRuleArgument ( elem . form , arr [ i ] ) ;
246249 }
247250 return Nette . validators [ op ]
248- ? Nette . validators [ op ] ( elem , Nette . isArray ( arg ) ? arr : arr [ 0 ] , val )
251+ ? Nette . validators [ op ] ( elem , Nette . isArray ( arg ) ? arr : arr [ 0 ] , value . value , value )
249252 : null ;
250253} ;
251254
@@ -305,8 +308,15 @@ Nette.validators = {
305308 return ( / ^ ( " ( [ ! \x23 - \x5B \x5D - \x7E ] * | \\ [ - ~ ] ) + " | [ - a - z 0 - 9 ! # $ % & ' * + \/ = ? ^ _ ` { | } ~ ] + ( \. [ - a - z 0 - 9 ! # $ % & ' * + \/ = ? ^ _ ` { | } ~ ] + ) * ) @ ( [ 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] ( [ - 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] { 0 , 61 } [ 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] ) ? \. ) + [ a - z \u00C0 - \u02FF \u0370 - \u1EFF ] [ - 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] { 0 , 17 } [ a - z \u00C0 - \u02FF \u0370 - \u1EFF ] $ / i) . test ( val ) ;
306309 } ,
307310
308- url : function ( elem , arg , val ) {
309- return ( / ^ ( h t t p s ? : \/ \/ | (? = .* \. ) ) ( [ 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] ( ( [ - 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] { 0 , 61 } [ 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] ) ? \. ) * [ a - z \u00C0 - \u02FF \u0370 - \u1EFF ] [ - 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] { 0 , 17 } [ a - z \u00C0 - \u02FF \u0370 - \u1EFF ] | \d { 1 , 3 } \. \d { 1 , 3 } \. \d { 1 , 3 } \. \d { 1 , 3 } | \[ [ 0 - 9 a - f : ] { 3 , 39 } \] ) ( : \d { 1 , 5 } ) ? ( \/ \S * ) ? $ / i) . test ( val ) ;
311+ url : function ( elem , arg , val , value ) {
312+ if ( ! ( / ^ [ a - z \d + . - ] + : / ) . test ( val ) ) {
313+ val = 'http://' + val ;
314+ }
315+ if ( ( / ^ h t t p s ? : \/ \/ ( [ 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] ( ( [ - 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] { 0 , 61 } [ 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] ) ? \. ) * [ a - z \u00C0 - \u02FF \u0370 - \u1EFF ] [ - 0 - 9 a - z \u00C0 - \u02FF \u0370 - \u1EFF ] { 0 , 17 } [ a - z \u00C0 - \u02FF \u0370 - \u1EFF ] | \d { 1 , 3 } \. \d { 1 , 3 } \. \d { 1 , 3 } \. \d { 1 , 3 } | \[ [ 0 - 9 a - f : ] { 3 , 39 } \] ) ( : \d { 1 , 5 } ) ? ( \/ \S * ) ? $ / i) . test ( val ) ) {
316+ value . value = val ;
317+ return true ;
318+ }
319+ return false ;
310320 } ,
311321
312322 regexp : function ( elem , arg , val ) {
@@ -326,8 +336,13 @@ Nette.validators = {
326336 return ( / ^ - ? [ 0 - 9 ] + $ / ) . test ( val ) ;
327337 } ,
328338
329- 'float' : function ( elem , arg , val ) {
330- return ( / ^ - ? [ 0 - 9 ] * [ . , ] ? [ 0 - 9 ] + $ / ) . test ( val ) ;
339+ 'float' : function ( elem , arg , val , value ) {
340+ val = val . replace ( ' ' , '' ) . replace ( ',' , '.' ) ;
341+ if ( ( / ^ - ? [ 0 - 9 ] * [ . , ] ? [ 0 - 9 ] + $ / ) . test ( val ) ) {
342+ value . value = val ;
343+ return true ;
344+ }
345+ return false ;
331346 } ,
332347
333348 min : function ( elem , arg , val ) {
@@ -393,11 +408,11 @@ Nette.toggleForm = function(form, elem) {
393408/**
394409 * Process toggles on form element.
395410 */
396- Nette . toggleControl = function ( elem , rules , topSuccess , firsttime ) {
411+ Nette . toggleControl = function ( elem , rules , success , firsttime , value ) {
397412 rules = rules || Nette . parseJSON ( elem . getAttribute ( 'data-nette-rules' ) ) ;
413+ value = value === undefined ? { value : Nette . getEffectiveValue ( elem ) } : value ;
398414
399415 var has = false ,
400- success = topSuccess ,
401416 handled = [ ] ,
402417 handler = function ( ) {
403418 Nette . toggleForm ( elem . form , elem ) ;
@@ -408,22 +423,18 @@ Nette.toggleControl = function(elem, rules, topSuccess, firsttime) {
408423 op = rule . op . match ( / ( ~ ) ? ( [ ^ ? ] + ) / ) ,
409424 curElem = rule . control ? elem . form . elements [ rule . control ] : elem ;
410425
411- if ( ! rule . rules ) {
412- continue ;
413- }
414-
415426 if ( success !== false ) {
416427 rule . neg = op [ 1 ] ;
417428 rule . op = op [ 2 ] ;
418- success = Nette . validateRule ( curElem , rule . op , rule . arg ) ;
419- if ( success === null ) {
429+ var curValue = elem === curElem ? value : { value : Nette . getEffectiveValue ( curElem ) } ,
430+ res = Nette . validateRule ( curElem , rule . op , rule . arg , curValue ) ;
431+ if ( res === null ) {
420432 continue ;
421- } else if ( rule . neg ) {
422- success = ! success ;
423433 }
434+ success = rule . neg ? ! res : res ;
424435 }
425436
426- if ( Nette . toggleControl ( elem , rule . rules , success , firsttime ) || rule . toggle ) {
437+ if ( ( rule . rules && Nette . toggleControl ( elem , rule . rules , success , firsttime , value ) ) || rule . toggle ) {
427438 has = true ;
428439 if ( firsttime ) {
429440 var oldIE = ! document . addEventListener , // IE < 9
0 commit comments