function setUpFormValidator( i_formId, i_rules, i_messages, i_groups ) {
	
	var $ = jQuery;
	var $balloon;
	var $errorBox;
	var $form;
	var $elements;
	var $validator;
	var flgSubmit = false;
	
	
	/*--------------------------------------------------
	* サブミット時
	--------------------------------------------------*/
	function onSubmit() {
		flgSubmit = true;
		return true;
	}
	
	/*--------------------------------------------------
	* 入力エラー発生時
	--------------------------------------------------*/
	function onInValid( i_form, i_validator ) {
		var errors = i_validator.numberOfInvalids();
		if ( errors && flgSubmit ) {
			var message = errors+"件の入力不備がございます。内容をお確かめください。";
			$balloon.find("p").html(message);
			$balloon.fadeIn(300);
			$errorBox.show();
			$errorBox.animate( { opacity:1 }, 300 );
			var i = 0;
			var l = i_validator.errorList.length;
			for ( i=0; i<l; i++ ) {
				switchLabelClass( i_validator.errorList[i].element, "error" );
			}
			/*
			var $errorForm = $(i_validator.errorList[0].element);
			var st = $errorForm.offset().top - 20;
			$("html,body").animate( { scrollTop:st }, 500, function(){ $errorForm.focus(); } );
			*/
		} else {
			$balloon.stop().fadeOut(300);
			$errorBox.stop().animate( { opacity:0 }, 300 );
		}
	}
	
	/*--------------------------------------------------
	* エラーメッセージの表示位置を設定
	--------------------------------------------------*/
	function errorPlace( $i_error, $i_element ) {
		$i_error.appendTo( $i_element.parents("td") );
	}
	
	/*--------------------------------------------------
	* カスタムリアルタイムバリデーション
	--------------------------------------------------*/
	function realtimeValidate( i_event ) {
		var rules = $(this).rules();
		if ( !rules || isEmpty(rules) ) {
			if ( i_event.type == "blur" ) switchLabelClass( this, $(this).val() ? "valid" : "" );
			return;
		}
		if ( !$(this).val() ) {
			if ( !rules.required ) return switchLabelClass( this );
			if ( i_event.type != "blur" ) return;
		}
		//
		var valid = $(this).valid();
		switchLabelClass( this, valid ? "valid" : "error" );
		//全てvalidな場合はエラーメッセージを非表示にする
		if ( flgSubmit && valid && $form.valid() ) {
			$balloon.stop().fadeOut(300);
			$errorBox.stop().animate( { opacity:0 }, 300 );
		}
	}
	
	//空のオブジェクト判定
	function isEmpty( i_object ) {
		var rs = true;
		for ( var i in i_object ) {
			rs = false;
			break;
		}
		return rs;
	}
	
	/*--------------------------------------------------
	* アイコン変更
	--------------------------------------------------*/
	function switchLabelClass( i_element, i_class ) {
		var $label = $(i_element).parents("td").eq(0).siblings("th").find("label");
		$label.removeClass("required").removeClass("valid").removeClass("error");
		if ( !i_class ) {
			var rules = $(i_element).rules();
			if ( rules.required ) i_class="required"
		}
		$label.addClass(i_class);
	}
	
	/*--------------------------------------------------
	* 初期設定
	--------------------------------------------------*/
	$(document).ready(function() {
		$form = $("#"+i_formId);
		$form.find("input[type=submit]:last").after('<div class="errorBalloon" style="display:none;"><div><p>入力内容に不備がございます。内容をお確かめください。</p></div></div>');
		$balloon = $form.find("div.errorBalloon");
		$errorBox = $form.find("div.errorBox");
		
		$elements = $form.find("input,select,textarea");
		$elements.bind("blur",realtimeValidate);
		$elements.bind("keyup",realtimeValidate);
		$elements.bind("click",realtimeValidate);
		$form.bind("submit",onSubmit)
		
		$validator = $form.validate({
			rules			: i_rules,
			messages		: i_messages,
			onfocusout		: false,
			onclick			: false,
			onkeyup			: false,
			errorElement	: "span",
			errorPlacement	: errorPlace,
			invalidHandler	: onInValid,
			groups			: i_groups,
			focusInvalid	: true
		});
		
		
	});
}

