var thisForm = null;
var form_err = new Array();
var form_state;
var arr_pref = [
	'北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県',
	'茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県',
	'新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県',
	'静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県',
	'奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県',
	'徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県',
	'熊本県','大分県','宮崎県','鹿児島県','沖縄県'
];

$(function() {
	form_state = "input";
	$('form').formtips();
	$('select.prefecture').each(function(){
		var option = "";
		option += '<option value="">(選択)</option>';
		for (i=0; i<arr_pref.length; i++) {
			option += '<option value="' + arr_pref[i] + '">' + arr_pref[i] + '</option>';
		}
		$(this).html(option);
	});
	$('#empty_alert').hide();
	//$('form :input').blur(form_check);  // $('form input, select, textarea')
	$('#btn_next').click(form_next);
	$('#btn_back').click(form_back);
});

function form_check () {
	// エラー初期化
	form_err = new Array();
	$('div.alertmsg, span.alertmsg').remove();
	$('#empty_alert').hide();

	// 入力チェック(フォーム毎別)
	if ('function' === typeof input_check) {
		input_check();
	}

	if (form_err.length > 0) {
		$('#empty_alert').html('<div class="title">ご入力いただいていない必須項目があります</div>' + form_err.join('&nbsp;&nbsp;')).show();
		$('#empty_alert').show();
		return false;
	}

	return true;
}

function form_next () {
	switch (form_state) {
		case "input":
			if (form_check() == false) {
				$('#empty_alert').hide();
				$('#empty_alert').fadeIn(1000);
				return false;
			}
			if ($('#form_agreement').attr('checked') == false) {
				alert('個人情報の利用目的をご確認頂き\n同意するにチェックをしてください。');
				$(window).scroll(0,200);
				return false;
			}
			clear_formtips();	// 入力例チップをクリア
			confirm_mode();		// 確認モードへ移行
			form_state = "confirm";
			break;

		case "confirm":
			if ($('#form_agreement').attr('checked') == false) {
				alert('個人情報の利用目的をご確認頂き\n同意するにチェックをしてください。');
				$(window).scroll(0,200);
				return false;
			}
			if ($('input[name="send"]', 'form').size() == 0) {
				$('form').append('<input type="hidden" name="send" value="enter" />');
			}
			jQuery.postJSON($('form').attr('action'), $(':input', 'form').serializeArray(), function(data) {
				if (data.state == 'ok') {
					//location.href = 'thanks.html';
					$('form').load('thanks.html');
				} else if (data.state == 'err' && data.msg) {
					$('#empty_alert').html('<div class="title">' + data.msg + '</div>').show();
				} else {
					$('#empty_alert').html('<div class="title">送信に失敗しました</div>').show();
				}
			});
			break;

	}
}



function form_back () {
	switch (form_state) {
		case "input":
			if (confirm('お問い合わせ内容をリセット致します。') == true) {
				location.href = location.href;
			}
			break;

		case "confirm":
			input_mode();		// 入力モードへ移行
			form_state = "input";
			break;
	}
}

function alertMsg (name, message, tagname) {
	if (!tagname) tagname = "div";
	if (objModel[name] != null) {
		form_err.push('<label>' + objModel[name] + '</label>');
	}
	$(':input[name="' + name + '"]').after('<' + tagname + ' class="alertmsg">' + message + '</' + tagname + '>');
}

function get_errmsg (type) {
	switch (type) {
		case "Equal": return "同じものを入力してください";
		case "Empty": return "必須項目です";
		case "OneEmpty": return "どちらかを入力してください";
		case "Num":   return "半角数値のみ有効です";
		case "Eisu":  return "半角英数のみ有効です";
		case "Kana":  return "全角カタカナのみ有効です";
		case "Zip":   return "郵便番号をご確認ください";
		case "Phone": return "番号をご確認ください";
		case "Mail":  return "アドレスをご確認ください";
	}
}

function clear_formtips () {
	// untip 'em
	$('.tipped', 'form').each(function() {
		var elem = $(this);
		var val = $(this).attr('title');
		if($(elem).val() == val) {
			$(elem).val('').removeClass('tipped');
		}
	});
}

function set_formtips () {
	// untip 'em
	$('.tipped', 'form').each(function() {
		var elem = $(this);
		var lv = $(this).attr('title');
		if($(elem).is('textarea')) {
			if($(elem).text() == lv) {
				$(elem).text('').removeClass('tipped');
			}
		} else {
			if($(elem).val() == lv) {
				$(elem).val('').removeClass('tipped');
			}
		}
	});
}

function input_mode () {
	$('.caution').show();
	$('span.form_val').remove();

	// テキストボックス･テキストエリア･セレクトボックス
	jQuery.each ( $('input:text, textarea, select', 'form'), function () {
		$(this).show();
	});

	// ラジオボタン
	jQuery.each ( $('div.radiogroup', 'form'), function () {
		$(this).show();
	});

	// チェックボックス
	jQuery.each ( $('div.checkgroup', 'form'), function () {
		$(this).show();
	});

	// 送信・リセットボタン
	$('#btn_next').attr('src', $('#btn_next').attr('src').replace('btn_form_send', 'btn_form_confirm'));
	$('#btn_back').attr('src', $('#btn_back').attr('src').replace('btn_form_back', 'btn_form_reset'));
}

