/*---------------------------------------------------------------

 jQuery.validation.js - ver 1.2.5
 
 jQuery required (tested on version 1.4)
 encoding UTF-8

 Copyright (c) 2010 nori (norimania@gmail.com)
 5509 - http://moto-mono.net
 Licensed under the MIT
 
 Document Archive:
 http://moto-mono.net/2008/08/22/realtimeformvalidation.html

 $Update: 2010-03-08 11:16
 $Date: 2008-08-20 20:00
 
 ----------------------------------------------------------------*/
 
(function($){

	// 繧ｨ繝ｩ繝ｼ繝√ャ繝鈴未騾｣
	$.tip = {
		create: function(id,val,tipPos,tipTop,tipLeft){
			var tip = document.createElement("div");
			$(tip).addClass("validationTip").attr("id",id+"_tip")
			
			// 繧ｪ繝励す繝ｧ繝ｳ縺ｧ繝√ャ繝励�菴咲ｽｮ繧呈ｱｺ繧√ｋ
			var getPos = function(){
				var pos = $("#"+id).offset(),
					rPos = {},
					requestPos = function(top,left){
						rPos.top = top+tipTop+pos.top;
						rPos.left = left+tipLeft+pos.left-280;
					}
					
				switch(tipPos){
					case "top":
						requestPos(0,0);
						break;
					case "bottom":
						requestPos($("#"+id).height(),0);
						break;
					case "even":
						requestPos(0,tipLeft);
						break;
					default:
						requestPos(0,$("#"+id).width());
						break;
				}
				return rPos;
			}
			var rPos = getPos();
			
			/* 莉･荳九�繧医≧縺ｪHTML繧呈祉縺榊�縺 -- 遨ｺ隕∫ｴ縺ｯ繝�じ繧､繝ｳ逕ｨ
			<div class="validationTip">
				<div class="tipInner">--Message--</div>
				
				<div class="tipRt" />
				<div class="tipRb" />
			</div>
			*/
			$(tip).append("<div class='tipInner'>"+val+"</div><div class='tipRt'></div><div class='tipRb'></div>")
				.hide().css({
					position: "absolute",
					top: rPos.top,
					left: rPos.left
				});
			$("body #contents").append(tip);
			
			$(window).resize(function(){
				var rPos = getPos();
				$(tip).css({
					top: rPos.top,
					left: rPos.left
				});
			});
		},
		msg: function(id,msg){
			$("#"+id+"_tip .tipInner").html(msg); // 譁�ｭ怜�縺稀TML繧呈ｸ｡縺
		},
		fadeIn: function(id){$("#"+id+"_tip").fadeIn("normal");},
		fadeOut: function(id){$("#"+id+"_tip").fadeOut("normal");}
	}
	
	// 繧ｨ繝ｩ繝ｼ繝繧､繧｢繝ｭ繧ｰ髢｢騾｣
	$.dialog = {
		ids: {
			mat: "dlgmat",
			me: "dlg",
			top: "dlgtop",
			cont: "dlgcont",
			btm: "dlgbtm",
			close: "close"
		},
		create: function(msgs){
			var dialogMat = document.createElement("div");
			var dialog = document.createElement("div");
			var closeBtn = document.createElement("span");
			var id = $.dialog.ids;
			var clearDialog = function(){
				$(dialog).fadeTo(1,0).hide();
				$(dialogMat).fadeTo(1,0).hide();
				
				// IE6縺ｧselect縺ｨobject縺悟�髱｢縺ｫ譚･繧句ｯｾ遲 - 陦ｨ遉ｺ
				$("select:hidden,object:hidden").css("visibility","visible");
			}
			$("body").keyup(function(e){if(e.keyCode==27) clearDialog();});
			$(dialogMat).attr("id",id.mat).fadeTo(1,0).click(function(){clearDialog();}).hide();
			$(closeBtn).attr("id",id.close).click(function(){clearDialog();})
				.hover(function(){$(this).addClass("hover");},function(){$(this).removeClass("hover");});
				
			/* 莉･荳九�繧医≧縺ｪHTML繧呈祉縺榊�縺 -- span莉･螟悶�遨ｺ隕∫ｴ縺ｯ繝�じ繧､繝ｳ逕ｨ
			<div id="digmat" />
			<div id="dlg">
				<div id="dlgtop" />
				<div id="dlgcont">
					<div>
						<span>--Message--</span>
					</div>
				</div>
				<div id="dlgbtm" />
				<span id="close" title="--Message--" />
			</div>
			*/
			$(dialog).append("<div id='"+id.top+"'></div><div id='"+id.cont+"'><div><span></span></div></div><div id='"+id.btm+"'></div>");
			$("body").append(dialogMat).append(dialog);
			var d = {
				width: $(dialog).width(),
				height: $(dialog).height()
			}
			$(dialog).attr("id",id.me).append(closeBtn);
			$("div span","#"+id.cont).html(msgs);
			
			// div隕∫ｴ繧剃ｸ蠎ｦinline縺ｫ縺励※縲∵枚蟄怜�縺ｮ蟷�→鬮倥＆繧貞ｾ励ｋ
			$(dialog).css("display","inline");
			$("div",dialog).css("display","inline");
			$("div","#"+id.cont).css("display","block");
			
			// IE6縺ｯ蟷�ｒ謖�ｮ壹☆繧
			if(typeof document.body.style.maxHeight == "undefined") $(dialog).width($(dialog).width());
			$(dialog).hide().fadeTo(1,0);
		},
		fadeIn: function(msgs,options){
			var setting = $.extend({
				duration: "fast",
				matOpacity: .6,
				dialogOpacity: .9,
				closeTitle: "縺薙�繝｡繝�そ繝ｼ繧ｸ繧帝哩縺倥ｋ"
			},options);
			var id = $.dialog.ids;
			$("#"+id.cont+" div span").html(msgs);
			$("#"+id.me).show();
			var d = {
				width: $("#"+id.me).width(),
				height: $("#"+id.me).height()
			}
			$("#"+id.me).css("display","block");
			$("div","#"+id.me).css("display","block");
			$("#"+id.close).attr("title",setting.closeTitle);
			$("#"+id.mat).show().fadeTo(setting.duration,setting.matOpacity);
			$("#"+id.me).fadeTo(setting.duration,setting.dialogOpacity).css({
			  "margin-left": "-"+d.width/2+"px"
			});
			
			// IE6莉･螟悶�莉･荳九〒繝繧､繧｢繝ｭ繧ｰ縺ｮ菴咲ｽｮ繧呈ｱｺ繧√ｋ(IE6縺ｯCSS蜀�xpression縺ｧ謖�ｮ
			if(typeof document.body.style.maxHeight != "undefined"){
				$("#"+id.me).css({
					"margin-top": "-"+(parseInt(d.height/2))+"px"
				});
				
				// IE7縺ｯ遨ｺ隕∫ｴ(div#dlgtop, div#dlgbtm)縺ｫ譛菴主ｹ�ｒ謖�ｮ
				if(document.all) $("#"+id.top+",#"+id.btm).css("min-width",d.width);
			}else{
				
				// IE6縺ｧselect縺ｨobject縺悟�髱｢縺ｫ譚･繧句ｯｾ遲 - 髱櫁｡ｨ遉ｺ縺ｫ縺吶ｋ
				$("select,object").css("visibility","hidden");
			}
		}
	}
	
	// 繝舌Μ繝��繧ｷ繝ｧ繝ｳ髢｢騾｣
	$.validate = {
		
		// class縺ｫ譚｡莉ｶ繧貞牡繧雁ｽ薙※繧
		chk: {
			required: function(txt,t){
				if($(t).hasClass("group")){
					var flag = 0;
					$("input,select",t).each(function(){
						if($(this).val().length>0) flag++;
					});
					return txt && flag==$("input,select",t).length;
				}else{
					return txt && txt.length > 0;
				}
			},
			hankaku: /^[a-zA-Z0-9@\;\:\[\]\^\=\/\!\*\"\#\$\%\&\'\(\)\,\.\-\_\?\\\s]*$/, //"
			email: /^([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+\.+[A-Za-z\.\-\_]+)*$/,
			tel: /^[\d-]*$/,
			numonly: /^\d*$/,
			zip: /^(\d\d\d\-?\d\d\d\d)*/,
			check: function(txt,t){
				return $("input:checked",t).length>0;
			},
			radio: function(txt,t){
				return $("input:checked",t).length>0;
			},
			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;
				}
			},
			min: function(txt,t){
				var length = $(t).attr("class").match(/min(\d+)/) ? RegExp.$1 : null;
				if(txt.length>0) return txt.length >= length;
			},
			max: function(txt,t){
				var length = $(t).attr("class").match(/max(\d+)/) ? RegExp.$1 : null;
				if(txt.length>0) return txt.length <= length;
			}
		},
		fn: function(t,options){
			msgs = $.extend({
				retype: "逶ｴ蜑阪�鬆�岼縺ｨ蜷後§蜀�ｮｹ繧貞�蜉帙＠縺ｦ縺上□縺輔＞",
				email: "豁｣縺励＞E繝｡繝ｼ繝ｫ繧｢繝峨Ξ繧ｹ繧貞�蜉帙＠縺ｦ縺上□縺輔＞",
				hankaku: "蜈ｨ隗呈枚蟄励�菴ｿ縺医∪縺帙ｓ",
				tel: "豁｣縺励＞髮ｻ隧ｱ逡ｪ蜿ｷ繧貞�蜉帙＠縺ｦ縺上□縺輔＞",
				numonly: "謨ｰ蟄励�縺ｿ縺ｧ蜈･蜉帙＠縺ｦ縺上□縺輔＞",
				zip: "豁｣縺励＞驛ｵ萓ｿ逡ｪ蜿ｷ繧貞�蜉帙＠縺ｦ縺上□縺輔＞",
				min: "譁�ｭ嶺ｻ･荳翫〒蜈･蜉帙＠縺ｦ縺上□縺輔＞",
				max: "譁�ｭ嶺ｻ･蜀�〒蜈･蜉帙＠縺ｦ縺上□縺輔＞",
				check: "縺ｲ縺ｨ縺､莉･荳翫ｒ驕ｸ謚槭＠縺ｦ縺上□縺輔＞",
				radio: "縺�★繧後°繧帝∈謚槭＠縺ｦ縺上□縺輔＞",
				required: "蠢�磯�岼縺ｧ縺",
				submit: "蠢�磯�岼繧呈ｭ｣縺励￥蜈･蜉帙＠縺ｦ縺上□縺輔＞"
			},options);
			var txt = $(t).attr("value");
			var CL = $(t).attr("class");
			
			// 蛻�牡鬆�岼縺ｯ荳ｭ縺ｮvalue繧定ｶｳ縺励◆繧ゅ�繧稚xt縺ｫ縺吶ｋ
			if(CL.match(/group/)){
				txt = "";
				var inputs = $("input,select",t);
				inputs.each(function(i){
					txt += $(this).val();
					
					// .email 縺ｫ縺ｯ@繧定ｿｽ蜉
					if(CL.match(/email/) && i==0 && $(this).val().length>0)
						txt += "@";
				});
			}
			
			// 繧ｨ繝ｩ繝ｼ譎ゅ�蜍穂ｽ
			var check = {
				isError: false,
				failed: function(t,c){
					var msg = msgs[c];
					if(c.match(/min/) && CL.match(/min(\d+)/)) msg = RegExp.$1+msgs[c];
					else if(c.match(/max/) && CL.match(/max(\d+)/)) msg = RegExp.$1+msgs[c];
					$.tip.msg(t.id,msg);
					$.tip.fadeIn(t.id);
					this.isError = true;
				}
			}
			var chk = $.validate.chk;
			for(c in chk){
				
				// .required, .check, .radio 縺ｫ縺ｯ 繝√ャ繝励↓ .requiredTip 繧定ｿｽ蜉
				if(CL.match(/required|check|radio/)) $("#"+t.id+"_tip").addClass("requiredTip");
				if(CL.match(c)){
					if(typeof(chk[c]) != "function"){
						if(txt && !txt.match(chk[c])){
							check.failed(t,c);
							break;
						}
					}else{
						if(!chk[c](txt,t)){
							check.failed(t,c);
							break;
						}
					}
				}
			}
			
			// 繧ｨ繝ｩ繝ｼ縺後↑縺代ｌ縺ｰ繝√ャ繝励ｒ髱櫁｡ｨ遉ｺ縺ｫ縺吶ｋ
			if(!check.isError){
				$.tip.fadeOut(t.id);
			}
		}
	}
	
	/* 蛻晄悄蛹悶→驕ｩ逕ｨ */
	$.fn.validation = function(options){
		if($(this).length<1) return false;
		var form = this, tipDiv = 500;
		if(!options) var options = {};
		var setting = $.extend({
			dialog: true,
			submit: "#submit",
			position: "left",
			top: 0,
			left: 15,
			AjaxZip2: false,
			zip: "zip",
			zip2: null,
			pref: "pref",
			addr1: "addr",
			addr2: null,
			addr3: null
		},options.extension);
		
		// 繝√ぉ繝�け縺吶ｋclass繧貞性繧薙〒縺�ｋinput隕∫ｴ
		var inputs = $("input[type='text'],input[type='password'],textarea,select",form)
			.filter(function(){
				return this.className.match(/required|retype|email|hankaku|numonly|tel|zip/);
			});
		var validate = function(target){
			$.validate.fn(target,options.msgs);
			if(!setting.dialog){
				setTimeout(function(){
					if($("div.requiredTip:visible").length>0){
						$(setting.submit).attr("disabled","disabled").addClass("disabled");
						$(setting.submit).stop().fadeTo(500,0.5);
						$(setting.submit).css({cursor:"default"});
					}else{
						$(setting.submit).stop().fadeTo(500,1.0, function(){
							if(!$.support.style){ $(this).get(0).style.removeAttribute('filter'); }
						});
						$(setting.submit).removeAttr("disabled").removeClass("disabled");
						$(setting.submit).css({cursor:"pointer"});
					}
				},500);
			}
		}
		
		// 荳願ｨ倥�input,select,textarea繧偵メ繧ｧ繝�け縺吶ｋ
		inputs.each(function(){
			$.tip.create(this.id,"",setting.position,setting.top,setting.left,tipDiv--);
			validate(this);
			$(this).bind("keyup blur",function(){validate(this)})
				.filter("select").change(function(){validate(this)});
		});
		
		// 荳願ｨ倅ｻ･螟悶�蛻�牡縲√メ繧ｧ繝�け繝懊ャ繧ｯ繧ｹ縲√Λ繧ｸ繧ｪ繝懊ち繝ｳ繧偵メ繧ｧ繝�け縺吶ｋ
		$(".group,.check,.radio").each(function(){
			var group = this;
			$.tip.create(this.id,"",setting.position,setting.top,setting.left);
			validate(this);
			if($(this).hasClass("group")){
				$("input",this).keyup(function(){validate(group)})
					.blur(function(){validate(group)});
				$("select",this).change(function(){validate(group)});
			}else{
				$("input",this).click(function(){validate(group)});
			}
		});
		
		// 繝ｪ繧ｻ繝�ヨ繝懊ち繝ｳ縺ｸ縺ｮ繧｢繧ｿ繝�メ
		$.validationResetFunc = function(){
			form.get(0).reset();
			inputs.each(function(){validate(this)});
			$(".group,.check,.radio").each(function(){validate(this)});
		}
		$("input[type='reset']").click(function(){
			$.validationResetFunc();
			return false;
		});
		
		if(setting.dialog) $.dialog.create(msgs.submit);
		
		// Submit繝懊ち繝ｳ繧呈款縺励◆縺ｨ縺阪お繝ｩ繝ｼ縺後↑縺代ｌ縺ｰ繝��繧ｿ繧帝√ｋ
		$("*[type='submit'],input[type='image']",form).click(function(){
			
			// 繧ｨ繝ｩ繝ｼ繝√ャ繝励′陦ｨ遉ｺ縺輔ｌ縺ｦ縺�ｋ蝣ｴ蜷医�繧ｨ繝ｩ繝ｼ繝繧､繧｢繝ｭ繧ｰ繧定｡ｨ遉ｺ縺吶ｋ
			if($("div.requiredTip:visible").length>0){
				$.dialog.fadeIn(msgs.submit,options.dialog);
				return false;
			}
		});
		
		// AjaxZip2縺梧怏蜉ｹ縺ｮ蝣ｴ蜷医�莉･荳九〒驕ｩ逕ｨ縺吶ｋ
		if(setting.AjaxZip2){
			var timer = function(){
				AjaxZip2.zip2addr(setting.zip,setting.pref,setting.addr1,setting.zip2,setting.addr2,setting.addr3);
				setTimeout(function(){
					inputs.each(function(){validate(this);});
				},10);
			}
			
			// setting.zip2縺ｫ蛟､縺後≠繧句ｴ蜷医�input[name='setting.zip2']縺ｧ繝√ぉ繝�け縺吶ｋ
			$("input[name='"+(setting.zip2!=null ? setting.zip2 : setting.zip)+"']")
				.keyup(function(){timer();})
				.blur(function(){timer();});
		}
			
	}
	
})(jQuery);
