/*
 * validation.js
 *
 * jQuery required (tested on version 1.2.6)
 * encoding UTF-8
 * 
 * Copyright (c) 2008 nori (norimania@gmail.com)
 * http://moto-mono.net
 * Licensed under the MIT
 *
 * $Update: 2008-11-14 20:00
 * $Date: 2008-08-20 20:00
 */

$.tip = {
	create: function(id,val,tipPos,tipTop,tipLeft){
		var tip = document.createElement("div");
		$(tip).addClass("validationTip").attr("id",id+"_tip")
		var tipInner = document.createElement("div");
		$(tipInner).addClass("tipInner").text(val);
		var pos = $("#"+id).offset();
		var rPos = new Object();
		var requestPos = function(top,left){
			rPos.top = top+tipTop+pos.top;
			rPos.left = left+tipLeft+pos.left;
		}
		switch(tipPos){
			case "top":
				requestPos(0,0);
				break;
			case "bottom":
				requestPos($("#"+id).height(),0);
				break;
			default:
				requestPos(0,$("#"+id).width());
				break;
		}
		$(tip).append(tipInner).hide().css({
			"position": "absolute",
			"top": rPos.top,
			"left": rPos.left
		});
		$("body").append(tip);
	},
	msg: function(id,msg){
		$("#"+id+"_tip .tipInner").html(msg);
	},
	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();
		}
		$(dialogMat).attr("id",id.mat).hide().fadeTo(1,0).click(function(){clearDialog();});
		$(closeBtn).attr("id",id.close).click(function(){clearDialog();})
		.hover(function(){$(this).addClass("hover");},function(){$(this).removeClass("hover");});
		$(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);
		$(dialog).css("display","inline");
		$("div",dialog).css("display","inline");
		$("div","#"+id.cont).css("display","block");
		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"
		});
		if(typeof document.body.style.maxHeight != "undefined"){
			$("#"+id.me).css({
				"margin-top": "-"+(parseInt(d.height/2))+"px"
			});
			if(document.all) $("#"+id.top+",#"+id.btm).css("min-width",d.width);
		}
	}
}
	
$.validate = {
	chk: {
		required: function(txt){
			return txt && txt.length > 0;
		},
		hankaku: /^[a-zA-Z0-9@\;\:\[\]\^\=\/\!\*\"\#\$\%\&\'\(\)\,\.\-\_\?\\\s]*$/,
		email: /^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+\.+[A-Za-z\.\-\_]*$/,
		retype: function(txt,t){
			return $("#"+$(t).attr("class").split("retype\-")[1].split(" ")[0]).val() == txt;
		},
		tel: /^[\d-]*$/,
		numonly: /^\d*$/,
		zip: /^\d*(?:-\d+)?$/
		// "
	},
	fn: function(t,options){
		msgs = $.extend({
			required: "必須項目です",
			email: "正しいEメールアドレスを入力してください",
			retype: "直前の項目と同じ内容を入力してください",
			hankaku: "全角文字は使えません",
			tel: "数字と'-'(ハイフン)以外は使えません",
			numonly: "数字のみで入力してください",
			zip: "正しい郵便番号を入力してください",
			submit: "必須項目を正しく入力してください"
		},options);
		var txt = $(t).attr("value");
		var CL = $(t).attr("class");
		var check = {
			isError: false,
			failed: function(t,c){
				$.tip.msg(t.id,msgs[c]);
				$.tip.fadeIn(t.id);
				this.isError = true;
			}
		}
		var chk = $.validate.chk;
		for(c in chk){
			if(CL.match(/required/)) $("#"+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;
	var setting = $.extend({
		//position: "right",
		top: 0,
		left: 15,
		AjaxZip2: false,
		zip: "zip",
		zip2: null,
		pref: "pref",
		addr1: "addr",
		addr2: null,
		addr3: null
	},options.extension);
	var inputs = $("input[type='text'],input[type='password'],textarea,select",form);
	inputs.each(function(){
		$.tip.create(this.id,"",setting.position,setting.top,setting.left);
		$.validate.fn(this,options.msgs);
		$(this).keyup(function(){$.validate.fn(this,options.msgs)})
		.blur(function(){$.validate.fn(this,options.msgs)});
		$(this).filter("select").change(function(){$.validate.fn(this,options.msgs)});
	});
	$.dialog.create(msgs.submit);
	$("*[type='submit']",form).click(function(){
		if($(".requiredTip:visible").length>0){
			$.dialog.fadeIn(msgs.submit,options.dialog);
			return false;
		}
	});
	if(setting.AjaxZip2){
		var timer = function(target){
			AjaxZip2.zip2addr(target,setting.pref,setting.addr1,setting.zip2,setting.addr2,setting.addr3);
			setTimeout(function(){
				inputs.each(function(){
					$.validate.fn(this,options.msgs);
				});
			},10);
		}
		$("#"+setting.zip).keyup(function(){
			timer(this);
		}).blur(function(){
			timer(this);
		});
	}
}
