/*
 *	formValidator.js - 1.0.0
 *
 *	Copyright (c) 2008 Nori(norimania@gmail.com)
 *	Licensed under the MIT License:
 *	http://www.opensource.org/licenses/mit-license.php
 *
 *	Modified:  2008-05-13
 *
 *	jQuery 1.2.3
 */
 
/*	[使用方法]
 *		
 *	Validationを行うinputにクラスを当てます
 *	必須項目にする場合は required
 *	メールアドレスチェックは mail
 *	メールアドレスチェックにはオプションで 全角チェックも含めることが出来ます
 *	その場合は mail byte とします
 *	半角数字+"-"ハイフンのチェックは number をそれぞれ当てます
 *	required は mail, number とともに併用することが出来ます
 *
 *	例)
 *	<input type="text" name="mail" id="mail" value="" class="mail byte required" />
 *	<span>エラーメッセージが表示されます</span> ←inputの後ろにエラーが挿入されます
 *
 *	inputの後ろは何もない状態にしておく必要があります
 *
 *	バリデーションを任意に実行したいときは $.f.start(); を記述します
 */

(function($){
	
	$(function(){
		$.f.start();
	});
		
	$.e = {	
		/* エラー文の定義 */
		required: "必須項目です",
		mail: "正しいEメールアドレスを入力してください",
		byte: "全角文字は使えません",
		number: "数字と'-'(ハイフン)以外は使えません",
		numonly: "数字のみで入力してください",
		zip: "正しい郵便番号を入力してください"
	}
	
	$.f = {
		/* クラス名の定義 */
		required: "required",
		mail: "mail",
		byte: "byte",
		number: "number",
		numonly: "numonly",
		zip: "zip",
		
		/* submitボタンの絞込みのためのID(formが2つ以上存在する場合に干渉するのを防ぐため */
		submit: "#contents",
		
		/* エラー文表示メソッド */
		addErr: function(t,e){
			if(e.length>0){
				if($(t).next().length>0){
					if($(t).next().text().length>1){
						$(t).next().show().text(e);
					}else{
						$(t).next().text(e).fadeIn("slow").css("display","block");
					}
				}else{
					var span = document.createElement("span");
					$(span).text(e).addClass("errTxt").hide();
					$(span).insertAfter(t).fadeIn("slow").css("display","block");
				}
			}else{
				$(t).next().fadeOut("slow",function(){$(this).text(e)})
			}
		},
		
		/* 必須項目のチェック */
		r: function(t){
			var fn = function(t){
				if($(t).attr("value")){
					if($(t).attr("value").length>0){
						$.f.addErr(t,"");
					}else{
						$.f.addErr(t,$.e.required);
					}
				}else{
					$.f.addErr(t,$.e.required);
				}
			}
			fn(t);
			$(t).keyup(function(){
				fn(this);
			});
			$(t).blur(function(){
				fn(this);
			});
		},
		
		/* メールアドレスのチェック */
		m: function(t){
			var fn = function(t){
				var txt = $(t).attr("value")
				/* 使用するメソッド */
				var chk = {
					/* 全角チェック */
					c_byte: function(txt){
						/* 全角を含む場合 */
						if(!txt.match(/^[a-zA-Z0-9@\;\:\[\]\^\=\/\!\*\"\#\$\%\&\'\(\)\,\.\-\_\?\\\s]+$/)){
							$.f.addErr(t,$.e.byte);
						/* 全角がない場合 */
						}else{
							chk.c_mail(txt);
						}
					},
					/* メールアドレスの形式チェック */
					c_mail: function(txt){						
						if(txt && txt.length>0){
							if(txt.match(/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+\.+[A-Za-z\.\-\_]/)){
								$.f.addErr(t,"");
							}else{
								$.f.addErr(t,$.e.mail);
							}
						}
					}
				}
				/* 実行時のクラスによる分岐 */
				if($(t).attr("class").match(/required/)){
					if($(t).hasClass("byte")){
						if(txt){
							if(txt.length>0){
								chk.c_byte(txt);
							}else{
								$.f.addErr(t,$.e.required);
							}
						}else{
							$.f.addErr(t,$.e.required);
						}
					}
				}else if($(t).attr("class").match(/byte/)){
					chk.c_byte(txt);
				}else{
					chk.c_mail(txt);
				}
			}
			fn(t);
			$(t).keyup(function(){
				fn(this);
			});
			$(t).blur(function(){
				fn(this);
			});
		},
		
		n: function(t){
			var fn = function(t){
				var txt = $(t).attr("value");
				var chk = {
					c_number: function(txt){
						if(txt.match(/^[0-9\-]/)){
							$.f.addErr(t,"");
						}else{
							$.f.addErr(t,$.e.number);
						}
					}
				}
				/* 実行時のクラスによる分岐 */
				if($(t).attr("class").match(/required/)){
					if(txt){
						if(txt.length>0){
							chk.c_number(txt);
						}else{
							$.f.addErr(t,$.e.required);
						}
					}else{
						$.f.addErr(t,$.e.required);
					}
				}else{
					if(txt && txt.length>0)
						chk.c_number(txt);
					else
						$.f.addErr(t,"");
				}
			}
			fn(t);
			$(t).keyup(function(){
				fn(this);
			});
			$(t).blur(function(){
				fn(this);
			});
		},
		
		no: function(t){
			var fn = function(t){
				var txt = $(t).attr("value");
				var chk = {
					c_numonly: function(txt){
						if(!txt.match(/[a-zA-Z@\;\:\[\]\^\=\/\!\*\"\#\$\%\&\'\(\)\,\.\-\_\?\\\s]/)){
							$.f.addErr(t,"");
						}else{
							$.f.addErr(t,$.e.numonly);
						}
					}
				}
				/* 実行時のクラスによる分岐 */
				if($(t).attr("class").match(/required/)){
					if(txt){
						if(txt.length>0){
							chk.c_numonly(txt);
						}else{
							$.f.addErr(t,$.e.required);
						}
					}else{
						$.f.addErr(t,$.e.required);
					}
				}else{
					if(txt && txt.length>0)
						chk.c_numonly(txt);
					else
						$.f.addErr(t,"");
				}
			}
			fn(t);
			$(t).keyup(function(){
				fn(this);
			});
			$(t).blur(function(){
				fn(this);
			});
		},
		
		z: function(t){
			var fn = function(t){
				var txt = $(t).attr("value");
				var chk = {
					c_zip: function(txt){
						if(!txt.match(/[a-zA-Z@\;\:\[\]\^\=\/\!\*\"\#\$\%\&\'\(\)\,\.\-\_\?\\\s]/)&&txt.length>6){
							$.f.addErr(t,"");
						}else{
							$.f.addErr(t,$.e.zip);
						}
					}
				}
				/* 実行時のクラスによる分岐 */
				if($(t).attr("class").match(/required/)){
					if(txt){
						if(txt.length>0){
							chk.c_zip(txt);
						}else{
							$.f.addErr(t,$.e.required);
						}
					}else{
						$.f.addErr(t,$.e.required);
					}
				}else{
					if(txt && txt.length>0)
						chk.c_zip(txt);
					else
						$.f.addErr(t,"");
				}
			}
			fn(t);
			$(t).keyup(function(){
				fn(this);
			});
			$(t).blur(function(){
				fn(this);
			});
		},
		
		s: function(area){
			$("*[type='submit']",area).click(function(){
				var errTxt = $(".errTxt");
				for(var i=0,n=0;i<errTxt.length;i++){
					n += $(errTxt[i]).text().length;
				}
				if(n>0){
					alert("必須項目を正しく入力してください");
					return false;
				}
			});
		},
				
		/* 実行メソッド */
		start: function(){
			$("input, textarea").each(function(){
				var c = $(this).attr("class");
				if(c){	//classが存在すれば
					if(c.indexOf($.f.mail)!=-1){
						$.f.m(this);
					}else if(c.indexOf($.f.number)!=-1){
						$.f.n(this);
					}else if(c.indexOf($.f.numonly)!=-1){
						$.f.no(this);
					}else if(c.indexOf($.f.zip)!=-1){
						$.f.z(this);
					}else if(c.indexOf($.f.required)!=-1){
						$.f.r(this);
					}
				}
			});
			$.f.s($($.f.submit));
		}
	}
	
})(jQuery);