/**
 * FileName:checkFormValidation.js
 * @author uniteair.co.jp
 */
var FORMNAME;
var DATA = new Array();
var SEND = new Array();
var SENDLEN;
var count = 0;
var ERR_FLG = false;
var requiredArray = new Array();
var POSTCODE = new Array();
var POSTCODE_ERR_MSG = "郵便番号は半角数字で入力してください。";
var ADDRESS_ERR_MSG = "キーワードを入力してください。";
var domain = "";
var checkOk = false;
var buttonObj = null;

/**
 * @description template
 */
var TOPERR = '<li><a href="#${id}" class="txRed">↓${msg}</a></li>';
var ERR = '<p class="alert"><strong>${msg}</strong></p>';

/**
 * @constructor
 * @description クラスの宣言
 */
var checkFormValidation = function(){
}


checkFormValidation.prototype = {
/**
 * @class initialize
 */
 	initialize:function(){
		this.click();
		this.setID();
		this.submit();
	},

/**
 * @class click
 * @description ページ上部のエラー項目をクリックされたら
 */
	click:function(){
		$(".alertBlock a").click(function () {
			var id = $(this).attr("href");
			id = id.slice(id.indexOf("#")+1);

			$(".formBlock tr").each(function(i){
				var trID = $(this).attr("id");
				if(trID == id){
					var y = $(this).offset().top;
					$('html,body').animate({scrollTop: y}, "slow");
				}
			});

			return false;
		});

		$(".js-resign-btn").click(function () {
			FORMNAME = $("form").attr("name");
			validation.reset();

			var label = "resign";

			validation.getValue(label, $("form"));
			validation.ajax(label, $("form"));

			return false;
		});
	},

/**
 * @class submit
 * @description サブミットされたら
 */
	submit:function(){
		$("form").submit(function() {
			if (checkOk) {
				return true;
			}


			POSTCODE = new Array();

			FORMNAME = $(this).attr("name");
			validation.reset();
			var count = 0;
			var label = "def";
			buttonObj = $(this).find("input[type='image']");

			if($(this).find("input[type='image']").hasClass("postcode")){
				label = "postcode";
				$(this).find("input[type='text']").each(function(){
					var obj = new Object();
					obj.name = $(this).attr("name");
					obj.msg = POSTCODE_ERR_MSG;
					POSTCODE.push(obj);
				});
			}

			if($(this).find("input[type='image']").hasClass("address")){
				label = "address";

				// 検索キーワードのトリミング
				if (this.shopAddress) {
					this.shopAddress.value = jQuery.trim(this.shopAddress.value);
				}

//				if (this.shopAddress.value.match(/^[\f\n\r\t\v\u0020\u00a0\u2000-\u200b\u2028-\u3000]+|[\f\n\r\t\v\u0020\u00a0\u2000-\u200b\u2028-\u3000]+$/g)){
//					this.shopAddress.value = "";
//				}
				this.shopAddress.value = this.shopAddress.value.replace(/^[ 　]+/,"").replace(/[ 　]+$/,"");

				if (this.shopAddress.value != ""){
					return true;
				}

				$(this).find("input[type='text']").each(function(){
					var obj = new Object();
					obj.name = $(this).attr("name");
					obj.msg = ADDRESS_ERR_MSG;
					POSTCODE.push(obj);
				});
			}

			validation.getValue(label, $(this));
			validation.ajax(label, $(this));

			if (checkOk) {
				return true;
			} else {
				return false;
			}
		});
	},

/**
 * @class submit
 * @description 配列を初期化。エラー表示を削除。
 */
	reset:function(){
		DATA.length = 0;
		$("p.alert").remove();
		$(".alertBlock").css("display", "none");
		$(".alertBlock ul li").remove();
		$("th, tr").removeClass("error");
	},

/**
 * @class getValue
 * @description inputの値を取得
 */
	getValue:function(label, elem){
		if(label=="def")requiredArray = REQUIREDITEMS;
		if(label=="postcode" || label=="address")requiredArray = POSTCODE;
		var mobileFlg = false;
		var radioFlgArray = new Array();
		if(label=="def"){
			radioFlgArray = new Array(REQUIREDITEMS.length);
		}

		$(elem).find("input, option:selected, textarea").each(function(i){
			var obj = new Object();

			if(!$(this).val()){	/* 必須項目未入力(type=text||password||option) */
				var name = ($(this).attr("name"))?$(this).attr("name"):$(this).parent().attr("name");

				$(requiredArray).each(function(i){
					if(name == requiredArray[i].name){
						if(name == "MemberPhoneNumber" || name == "MemberMobilePhoneNumber"){ /* 電話番号 自宅と携帯両方とも未入力の場合のみ処理を行う */
							if(!($("input[name=MemberPhoneNumber]").val()) && !($("input[name=MemberMobilePhoneNumber]").val())){
								obj.name = requiredArray[i].name;
								obj.val = "";
								obj.msg = requiredArray[i].msg;
								validation.addDATA(obj);
							}
						}else{
							obj.name = requiredArray[i].name;
							obj.val = "";
							obj.msg = requiredArray[i].msg;
							validation.addDATA(obj);
						}
					}
				});
			}else if($(this).attr("type")=="radio"){	/* 必須項目未入力(type=radio) */
				var name = ($(this).attr("name"))?$(this).attr("name"):$(this).parent().attr("name");

				$(requiredArray).each(function(i){
					if (!radioFlgArray[i]) {
						if(name == requiredArray[i].name){
							if (!$("input:radio[name='" + name + "']:checked").val()) {
								obj.name = requiredArray[i].name;
								obj.val = "";
								obj.msg = requiredArray[i].msg;
								validation.addDATA(obj);
							}
							radioFlgArray[i] = true;
						}
					}
				});
			}else if($(this).attr("type")=="checkbox"){	/* 必須項目未入力(type=checkbox) */
				if($(this).attr("name") == "MailMagazineFlag"){ /* 配信チェック */
					if($(this).attr("checked")){ /* チェックされていたら */
						var sendFlg = false;
						$("input:checkbox[name=MailSendType]").each(function(){
							if($(this).attr("checked")){
								sendFlg =true;
							}
						});

						if(!(sendFlg)){ /* 配信にチェックされているのに「パソコン」「携帯」両方とも選択されていない場合の処理 */
							$(requiredArray).each(function(i){
								if("MailMagazineFlag" == requiredArray[i].name){
									obj.name = requiredArray[i].name;
									obj.val = "";
									obj.msg = requiredArray[i].msg;
									validation.addDATA(obj);
								}
							});
						}else{
							validation.mobileMailCheck();	/* 携帯アドレス入力チェック */
						}
					}else{
						$("input:checkbox[name=MailSendType]").each(function(){
							if($(this).attr("checked")){
								$("input[name^='MailMagazineFlag']").attr("checked", "checked");
							}

							validation.mobileMailCheck();	/* 携帯アドレス入力チェック */
						});
					}
				}else if($(this).attr("name") == "MailSendType" && $("body").hasClass("js-pre")){ /* メルマガ会員用 */
					var sendFlg = false;
					$("input:checkbox[name=MailSendType]").each(function(){
						if($(this).attr("checked")){
							sendFlg =true;
							if($(this).hasClass("js-mobile"))mobileFlg = true;
						}
					});

					if(!(sendFlg)){ /* 配信先がチェックされていない場合 */
						var name = $(this).attr("name");
						$(requiredArray).each(function(i){
							if(name == requiredArray[i].name){
								if(name == "MemberPhoneNumber" || name == "MemberMobilePhoneNumber"){ /* 電話番号 自宅と携帯両方とも未入力の場合のみ処理を行う */
									if(!($("input[name=MemberPhoneNumber]").val()) && !($("input[name=MemberMobilePhoneNumber]").val())){
										obj.name = requiredArray[i].name;
										obj.val = "";
										obj.msg = requiredArray[i].msg;
										validation.addDATA(obj);
									}
								}else{
									obj.name = requiredArray[i].name;
									obj.val = "";
									obj.msg = requiredArray[i].msg;
									validation.addDATA(obj);
								}
							}
						});
					}

					if(mobileFlg){
						validation.mobileMailCheck();
					}
				}else{
					if(!($(this).attr("checked"))){
						var name = $(this).attr("name");
						$(requiredArray).each(function(i){
							if(name == requiredArray[i].name){
								if(name == "MemberPhoneNumber" || name == "MemberMobilePhoneNumber"){ /* 電話番号 自宅と携帯両方とも未入力の場合のみ処理を行う */
									if(!($("input[name=MemberPhoneNumber]").val()) && !($("input[name=MemberMobilePhoneNumber]").val())){
										obj.name = requiredArray[i].name;
										obj.val = "";
										obj.msg = requiredArray[i].msg;
										validation.addDATA(obj);
									}
								}else{
									obj.name = requiredArray[i].name;
									obj.val = "";
									obj.msg = requiredArray[i].msg;
									validation.addDATA(obj);
								}
							}
						});
					}
				}
			}else if($(this).attr("type")=="text" || $(this).attr("type")=="password"){	/* 入力値エラー */
				obj.name = $(this).attr("name");
				obj.val = $(this).val();
				obj.data = "/" + FORMNAME + "/" + obj.name + "/d?p=" + encodeURIComponent(obj.val);
				validation.addDATA(obj);
				SEND.push(obj);
			}else{
				if($(this).attr("type")!="radio" && $(this).attr("type")!="checkbox" && $(this).attr("type")!="hidden"){
					obj.name = $(this).attr("name");
					obj.val = $(this).val();

					if($(this).hasClass("js-confirm"))validation.confirmCheck(obj.name, obj.val);

					var cls = $(this).hasClass("js-mail");

					obj.name = $(this).attr("name");
					obj.val = $(this).val();
					obj.data = "/" + FORMNAME + "/" + obj.name + "/d?p=" + encodeURIComponent(obj.val);
					if(!(cls))validation.addDATA(obj);
					SEND.push(obj);
				}
			}
		});

		this.sortDATA();
		SENDLEN = SEND.length;
	},

/**
 * @class mobileMailCheck
 * @description 携帯アドレス入力チェック
 */
	mobileMailCheck:function(){
		$("input:checkbox[name=MailSendType]").each(function(){
			if($(this).attr("checked") && $(this).hasClass("js-mobile")){
				$("input[name^='MemberMobileEMail']").each(function(){
					if(!($(this).val())){
						var name = $(this).attr("name");

						$(requiredArray).each(function(i){
							if("MailMagazineFlag" == requiredArray[i].name || "MailSendType" == requiredArray[i].name){
								$(requiredArray[i].child).each(function(j){
									if(name == requiredArray[i].child[j].name){
										var obj = new Object();
										obj.name = requiredArray[i].child[j].name;
										obj.val = "";
										obj.msg = requiredArray[i].child[j].msg;
										validation.addDATA(obj);
									}
								});
							}
						});
					}
				});
			}
		});
	},

/**
 * @class ajax
 * @description API呼び出し
 */
	ajax:function(label, elem){
		if(SENDLEN>count){
			var name = SEND[count].name;
			$.ajax({
				type: "GET",
				url: domain + "/rest/checkFormValidation" + SEND[count].data,
				data: "",
				success: function(msg){
					validation.callback(msg, name, label, elem);
				}
			});

			//validation.callback("TRUE", name, label, elem); // デバッグ用
		}else{
			ERR_FLG = false;
			$(DATA).each(function(i){
				if(DATA[i].msg != "TRUE"){
					ERR_FLG = true;
					return false;
				}
			});

			if(ERR_FLG){
				var login = $("body").hasClass("js-login");
				var pgsho05 = $("body").hasClass("js-pgsho05");
//				if((!login) && label != "postcode" && label != "address"){
				if((!login) && (!pgsho05) && label != "postcode" && label != "address"){
					validation.topErrDisplay();
					validation.setFocus();
				}
				validation.errDisplay(label, elem);
			}else{
				if(label == "resign"){
					//box.click();
				}else{
					if($("form").attr("name") == FORMNAME ){	/* FF 戻る対策 */
						checkOk = true;
						buttonObj.click();
					} else if("ZipCodeDto" == FORMNAME) {
						checkOk = true;
						buttonObj.click();
					}
				}
			}
		}
	},

/**
 * @class callback
 * @description ajax callback
 */
	callback:function(msg, name, label, elem){
		$(DATA).each(function(i){
			if(DATA[i].name == name && !(DATA[i].msg)){
				DATA[i].msg = msg;
			}
		});

		if(count+1<=SENDLEN){
			count++;
			validation.ajax(label, elem);
		}
	},

/**
 * @class mailAjax
 * @description メールアドレス重複API呼び出し
 */
	mailAjax:function(mail, name){
		$.ajax({
			type: "GET",
			url: domain + "/rest/existMember/" + mail,
			success: function(msg){
				validation.mailCallback(msg, name);
			}
		});
	},

/**
 * @class callback
 * @description ajax callback
 */
	mailCallback:function(msg, name){
		$(DATA).each(function(i){
			if(DATA[i].name == name){
				DATA[i].msg = msg;
				DATA[i+1].msg = "TRUE";
			}
		});
	},
/**
 * @class mailAddress
 * @description
 */
	mailAddress:function(){
		if(($("input[name$='MemberPCEMailBefore']").val()) && ($("input[name$='MemberPCEMailAfter']").val())){
			if($("input[name$='MemberPCEMailBefore']")){
				var mail = $("input[name$='MemberPCEMailBefore']").val()+"@"+$("input[name$='MemberPCEMailAfter']").val();
				this.mailAjax(mail, "MemberPCEMailBefore");
			}
		}

		if(($("input[name$='MemberMobileEMailBefore']").val()) && ($("input[name$='MemberMobileEMailAfter']").val())){
			if($("input[name$='MemberPCEMailBefore']")){
				var mail = $("input[name$='MemberPCEMailBefore']").val()+"@"+$("input[name$='MemberPCEMailAfter']").val();
				this.mailAjax(mail, "MemberMobileEMailBefore");
			}
		}
	},

/**
 * @class topErrDisplay
 * @description ページ上部のエラーメッセージ表示処理
 */
 	topErrDisplay:function(){
		var html = "";
		var topErr = false;

		$(DATA).each(function(i){
			if(i>0 && (DATA[i].msg != DATA[i-1].msg)){
				if(validation.topErrSetHTML(i))html += validation.topErrSetHTML(i);
			}else if(i==0){
				if(validation.topErrSetHTML(i))html += validation.topErrSetHTML(i);
			}
		});

		if(html){
			$(".alertBlock ul").html(html);
			$(".alertBlock").css("display", "block");
			this.click();
		}
	},

	topErrSetHTML:function(i){
		if(DATA[i].msg != "TRUE"){
			var tmp = TOPERR;

			$("input, textarea").each(function(j){
				var name = $(this).attr("name");
				if(name == DATA[i].name){
					var id = $(this).parent().parent().attr("id");
					tmp = tmp.replace("${id}", id);
				}
			});

			tmp = tmp.replace("${msg}", DATA[i].msg);
			return tmp;
		}
	},

/**
 * @class errDisplay
 * @description 各項目のエラーメッセージ表示処理
 */
 	errDisplay:function(label, elem){
		var login = $("body").hasClass("js-login");
		var pgsho05 = $("body").hasClass("js-pgsho05");
		var radioFlgArray = new Array(DATA.length);
		$(DATA).each(function(i){
			var exists = false;
			var count = 1;
			while((i - count) >= 0) {
				if (DATA[i].msg == DATA[i-count].msg) {
					exists = true;
					break;
				}
				count++;
			}

			if(i>0 && !exists){
				if(DATA[i].msg != "TRUE"){
					var name = DATA[i].name;
					var val = DATA[i].val;

					$(elem).find("input, select, textarea").each(function(){

						if($(this).attr("type")=="checkbox"){
							var txt;
							$(this).parent().children().each(function(){
								if($(this).attr("class") =="alert"){
									txt = $(this).text();
								}
							});

							if(name == $(this).attr("name") && txt != DATA[i].msg){
								var tmp = ERR;
								tmp = tmp.replace("${msg}", DATA[i].msg);
								var parent = $(this).parent();

								if(login){
									if(label == "postcode"){
										if(!($(parent).children("p").hasClass("alert"))){
											$(parent).after(tmp);
											$(".alert").css("marginTop", "5px");
										}
									}else{
										$(".js-submit").before(tmp);
									}
								}else{
									if(DATA[i].name == "MailMagazineFlag"){
										$(this).parents("tr").next().find("td:first").append(tmp);
										$(this).parents("tr").next().addClass("error")
									}else{
										if(label == "postcode"){
											if(!($(parent).children("p").hasClass("alert"))){
												$(parent).after(tmp);
												$(".alert").css("marginTop", "5px");
											}
										}else{
											$(parent).append(tmp);
										}
										$(parent).parent().addClass("error");
									}
								}
							}
						}else if($(this).attr("type")=="radio"){
							if(!(radioFlgArray[i]) && (name == $(this).attr("name"))){
								if(pgsho05){
									radioFlgArray[i] = true;

									if (typeof DATA[i].msg == "string") {
										$("#" + name + "error").append(ERR.replace("${msg}", DATA[i].msg));
									} else {
										$.each(DATA[i].msg, function(i, m) {
											$(m.selector).append($(ERR.replace("${msg}", m.message)).css(m.css || {}));
										});
									}
								}
							}
						}else{
							if(name == $(this).attr("name") && val == $(this).val()){
								var tmp = ERR;
								tmp = tmp.replace("${msg}", DATA[i].msg);
								var parent = $(this).parent();

								if(login){
									if(label == "postcode"){
										if(!($(parent).children("p").hasClass("alert"))){
											$(parent).after(tmp);
											$(".alert").css("marginTop", "5px");
										}
									}else{
										$(".js-submit").before(tmp);
									}
								}else{
									if(label == "postcode"){
										if(!($(parent).children("p").hasClass("alert"))){
											$(parent).after(tmp);
											$(".alert").css("marginTop", "5px");
										}
									}else{
										$(parent).append(tmp);
									}
									$(parent).parent().addClass("error");
								}

								if($("input[name$='MailMagazineFlag']").attr("checked")){
									/*
									if(name.indexOf("MemberPCEMail")>-1 || name.indexOf("MemberMobileEMail")>-1){
										$(".formBlock .js-mail").addClass("error");
									}
									*/

									if(!($(".js-pc").attr("checked")) && !($(".js-mobile").attr("checked"))){
										$(".formBlock .js-mail").addClass("error");
									}
								}
							}
						}
					});
				}
			}else if(i==0){
				if(DATA[i].msg != "TRUE"){
					var name = DATA[i].name;
					var val = DATA[i].val;

					$(elem).find("input, textarea").each(function(){
						if($(this).attr("type")=="text" || $(this).attr("type")=="password"){
							if(name == $(this).attr("name") && val == $(this).val()){
								var tmp = ERR;
								tmp = tmp.replace("${msg}", DATA[i].msg);

								var parent = $(this).parent();

								if(login){
									var item = $(this).attr("class");

									if(label == "postcode"){
										if(!($(parent).children("p").hasClass("alert"))){
											$(parent).next().append(tmp);
											$(".alert").css("marginTop", "5px");
										}
									}else{
										$(".js-submit").before(tmp);
									}
								}else{
									if(label == "postcode"){
										if(!($(parent).children("p").hasClass("alert"))){
											$(parent).after(tmp);
											$(".alert").css("marginTop", "5px");
										}

									}else{
										$(parent).append(tmp);
									}
									$(parent).parent().addClass("error");
								}

								if(name.indexOf("MemberPCEMail")>-1 || name.indexOf("MemberMobileEMail")>-1){
									$(".formBlock .js-mail").addClass("error");
								}
							}
						}else if($(this).attr("type")=="checkbox"){
							var txt;
							$(this).parent().children().each(function(){
								if($(this).attr("class") =="alert"){
									txt = $(this).text();
								}
							});

							if(name == $(this).attr("name") && txt != DATA[i].msg){
								var tmp = ERR;
								tmp = tmp.replace("${msg}", DATA[i].msg);
								var parent = $(this).parent();

								if(login){
									if(label == "postcode"){
										if(!($(parent).children("p").hasClass("alert"))){
											$(parent).after(tmp);
											$(".alert").css("marginTop", "5px");
										}
									}else{
										$(".js-submit").before(tmp);
									}
								}else{
									if(label == "postcode"){
										if(!($(parent).children("p").hasClass("alert"))){
											$(parent).after(tmp);
											$(".alert").css("marginTop", "5px");
										}
									}else{
										$(parent).append(tmp);
									}
									$(parent).parent().addClass("error");
								}
							}
						}else{
							if($(this).attr("type")!="radio" && $(this).attr("type")!="image"){
								if(name == $(this).attr("name")){
									var tmp = ERR;
									tmp = tmp.replace("${msg}", DATA[i].msg);
									var parent = $(this).parent();
									$(parent).append(tmp);
									$(parent).parent().addClass("error");
								}
							}else if($(this).attr("type") == "radio"){
								if(!(radioFlgArray[i]) && (name == $(this).attr("name"))){
									if(pgsho05){
										radioFlgArray[i] = true;

										if (typeof DATA[i].msg == "string") {
											$("#" + name + "error").append(ERR.replace("${msg}", DATA[i].msg));
										} else {
											$.each(DATA[i].msg, function(i, m) {
												$(m.selector).append($(ERR.replace("${msg}", m.message)).css(m.css || {}));
											});
										}
									}
								}
							}
						}
					});
				}
			}
		});

		$(".alert").css("display", "block");
	},

	setFocus:function(){
		var y = $(".alertBlock").offset().top;
		$('html,body').animate({scrollTop: y}, "slow");
	},

	setID:function(){
		$(".formBlock tr").each(function(i){
			var id = "item"+i;
			$(this).attr("id", id);
		});
	},

/**
 * @class confirmCheck
 * @description 再入力値チェック
 */
	confirmCheck:function(name, val){
		var name1 = name.slice(0, name.indexOf("Confirm"));

		$("input").each(function(j){
			var n = $(this).attr("name");
			if(n == name1){
				val1 = $(this).val();
			}
		});

		var obj = new Object();

		if(val1 != val){
			obj.name = name;
			obj.val = val;

			$(requiredArray).each(function(i){
				if(name == requiredArray[i].name){
					obj.msg = requiredArray[i].msg2;
				}

				if(!(obj.msg)){
					$(requiredArray[i].child).each(function(j){
						if(name == requiredArray[i].child[j].name){
							obj.msg = requiredArray[i].child[j].msg2;
						}
					});
				}
			});

			validation.addDATA(obj);
		}
	},

/**
 * @class addDATA
 * @description エラー情報を配列設定
 */
 	addDATA:function(obj){
		var nameCheck = false;

		$(DATA).each(function(i){
			if(DATA[i].name == obj.name){
				nameCheck = true;
			}
		});

		if(!(nameCheck))DATA.push(obj);
	},

/**
 * @class sortDATA
 * @description エラー情報並び替え
 */
 	sortDATA:function(){
		var tmp = new Array();
		var tmp2 = new Array();

		tmp = DATA;


		$("input, select, textarea").each(function(i){
			var name = $(this).attr("name");

			$(tmp).each(function(j){
				if(name == tmp[j].name){
					tmp2.push(tmp[j]);
				}
			});
		});

		DATA.length = 0;
		DATA = tmp2;
	}
}

var validation = new checkFormValidation();

$(document).ready(function(){
	validation.initialize();
});

