'use strict'; $.fn.formValidate = function() { var thisSelector = this.selector; var _this = this; var formInputs = thisSelector+' .input_validate input, '+thisSelector+' .input_validate select'; var events = { beforeSubmit : function() { checkSubmit(); } } // on input change $(document).on('blur keyup change', formInputs, function(data){ checkInput($(this)); }); // on form submit var formChecked = false; var isSubmitted = false; _this.find('input[type="submit"]:first-child').on('click', function(e) { if($(this).val() != '予約削除')  { if(formChecked == false) { e.preventDefault(); } events.beforeSubmit(function(){ checkSubmit() }); } }); function checkSubmit() { var error = checkAllInputs(formInputs); _state.error = error; console.log('before submit'); if(error > 0 || isSubmitted == true) { // error console.log('error'); } else { formChecked = true; isSubmitted = true; console.log('trigger submit'); _this.find('input[type="submit"]:first-child').trigger('click'); } } var checkForm = function() { var error = checkAllInputs(formInputs); _state.error = error; return false; } return { checkForm : checkForm, events : events }; }; //////////////////////////////////////////// // helper functions //////////////////////////////////////////// var firstChild,inputs,inputError; // checks all the inputs in the form function checkAllInputs(formInputs) { firstChild = ''; var error = 0; $.each($(formInputs), function(i){ if($(this).is(':visible')) { inputs = checkInput($(this)); inputError = inputs.error; } if(!firstChild && inputError) { firstChild = $(this); } error += inputError; }); if(error > 0) { $("html,body").animate({scrollTop: firstChild.parents('.input_validate').offset().top - 200}); } return error; } // checks input content var error_msg,error,match; function checkInput(input) { //console.log($('input[name="ご予約日時"]:checked').val()); var val = input.val(); var isRequired = input.attr('required'); var inputName = input.attr('name'); var alertName = ''; var validateName = input.parents('.input_validate').data('validate-name'); if(validateName) { alertName = validateName; } var type = (input.data('type') ? input.data('type') : input.attr('type')); var error = 0; error_msg = ''; //match = /^(?:[ぁ-ん゛゜ゝゞーむ]+)*$/; if(isRequired && val.trim() == ''){ error_msg = '入力欄にご入力ください'; error++; } var returnError = input.parents('.input_validate'); var alertError = input.parents('.input_validate').find('.alert_text'); switch(type) { case 'checkbox': case 'radio': var isChecked = $('input[name="'+inputName+'"]').is(':checked'); if(!alertName) { alertName = '項目をチェックしてください'; } //returnError = input.parents('.input_validate'); if(!isChecked) { error_msg = alertName; error++; } break; case 'hira': if(!val.match(match)){ error_msg = 'ひらがな以外の文字は使用できません'; error++; } break; case 'kana': match = /^(?:[ァ-ヾ\s ]+)*$/; if(!val.match(match)){ error_msg = '全角カタカナ以外の文字は使用できません'; error++; } break; case 'email': match = /^(?:[^\@]+?@[A-Za-z0-9_\.\-]+\.+[A-Za-z\.\-\_]+)*$/; if(!val.match(match)){ error_msg = '正しいメールアドレスの形式を入力してください'; error++; } var emailConfirm = input.data('email-confirm'); if(emailConfirm) { var origVal = $('input[name="'+emailConfirm+'"]').val(); if(origVal != val) { error_msg = '正しいメールアドレスの形式を入力してください'; error++; } } break; case 'num' : match = /^\d+$/; if(!val.match(match)) { error_msg = '正しい'+alertName+'を入力してください'; error++; } break; case 'month' : match = /^\d+$/; if(!val.match(match) || (val > 12 || val <= 0)) { error_msg = '正しい'+inputName+'を入力してください'; error++; } break; case 'day' : match = /^\d+$/; if(!val.match(match) || (val > 31 || val <= 0)) { error_msg = '正しい'+inputName+'を入力してください'; error++; } break; case 'tel': match = /^(?:[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$|^[0-9]{7,12})*$/; if(!val.match(match)){ error_msg = '正しく電話番号を入力してください'; error++; } break; case 'select' : if(isRequired && val.trim() == ''){ error_msg = inputName+'を選択してください'; error++; } break; } // console.log(error); if(error) { returnError.addClass('input_error'); alertError.html(error_msg); //error_msg = ''+error_msg+''; } else { returnError.removeClass('input_error'); alertError.html(''); } return { error : error, errorMsg : error_msg }; }