/*਀ऀ䌀氀愀猀猀㨀 䘀漀爀洀䌀栀攀挀欀 
		Performs different tests on forms and indicates errors.਀ 
	Usage:਀ऀऀ圀漀爀欀猀 眀椀琀栀 琀栀攀猀攀 琀礀瀀攀猀 漀昀 昀椀攀氀搀猀 㨀 
		- input (text, radio, checkbox)਀ऀऀⴀ 琀攀砀琀愀爀攀愀 
		- select਀ 
		You just need to add a specific class to each fields you want to check.਀ऀऀ䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 椀昀 礀漀甀 愀搀搀 琀栀攀 挀氀愀猀猀 
			(code)਀ऀऀऀ瘀愀氀椀搀愀琀攀嬀✀爀攀焀甀椀爀攀搀✀Ⰰ✀氀攀渀最琀栀嬀㐀Ⰰ ⴀ㄀崀✀Ⰰ✀搀椀昀昀攀爀猀嬀攀洀愀椀氀崀✀Ⰰ✀搀椀最椀琀✀崀 
			(end code)਀ऀऀ琀栀攀 瘀愀氀甀攀✀猀 昀椀攀氀搀 洀甀猀琀 戀攀 猀攀琀 ⠀爀攀焀甀椀爀攀搀⤀ 眀椀琀栀 愀 洀椀渀椀洀甀洀 氀攀渀最琀栀 漀昀 昀漀甀爀 挀栀愀爀猀 ⠀㐀Ⰰ ⴀ㄀⤀Ⰰ 
		must differs of the input named email (differs[email]), and must be digit.਀ऀऀ夀漀甀 挀愀渀 瀀攀爀昀漀爀洀 挀栀攀挀欀 搀甀爀椀渀最 琀栀攀 搀愀琀愀猀 攀渀琀爀礀 漀爀 漀渀 琀栀攀 猀甀戀洀椀琀 愀挀琀椀漀渀Ⰰ 猀栀漀眀猀 攀爀爀漀爀猀 愀猀 琀椀瀀猀 漀爀 愀猀 搀椀瘀 愀昀琀攀爀 琀栀攀 昀椀攀氀搀Ⰰ 
		show errors one by one or all together, show a list of all errors at the top of the form, localize error messages, add new regex check, ...਀ऀऀ吀栀攀 氀愀礀漀甀琀 椀猀 搀攀猀椀最渀 漀渀氀礀 眀椀琀栀 挀猀猀⸀ 䤀琀 挀愀渀 愀氀猀漀 眀漀爀欀猀 眀椀琀栀 洀甀氀琀椀瀀氀攀 昀漀爀洀猀 漀渀 愀 猀椀渀最氀攀 栀琀洀氀 瀀愀最攀⸀ 
		The class supports now internationalization. To use it, simply specify a new <script> element in your html page, like this : <script type="text/javascript" src="formcheck/lang/fr.js"></script>. N.B. : you must load this script before the formcheck and this method overpass the old way. You can create new languages following existing ones. You can otherwise still specifiy the alerts' strings when you initialize the Class, with options.਀ 
	Test type:਀ऀऀ夀漀甀 挀愀渀 瀀攀爀昀漀爀洀 瘀愀爀椀漀甀猀 琀攀猀琀 漀渀 昀椀攀氀搀猀 戀礀 愀搀搀椀渀搀 琀栀攀洀 琀漀 琀栀攀 瘀愀氀椀搀愀琀攀 挀氀愀猀猀⸀ 䈀攀 挀愀爀攀昀甀氀 琀漀 ⨀渀漀琀 甀猀攀 猀瀀愀挀攀 挀栀愀爀猀⨀⸀ 䠀攀爀攀 椀猀 琀栀攀 氀椀猀琀 漀昀 琀栀攀洀⸀ 
਀ऀऀ爀攀焀甀椀爀攀搀 ⴀ 吀栀攀 昀椀攀氀搀 戀攀挀漀洀攀猀 爀攀焀甀椀爀攀搀⸀ 吀栀椀猀 椀猀 愀 爀攀最攀砀Ⰰ 礀漀甀 挀愀渀 挀栀愀渀最攀 椀琀 眀椀琀栀 挀氀愀猀猀 漀瀀琀椀漀渀猀⸀ 
		alpha - The value is restricted to alphabetic chars. This is a regex, you can change it with class options.਀ऀऀ愀氀瀀栀愀渀甀洀 ⴀ 吀栀攀 瘀愀氀甀攀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 愀氀瀀栀愀渀甀洀攀爀椀挀 挀栀愀爀愀挀琀攀爀猀 漀渀氀礀⸀ 吀栀椀猀 椀猀 愀 爀攀最攀砀Ⰰ 礀漀甀 挀愀渀 挀栀愀渀最攀 椀琀 眀椀琀栀 挀氀愀猀猀 漀瀀琀椀漀渀猀⸀ 
		nodigit - The field doesn't accept digit chars. This is a regex, you can change it with class options.਀ऀऀ搀椀最椀琀 ⴀ 吀栀攀 瘀愀氀甀攀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀椀最椀琀 ⠀渀漀 昀氀漀愀琀椀渀最 瀀漀椀渀琀 渀甀洀戀攀爀⤀ 挀栀愀爀猀Ⰰ 礀漀甀 挀愀渀 瀀愀猀猀 琀眀漀 愀爀最甀洀攀渀琀猀 ⠀昀⸀攀⸀ 搀椀最椀琀嬀㈀㄀Ⰰ㘀㔀崀⤀ 琀漀 氀椀洀椀琀 琀栀攀 渀甀洀戀攀爀 戀攀琀眀攀攀渀 琀栀攀洀⸀ 唀猀攀 ⴀ㄀ 愀猀 猀攀挀漀渀搀 愀爀最甀洀攀渀琀 琀漀 渀漀琀 猀攀琀 愀 洀愀砀椀洀甀洀⸀ 
		number - The value is restricted to number, including floating point number. This is a regex, you can change it with class options.਀ऀऀ攀洀愀椀氀 ⴀ 吀栀攀 瘀愀氀甀攀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 瘀愀氀椀搀 攀洀愀椀氀⸀ 吀栀椀猀 椀猀 愀 爀攀最攀砀Ⰰ 礀漀甀 挀愀渀 挀栀愀渀最攀 椀琀 眀椀琀栀 挀氀愀猀猀 漀瀀琀椀漀渀猀⸀ 
		phone - The value is restricted to phone chars. This is a regex, you can change it with class options.਀ऀऀ甀爀氀㨀 ⴀ 吀栀攀 瘀愀氀甀攀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 甀爀氀⸀ 吀栀椀猀 椀猀 愀 爀攀最攀砀Ⰰ 礀漀甀 挀愀渀 挀栀愀渀最攀 椀琀 眀椀琀栀 挀氀愀猀猀 漀瀀琀椀漀渀猀⸀ 
		confirm - The value has to be the same as the one passed in argument. f.e. confirm[password].਀ऀऀ搀椀昀昀攀爀猀 ⴀ 吀栀攀 瘀愀氀甀攀 栀愀猀 琀漀 戀攀 搀椀昀攀爀攀渀琀 愀猀 琀栀攀 漀渀攀 瀀愀猀猀攀搀 椀渀 愀爀最甀洀攀渀琀⸀ 昀⸀攀⸀ 搀椀昀昀攀爀猀嬀甀猀攀爀崀⸀ 
		length - The value length is restricted by argument (f.e. length[6,10]). Use -1 as second argument to not set a maximum.਀ 
	Parameters:਀ऀऀ圀栀攀渀 礀漀甀 椀渀椀琀椀愀氀椀稀攀 琀栀攀 挀氀愀猀猀 眀椀琀栀 愀搀搀䔀瘀攀渀琀Ⰰ 礀漀甀 挀愀渀 猀攀琀 猀漀洀攀 漀瀀琀椀漀渀猀⸀ 䤀昀 礀漀甀 眀愀渀琀 琀漀 洀漀搀椀昀礀 爀攀最攀砀Ⰰ 礀漀甀 洀甀猀琀 搀漀 椀琀 椀渀 愀 栀愀猀栀Ⰰ 氀椀欀攀 昀漀爀 搀椀猀瀀氀愀礀 漀爀 愀氀攀爀琀⸀ 夀漀甀 挀愀渀 愀氀猀漀 愀搀搀 渀攀眀 爀攀最攀砀 挀栀攀挀欀 洀攀琀栀漀搀 戀礀 愀搀搀椀渀最 琀栀攀 爀攀最攀砀 愀渀搀 愀渀 愀氀攀爀琀 眀椀琀栀 琀栀攀 猀愀洀攀 渀愀洀攀⸀ 
਀ऀऀ昀漀爀洀开椀搀 ⴀ 吀栀攀 椀搀 漀昀 琀栀攀 昀漀爀洀甀氀愀爀⸀ 吀栀椀猀 椀猀 爀攀焀甀椀爀攀搀⸀ 
਀ऀऀ琀椀瀀猀开挀氀愀猀猀 ⴀ 吀栀攀 挀氀愀猀猀 琀漀 愀瀀瀀氀礀 琀漀 琀椀瀀戀漀砀攀猀✀ 攀爀爀漀爀猀⸀ 䈀礀 搀攀昀愀甀氀琀 椀琀 椀猀 ✀琀椀瀀猀戀漀砀✀⸀ 
		error_class - The class to apply to fields with error. By default it is 'error_f'.਀ऀऀ搀椀猀瀀氀愀礀 ⴀ 吀栀椀猀 椀猀 愀 栀愀猀栀 漀昀 搀椀猀瀀氀愀礀 猀攀琀琀椀渀最猀⸀ 椀渀 栀攀爀攀 礀漀甀 挀愀渀 洀漀搀椀昀礀 㨀 
		showErrors - 0 : onSubmit, 1 : onSubmit & onBlur, by default it is 1.਀ऀऀ攀爀爀漀爀猀䰀漀挀愀琀椀漀渀 ⴀ ㄀ 㨀 琀椀瀀猀Ⰰ ㈀ 㨀 戀攀昀漀爀攀Ⰰ ㌀ 㨀 愀昀琀攀爀Ⰰ 戀礀 搀攀昀愀甀氀琀 椀琀 椀猀 ㄀⸀ 
		indicateErrors - 0 : none, 1 : one by one, 2 : all, by default it is 1.਀ऀऀ琀椀瀀猀伀昀昀猀攀琀堀 ⴀ 䠀漀爀椀稀漀渀琀愀氀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 琀椀瀀猀 戀漀砀 ⠀洀愀爀最椀渀ⴀ氀攀昀琀⤀Ⰰ Ⰰ 戀礀 搀攀昀愀甀氀琀 椀琀 椀猀 ㄀　　 ⠀瀀砀⤀⸀ 
		tipsOffsetY - Vertical position of the tips box (margin-bottom), , by default it is -10 (px).਀ऀऀ氀椀猀琀䔀爀爀漀爀猀䄀琀吀漀瀀 ⴀ 䰀椀猀琀 愀氀氀 攀爀爀漀爀猀 愀琀 琀栀攀 琀漀瀀 漀昀 琀栀攀 昀漀爀洀Ⰰ Ⰰ 戀礀 搀攀昀愀甀氀琀 椀琀 椀猀 昀愀氀猀攀⸀ 
		scrollToFirst - Smooth scroll the page to first error and focus on it, by default it is true.਀ऀऀ昀愀搀攀䐀甀爀愀琀椀漀渀 ⴀ 吀爀愀渀猀椀琀椀漀渀 搀甀爀愀琀椀漀渀 ⠀椀渀 洀猀⤀Ⰰ 戀礀 搀攀昀愀甀氀琀 椀琀 椀猀 ㌀　　⸀ 
਀ऀऀ愀氀攀爀琀猀  ⴀ 吀栀椀猀 椀猀 愀 栀愀猀栀 漀昀 愀氀攀爀琀猀 猀攀琀琀椀渀最猀⸀ 椀渀 栀攀爀攀 礀漀甀 挀愀渀 洀漀搀椀昀礀 猀琀爀椀渀最猀 琀漀 氀漀挀愀氀椀稀攀 漀爀 眀愀琀栀攀瘀攀爀 攀氀猀攀⸀ ─　 愀渀搀 ─㄀ 爀攀瀀爀攀猀攀渀琀 琀栀攀 愀爀最甀洀攀渀琀⸀ 
਀ऀऀऀ爀攀焀甀椀爀攀搀㨀 ∀吀栀椀猀 昀椀攀氀搀 椀猀 爀攀焀甀椀爀攀搀⸀∀Ⰰ 
			alpha: "This field accepts alphabetic characters only.",਀ऀऀऀ愀氀瀀栀愀渀甀洀㨀 ∀吀栀椀猀 昀椀攀氀搀 愀挀挀攀瀀琀猀 愀氀瀀栀愀渀甀洀攀爀椀挀 挀栀愀爀愀挀琀攀爀猀 漀渀氀礀⸀∀Ⰰ 
			nodigit: "No digits are accepted.",਀ऀऀऀ搀椀最椀琀㨀 ∀倀氀攀愀猀攀 攀渀琀攀爀 愀 瘀愀氀椀搀 椀渀琀攀最攀爀⸀∀Ⰰ 
			digitmin: "The number must be at least %0",਀ऀऀऀ搀椀最椀琀氀琀搀㨀 ∀吀栀攀 瘀愀氀甀攀 洀甀猀琀 戀攀 戀攀琀眀攀攀渀 ─　 愀渀搀 ─㄀∀Ⰰ 
			number: "Xin vui lòng nhập số vào ô trống.",਀ऀऀऀ攀洀愀椀氀㨀 ∀倀氀攀愀猀攀 攀渀琀攀爀 愀 瘀愀氀椀搀 攀洀愀椀氀⸀∀Ⰰ 
			phone: "Please enter a valid phone.",਀ऀऀऀ甀爀氀㨀 ∀倀氀攀愀猀攀 攀渀琀攀爀 愀 瘀愀氀椀搀 甀爀氀⸀∀Ⰰ 
			confirm: "This field is different from %0",਀ऀऀऀ搀椀昀昀攀爀猀㨀 ∀吀栀椀猀 瘀愀氀甀攀 洀甀猀琀 戀攀 搀椀昀昀攀爀攀渀琀 漀昀 ─　∀Ⰰ 
			length_str: "Text is too short, it must be between %0 and %1",਀ऀऀऀ氀攀渀最琀栀洀愀砀㨀 ∀吀攀砀琀 椀猀 琀漀漀 猀栀漀爀琀Ⰰ 椀琀 洀甀猀琀 戀攀 愀琀 洀愀砀 ─　∀Ⰰ 
			lengthmin: "Text is too short, it must be at least %0",਀ऀऀऀ挀栀攀挀欀戀漀砀㨀 ∀倀氀攀愀猀攀 挀栀攀挀欀 琀栀攀 戀漀砀∀Ⰰ 
			radios: "Please select a radio",਀ऀऀऀ猀攀氀攀挀琀㨀 ∀倀氀攀愀猀攀 挀栀漀漀猀攀 愀 瘀愀氀甀攀∀ 
਀ऀ䔀砀愀洀瀀氀攀㨀 
		You can initialize a formcheck (no scroll, custom classes and alert) by adding for example this in your html head this code :਀ 
		(code)਀ऀऀ㰀猀挀爀椀瀀琀 琀礀瀀攀㴀∀琀攀砀琀⼀樀愀瘀愀猀挀爀椀瀀琀∀㸀 
			window.addEvent('domready', function() {਀ऀऀऀऀ瘀愀爀 洀礀䌀栀攀挀欀 㴀 渀攀眀 䘀漀爀洀䌀栀攀挀欀⠀✀昀漀爀洀开椀搀✀Ⰰ 笀 
					tips_class : 'tips_box',਀ऀऀऀऀऀ攀爀爀漀爀开挀氀愀猀猀 㨀 ✀攀爀爀漀爀开昀椀攀氀搀✀Ⰰ 
					display : {਀ऀऀऀऀऀऀ猀挀爀漀氀氀吀漀䘀椀爀猀琀 㨀 昀愀氀猀攀 
					},਀ऀऀऀऀऀ愀氀攀爀琀猀 㨀 笀 
						required : 'This field is ablolutely required! Please enter a value'਀ऀऀऀऀऀ紀 
				})਀ऀऀऀ紀⤀㬀 
		</script>਀ऀऀ⠀攀渀搀 挀漀搀攀⤀ 
਀ऀ䄀戀漀甀琀㨀 
		formcheck2.js v.1.2 for mootools v1.1 - 09 / 2007਀ 
		by Floor SA (http://www.floor.ch) MIT-style license਀ 
		Created by Luca Pillonel and David Mignot, last modified by Luca Pillonel 09.19.07਀ 
*/਀ 
var FormCheck = new Class({਀ऀ漀瀀琀椀漀渀猀 㨀 笀 
਀ऀऀ琀椀瀀猀开挀氀愀猀猀㨀 ✀琀椀瀀猀戀漀砀✀Ⰰऀऀऀ⼀⼀琀椀瀀猀 攀爀爀漀爀 挀氀愀猀猀 
		error_class: 'error_f',			//div error class਀ 
		display : {਀ऀऀऀ猀栀漀眀䔀爀爀漀爀猀 㨀 ㄀Ⰰऀऀऀऀ⼀⼀　 㨀 漀渀匀甀戀洀椀琀Ⰰ ㄀ 㨀 漀渀匀甀戀洀椀琀 ☀ 漀渀䈀氀甀爀 
			errorsLocation : 1,			//1 : tips, 2 : before, 3 : after਀ऀऀऀ椀渀搀椀挀愀琀攀䔀爀爀漀爀猀 㨀 ㄀Ⰰऀऀऀ⼀⼀　 㨀  渀漀渀攀Ⰰ ㄀ 㨀 漀渀攀Ⰰ ㈀ 㨀 愀氀氀 
			tipsOffsetX : -32,			//Left position of the tips box (margin-left)਀ऀऀऀ琀椀瀀猀伀昀昀猀攀琀夀 㨀 ⴀ㄀㈀Ⰰऀऀऀ⼀⼀吀漀瀀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 琀椀瀀猀 戀漀砀 ⠀洀愀爀最椀渀ⴀ戀漀琀琀漀洀⤀ 
			tipsPosition : 'relative',	//If you want to set the tips position with relative or absolute value (page not centered)਀ऀऀऀ琀椀瀀猀䌀漀渀琀愀椀渀攀爀 㨀 ✀甀渀搀攀昀✀Ⰰऀ⼀⼀䌀漀渀琀愀椀渀攀爀 漀昀 昀椀攀氀搀猀Ⰰ 琀漀 最攀琀 爀椀最栀琀 瀀漀猀椀琀椀漀渀猀⸀ 
			listErrorsAtTop : false,	//list all errors at the top of the form਀ऀऀऀ猀挀爀漀氀氀吀漀䘀椀爀猀琀 㨀 琀爀甀攀Ⰰऀऀ⼀⼀匀洀漀漀琀栀 猀挀爀漀氀氀 琀栀攀 瀀愀最攀 琀漀 昀椀爀猀琀 攀爀爀漀爀 
			fadeDuration : 1000			//Transition duration਀ऀऀ紀Ⰰ 
਀ऀऀ愀氀攀爀琀猀 㨀 笀 
			required     : "This field is required.",਀ऀऀऀ愀氀瀀栀愀        㨀 ∀吀栀椀猀 昀椀攀氀搀 愀挀挀攀瀀琀猀 愀氀瀀栀愀戀攀琀椀挀 挀栀愀爀愀挀琀攀爀猀 漀渀氀礀⸀∀Ⰰ 
			alphanum     : "This field accepts alphanumeric characters only.",਀ऀऀऀ渀漀搀椀最椀琀      㨀 ∀一漀 搀椀最椀琀猀 愀爀攀 愀挀挀攀瀀琀攀搀⸀∀Ⰰ 
			digit        : "Please enter a valid integer.",਀ऀऀऀ搀椀最椀琀洀椀渀     㨀 ∀吀栀攀 渀甀洀戀攀爀 洀甀猀琀 戀攀 愀琀 氀攀愀猀琀 ─　∀Ⰰ 
			digitltd     : "The value must be between %0 and %1",਀ऀऀऀ渀甀洀戀攀爀       㨀 ∀堀椀渀 瘀甀椀 氀渀最 渀栀관瀞 猀턀„瘀漀  琀爀턀渞最∀Ⰰ 
			email        : "Please enter a valid email: <br /><span>E.g. yourname@domain.com</span>",਀ऀऀऀ猀瀀愀洀挀栀攀挀欀    㨀 ∀㰀猀瀀愀渀㸀㈀ ⬀ ㌀ 㴀 㼀㼀㼀㰀⼀猀瀀愀渀㸀∀Ⰰ 
			phone        : "Please enter a valid phone.",਀ऀऀऀ甀爀氀          㨀 ∀倀氀攀愀猀攀 攀渀琀攀爀 愀 瘀愀氀椀搀 甀爀氀㨀 㰀戀爀 ⼀㸀㰀猀瀀愀渀㸀䔀⸀最⸀ 栀琀琀瀀㨀⼀⼀眀眀眀⸀搀漀洀愀椀渀⸀挀漀洀㰀⼀猀瀀愀渀㸀∀Ⰰ 
			confirm      : "This field is different from %0",਀ऀऀऀ搀椀昀昀攀爀猀      㨀 ∀吀栀椀猀 瘀愀氀甀攀 洀甀猀琀 戀攀 搀椀昀昀攀爀攀渀琀 漀昀 ─　∀Ⰰ 
			length_str   : "Text is too short, it must be between %0 and %1",਀ऀऀऀ氀攀渀最琀栀洀愀砀    㨀 ∀吀攀砀琀 椀猀 琀漀漀 猀栀漀爀琀Ⰰ 椀琀 洀甀猀琀 戀攀 愀琀 洀愀砀 ─　∀Ⰰ 
			lengthmin    : "Text is too short, it must be at least %0",਀ऀऀऀ挀栀攀挀欀戀漀砀     㨀 ∀倀氀攀愀猀攀 挀栀攀挀欀 琀栀攀 戀漀砀∀Ⰰ 
			radios       : "Please select a radio",਀ऀऀऀ猀攀氀攀挀琀       㨀 ∀倀氀攀愀猀攀 挀栀漀漀猀攀 愀 瘀愀氀甀攀∀ 
		},਀ 
		regexp : {਀ऀऀऀ爀攀焀甀椀爀攀搀     㨀 ⼀嬀帀⸀⨀崀⼀Ⰰ 
			alpha        : /^[a-z ._-]+$/i,਀ऀऀऀ愀氀瀀栀愀渀甀洀     㨀 ⼀帀嬀愀ⴀ稀　ⴀ㤀 ⸀开ⴀ崀⬀␀⼀椀Ⰰ 
			digit        : /^[-+]?[0-9]+$/,਀ऀऀऀ渀漀搀椀最椀琀      㨀 ⼀帀嬀帀　ⴀ㤀崀⬀␀⼀Ⰰ 
			spamcheck    : /^[5]+$/,਀ऀऀऀ渀甀洀戀攀爀       㨀 ⼀帀嬀ⴀ⬀崀㼀尀搀⨀尀⸀㼀尀搀⬀␀⼀Ⰰ 
			email        : /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i,਀ऀऀऀ瀀栀漀渀攀        㨀 ⼀帀嬀尀搀尀猀 ⠀⤀⸀ⴀ崀⬀␀⼀Ⰰ 
			url          : /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i਀ऀऀ紀 
	},਀ 
਀ 
	/*਀ऀ䌀漀渀猀琀爀甀挀琀漀爀㨀 椀渀椀琀椀愀氀椀稀攀 
		Constructor਀ 
		Add event on formular and perform some stuff, you now, like settings, ...਀ऀ⨀⼀ 
	initialize : function(form, options) {਀ऀऀ椀昀 ⠀琀栀椀猀⸀昀漀爀洀 㴀 ␀⠀昀漀爀洀⤀⤀ 笀 
			this.form.isValid = true;਀ऀऀऀ琀栀椀猀⸀爀攀最攀砀 㴀 嬀✀氀攀渀最琀栀✀崀㬀 
			this.setOptions(options);਀ 
			//internalization਀ऀऀऀ椀昀 ⠀琀礀瀀攀漀昀⠀昀漀爀洀挀栀攀挀欀䰀愀渀最甀愀最攀⤀ ℀㴀 ✀甀渀搀攀昀椀渀攀搀✀⤀ 琀栀椀猀⸀漀瀀琀椀漀渀猀⸀愀氀攀爀琀猀 㴀 昀漀爀洀挀栀攀挀欀䰀愀渀最甀愀最攀㬀 
਀ऀऀऀ琀栀椀猀⸀瘀愀氀椀搀愀琀椀漀渀猀 㴀 嬀崀㬀 
			this.alreadyIndicated = false;਀ऀऀऀ琀栀椀猀⸀昀椀爀猀琀䔀爀爀漀爀 㴀 昀愀氀猀攀㬀 
਀ऀऀऀ瘀愀爀 爀攀最攀砀 㴀 渀攀眀 䠀愀猀栀⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀爀攀最攀砀瀀⤀㬀 
			regex.each(function(el, key) {਀ऀऀऀऀ琀栀椀猀⸀爀攀最攀砀⸀瀀甀猀栀⠀欀攀礀⤀㬀 
			}, this)਀ 
			this.form.getElements("*[class*=validate]").each(function(el) {਀ऀऀऀऀ攀氀⸀瘀愀氀椀搀愀琀椀漀渀 㴀 嬀崀㬀 
				var classes = el.getProperty("class").split(' ');਀ऀऀऀऀ挀氀愀猀猀攀猀⸀攀愀挀栀⠀昀甀渀挀琀椀漀渀⠀挀氀愀猀猀堀⤀ 笀 
					if(classX.match(/^validate(\[.+\])$/)) {਀ऀऀऀऀऀऀ瘀愀爀 瘀愀氀椀搀愀琀漀爀猀 㴀 攀瘀愀氀⠀挀氀愀猀猀堀⸀洀愀琀挀栀⠀⼀帀瘀愀氀椀搀愀琀攀⠀尀嬀⸀⬀尀崀⤀␀⼀⤀嬀㄀崀⤀㬀 
						for(var i = 0; i < validators.length; i++) {਀ऀऀऀऀऀऀऀ攀氀⸀瘀愀氀椀搀愀琀椀漀渀⸀瀀甀猀栀⠀瘀愀氀椀搀愀琀漀爀猀嬀椀崀⤀㬀 
						}਀ऀऀऀऀऀऀ琀栀椀猀⸀开爀攀最椀猀琀攀爀⠀攀氀⤀㬀 
					}਀ऀऀऀऀ紀Ⰰ 琀栀椀猀⤀㬀 
			}, this);਀ 
			this.form.addEvents({਀ऀऀऀऀ∀猀甀戀洀椀琀∀㨀 琀栀椀猀⸀开漀渀匀甀戀洀椀琀⸀戀椀渀搀⠀琀栀椀猀⤀ 
			});਀ऀऀ紀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开爀攀最椀猀琀攀爀 
		Private method਀ 
		Add listener on fields਀ऀ⨀⼀ 
	_register : function(el) {਀ऀऀ琀栀椀猀⸀瘀愀氀椀搀愀琀椀漀渀猀⸀瀀甀猀栀⠀攀氀⤀㬀 
		el.errors = [];਀ऀऀ椀昀 ⠀琀栀椀猀⸀开椀猀䌀栀椀氀搀吀礀瀀攀⠀攀氀⤀ 㴀㴀 昀愀氀猀攀 ☀☀ 琀栀椀猀⸀漀瀀琀椀漀渀猀⸀搀椀猀瀀氀愀礀⸀猀栀漀眀䔀爀爀漀爀猀 㴀㴀 ㄀⤀ 攀氀⸀愀搀搀䔀瘀攀渀琀⠀✀戀氀甀爀✀Ⰰ 昀甀渀挀琀椀漀渀⠀⤀ 笀 
			this._manageError(el, 'blur');਀ऀऀ紀⸀戀椀渀搀⠀琀栀椀猀⤀⤀㬀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开瘀愀氀椀搀愀琀攀 
		Private method਀ 
		Dispatch check to other methods਀ऀ⨀⼀ 
	_validate : function(el) {਀ऀऀ攀氀⸀攀爀爀漀爀猀 㴀 嬀崀㬀 
		el.isOk = true;਀ऀऀ⼀⼀伀渀 瘀愀氀椀搀攀 氀✀氀洀攀渀琀 焀甀椀 渀✀攀猀琀 瀀愀猀 甀渀 爀愀搀椀漀 渀椀 挀栀攀挀欀戀漀砀 
		el.validation.each(function(rule) {਀ऀऀऀ椀昀⠀琀栀椀猀⸀开椀猀䌀栀椀氀搀吀礀瀀攀⠀攀氀⤀⤀ 笀 
				if (this._validateGroup(el) == false) {਀ऀऀऀऀऀ攀氀⸀椀猀伀欀 㴀 昀愀氀猀攀㬀 
				}਀ऀऀऀ紀 攀氀猀攀 笀 
				var ruleArgs = [];਀ऀऀऀऀ椀昀⠀爀甀氀攀⸀洀愀琀挀栀⠀⼀帀⸀⬀尀嬀⼀⤀⤀ 笀 
					var ruleMethod = rule.split('[')[0];਀ऀऀऀऀऀ瘀愀爀 爀甀氀攀䄀爀最猀 㴀 攀瘀愀氀⠀爀甀氀攀⸀洀愀琀挀栀⠀⼀帀⸀⬀⠀尀嬀⸀⬀尀崀⤀␀⼀⤀嬀㄀崀⸀爀攀瀀氀愀挀攀⠀⼀⠀嬀䄀ⴀ娀崀⬀⤀⼀椀Ⰰ ∀✀␀㄀✀∀⤀⤀㬀 
				} else var ruleMethod = rule;਀ 
				if (this.regex.contains(ruleMethod)) {਀ऀऀऀऀऀ椀昀 ⠀琀栀椀猀⸀开瘀愀氀椀搀愀琀攀刀攀最攀砀⠀攀氀Ⰰ 爀甀氀攀䴀攀琀栀漀搀Ⰰ 爀甀氀攀䄀爀最猀⤀ 㴀㴀 昀愀氀猀攀⤀ 笀 
						el.isOk = false;਀ऀऀऀऀऀ紀 
				}਀ऀऀऀऀ椀昀 ⠀爀甀氀攀䴀攀琀栀漀搀 㴀㴀 ✀挀漀渀昀椀爀洀✀⤀ 笀 
					if (this._validateConfirm(el, ruleArgs) == false) {਀ऀऀऀऀऀऀ攀氀⸀椀猀伀欀 㴀 昀愀氀猀攀㬀 
					}਀ऀऀऀऀ紀 
				if (ruleMethod == 'differs') {਀ऀऀऀऀऀ椀昀 ⠀琀栀椀猀⸀开瘀愀氀椀搀愀琀攀䐀椀昀昀攀爀猀⠀攀氀Ⰰ 爀甀氀攀䄀爀最猀⤀ 㴀㴀 昀愀氀猀攀⤀ 笀 
						el.isOk = false;਀ऀऀऀऀऀ紀 
				}਀ऀऀऀऀ椀昀 ⠀攀氀⸀最攀琀吀愀最⠀⤀ 㴀㴀 ∀猀攀氀攀挀琀∀ 簀簀 攀氀⸀琀礀瀀攀 㴀㴀 ∀挀栀攀挀欀戀漀砀∀⤀ 笀 
					if (this._simpleValidate(el) == false) {਀ऀऀऀऀऀऀ攀氀⸀椀猀伀欀 㴀 昀愀氀猀攀㬀 
					}਀ऀऀऀऀ紀 
			}਀ऀऀ紀Ⰰ 琀栀椀猀⤀㬀 
਀ऀऀ椀昀 ⠀攀氀⸀椀猀伀欀⤀ 爀攀琀甀爀渀 琀爀甀攀㬀 
		else return false;਀ऀ紀Ⰰ 
਀ऀ⼀⨀ 
	Function: _simpleValidate਀ऀऀ倀爀椀瘀愀琀攀 洀攀琀栀漀搀 
਀ऀऀ倀攀爀昀漀爀洀 猀椀洀瀀氀攀 挀栀攀挀欀 昀漀爀 猀攀氀攀挀琀 昀椀攀氀搀猀 愀渀搀 挀栀攀挀欀戀漀砀攀猀 
	*/਀ऀ开猀椀洀瀀氀攀嘀愀氀椀搀愀琀攀 㨀 昀甀渀挀琀椀漀渀⠀攀氀⤀ 笀 
		if (el.getTag() == 'select' && (el.value == el.options[0].value)) {਀ऀऀऀ攀氀⸀攀爀爀漀爀猀⸀瀀甀猀栀⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀愀氀攀爀琀猀⸀猀攀氀攀挀琀⤀㬀 
			return false;਀ऀऀ紀 攀氀猀攀 椀昀 ⠀攀氀⸀琀礀瀀攀 㴀㴀 ∀挀栀攀挀欀戀漀砀∀ ☀☀ 攀氀⸀挀栀攀挀欀攀搀 㴀㴀 昀愀氀猀攀⤀ 笀 
			el.errors.push(this.options.alerts.checkbox);਀ऀऀऀ爀攀琀甀爀渀 昀愀氀猀攀㬀 
		}਀ऀऀ爀攀琀甀爀渀 琀爀甀攀㬀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开瘀愀氀椀搀愀琀攀刀攀最攀砀 
		Private method਀ 
		Perform regex validations਀ऀ⨀⼀ 
	_validateRegex : function(el, ruleMethod, ruleArgs) {਀ऀऀ瘀愀爀 洀猀最 㴀 ∀∀㬀 
		if (ruleArgs[1] && ruleMethod == 'length') {਀ऀऀऀ椀昀 ⠀爀甀氀攀䄀爀最猀嬀㄀崀 㴀㴀 ⴀ㄀⤀ 笀 
				this.options.regexp.length = new RegExp("^.{"+ ruleArgs[0] +",}$");਀ऀऀऀऀ洀猀最 㴀 琀栀椀猀⸀漀瀀琀椀漀渀猀⸀愀氀攀爀琀猀⸀氀攀渀最琀栀洀椀渀⸀爀攀瀀氀愀挀攀⠀∀─　∀Ⰰ爀甀氀攀䄀爀最猀嬀　崀⤀㬀 
			} else {਀ऀऀऀऀ琀栀椀猀⸀漀瀀琀椀漀渀猀⸀爀攀最攀砀瀀⸀氀攀渀最琀栀 㴀 渀攀眀 刀攀最䔀砀瀀⠀∀帀⸀笀∀⬀ 爀甀氀攀䄀爀最猀嬀　崀 ⬀∀Ⰰ∀⬀ 爀甀氀攀䄀爀最猀嬀㄀崀 ⬀∀紀␀∀⤀㬀 
				msg = this.options.alerts.length_str.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]);਀ऀऀऀ紀 
		} else if (ruleArgs[0]) {਀ऀऀऀ琀栀椀猀⸀漀瀀琀椀漀渀猀⸀爀攀最攀砀瀀⸀氀攀渀最琀栀 㴀 渀攀眀 刀攀最䔀砀瀀⠀∀帀⸀笀　Ⰰ∀⬀ 爀甀氀攀䄀爀最猀嬀　崀 ⬀∀紀␀∀⤀㬀 
			msg = this.options.alerts.lengthmax.replace("%0",ruleArgs[0]);਀ऀऀ紀 攀氀猀攀 笀 
			msg = this.options.alerts[ruleMethod];਀ऀऀ紀 
		if (ruleArgs[1] && ruleMethod == 'digit') {਀ऀऀऀ瘀愀爀 爀攀最爀攀猀 㴀 琀爀甀攀㬀 
			if (!this.options.regexp.digit.test(el.value)) {਀ऀऀऀऀ攀氀⸀攀爀爀漀爀猀⸀瀀甀猀栀⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀愀氀攀爀琀猀嬀爀甀氀攀䴀攀琀栀漀搀崀⤀㬀 
				regres = false;਀ऀऀऀ紀 
			if (ruleArgs[1] == -1) {਀ऀऀऀऀ椀昀 ⠀攀氀⸀瘀愀氀甀攀 㸀㴀 爀甀氀攀䄀爀最猀嬀　崀⤀ 瘀愀爀 瘀愀氀甀攀爀攀猀 㴀 琀爀甀攀㬀 攀氀猀攀 瘀愀爀 瘀愀氀甀攀爀攀猀 㴀 昀愀氀猀攀㬀 
				msg = this.options.alerts.digitmin.replace("%0",ruleArgs[0]);਀ऀऀऀ紀 攀氀猀攀 笀 
				if (el.value >= ruleArgs[0] && el.value <= ruleArgs[1]) var valueres = true; else var valueres = false;਀ऀऀऀऀ洀猀最 㴀 琀栀椀猀⸀漀瀀琀椀漀渀猀⸀愀氀攀爀琀猀⸀搀椀最椀琀氀琀搀⸀爀攀瀀氀愀挀攀⠀∀─　∀Ⰰ爀甀氀攀䄀爀最猀嬀　崀⤀⸀爀攀瀀氀愀挀攀⠀∀─㄀∀Ⰰ爀甀氀攀䄀爀最猀嬀㄀崀⤀㬀 
			}਀ऀऀऀ椀昀 ⠀爀攀最爀攀猀 㴀㴀 昀愀氀猀攀 簀簀 瘀愀氀甀攀爀攀猀 㴀㴀 昀愀氀猀攀⤀ 笀 
				el.errors.push(msg);਀ऀऀऀऀ爀攀琀甀爀渀 昀愀氀猀攀㬀 
			}਀ऀऀ紀 攀氀猀攀 椀昀 ⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀爀攀最攀砀瀀嬀爀甀氀攀䴀攀琀栀漀搀崀⸀琀攀猀琀⠀攀氀⸀瘀愀氀甀攀⤀ 㴀㴀 昀愀氀猀攀⤀  笀 
			el.errors.push(msg);਀ऀऀऀ爀攀琀甀爀渀 昀愀氀猀攀㬀 
		}਀ऀऀ爀攀琀甀爀渀 琀爀甀攀㬀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开瘀愀氀椀搀愀琀攀䌀漀渀昀椀爀洀 
		Private method਀ 
		Perform confirm validations਀ऀ⨀⼀ 
	_validateConfirm: function(el,ruleArgs) {਀ऀऀ椀昀 ⠀攀氀⸀瘀愀氀椀搀愀琀椀漀渀⸀挀漀渀琀愀椀渀猀⠀✀爀攀焀甀椀爀攀搀✀⤀ 㴀㴀 昀愀氀猀攀⤀ 笀 
			//el.validation.push('required');਀ऀऀ紀 
		var confirm = ruleArgs[0];਀ऀऀ椀昀⠀攀氀⸀瘀愀氀甀攀 ℀㴀 琀栀椀猀⸀昀漀爀洀嬀挀漀渀昀椀爀洀崀⸀瘀愀氀甀攀⤀笀 
			msg = this.options.alerts.confirm.replace("%0",ruleArgs[0]);਀ऀऀऀ攀氀⸀攀爀爀漀爀猀⸀瀀甀猀栀⠀洀猀最⤀㬀 
			return false;਀ऀऀ紀 
		return true;਀ऀ紀Ⰰ 
਀ऀ⼀⨀ 
	Function: _validateDiffers਀ऀऀ倀爀椀瘀愀琀攀 洀攀琀栀漀搀 
਀ऀऀ倀攀爀昀漀爀洀 搀椀昀昀攀爀猀 瘀愀氀椀搀愀琀椀漀渀猀 
	*/਀ऀ开瘀愀氀椀搀愀琀攀䐀椀昀昀攀爀猀㨀 昀甀渀挀琀椀漀渀⠀攀氀Ⰰ爀甀氀攀䄀爀最猀⤀ 笀 
		var confirm = ruleArgs[0];਀ऀऀ椀昀⠀攀氀⸀瘀愀氀甀攀 㴀㴀 琀栀椀猀⸀昀漀爀洀嬀挀漀渀昀椀爀洀崀⸀瘀愀氀甀攀⤀笀 
			msg = this.options.alerts.differs.replace("%0",ruleArgs[0]);਀ऀऀऀ攀氀⸀攀爀爀漀爀猀⸀瀀甀猀栀⠀洀猀最⤀㬀 
			return false;਀ऀऀ紀 
		return true;਀ऀ紀Ⰰ 
਀ऀ⼀⨀ 
	Function: _isChildType਀ऀऀ倀爀椀瘀愀琀攀 洀攀琀栀漀搀 
਀ऀऀ䐀攀琀攀爀洀椀渀攀 椀昀 琀栀攀 昀椀攀氀搀 椀猀 愀 最爀漀甀瀀 漀昀 爀愀搀椀漀 漀爀 渀漀琀⸀ 
	*/਀ऀ开椀猀䌀栀椀氀搀吀礀瀀攀㨀 昀甀渀挀琀椀漀渀⠀攀氀⤀ 笀 
		var elType = el.type.toLowerCase();਀ऀऀ椀昀⠀⠀攀氀吀礀瀀攀 㴀㴀 ∀爀愀搀椀漀∀⤀⤀ 爀攀琀甀爀渀 琀爀甀攀㬀 
		return false;਀ऀ紀Ⰰ 
਀ऀ⼀⨀ 
	Function: _validateGroup਀ऀऀ倀爀椀瘀愀琀攀 洀攀琀栀漀搀 
਀ऀऀ倀攀爀昀漀爀洀 爀愀搀椀漀猀 瘀愀氀椀搀愀琀椀漀渀猀 
	*/਀ऀ开瘀愀氀椀搀愀琀攀䜀爀漀甀瀀 㨀 昀甀渀挀琀椀漀渀⠀攀氀⤀ 笀 
		el.errors = [];਀ऀऀ瘀愀爀 渀氀䈀甀琀琀漀渀䜀爀漀甀瀀 㴀 琀栀椀猀⸀昀漀爀洀嬀攀氀⸀最攀琀倀爀漀瀀攀爀琀礀⠀∀渀愀洀攀∀⤀崀㬀 
		el.group = nlButtonGroup;਀ऀऀ瘀愀爀 挀戀䌀栀攀挀欀攀搀猀 㴀 昀愀氀猀攀㬀 
਀ऀऀ昀漀爀⠀瘀愀爀 椀 㴀 　㬀 椀 㰀 渀氀䈀甀琀琀漀渀䜀爀漀甀瀀⸀氀攀渀最琀栀㬀 椀⬀⬀⤀ 笀 
			if(nlButtonGroup[i].checked) {਀ऀऀऀऀ挀戀䌀栀攀挀欀攀搀猀 㴀 琀爀甀攀㬀 
			}਀ऀऀ紀 
		if(cbCheckeds == false) {਀ऀऀऀ攀氀⸀攀爀爀漀爀猀⸀瀀甀猀栀⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀愀氀攀爀琀猀⸀爀愀搀椀漀猀⤀㬀 
			return false;਀ऀऀ紀 攀氀猀攀 笀 
			return true;਀ऀऀ紀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开氀椀猀琀䔀爀爀漀爀猀䄀琀吀漀瀀 
		Private method਀ 
		Display errors਀ऀ⨀⼀ 
	_listErrorsAtTop : function(obj) {਀ऀऀ椀昀⠀℀琀栀椀猀⸀昀漀爀洀⸀攀氀攀洀攀渀琀⤀ 笀 
			 this.form.element = new Element('div', {'id' : 'errorlist', 'class' : this.options.error_class}).injectTop(this.form);਀ऀऀ紀 
		if ($type(obj) == 'collection') {਀ऀऀऀ渀攀眀 䔀氀攀洀攀渀琀⠀✀瀀✀⤀⸀猀攀琀䠀吀䴀䰀⠀∀㰀猀瀀愀渀㸀∀ ⬀ 漀戀樀嬀　崀⸀渀愀洀攀 ⬀ ∀ 㨀 㰀⼀猀瀀愀渀㸀∀ ⬀ 漀戀樀嬀　崀⸀攀爀爀漀爀猀嬀　崀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀栀椀猀⸀昀漀爀洀⸀攀氀攀洀攀渀琀⤀㬀 
		} else {਀ऀऀऀ椀昀 ⠀⠀漀戀樀⸀瘀愀氀椀搀愀琀椀漀渀⸀挀漀渀琀愀椀渀猀⠀✀爀攀焀甀椀爀攀搀✀⤀ ☀☀ 漀戀樀⸀攀爀爀漀爀猀⸀氀攀渀最琀栀 㸀 　⤀ 簀簀 ⠀漀戀樀⸀攀爀爀漀爀猀⸀氀攀渀最琀栀 㸀 　 ☀☀ 漀戀樀⸀瘀愀氀甀攀 ☀☀ 漀戀樀⸀瘀愀氀椀搀愀琀椀漀渀⸀挀漀渀琀愀椀渀猀⠀✀爀攀焀甀椀爀攀搀✀⤀ 㴀㴀 昀愀氀猀攀⤀⤀ 笀 
				obj.errors.each(function(error) {਀ऀऀऀऀऀ渀攀眀 䔀氀攀洀攀渀琀⠀✀瀀✀⤀⸀猀攀琀䠀吀䴀䰀⠀∀㰀猀瀀愀渀㸀∀ ⬀ 漀戀樀⸀渀愀洀攀 ⬀ ∀ 㨀 㰀⼀猀瀀愀渀㸀∀ ⬀ 攀爀爀漀爀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀栀椀猀⸀昀漀爀洀⸀攀氀攀洀攀渀琀⤀㬀 
				}, this);਀ऀऀऀ紀 
		}਀ऀ紀Ⰰ 
਀ऀ⼀⨀ 
	Function: _manageError਀ऀऀ倀爀椀瘀愀琀攀 洀攀琀栀漀搀 
਀ऀऀ䴀愀渀愀最攀 搀椀猀瀀氀愀礀 漀昀 攀爀爀漀爀猀 戀漀砀攀猀 
	*/਀ऀ开洀愀渀愀最攀䔀爀爀漀爀 㨀 昀甀渀挀琀椀漀渀⠀攀氀Ⰰ 洀攀琀栀漀搀⤀ 笀 
		var isValid = this._validate(el);਀ऀऀ椀昀 ⠀⠀⠀℀椀猀嘀愀氀椀搀 ☀☀ 攀氀⸀瘀愀氀椀搀愀琀椀漀渀⸀挀漀渀琀愀椀渀猀⠀✀爀攀焀甀椀爀攀搀✀⤀⤀ 簀簀 ⠀℀攀氀⸀瘀愀氀椀搀愀琀椀漀渀⸀挀漀渀琀愀椀渀猀⠀✀爀攀焀甀椀爀攀搀✀⤀ ☀☀ 攀氀⸀瘀愀氀甀攀 ☀☀ ℀椀猀嘀愀氀椀搀⤀⤀⤀ 笀 
			if(this.options.display.listErrorsAtTop == true && method == 'submit')਀ऀऀऀऀ琀栀椀猀⸀开氀椀猀琀䔀爀爀漀爀猀䄀琀吀漀瀀⠀攀氀Ⰰ 洀攀琀栀漀搀⤀㬀 
			if (this.options.display.indicateErrors == 2 ||this.alreadyIndicated == false || el.name == this.alreadyIndicated.name)਀ऀऀऀऀ笀 
					this._addError(el);਀ऀऀऀऀऀ爀攀琀甀爀渀 昀愀氀猀攀㬀 
				}਀ऀऀ紀 攀氀猀攀 椀昀 ⠀⠀椀猀嘀愀氀椀搀 簀簀 ⠀℀攀氀⸀瘀愀氀椀搀愀琀椀漀渀⸀挀漀渀琀愀椀渀猀⠀✀爀攀焀甀椀爀攀搀✀⤀ ☀☀ ℀攀氀⸀瘀愀氀甀攀⤀⤀ ☀☀ 攀氀⸀攀氀攀洀攀渀琀⤀ 笀 
			this._removeError(el);਀ऀऀऀ爀攀琀甀爀渀 琀爀甀攀㬀 
		}਀ऀऀ爀攀琀甀爀渀 琀爀甀攀㬀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开愀搀搀䔀爀爀漀爀 
		Private method਀ 
		Add error message਀ऀ⨀⼀ 
	_addError : function(obj) {਀ऀऀ琀栀椀猀⸀愀氀爀攀愀搀礀䤀渀搀椀挀愀琀攀搀 㴀 漀戀樀㬀 
		if(!this.firstError) this.firstError = obj;਀ऀऀ椀昀⠀℀漀戀樀⸀攀氀攀洀攀渀琀⤀ 笀 
			if (this.options.display.errorsLocation == 1) {਀ऀऀऀऀ椀昀 ⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀搀椀猀瀀氀愀礀⸀琀椀瀀猀倀漀猀椀琀椀漀渀 㴀㴀 ✀爀攀氀愀琀椀瘀攀✀⤀ 笀 
					var marginLeft = this.options.display.tipsOffsetX;਀ऀऀऀऀऀ椀昀 ⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀搀椀猀瀀氀愀礀⸀琀椀瀀猀䌀漀渀琀愀椀渀攀爀 㴀 ✀甀渀搀攀昀✀⤀ 
						var displacement = this.form.getCoordinates().left;਀ऀऀऀऀऀ攀氀猀攀 
						var displacement = $(this.options.display.tipsContainer).getCoordinates().left;਀ऀऀऀऀऀ瘀愀爀 漀瀀琀椀漀渀猀 㴀 笀 
						'opacity' : 0,਀ऀऀऀऀऀऀ✀瀀漀猀椀琀椀漀渀✀ 㨀 ✀愀戀猀漀氀甀琀攀✀Ⰰ 
						'margin-left' : obj.getCoordinates().right - displacement + this.options.display.tipsOffsetX਀ऀऀऀऀऀ紀 
				} else if (this.options.display.tipsPosition == 'absolute') {਀ऀऀऀऀऀ瘀愀爀 漀瀀琀椀漀渀猀 㴀 笀 
						'opacity' : 0,਀ऀऀऀऀऀऀ✀瀀漀猀椀琀椀漀渀✀ 㨀 ✀愀戀猀漀氀甀琀攀✀Ⰰ 
						'margin-left' : this.options.display.tipsOffsetX,਀ऀऀऀऀऀऀ✀氀攀昀琀✀ 㨀 漀戀樀⸀最攀琀䌀漀漀爀搀椀渀愀琀攀猀⠀⤀⸀爀椀最栀琀Ⰰ 
						'bottom' : obj.getCoordinates().top਀ऀऀऀऀऀ紀 
				}਀ऀऀऀऀऀ漀戀樀⸀攀氀攀洀攀渀琀 㴀 渀攀眀 䔀氀攀洀攀渀琀⠀✀搀椀瘀✀Ⰰ 笀✀椀搀✀ 㨀 ✀搀椀瘀攀爀爀漀爀✀ ⬀ 漀戀樀⸀渀愀洀攀Ⰰ ✀挀氀愀猀猀✀ 㨀 琀栀椀猀⸀漀瀀琀椀漀渀猀⸀琀椀瀀猀开挀氀愀猀猀Ⰰ ✀猀琀礀氀攀猀✀ 㨀 漀瀀琀椀漀渀猀紀⤀㬀 
					obj.element.injectInside(this.form);਀ 
			} else if (this.options.display.errorsLocation == 2){਀ऀऀऀऀ漀戀樀⸀攀氀攀洀攀渀琀 㴀 渀攀眀 䔀氀攀洀攀渀琀⠀✀搀椀瘀✀Ⰰ 笀✀椀搀✀ 㨀 ✀搀椀瘀攀爀爀漀爀✀ ⬀ 漀戀樀⸀渀愀洀攀Ⰰ ✀挀氀愀猀猀✀ 㨀 琀栀椀猀⸀漀瀀琀椀漀渀猀⸀攀爀爀漀爀开挀氀愀猀猀Ⰰ ✀猀琀礀氀攀猀✀ 㨀 笀✀漀瀀愀挀椀琀礀✀ 㨀 　紀紀⤀㬀 
				obj.element.injectBefore(obj);਀ऀऀऀ紀 攀氀猀攀 椀昀 ⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀搀椀猀瀀氀愀礀⸀攀爀爀漀爀猀䰀漀挀愀琀椀漀渀 㴀㴀 ㌀⤀笀 
				obj.element = new Element('div', {'id' : 'diverror' + obj.name, 'class' : this.options.error_class, 'styles' : {'opacity' : 0}});਀ 
				if ($type(obj.group) == 'object' || $type(obj.group) == 'collection')਀ऀऀऀऀऀ漀戀樀⸀攀氀攀洀攀渀琀⸀椀渀樀攀挀琀䄀昀琀攀爀⠀漀戀樀⸀最爀漀甀瀀嬀漀戀樀⸀最爀漀甀瀀⸀氀攀渀最琀栀ⴀ㄀崀⤀㬀 
				else਀ऀऀऀऀऀ漀戀樀⸀攀氀攀洀攀渀琀⸀椀渀樀攀挀琀䄀昀琀攀爀⠀漀戀樀⤀㬀 
			}਀ऀऀ紀 
		if (obj.element) {਀ऀऀऀ漀戀樀⸀攀氀攀洀攀渀琀⸀攀洀瀀琀礀⠀⤀㬀 
			if (this.options.display.errorsLocation == 1) {਀ऀऀऀऀ瘀愀爀 攀爀爀漀爀猀 㴀 嬀崀㬀 
				obj.errors.each(function(error) {਀ऀऀऀऀऀ攀爀爀漀爀猀⸀瀀甀猀栀⠀渀攀眀 䔀氀攀洀攀渀琀⠀✀瀀✀⤀⸀猀攀琀䠀吀䴀䰀⠀攀爀爀漀爀⤀⤀㬀 
				});਀ऀऀऀऀ瘀愀爀 琀椀瀀猀 㴀 琀栀椀猀⸀开洀愀欀攀吀椀瀀猀⠀攀爀爀漀爀猀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀漀戀樀⸀攀氀攀洀攀渀琀⤀㬀 
				obj.element.setStyle('top', obj.getCoordinates().top - tips.getCoordinates().height - this.options.display.tipsOffsetY);਀ऀऀऀ紀 攀氀猀攀 笀 
				obj.errors.each(function(error) {਀ऀऀऀऀऀ渀攀眀 䔀氀攀洀攀渀琀⠀✀瀀✀⤀⸀猀攀琀䠀吀䴀䰀⠀攀爀爀漀爀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀漀戀樀⸀攀氀攀洀攀渀琀⤀㬀 
				});਀ऀऀऀ紀 
਀ऀऀऀ椀昀 ⠀℀眀椀渀搀漀眀⸀椀攀㜀 ☀☀ 漀戀樀⸀攀氀攀洀攀渀琀⸀最攀琀匀琀礀氀攀⠀✀漀瀀愀挀椀琀礀✀⤀ 㴀㴀 　⤀ 
				new Fx.Styles(obj.element, {'duration' : this.options.display.fadeDuration}).start({'opacity':[1]});਀ऀऀऀ攀氀猀攀 
				obj.element.setStyle('opacity', 1);਀ऀऀ紀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开爀攀洀漀瘀攀䔀爀爀漀爀 
		Private method਀ 
		Remove the error display਀ऀ⨀⼀ 
	_removeError : function(obj) {਀ऀऀ琀栀椀猀⸀昀椀爀猀琀䔀爀爀漀爀 㴀 昀愀氀猀攀㬀 
		this.alreadyIndicated = false;਀ऀऀ漀戀樀⸀攀爀爀漀爀猀 㴀 嬀崀㬀 
		obj.isOK = true;਀ऀऀ椀昀 ⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀搀椀猀瀀氀愀礀⸀攀爀爀漀爀猀䰀漀挀愀琀椀漀渀 㴀㴀 ㈀⤀ 
			new Fx.Styles(obj.element, {'duration' : this.options.display.fadeDuration}).start({ 'height':[0] });਀ऀऀ椀昀 ⠀℀眀椀渀搀漀眀⸀椀攀㜀⤀ 笀 
			new Fx.Styles(obj.element, {਀ऀऀऀऀ✀搀甀爀愀琀椀漀渀✀ 㨀 琀栀椀猀⸀漀瀀琀椀漀渀猀⸀搀椀猀瀀氀愀礀⸀昀愀搀攀䐀甀爀愀琀椀漀渀Ⰰ 
				'onComplete' : function() {਀ऀऀऀऀऀ椀昀 ⠀漀戀樀⸀攀氀攀洀攀渀琀⤀ 笀 
						obj.element.remove();਀ऀऀऀऀऀऀ漀戀樀⸀攀氀攀洀攀渀琀 㴀 昀愀氀猀攀㬀 
					}਀ऀऀऀऀ紀⸀戀椀渀搀⠀琀栀椀猀⤀ 
			}).start({ 'opacity':[1,0] });਀ऀऀ紀 攀氀猀攀 笀 
			obj.element.remove();਀ऀऀऀ漀戀樀⸀攀氀攀洀攀渀琀 㴀 昀愀氀猀攀㬀 
		}਀ऀ紀Ⰰ 
਀ऀ⼀⨀ 
	Function: _focusOnError਀ऀऀ倀爀椀瘀愀琀攀 洀攀琀栀漀搀 
਀ऀऀ䌀爀攀愀琀攀 猀攀琀 琀栀攀 昀漀挀甀猀 琀漀 琀栀攀 昀椀爀猀琀 昀椀攀氀搀 眀椀琀栀 愀渀 攀爀爀漀爀 椀昀 渀攀攀搀攀搀 
	*/਀ऀ开昀漀挀甀猀伀渀䔀爀爀漀爀 㨀 昀甀渀挀琀椀漀渀 ⠀漀戀樀⤀ 笀 
		if (this.options.display.scrollToFirst && !this.alreadyFocused && this.alreadyIndicated.element && !this.isScrolling) {਀ऀऀऀ椀昀 ⠀琀栀椀猀⸀漀瀀琀椀漀渀猀⸀搀椀猀瀀氀愀礀⸀攀爀爀漀爀猀䰀漀挀愀琀椀漀渀 㴀㴀 ㄀⤀ 渀攀眀 䘀砀⸀匀挀爀漀氀氀⠀眀椀渀搀漀眀Ⰰ 笀漀渀䌀漀洀瀀氀攀琀攀 㨀 昀甀渀挀琀椀漀渀⠀⤀ 笀琀栀椀猀⸀椀猀匀挀爀漀氀氀椀渀最 㴀 昀愀氀猀攀㬀紀⸀戀椀渀搀⠀琀栀椀猀⤀紀⤀⸀猀挀爀漀氀氀吀漀⠀　Ⰰ漀戀樀⸀攀氀攀洀攀渀琀⸀最攀琀䌀漀漀爀搀椀渀愀琀攀猀⠀⤀⸀琀漀瀀⤀㬀 
			else if (this.options.display.errorsLocation == 2) new Fx.Scroll(window, {onComplete : function() {this.isScrolling = false;}.bind(this)}).scrollTo(0,obj.getCoordinates().top-30);਀ऀऀऀ琀栀椀猀⸀椀猀匀挀爀漀氀氀椀渀最 㴀 琀爀甀攀㬀 
			obj.focus();਀ऀऀऀ琀栀椀猀⸀愀氀爀攀愀搀礀䘀漀挀甀猀攀搀 㴀 琀爀甀攀㬀 
		} else if (this.options.display.scrollToFirst && !this.isScrolling) {਀ऀऀऀ渀攀眀 䘀砀⸀匀挀爀漀氀氀⠀眀椀渀搀漀眀Ⰰ 笀漀渀䌀漀洀瀀氀攀琀攀 㨀 昀甀渀挀琀椀漀渀⠀⤀ 笀琀栀椀猀⸀椀猀匀挀爀漀氀氀椀渀最 㴀 昀愀氀猀攀㬀紀⸀戀椀渀搀⠀琀栀椀猀⤀紀⤀⸀猀挀爀漀氀氀吀漀⠀　Ⰰ漀戀樀⸀最攀琀䌀漀漀爀搀椀渀愀琀攀猀⠀⤀⸀琀漀瀀ⴀ㌀　⤀㬀 
			this.isScrolling = true;਀ऀऀऀ漀戀樀⸀昀漀挀甀猀⠀⤀㬀 
			this.alreadyFocused = true;਀ऀऀ紀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开洀愀欀攀吀椀瀀猀 
		Private method਀ 
		Create tips boxes਀ऀ⨀⼀ 
	_makeTips : function(txt) {਀ऀऀ瘀愀爀 琀愀戀氀攀 㴀 渀攀眀 䔀氀攀洀攀渀琀⠀✀琀愀戀氀攀✀Ⰰ 笀✀挀氀愀猀猀✀ 㨀 ✀琀椀瀀猀戀漀砀✀紀⤀㬀 
			table.cellPadding ='0';਀ऀऀऀ琀愀戀氀攀⸀挀攀氀氀匀瀀愀挀椀渀最 㴀✀　✀㬀 
			table.border ='0';਀ 
			var tbody = new Element('tbody').injectInside(table);਀ऀऀऀऀ瘀愀爀 琀爀㄀ 㴀 渀攀眀 䔀氀攀洀攀渀琀⠀✀琀爀✀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀戀漀搀礀⤀㬀 
					new Element('td', {'class' : 'tipsbox_top_left'}).injectInside(tr1);਀ऀऀऀऀऀ渀攀眀 䔀氀攀洀攀渀琀⠀✀琀搀✀Ⰰ 笀✀挀氀愀猀猀✀ 㨀 ✀琀椀瀀猀戀漀砀开琀漀瀀✀紀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀爀㄀⤀㬀 
					new Element('td', {'class' : 'tipsbox_top_right'}).injectInside(tr1);਀ऀऀऀऀ瘀愀爀 琀爀㈀ 㴀 渀攀眀 䔀氀攀洀攀渀琀⠀✀琀爀✀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀戀漀搀礀⤀㬀 
					new Element('td', {'class' : 'tipsbox_left'}).injectInside(tr2);਀ऀऀऀऀऀ瘀愀爀 攀爀爀漀爀猀 㴀 渀攀眀 䔀氀攀洀攀渀琀⠀✀琀搀✀Ⰰ 笀✀挀氀愀猀猀✀ 㨀 ✀琀椀瀀猀戀漀砀开椀渀渀攀爀✀紀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀爀㈀⤀㬀 
					var errorImg = new Element('div', {'class' : 'tipsbox_error'}).injectInside(errors);਀ऀऀऀऀऀ琀砀琀⸀攀愀挀栀⠀昀甀渀挀琀椀漀渀⠀攀爀爀漀爀⤀ 笀 
						error.injectInside(errors);਀ऀऀऀऀऀ紀⤀㬀 
					new Element('td', {'class' : 'tipsbox_right'}).injectInside(tr2);਀ऀऀऀऀ瘀愀爀 琀爀㌀ 㴀 渀攀眀 䔀氀攀洀攀渀琀⠀✀琀爀✀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀戀漀搀礀⤀㬀 
					new Element('td', {'class' : 'tipsbox_bottom_left'}).injectInside(tr3);਀ऀऀऀऀऀ渀攀眀 䔀氀攀洀攀渀琀⠀✀琀搀✀Ⰰ 笀✀挀氀愀猀猀✀ 㨀 ✀琀椀瀀猀戀漀砀开洀愀爀欀✀紀⤀⸀椀渀樀攀挀琀䤀渀猀椀搀攀⠀琀爀㌀⤀㬀 
					new Element('td', {'class' : 'tipsbox_bottom_right'}).injectInside(tr3);਀ऀऀ爀攀琀甀爀渀 琀愀戀氀攀㬀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开爀攀椀渀椀琀椀愀氀椀稀攀 
		Private method਀ 
		Reinitialize form before submit check਀ऀ⨀⼀ 
	_reinitialize: function() {਀ऀऀ琀栀椀猀⸀瘀愀氀椀搀愀琀椀漀渀猀⸀攀愀挀栀⠀昀甀渀挀琀椀漀渀⠀攀氀⤀ 笀 
			if (el.element) {਀ऀऀऀऀ攀氀⸀攀爀爀漀爀猀 㴀 嬀崀㬀 
				el.isOK = true;਀ऀऀऀऀ攀氀⸀攀氀攀洀攀渀琀⸀爀攀洀漀瘀攀⠀⤀㬀 
				el.element = false;਀ऀऀऀ紀 
		});਀ऀऀ椀昀 ⠀琀栀椀猀⸀昀漀爀洀⸀攀氀攀洀攀渀琀⤀ 琀栀椀猀⸀昀漀爀洀⸀攀氀攀洀攀渀琀⸀攀洀瀀琀礀⠀⤀㬀 
		this.alreadyFocused = false;਀ऀऀ琀栀椀猀⸀昀椀爀猀琀䔀爀爀漀爀 㴀 昀愀氀猀攀㬀 
		this.alreadyIndicated = false;਀ऀऀ琀栀椀猀⸀昀漀爀洀⸀椀猀嘀愀氀椀搀 㴀 琀爀甀攀㬀 
	},਀ 
	/*਀ऀ䘀甀渀挀琀椀漀渀㨀 开漀渀匀甀戀洀椀琀 
		Private method਀ 
		Perform check on submit action਀ऀ⨀⼀ 
	_onSubmit: function(event) {਀ऀऀ琀栀椀猀⸀开爀攀椀渀椀琀椀愀氀椀稀攀⠀⤀㬀 
਀ऀऀ琀栀椀猀⸀瘀愀氀椀搀愀琀椀漀渀猀⸀攀愀挀栀⠀昀甀渀挀琀椀漀渀⠀攀氀⤀ 笀 
			if(!this._manageError(el,'submit')) this.form.isValid = false;਀ऀऀ紀Ⰰ 琀栀椀猀⤀㬀 
		if(!this.form.isValid) {਀ऀऀऀ渀攀眀 䔀瘀攀渀琀⠀攀瘀攀渀琀⤀⸀猀琀漀瀀⠀⤀㬀 
			if (this.firstError) this._focusOnError(this.firstError);਀ऀऀ紀 
	}਀紀⤀㬀 
FormCheck.implement(new Options());