function confirm_mode () {
	$('.caution').hide();

	// テキストボックス･テキストエリア･セレクトボックス
	jQuery.each ( $('input:text, select', 'form'), function () {
		$(this).after('<span class="form_val">' + $(this).val() + '</span>');
		$(this).hide();
	});

	// テキストエリア
	jQuery.each ( $('textarea', 'form'), function () {
		$(this).after('<span class="form_val">' + $(this).val().replace(/\r\n/g, "<br />").replace(/(\n|\r)/g, "<br />") + '</span>');
		$(this).hide();
	});

	// ラジオボタン
	jQuery.each ( $('div.radiogroup', 'form'), function () {
		$(this).after('<span class="form_val">' + $('input:radio:checked', this).val() + '</span>');
		$(this).hide();
	});

	// チェックボックス
	jQuery.each ( $('div.checkgroup', 'form'), function () {
		var checked = $('input:checkbox:checked', this).map( function() { return this.value; }).get();
		$(this).after('<span class="form_val">' + checked.join('/') + '</span>');
		$(this).hide();
	});

	// 送信・リセットボタン
	$('#btn_next').attr('src', $('#btn_next').attr('src').replace('btn_form_confirm', 'btn_form_send'));
	$('#btn_back').attr('src', $('#btn_back').attr('src').replace('btn_form_reset', 'btn_form_back'));
}

jQuery.postJSON = function(url, data, callback) {
	jQuery.post(url, data, callback, "json");
};

var Validate = function () {
	/*--------------------------------------------------------------------------*/
	this.isEqual = function(name1, name2){
		if($(':input[name="'+ name1 +'"]').val() == $(':input[name="'+ name2 +'"]').val()) return true;
		else return false;
	};
	/*--------------------------------------------------------------------------*/
	this.hasValidChars = function(name, characters, caseSensitive){
		var s = $(':input[name="'+ name +'"]').val();
		function escapeSpecials(s){
			return s.replace(new RegExp("([\\\\-])", "g"), "\\$1");
		}
		return new RegExp("^[" + escapeSpecials(characters) + "]+$",(!caseSensitive ? "i" : "")).test(s);
	};
	/*--------------------------------------------------------------------------*/
	this.isEisu = function(name){
		var string = $(':input[name="'+ name +'"]').val();
		alphaRegExp = /^[0-9a-z]+$/i
		return alphaRegExp.test(string);
	};
	/*--------------------------------------------------------------------------*/
	this.isNotEmpty = function (name){
		var string = $(':input[name="'+ name +'"]').val();
		return /\S/.test(string);
	};
	/*--------------------------------------------------------------------------*/
	this.isEmpty = function(name){
		var string = $(':input[name="'+ name +'"]').val();
		return !/\S/.test(string);
	};
	/*--------------------------------------------------------------------------*/
	this.isTitle = function(name){
		if($(':input[name="'+ name +'"]').val() == $(':input[name="'+ name +'"]').attr('title')) return true;
		else return false;
	};
	/*--------------------------------------------------------------------------*/
	this.isIntegerInRange = function(name,Nmin,Nmax){
		var n = $(':input[name="'+ name +'"]').val();
		var num = Number(n);
		if(isNaN(num)){
			return false;
		}
		if(num != Math.round(num)){
			return false;
		}
		return (num >= Nmin && num <= Nmax);
	};
	/*--------------------------------------------------------------------------*/
	this.isKana = function(name){
		var string = $(':input[name="'+ name +'"]').val();
		return string.match(/^[ァ-ヶー]*$/)
	};
	/*--------------------------------------------------------------------------*/
	this.isNum = function(name){
		var number = $(':input[name="'+ name +'"]').val();
		numRegExp = /^[0-9]+$/
		return numRegExp.test(number);
	};
	/*--------------------------------------------------------------------------*/
	this.isMail = function(name){
		var string = $(':input[name="'+ name +'"]').val();
		emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
		return emailRegExp.test(string);
	};
	/*--------------------------------------------------------------------------*/
	this.isZip = function(name1 ,name2){
		if (name2 != undefined) {
			var zipcode = $(':input[name="'+ name1 +'"]').val() + "-" + $(':input[name="'+ name2 +'"]').val();
		} else {
			var zipcode = $(':input[name="'+ name1 +'"]').val();
		}
		if(!zipcode) return false;
		return /^\d{3}-\d{4}$/.test(zipcode);
	};
	/*--------------------------------------------------------------------------*/
	this.isPhone = function(name1 ,name2, name3){
		if (name2 != undefined && name3 != undefined) {
			var phone = $(':input[name="'+ name1 +'"]').val() + "-" + $(':input[name="'+ name2 +'"]').val() + "-" + $(':input[name="'+ name3 +'"]').val();
		} else {
			var phone = $(':input[name="'+ name1 +'"]').val();
		}
		if(!phone) return false;
		return /^\d{2,4}-\d{2,4}-\d{4}$/.test(phone);
	};
	/*--------------------------------------------------------------------------*/
	this.isDate = function(date){
		if(!date) return false;
		return /\d{4}\/([0]\d|[1][0-2])\/^([0-2]\d|[3][0-1])$/.test(date);
	};
	/*--------------------------------------------------------------------------*/
	this.isURL = function(name){
		var string = $(':input[name="'+ name +'"]').val();
		if(!string) return false;
		var string = string.toLowerCase();
		urlRegExp = /^(((ht|f)tp(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/
		return urlRegExp.test(string);
	};
	/*--------------------------------------------------------------------------*/
	this.isDecimal = function(name){// positive or negative decimal
		number = $(':input[name="'+ name +'"]').val();
		if(!number) return false;
		decimalRegExp = /^-?(0|[1-9]{1}\d{0,})(\.(\d{1}\d{0,}))?$/
		return decimalRegExp.test(number);
	};
	/*--------------------------------------------------------------------------*/
};

