|  |  |  | @ -30,53 +30,61 @@ yii.validation = (function ($) { | 
			
		
	
		
			
				
					|  |  |  |  | 			valid || messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 		}, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		compare: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 		boolean: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.skipOnEmpty && isEmpty(value)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			var valid = !options.strict && (value == options.trueValue || value == options.falseValue) | 
			
		
	
		
			
				
					|  |  |  |  | 				|| options.strict && (value === options.trueValue || value === options.falseValue); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			var compareValue, valid = true; | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.compareAttribute === undefined) { | 
			
		
	
		
			
				
					|  |  |  |  | 				compareValue = options.compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 			} else { | 
			
		
	
		
			
				
					|  |  |  |  | 				compareValue = $('#' + options.compareAttribute).val(); | 
			
		
	
		
			
				
					|  |  |  |  | 			valid || messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 		}, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		string: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.skipOnEmpty && isEmpty(value)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			switch (options.operator) { | 
			
		
	
		
			
				
					|  |  |  |  | 				case '==': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value == compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '===': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value === compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '!=': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value != compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '!==': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value !== compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '>': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value > compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '>=': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value >= compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '<': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value < compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '<=': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value <= compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (typeof value !== 'string') { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			valid || messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.min !== undefined && value.length < options.min) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooShort); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.max !== undefined && value.length > options.max) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooLong); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.is !== undefined && value.length != options.is) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.is); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		}, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		boolean: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 		number: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.skipOnEmpty && isEmpty(value)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			var valid = !options.strict && (value == options.trueValue || value == options.falseValue) | 
			
		
	
		
			
				
					|  |  |  |  | 				|| options.strict && (value === options.trueValue || value === options.falseValue); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (typeof value === 'string' && !value.match(options.pattern)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.min !== undefined && value < options.min) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooSmall); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.max !== undefined && value > options.max) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooBig); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		}, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		range: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.skipOnEmpty && isEmpty(value)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			var valid = !options.not && $.inArray(value, options.range) | 
			
		
	
		
			
				
					|  |  |  |  | 				|| options.not && !$.inArray(value, options.range); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			valid || messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 		}, | 
			
		
	
	
		
			
				
					|  |  |  | @ -115,43 +123,66 @@ yii.validation = (function ($) { | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		}, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		string: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 		captcha: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.skipOnEmpty && isEmpty(value)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (typeof value !== 'string') { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.min !== undefined && value.length < options.min) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooShort); | 
			
		
	
		
			
				
					|  |  |  |  | 			// CAPTCHA may be updated via AJAX and the updated hash is stored in body data
 | 
			
		
	
		
			
				
					|  |  |  |  | 			var hash = $('body').data(options.hashKey); | 
			
		
	
		
			
				
					|  |  |  |  | 			if (hash == null) { | 
			
		
	
		
			
				
					|  |  |  |  | 				hash = options.hash; | 
			
		
	
		
			
				
					|  |  |  |  | 			} else { | 
			
		
	
		
			
				
					|  |  |  |  | 				hash = hash[options.caseSensitive ? 0 : 1]; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.max !== undefined && value.length > options.max) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooLong); | 
			
		
	
		
			
				
					|  |  |  |  | 			var v = options.caseSensitive ? value : value.toLowerCase(); | 
			
		
	
		
			
				
					|  |  |  |  | 			for (var i = v.length - 1, h = 0; i >= 0; --i) { | 
			
		
	
		
			
				
					|  |  |  |  | 				h += v.charCodeAt(i); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.is !== undefined && value.length != options.is) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.is); | 
			
		
	
		
			
				
					|  |  |  |  | 			if(h != hash) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		}, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		number: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 		compare: function (value, messages, options) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.skipOnEmpty && isEmpty(value)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (typeof value === 'string' && !value.match(options.pattern)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 				return; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.min !== undefined && value < options.min) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooSmall); | 
			
		
	
		
			
				
					|  |  |  |  | 			var compareValue, valid = true; | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.compareAttribute === undefined) { | 
			
		
	
		
			
				
					|  |  |  |  | 				compareValue = options.compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 			} else { | 
			
		
	
		
			
				
					|  |  |  |  | 				compareValue = $('#' + options.compareAttribute).val(); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (options.max !== undefined && value > options.max) { | 
			
		
	
		
			
				
					|  |  |  |  | 				messages.push(options.tooBig); | 
			
		
	
		
			
				
					|  |  |  |  | 			switch (options.operator) { | 
			
		
	
		
			
				
					|  |  |  |  | 				case '==': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value == compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '===': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value === compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '!=': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value != compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '!==': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value !== compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '>': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value > compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '>=': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value >= compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '<': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value < compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 				case '<=': | 
			
		
	
		
			
				
					|  |  |  |  | 					valid = value <= compareValue; | 
			
		
	
		
			
				
					|  |  |  |  | 					break; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			valid || messages.push(options.message); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	}; | 
			
		
	
		
			
				
					|  |  |  |  | })(jQuery); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |