(function($){

	// Validation Suspended Class
	// $Date: 09-09-08 11:13
	// $Update: 09-09-24 11:08
	$.zaqValidation = (function(){
		
		// these are validation rules
		// for(c in conf) c: target className
		this.conf = {
			required: [
				'\*入力してください',
				function(txt,t){
					if($(t).hasClass('group')){
						var flag = 0;
						$('input,select',t).each(function(){
							if($(this).val().length>0) flag++;
						});
						//console.log(txt);
						//return txt && flag==$('input,select',t).length;
						if($(t).hasClass('eventTerm')){
							return txt && flag==$('input,select',t).length;
						}else if(txt && flag==$('input,select',t).length){
							if(txt.match(/^[ 　\r\n\t]+$/)){
								return false;
							}else{
								return true;
							}
						}
					}else{
						if(txt && txt.length>0){
							if(txt.match(/^[ 　\r\n\t]+$/)){
								return false;
							}else{
								return true;
							}
						}
					}
				}
			],
			retype: [
				'\*入力内容が異なります',
				function(txt,t){
					var elm = $('#'+$(t).attr('class').split('retype\-')[1].split(/\b/)[0]);
					if(elm.hasClass('group')){
						var chktxt = $('input',elm), txt = $('input',t);
						for(var i=0,flag=false;i<chktxt.length;i++){
							if(chktxt[i].value==txt[i].value) flag = true;
							else flag = false;
						}
						if(flag) return true;
					}else{
						return elm.val() == txt;
					}				
				}
			],
			dirName: [
				'\*使える文字は半角小文字英数字と_(アンダーバー)、-(ハイフン)です',
				/^[a-z\d\_\-]+$/
			],
			/*forbidden: [
				'\* 「\<\>」は使えません',
				function(txt,t){
					if(txt.match(/[\<\>]/)){
						return false;
					}else{
						return true;
					}
				}
			],*/
			email: [
				'\*正しいメールアドレスの形式を入力してください',
				/^[^\@]+?@[A-Za-z0-9_\.\-]+\.+[A-Za-z\.\-\_]+$/
			],
			nomobile: [
				'\*携帯電話のメールアドレスは登録することができません',
				function(txt,t){
					if(!txt || txt.length<1) return true;
					if(txt.match(/(docomo|ezweb|softbank|vodafone|jp\-\w|pdx|disney|emnet|mopera)\.ne\.jpx?$/) || txt.match(/willcom\.com$/) || txt.match(/i\.softbank\.jp$/)){
						return false;
					}else{
						return true;
					}
				}
			],
			hankaku: [
				'\*全角文字は使用できません',
				/^[a-zA-Z0-9@\;\:\[\]\{\}\|\^\=\/\!\*\`\"\#\$\+\%\&\'\(\)\,\.\-\_\?\\\s]*$/
			],
			nickname: [
				'\*全角文字と半角英数字、-(ハイフン)、_(アンダーバー)の組み合わせと全角10文字以内で入力してください',
				 function(txt,t){
				 	var hankaku;
				 	if(txt.match(/[a-zA-Z0-9\-\_]/)){
						hankaku = txt.match(/[a-zA-Z0-9\-\_]/g);
					}
					if(!hankaku) hankaku = 0;					
					var count = hankaku ? txt.length - hankaku.length/2 : txt.length;
					
				 	if(count<=10){
				 		if(txt.match(/^[^@\;\:\[\]\{\}\|\^\=\/\!\*\>\<\^\"\#\$\+\%\&\'\(\)\,\.\\?\\\s]+$/)){
				 			return true;
				 		}else{
				 			return false;
				 		}
				 	}else{
				 		return false;
				 	}
				 }
			],
			zenkaku: [
				'\*全角文字で入力してください',
				/^[^a-zA-Z0-9@\;\:\[\]\{\}\|\^\=\/\!\*\"\#\$\+\%\&\'\(\)\,\.\-\_\?\\\s]+$/
			],
			hiragana: [
				'\*ひらがなで入力してください',
				/^[あ-んー～]+$/
			],
			furigana: [
				'\*ふりがなはひらがな、数字、アルファベットと〜、ー、（）が利用できます',
				/^[あ-ん０-９ー～（）\(\)\d 　]+$/
			],
			nochar: [
				'\*英数字で入力してください',
				/^[a-zA-Z0-9]+$/
			],
			nocaps: [
				'\*英数字(小文字のみ)で入力してください',
				/^[a-z0-9]+$/
			],
			numonly: [
				'\*半角数字のみで入力してください',
				function(txt,t){
					if(txt && txt.length>0){
						if(txt.match(/^[0-9]+$/)){
							return true;
						}else{
							return false;
						}
					}else{
						return true;
					}
				}
			],
			password: [
				'\*使える文字は半角英数字と\! \" \# \& \' \( \) \^ \_ \* \. \, \/ \; \< \> \= \@ \[ \] \{ \} \| \+ \: \? \/ \- です。',
				/^[a-zA-Z0-9\!\"\#\&\'\(\)\*\.\,\^\_\/\;\<\>\=\@\[\]\{\}\|\+\:\?\-]+$/
			],
			/*dateformat: [
			],*/
			timeformat: [
				'\*時間は00:00:00～23:59:59までが指定可能です',
				function(txt,t){
					if(txt.length>0){
						if(txt.match(/^[01]/)){
							if(txt.match(/^[01][0-9]\:[012345][0-9]\:[012345][0-9]$/)){
								return true;
							}else{
								return false;
							}
						}else if(txt.match(/^2/)){
							if(txt.match(/^[2][0123]\:[012345][0-9]\:[012345][0-9]$/)){
								return true;
							}else{
								return false;
							}
						}
					}else{
						return true;
					}
				}
			],
			singleMin: [
				'文字以上で入力してください',
				function(txt,t){
					if(txt.length==0) return true;
				 	var length = $(t).attr('class').match(/singleMin(\d+)/) ? RegExp.$1 : null;
					return txt.length >= length;
				}
			],
			singleMax: [
				'文字以内で入力してください',
				function(txt,t){
					var length = $(t).attr('class').match(/singleMax(\d+)/) ? RegExp.$1 : null;
					return txt.length <= length;
				}
			],
			min: [
				'文字以上で入力してください',
				function(txt,t){
				 	var hankaku;
				 	var length = $(t).attr('class').match(/min(\d+)/) ? RegExp.$1 : null;
				 	if(txt.match(/[a-zA-Z0-9\-\_]/)){
						hankaku = txt.match(/[a-zA-Z0-9\-\_]/g);
					}
					if(!hankaku) hankaku = 0;					
					var count = hankaku ? txt.length - hankaku.length/2 : txt.length;
					
					return count >= length;
				}
			],
			max: [
				'文字以内で入力してください',
				function(txt,t){
				 	var hankaku;
					var length = $(t).attr('class').match(/max(\d+)/) ? RegExp.$1 : null;
				 	if(txt.match(/[a-zA-Z0-9\-\_]/)){
						hankaku = txt.match(/[a-zA-Z0-9\-\_]/g);
					}
					if(!hankaku) hankaku = 0;					
					var count = hankaku ? txt.length - hankaku.length/2 : txt.length;
					
					return count <= length;
				}
			],
			radio: [
				'\*選択してください',
				function(txt,t){
					return $('input:checked',t).length>0;
				}
			],
			checkbox: [
				'\*選択してください',
				function(txt,t){
					return $('input:checked',t).length>0;
				}
			],
			url: [
				'\*正しいURLの形式を入力してください',
				function(txt,t){
					if(txt && txt.length>0){
						if(txt.match(/^http(s)?\:\/\/[^\/]*/)){
							return true;
						}else{
							return false;
						}
					}else{
						return true;
					}
				}
			],
			tel: [
				'\*正しい電話番号を入力してください',
				function(txt,t){
					if(txt && txt.length>0){
						if(txt.match(/^\(?\d+\)?\-?\d+\-?\d+$/)){
							return true;
						}else{
							return false;
						}
					}else{
						return true;
					}
				}
			],
			fax: [
				'\*正しいファックス番号を入力してください',
				function(txt,t){
					if(txt && txt.length>0){
						if(txt.match(/^\(?\d+\)?\-?\d+\-?\d+$/)){
							return true;
						}else{
							return false;
						}
					}else{
						return true;
					}
				}
			],
			genre: [
				'\*どれかひとつ以上を選んでください',
				function(txt,t){
					return $('input:checked',t).length>0;
				}
			],
			eventTerm: [
				'\*正しい開催開始日と開催終了日を選択してください',
				function(txt,t){
					var date = function(year,month,day){
						var returnDate = new Date(year,(month-1),day);
						return returnDate;
					}
				
					function checkDate(year,month,day){
						var dt = date(year,month,day);
						if(dt == null || dt.getFullYear() != year || dt.getMonth() + 1 != month || dt.getDate() != day){
							return false;
						}
						return true;
					}
					
					var startSplit = txt[0].split('-');
					var endSplit = txt[1].split('-');
					
					checkDate(startSplit[0],startSplit[1],startSplit[2]);
					checkDate(endSplit[0],endSplit[1],endSplit[2]);
					
					var dt1 = date(startSplit[0],startSplit[1],startSplit[2]);
					var dt2 = date(endSplit[0],endSplit[1],endSplit[2]);
					
					if(dt1 > dt2){
						return false;
					}else{
						return true;
					}
				}
			]
		}
		
		this.chkIcons = {
			ok: '<img width="20" height="20" alt="OK" src="/common/images/icon/ok.png" />',
			err: '<img width="20" height="20" alt="Caution" src="/common/images/icon/caution.png" />'
		}
		
		return this;

	})();
	
	// Generate error
	// $Date: 09-09-19:32
	// $Update: 09-09-24 12:55
	$.zaqValidation.generateErr = function(id,formID){
		//return '<span id="err_'+id+'" class="errMsg" style="display:none"></span>';
		return Array(
			'<div class="errWindow errMsg '+formID+'" id="err_'+id+'">',
				'<div><img src="/common/images/err/errWindowHead_s.png" alt="" width="200" height="10" /></div>',
				'<div class="body">',
					//'<p>Error</p>',
					'<span class="msg"></span>',
				'</div>',
				'<div><img src="/common/images/err/errWindowFoot_s.png" alt="" width="200" height="17"/></div>',
			'</div>'
		).join('');
	}
	
	// Insert error message
	// $Date: 09-09-14 19:32
	// $Date: 09-09-24 12:56
	$.zaqValidation.insertErrMsg = function(t,errMsg,id){
		$('span.msg','#err_'+id).html(errMsg);
		this.getErrHeight(id);
	}
	
	
	// Validate target element (this is be the one of form elements)
	// 09-09-14 19:17
	// $(err) and $(ok) .isFunction() == true
	$.zaqValidation.basicValidate = function(t,err,ok,checkDir){
		var CL = $(t).attr('class');
		var chk = this.conf;
		var id = $(t).attr('id');
		var txt = '';
		var _this = this;
		var dirCheck = checkDir ? checkDir : false;
		
		if($(t).hasClass('eventTerm')){
			txt = new Array();
			txt[0] = $('#hiddenEventStartDate').val();
			txt[1] = $('#hiddenEventEndDate').val();
		}else if($(t).hasClass('group')){
			var groupInputs = $('input,select,textarea',t);
			groupInputs.each(function(i){
				txt += $(this).val();
			});
		}else{
			txt = $(t).attr('value');
		}
		
		var check = {
			isError: false,
			failed: function(t,c){
				var msg = chk[c][0];
				if(c.match(/min/i) && CL.match(/min(\d+)/i)){
					msg = '\*'+RegExp.$1+msg;
				}else if(c.match(/max/i) && CL.match(/max(\d+)/i)){
					msg = '\*'+RegExp.$1+msg;
				}else if(t.nodeName=='SELECT'){ // select要素の場合はメッセージを変える
					msg = '\*選択してください';
				}
				
				if(err && typeof err == 'function'){
					err(t,msg,id);
				}else{
					$(t).addClass('err');
					$('#err_'+id).exShow();
					_this.insertErrMsg(t,msg,id);
				}
				this.isError = true;
			}
		}
		for(c in chk){
			//console.log(c+'\n'+dirCheck)
			//if(!dirCheck && !c.match(/checkDir/)){
				if(CL.match(c)){
				
					if(typeof(chk[c][1]) != 'function'){
						if(txt && !txt.match(chk[c][1])){
							check.failed(t,c);
							break;
						}
					}else{
						/*if(dirCheck && c.match(/checkDir/)){
						
						}else */if(!chk[c][1](txt,t)){
							check.failed(t,c);
							break;
						}
					}
				}
			//}
		}
		
		if(!check.isError){
			if(ok && typeof ok == 'function'){
				ok(t,id);
			}else{
				$(t).removeClass('err');
				$('#err_'+id).exHide();
			}
		}
	}
		
	// Error message template A
	// Signup, Signup Profile
	// div#err_[id]
	// $Date: 09-09-08 11:28
	$.zaqValidation.errTempA = function(id){
		return Array(
			'<div class="errWindow errMsg" id="err_'+id+'">',
				'<div><img src="/common/images/err/errWindowHead_s.png" alt="" width="200" height="10" /></div>',
				'<div class="body">',
					//'<p>Error</p>',
					'<span class="msg"></span>',
				'</div>',
				'<div><img src="/common/images/err/errWindowFoot_s.png" alt="" width="200" height="17"/></div>',
			'</div>'
		).join('');
	}
	
	// Insert error message included in target err box
	// $Date: 09-09-08 13:43
	$.zaqValidation.errMsg = function(id,errMsg){
		$('span.msg','#err_'+id).html(errMsg);
	}
	
	// Insert error message target ID
	// $Date: 09-09-14 17:56
	/*$.zaqValidation.insertErrMsg = function(id,errMsg){
		$('#err_',id).html(errMsg);
	}*/
	
	// Return RegClasses
	// $Date: 09-09-12 12:24
	$.zaqValidation.returnReg = function(){
		var validationClasses = '';
		for(var c in this.conf){
			validationClasses += c+'|';
		}
		validationClasses = validationClasses.replace(/\|$/,'');
		return new RegExp(validationClasses);
	}
	
	// Get error height & position
	// $Date: 09-09-16 21:34
	$.zaqValidation.getErrHeight = function(id,zIndex){
		var target = $('#'+id);
		var left;
		
		if(target.is(':hidden')){
			target = target.next();
		}
		
		var err = $('#err_'+id);
		var pos = target.offset();
		
		if(target.hasClass('errPosRight')){
			left = pos.left + target.attr('offsetWidth') - 40;
		}else{
			left = pos.left - 20;
		}
		
		err.css({
			position: 'absolute',
			top: pos.top - err.attr('offsetHeight') - 5,
			left: left
		});
		
		if(zIndex){
			err.css('zIndex',zIndex);
		}
	}
	
	// Later call
	// Call this func everytime everywhere you like
	// $Date: 09-09-16 22:39
	$.zaqValidation.laterCall = function(){
		// this is empty
	}
	
	// Serialize data to post
	// $Date: 09-09-30 18:56
	$.zaqValidation.serializeParams = function(elms){
		var _params = elms.filter(function(){ return this.name && this.name.length>0; }).serializeArray();
		var _sendParams = {};
		for(var i=0;i<_params.length;i++){
			_sendParams[_params[i].name] = _params[i].value ? _params[i].value : '';
		}
		return _sendParams;
	}
		
	// Input label
	// $Date: 09-09-12 16:10
	$.zaqValidation.label = function(attr){
		var formElms = $('input:text,input:password,textarea');
		for(var i=0;i<formElms.length;i++){
			var self = formElms[i];
			var parent = $(self).parent();
			
			if($(self).attr(attr) && $(self).attr(attr).length>0){
				
				parent.css('position','relative')
				
				var label = $(self).attr(attr);
				var pos = $(self).position();
				
				$(self).removeAttr('title');
				
				var insertLabel = $('<span/>')
					.attr('id','label_'+self.id)
					.append(label)
					.addClass('label')
					.css({
						position: 'absolute',
						top: pos.top + 6,
						left: pos.left + 7,
						zIndex: 100,
						color: '#666'
					});
				
				parent.append(insertLabel);
				
				if(self.value && self.value.length>0){
					insertLabel.hide();
				}
				
				insertLabel.click(function(){
					var relationInputId = this.id.replace('label_','');
					$(this).hide();
					$('#'+relationInputId).focus();
				});
					
				$(self).focus(function(){
					$('#label_'+this.id).hide();
				}).blur(function(){
					if(this.value.length<1){
						$('#label_'+this.id).show();
					}
				});
			}
		}
	}
	
	// Validate basic elements
	// $Date: 09-09-14 19:36
	$.fn.zaqBasicValidation = function(conf){
		
		var $vali = $.zaqValidation;
		var c = $.extend({
			errInsertPos: 'body', // 'body' or target before
			err: null,
			ok: null,
			moveToErr: true,
			position: 'absolute', // fixed
			errZIndex: null,
			customSubmit: null, // function(){}
			customListener: 'blur keyup change',
			customBind: null,
			customGetErrHeight: null,
			ajaxValidate: null // { 'id':{ binding: 'bind', handler: 'blur', url: '~~~' }, ... }
			/* params
			@ binding: 'bind', 'one'
			@ handler: eventHandler (click,dblclick,focus,blur,mouseover...)
			@ url: URL
			@ type: 'POST', 'GET'
			@ dataType: 'json'
			*/
		},conf || {});
		var randomInt = function(){
			return Math.floor(Math.random()*10)+1;
		};
		// If this form doesn't have ID, formID is to be decided by random integer
		var formID = $(this).attr('id') ? 'form_' + $(this).attr('id') : 'form_' + randomInt()*randomInt();
		
		var errZIndex = c.errZIndex ? c.errZIndex : 100;
		$vali.errZIndex = errZIndex;
		//$vali.errZIndex = c.errZIndex ? c.errZIndex : 100;
		//console.log($vali.errZIndex)
		
		var inputs = $('input:text,input:password,input:hidden,textarea,select,[class*="group"],[class*="radio"],[class*="checkbox"]',this)
			.filter(function(){ return !$(this).parents().hasClass('group'); });
			
		var classReg = $vali.returnReg();
		var idReg = '';
		if(c.ajaxValidate){
			for(var d in c.ajaxValidate){
				idReg += d+'|';
			}
			idReg = idReg.replace(/\|$/,'');
		}
		
		inputs.each(function(){
			
			var self = $(this);
			var cl = this.className;
			var offset = self.offset();
			var id = this.id;
			
			// classRegを含んでいなければ対象外
			if(cl.match(classReg)){
				if(c.errInsertPos=='body'){
					$('body').append($vali.generateErr(id,formID));
				}else{
					$(this).after($vali.generateErr(id,formID));
				}
				if(c.position=='absolute'){
					if(c.customGetErrHeight && typeof c.customGetErrHeight=='function'){
						c.customGetErrHeight(id);
					}else{
						$vali.getErrHeight(id,errZIndex);
					}
					
					// Reget the position
					$(window).resize(function(){
						if(c.customGetErrHeight && typeof c.customGetErrHeight=='function'){
							c.customGetErrHeight(id);
						}else{
							$vali.getErrHeight(id,errZIndex);
						}
					});
				}
				$('#err_'+id).hide();
			}
			
			if(idReg && this.id.match(idReg)){
				var _aVal = c.ajaxValidate[id];
				var _self = this;
				$(this)[_aVal.binding ? _aVal.binding : 'bind'](_aVal.handler,function(){
					$('#err_'+id).exShow();
					$('span.msg','#err_'+id).html('<img src="/common/images/loadinfo/loadinfo_ss.gif" />');
					if(_self.value && _self.value.length>0){
						$.ajax({
							url: _aVal.url ? _aVal.url : null,
							type: 'POST',
							data: {
								dir: $('#dir').val(),
								zaq_token: $('#zaq_token').val()
							},
							dataType: 'json',
							global: false,
							error: function(){
								$('#'+id).addClass('err');
								$('#err_'+id).exShow();
								$vali.insertErrMsg('通信に失敗したかJSONファイルにエラーがあります',id);
							},
							success: function(JSON){
								if(JSON.Error.Code=='0'){
									$('#'+id).removeClass('err');
									$('span.msg','#err_'+id).html('使用できます');
									$('#err_'+id).exHide();
								}else{
									setTimeout(function(){
									$('#'+id).addClass('err');
									$('span.msg','#err_'+id).html(JSON.Error.Message);
									$('#err_'+id).exShow();
									},1000);
								}
							}
						});
					}else{
						$('#'+id).removeClass('err');
						$('#err_'+id).exHide();
					}
				});
			}
			
		});
		
		// You call this func everytime, everywhere you like after init
		$vali.laterCall = function(t){
			$vali.basicValidate(t,c.err,c.ok);
		}
		
		if($.firstValidate){
			var bindingListener = 'blur click';//$.browser.msie ? 'blur click' : 'blur';
			inputs.each(function(){
				if($(this).hasClass('group')){
					var self = $(this);
					var groupInputs = $('input:text,input:password,input:checkbox,input:radio,select,textarea',self);
					groupInputs.bind(bindingListener,function(){
						$vali.basicValidate(self,c.err,c.ok);
					});
				}else{
					$(this).bind(bindingListener,function(){
						$vali.basicValidate(this,c.err,c.ok);
					});
				}
			});
		}
		
		function _exeValidation(customBindCallback){
			if($.firstValidate){
				inputs.unbind('blur keyup change click');
				$.firstValidate = false;
			}
			// submit時にvalidationをbindする
			inputs.each(function(){
				$vali.basicValidate(this,c.err,c.ok,true);
				
				if($(this).hasClass('group')){
					var self = $(this);
					var groupInputs = $('input:hidden,input:text,input:password,input:checkbox,input:radio,select,textarea',self);
					groupInputs.bind(c.customListener,function(){
						$vali.basicValidate(self,c.err,c.ok);
					});
				}else{
					$(this).bind(c.customListener,function(){
						$vali.basicValidate(this,c.err,c.ok);
					});
				}
			});
				
			var err = $('div.errMsg:visible[class*="'+formID+'"],span.errMsg:visible[class*="'+formID+'"]');
			// エラーボックス最大の高さ
			if(err.length>0){
				var reverseOffsetTop = $(err[0]).offset().top;
				for(var i=0;i<err.length;i++){
					reverseOffsetTop = $(err[i]).offset().top < reverseOffsetTop ? $(err[i]).offset().top : reverseOffsetTop;
				}
			}
			
			var scrollToErr = function(){
				if(err.length>0){
					var scrollTarget = $.support.boxModel ? navigator.appName.match(/Opera/) ? 'html' : 'html,body' : 'body';
					$(scrollTarget).animate({
						scrollTop: reverseOffsetTop - 60
					},{
						easing: $.easing.easeInOutCirc ? 'easeInOutCirc' : 'swing',
						duration: 500
					});
				}
			}
			
			if(err.length>0){
				if(c.moveToErr) scrollToErr();
				return false;
			}else{
				if(customBindCallback && typeof customBindCallback=='function'){
					customBindCallback();
				}else{
					if(c.customSubmit && typeof c.customSubmit=='function'){
						c.customSubmit();
						return false;
					}else{
						// OK
						if(c.callback && typeof c.callback=='function'){
							c.callback();
						}
					}
				}
			}
		}
		
		// When the form is submited
		this.submit(_exeValidation);
		
		// Add the Validation
		if(c.customBind){
			c.customBind.object.bind(c.customBind.listener,function(){
				_exeValidation(c.customBind.callback);
				return false;
			});
		}
		
		// Return the jQuery object
		return this;
		
	}
	
	// Check if you accept the guidline
	// $Date: 09-09-15 11:00
	$.fn.zaqBasicValidationAccept = function(conf){
		
		var c = $.extend({
			customBind: null
		},conf || {});
		
		// Accept the Guideline check
		var $vali = $.zaqValidation;
		var randomInt = function(){
			return Math.floor(Math.random()*10)+1;
		};
		var formID = $(this).attr('id') ? 'form_' + $(this).attr('id') : 'form_' + randomInt()*randomInt();
		var acceptErr = $($vali.errTempA('accept')).css('position','absolute').addClass(formID);
		$('#accept').before(acceptErr).parent().css('position','relative');
		$vali.errMsg('accept','\*ガイドラインに同意してチェックしてください');
		
		var setPos = function(){
			var acceptPos = $('#accept').position();
			acceptErr.css({
				zIndex: 10000,
				top: acceptPos.top - acceptErr.attr('offsetHeight'),
				left: acceptPos.left - 20 //- (acceptErr.attr('offsetWidth')/2) + 10
			});
		}
		setPos();
		acceptErr.hide();
		
		function _exeValidation(){
			var accept = $('#accept').is(':checked') ? true : false;
			
			$('#accept').click(function(){
				accept = $('#accept').is(':checked') ? true : false;
				
				if(accept){
					acceptErr.exHide('fast');
				}else{
					acceptErr.exShow('fast');
					setPos();
				}
			});
				
			if(!accept){
				acceptErr.exShow('fast');
				setPos();
			}
			
			if(accept){
				// OK
			}else{
				// ERROR
				return false;
			}
		}
		
		// When the form is submited
		this.submit(_exeValidation);
		
		// Add the Validation
		if(c.customBind){
			c.customBind.object.bind(c.customBind.listener,function(){
				_exeValidation();
				return false;
			});
		}
		
		return this;
	}
	
	// Encode post datas
	// $Date: 09-09-29 16:03
	$.zaqEncodeData = function(Data){
		if(typeof Data=='object'){
			for(var d in Data){
				Data[d] = encodeURIComponent(Data[d]);
			}
		}else{
			Data = encodeURIComponent(Data);
		}
		return Data;
	}
	
	// Init Pref & City selectable
	// $Date: 09-09-24 17:24
	$.zaqPrefSelectableInit = function(prefID,cityID,validationLaterCall){
		if(!$.fn.selectable) return false;
		
		// validationLaterCall
		//{
		//	pref: true,
		//	city: true
		//}
		var c = $.extend({
			pref: true,
			city: true,
			prefLeft: null
		},validationLaterCall || {});
		
		var prefObj = $(prefID);
		var cityObj = $(cityID);
		var $vali = $.zaqValidation;
		var requestCityData = function(){
			if(prefObj.val() && prefObj.val().length>0){
				cityObj.empty().append('<option value="">市区町村</option>');
				$('#city_mat div.sBoxBody').empty();
				if(c.city){
					$vali.laterCall(cityID);
				}
				
		        $.ajax({
					url:'/handler/common/get_address.aspx',
					data:{
						prefecture: prefObj.val()
					},
					dataType:'json',
					type:'POST',
					success:function(data) {
						//cityObj.empty().append('<option value="">市区町村</option>');
						$.each(data.Data.Items, function() {
							cityObj.append('<option value="'+this.CityID+'">'+this.City+'</option>');
						});
						cityObj.removeAttr('disabled');
						cityInstance.rebuild();
					}
				});
			}
		}
		
		var prefInstance = prefObj.selectable({
			left: c.prefLeft ? -165 : c.prefLeft,
			callback: function(){
				if(c.pref){
					$vali.laterCall(prefID);
				}
				
				if(prefObj.val().length>0){
					requestCityData();
				}
			}
		});
		var cityInstance = cityObj.selectable({
			style: 'simpleBox',
			top: -15,
			height: 200,
			callback: function(){
				if(c.city){
					$vali.laterCall(cityID);
				}
			}
		});
		//requestCityData();
		
		// Init pref select
		var initPrefSelect = function(){
			$.ajax({
				url: '/handler/common/get_area.aspx',
				dataType: 'json',
				type: 'POST',
				success: function(data){
					// Optgroup
					var area = [];
					var areaItems = data.Data.Items;
					for(var i=0;i<areaItems.length;i++){
						area[parseInt(areaItems[i].AreaID)] = {
							AreaName: areaItems[i].AreaName,
							Prefs: []
						}
					}
					
				    $.ajax({
						url:'/handler/common/get_prefecture.aspx',
						dataType:'json',
						type:'POST',
						success:function(data) {
							var prefItems = data.Data.Items;
							
							for(var i=0;i<prefItems.length;i++){
								area[parseInt(prefItems[i].AreaID)].Prefs.push({
									ID: prefItems[i].PrefectureID,
									Name: prefItems[i].PrefectureName
								});
							}
							for(var i=0;i<area.length;i++){
								if(!area[i] || area[i].Prefs.length==0) continue;
								
								var optgroup = $('<optgroup/>').attr('label',area[i].AreaName);
								for(var j=0;j<area[i].Prefs.length;j++){
									optgroup.append('<option value="'+area[i].Prefs[j].ID+'">'+area[i].Prefs[j].Name+'</option>');
								}
								prefObj.append(optgroup);
							}
							
							// Rebuild selectable
							prefInstance.rebuild();
						}
					});
					
				}
			});
		}
		$(prefID+'_dammy').one('click',function(){
			initPrefSelect();
		});
		
		if(prefObj.val() && prefObj.val().length>0 && cityObj.val().length>=0){
			$(cityID+'_dammy').one('click',function(){
				requestCityData();
			});
		}
	}
	
	$.zaqValidation.overMask = function(id){
		/*var overMask = $('<div/>').addClass('overMask').attr('id','overMask_'+id);
		var pubDate = $('#'+id);
		
		pubDate.before(overMask);
		pubDate.parent().css('position','relative');
		var pubDatePos = pubDate.position();
		
		overMask.css({
			width: pubDate.attr('offsetWidth'),
			height: pubDate.attr('offsetHeight')+5,
			position: 'absolute',
			top: pubDatePos.top,
			left: pubDatePos.left
		});*/
	}
	
})(jQuery);

/// <reference path="../../../lib/jquery-1.2.6.js" />
/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function(c){var a=(c.browser.msie?"paste":"input")+".mask";var b=(window.orientation!=undefined);c.mask={definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};c.fn.extend({caret:function(f,d){if(this.length==0){return;}if(typeof f=="number"){d=(typeof d=="number")?d:f;return this.each(function(){if(this.setSelectionRange){this.focus();this.setSelectionRange(f,d);}else{if(this.createTextRange){var g=this.createTextRange();g.collapse(true);g.moveEnd("character",d);g.moveStart("character",f);g.select();}}});}else{if(this[0].setSelectionRange){f=this[0].selectionStart;d=this[0].selectionEnd;}else{if(document.selection&&document.selection.createRange){var e=document.selection.createRange();f=0-e.duplicate().moveStart("character",-100000);d=f+e.text.length;}}return{begin:f,end:d};}},unmask:function(){return this.trigger("unmask");},mask:function(f,j){if(!f&&this.length>0){var g=c(this[0]);var i=g.data("tests");return c.map(g.data("buffer"),function(m,l){return i[l]?m:null;}).join("");}j=c.extend({placeholder:"_",completed:null},j);var e=c.mask.definitions;var i=[];var k=f.length;var h=null;var d=f.length;c.each(f.split(""),function(l,m){if(m=="?"){d--;k=l;}else{if(e[m]){i.push(new RegExp(e[m]));if(h==null){h=i.length-1;}}else{i.push(null);}}});return this.each(function(){var u=c(this);var p=c.map(f.split(""),function(y,x){if(y!="?"){return e[y]?j.placeholder:y;}});var s=false;var w=u.val();u.data("buffer",p).data("tests",i);function t(x){while(++x<=d&&!i[x]){}return x;}function o(z){while(!i[z]&&--z>=0){}for(var y=z;y<d;y++){if(i[y]){p[y]=j.placeholder;var x=t(y);if(x<d&&i[y].test(p[x])){p[y]=p[x];}else{break;}}}r();u.caret(Math.max(h,z));}function l(B){for(var z=B,A=j.placeholder;z<d;z++){if(i[z]){var x=t(z);var y=p[z];p[z]=A;if(x<d&&i[x].test(y)){A=y;}else{break;}}}}function q(y){var z=c(this).caret();var x=y.keyCode;s=(x<16||(x>16&&x<32)||(x>32&&x<41));if((z.begin-z.end)!=0&&(!s||x==8||x==46)){m(z.begin,z.end);}if(x==8||x==46||(b&&x==127)){o(z.begin+(x==46?0:-1));return false;}else{if(x==27){u.val(w);u.caret(0,n());return false;}}}function v(A){if(s){s=false;return(A.keyCode==8)?false:null;}A=A||window.event;var x=A.charCode||A.keyCode||A.which;var C=c(this).caret();if(A.ctrlKey||A.altKey||A.metaKey){return true;}else{if((x>=32&&x<=125)||x>186){var z=t(C.begin-1);if(z<d){var B=String.fromCharCode(x);if(i[z].test(B)){l(z);p[z]=B;r();var y=t(z);c(this).caret(y);if(j.completed&&y==d){j.completed.call(u);}}}}}return false;}function m(z,x){for(var y=z;y<x&&y<d;y++){if(i[y]){p[y]=j.placeholder;}}}function r(){return u.val(p.join("")).val();}function n(y){var C=u.val();var B=-1;for(var x=0,A=0;x<d;x++){if(i[x]){p[x]=j.placeholder;while(A++<C.length){var z=C.charAt(A-1);if(i[x].test(z)){p[x]=z;B=x;break;}}if(A>C.length){break;}}else{if(p[x]==C[A]&&x!=k){A++;B=x;}}}if(!y&&B+1<k){u.val("");m(0,d);}else{if(y||B+1>=k){r();if(!y){u.val(u.val().substring(0,B+1));}}}return(k?x:h);}if(!u.attr("readonly")){u.one("unmask",function(){u.unbind(".mask").removeData("buffer").removeData("tests");}).bind("focus.mask",function(){w=u.val();var x=n();r();setTimeout(function(){if(x==f.length){u.caret(0,x);}else{u.caret(x);}},0);}).bind("blur.mask",function(){n();if(u.val()!=w){u.change();}}).bind("keydown.mask",q).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){u.caret(n(true));},0);});}n();});}});})(jQuery);