/*
 * formSender 1.0.0
 *
 * Copyright (c) 2008- passiona.net
 * 
 * Please refer "http://creativecommons.org/licenses/by/2.1/jp/"
 */

$(document).ready(function() {
	//Javascriptが使えるということで
	$("#isJS").val('1');
	$("#confirmBt").css('display','inline');
	//必須項目のID
	var elms = ["s_name","s_kana","s_mail","s_msg"];
	//第2、第3引数はelms配列内メールアドレスのインデックス
	formSender.formElmsInit();
	formSender.init(elms, 2);

	$("#confirmBt").click(
				   function() {
					   formSender.errResetState();
					   formSender.validate();
					   formSender.checkResult();
				   });
	
	$("#submitBt").click(
				   function() {
					   formSender.mailSend();
				   });
});

var formSender = {
	requiredObjs: new Object(),
	//必須項目数
	len: 0,
	//defaultBorder: "1px solid #A5ACB2",
	//errorBorder: "1px solid #990000",
	errObj: new Object(),
	//デバッグ用のname
	name: "formSender",
	
	formElmsInit: function() {
		$("#defRadio").attr('checked', 'checked');
	},
	
	init: function(elms, mail1, mail2) {
			//mail1とmail2で同じアドレスが入力されているかのチェックをするため
			//elms配列のどのインデックスにメールアドレスが格納されているか。省略可
			
			//エラーメッセージのクラス名：errmsg, mailerr, mailnotsame
			
			//送信ボタン不可
			$("#submitBt").attr('disabled','disabled');
			$("#submitBt").css('opacity','0.3');
			
			//必須項目があればその要素情報をrequiredObjsに格納
			if(elms.length > 0) {
				this.len = elms.length;
				
				for(var i=0; i<this.len; i++) {
					//ID値
					var elmID = elms[i];
					//要素
					var elmObj = document.getElementById(elms[i]);
					//タグ名かtype属性値
					var elmType;
					
					var tagname = elmObj.nodeName.toLowerCase();
					if(tagname == "input") {
						elmType = $(elmObj).attr('type');
					} else {
						elmType = tagname;
					};
					
					//メールアドレスか？
					var mail = false;
					if(mail1) {
						if(i == mail1 || i == mail2) mail = true;
					};
					
					var obj = {
						id: elmID,
						obj: elmObj,
						type: elmType,
						isMail: mail
					};
					
					this.requiredObjs[i] = obj;
				};
			};
			// this.requiredObjs[i]['id']  ID値
			// this.requiredObjs[i]['obj']  要素
			// this.requiredObjs[i]['type']  タグ名もしくはtype属性値
			// this.requiredObjs[i]['isMail']  メールアドレスか？
	},
		
	validate: function() {
		//alert("validate");
				this.errObj.name = "none";

				//必須項目があれば
				if(this.len > 0) {
					//未入力チェック
					for(var i=0; i<this.len; i++) {
						//可読性のため別のオブジェクトに代入
						var thisObj = document.getElementById(this.requiredObjs[i]['id']);
						
						//未入力のものはerrObj.errlistに番号を入れていく。
						//HTML要素によって未入力チェックする項目が違う。
						switch(this.requiredObjs[i]['type']) {
							case "text":
								if($(thisObj).val() == "" || $(thisObj).val() == " " || $(thisObj).val() == "　") this.errObj.errlist.push(i);
								break;
							case "checkbox":
								if(!$(thisObj).attr('checked')) this.errObj.errlist.push(i);
								break;
							case "textarea":
								if($(thisObj).val() == "") this.errObj.errlist.push(i);
								break;
								
							default:
								break;
						};
					};
					
					if(this.errObj.errlist.length > 0) {
						this.errObj.name = "empty";
						return;
						
					} else {
						//未入力がなければメール書式のチェック
						var mail1;
						for(var k=0; k<this.len; k++) {
							//メールアドレスだけ
							if(this.requiredObjs[k]['isMail']) {
								//入力されているメールアドレス格納
								var str = $(this.requiredObjs[k]['obj']).val();
								
								//1つ目のメールアドレスであり、その書式が不正であれば（書式チェックは最初の１つだけでいい）
								if(!mail1 && !str.match(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/)) {
									this.errObj.name = "mailErr";
									this.errObj.errlist.push(k);
									return;
									
								} else {
									if(!mail1) mail1 = str;
								};
								
								//2つ目のアドレスであれば1つ目との一致チェック
								if(mail1) {
									if(mail1 != str) {
										this.errObj.name = "mailNotSame";
										this.errObj.errlist.push(k);
										return;
									};
								};
							};
						};
					};
						
				};
	},
	
	//エラー状態をリセット
	errResetState: function() {
					this.errObj.name = "";
					this.errObj.errlist = [];
					$(".commonerr").css('display', 'none');
					$(".errmsg").css("display", "none");
					$(".mailerr").css("display", "none");
					$(".mailnotsame").css("display", "none");
	},
	
	//未入力エラーが発生した場合
	inputEmptyState: function() {
						for(var i=0; i<this.errObj.errlist.length; i++) {
							var e = this.errObj.errlist[i];
							//エラーメッセージを抽出して表示
							var errmsg = $(this.requiredObjs[e]['obj']).siblings().filter(".errmsg").css('display', 'block');
							//$(this.requiredObjs[e]['obj']).css('border', this.errorBorder);
						};
	},
	
	//全エラー共通メッセージ表示
	commonErrState: function() {
						$(".commonerr").css('display', 'block');
	},
	
	//メールアドレス書式エラーが発生した場合
	mailErrState: function() {
						$(".mailerr").css('display', 'block');
	},
	
	//メールアドレス不一致エラーが発生した場合
	mailNotSameState: function() {
						$(".mailnotsame").css('display', 'block');
	},
	
	//フォームのデータを送信
	mailSend: function() {
				try {
					$('#sendform').ajaxForm({
											dataType:'json',
											beforeSubmit:function() {$("#submitBt").attr('disabled','disabled');},
											success:this.getRes,
											timeout: 1000
											});
				} catch (err){
					alert("エラーが発生しました。サイト管理者へお問合せ下さい。" + err);
				};
	},
	
	//サーバーとの通信完了後に実行
	//この関数の実行はthis(formSender)ではない
	getRes: function(objHTTP, status) {
				formSender.errObj = objHTTP;
				
				if(status == "success") {
					formSender.checkResult();
				} else {
					alert("送信エラーが発生しました。サイト管理者へお問合せ下さい。" + status);
				};
	},
	
	checkResult: function() {
		//alert(this.errObj.name);
		var m = this.errObj.name;
					switch(m) {
						case "none":
							$("#submitBt").attr('disabled', false);
							$("#submitBt").css('opacity','1');
							break;
						case "empty":
							this.commonErrState();
							this.inputEmptyState();
							break;
						case "mailErr":
							this.commonErrState();
							this.mailErrState();
							break;
						case "mailNotSame":
							this.commonErrState();
							this.mailNotSameState();
							break;
						case "send":
							this.mailSent();
							break;
					};
	},
	
	mailSent: function() {
				$('#sendform').clearForm();
				$('#sendform').css('display', 'none');
				$('#sentMsg').show();
	}
	
};