PageSourceSearch

https://www.ange-sourire.com/js/form-contact.js

js ange-sourire.com collected 2026-10-05 11:16:29 UTC 14,223 bytes, 405 lines download raw bytes

1function validateForm() {
2  $.datetimepicker.setLocale('ja');
3  let ja = {
4    ja:{
5      months:[
6        "1月",
7        "2月",
8        "3月",
9        "4月",
10        "5月",
11        "6月",
12        "7月",
13        "8月",
14        "9月",
15        "10月",
16        "11月",
17        "12月",
18      ],
19      dayOfWeek:[
20        "日曜日",
21        "月曜日",
22        "火曜日",
23        "水曜日",
24        "木曜日",
25        "金曜日",
26        "土曜日"
27      ]
28    }
29  }
30
31  $( ".datepicker" ).datetimepicker({
32    timepicker:false,
33    format: 'Y/m/d(D)',
34    scrollMonth : false,
35    scrollInput : false
36  });
37
38  $( ".datetimepicker").datetimepicker({
39    scrollMonth : false,
40    scrollInput : false,
41    format: 'Y/m/d H:i(D)',
42    step: 30
43  });
44
45  $.validator.addMethod('filesize', function (value, element, param) {
46    let rightSize = true;
47    let validFileTypes = ["image/gif", "image/jpeg", "image/jpg", "image/png", "application/pdf"];
48    const inputKey = element.name || element.id;
49    const form = $(element).closest('.formContact');
50    const allFileData = form.data("fileData") || {};
51    const files = (allFileData[inputKey] || new FormData()).getAll("files[]") || [];
52
53    for (let i=0; i<files.length; i++) {
54      if (files[i].size > param.size) rightSize = false;
55      if (validFileTypes.indexOf(files[i].type) == -1) rightSize = false;
56    }
57    return this.optional(element) || (rightSize)
58  }, '3MB以下の画像やPDFファイルを選択してください。');
59
60  $.validator.addMethod(
61      "email",
62      function(value, element, param) {
63        var re = new RegExp(param.regexp);
64        return this.optional(element) || re.test(value);
65      },
66      (param) => {return `${param.name}の形式が正しくありません。`});
67
68  $.validator.addMethod(
69      "postal_code",
70      function(value, element, param) {
71        var re = new RegExp(param.regexp);
72        return this.optional(element) || re.test(value);
73      },
74      (param) => {return `${param.name}の形式が正しくありません。`});
75
76  const formIds = Array.from($('.form-id'))
77  formIds.forEach((item, index) => {
78    const rulesData = $(`#${item.textContent}`).data('rules')
79    const messagesData = $(`#${item.textContent}`).data('messages')
80    $(`#${item.textContent}`).validate({
81      errorElement: 'p',
82      onfocusout: false,
83      onkeyup: false,
84      onclick: false,
85      ignore: [],
86      rules: rulesData,
87      messages: messagesData,
88      errorPlacement: function(error, element) {
89        element.closest('dd').find('.errors').text(error[0].innerHTML)
90      },
91      focusInvalid: false,
92    });
93  });
94}
95validateForm();
96
97$('body').on('click', '.formContact .confirm-contact', function() {
98  let this_form = $(this).closest('.formContact');
99  change_to_confirm(this_form);
100});
101
102$('body').on('keypress', `.formContact input[type=text]`, function(e) {
103  if(e.keyCode === 13) {
104    let this_form = $(this).closest('.formContact');
105    change_to_confirm(this_form);
106    return false;
107  }
108});
109
110function change_to_confirm(this_form) {
111  if(this_form.valid()){
112    this_form.prepend('<div class="wrapper_item"><div class="inner_item_txt"><p>入力内容をご確認の上、『送信する』ボタンを押してください。</p></div></div>');
113    $('section.widget_form.block_form').not(this_form.closest('section')).addClass('hidden-in-contact');
114    this_form.find(`.btn-in-form`).addClass('hidden-in-contact');
115    this_form.find(`.btn-in-confirm`).removeClass('hidden-in-contact');
116    this_form.siblings().addClass('hidden-in-contact');
117    this_form.find(`dd p`).addClass('hidden-in-contact');
118    $('.errors').text('')
119    this_form.find(":input:text, select").each(function() {
120      let val = $(this).val()
121      if(val == null){
122        val = ''
123      }
124      $(this).addClass('hidden-in-contact').after($("<span></span>").text(val.replace(/\r\n|\r|\n/g,"<br>")));
125    });
126    this_form.find("textarea").each(function() {
127      let val = $(this).val().replace(/\r\n|\r|\n/g,"<br>")
128      $(this).addClass('hidden-in-contact').after($("<span></span>").html(val));
129    });
130    this_form.find(":input:checkbox, :input:radio").each(function() {
131      $(this).addClass('hidden-in-contact')
132      $(this).next("label").addClass('hidden-in-contact')
133      if($(this).is(":checked")){
134        $(this).next("label").after($('<span style="margin-right: 35px;"></span').text( $(this).next("label").text()));
135      }
136    });
137    this_form.find(":input:file").each(function() {
138      $(this).addClass('hidden-in-contact');
139      $(this).next('.file-list').addClass('hidden-in-contact');
140
141      let validImageTypes = ["image/gif", "image/jpeg", "image/jpg", "image/png"];
142      const inputKey = this.name || this.id;
143      let allFileLists = this_form.data("fileList") || {};
144      let files = allFileLists[inputKey] || [];
145
146      if(files.length > 0) {
147        for (let i = files.length - 1; i >= 0; i--) {
148          let file = files[i];
149          let fileType = file["type"];
150          let filename = file["name"];
151          let extension = filename.split('.')[1];
152          if($.inArray(fileType, validImageTypes) > 0) {
153            $(this).after('<img id="output" src=' + window.URL.createObjectURL(file) +' /></br>' + '<span>' + filename + '</span></br>');
154          } else if (extension == 'pdf'){
155            $(this).after('<span>' + filename + '</span></br>');
156          }
157        }
158      }
159    });
160  }
161  else {
162    let inputs = Array.from(this_form[0].getElementsByTagName('input')).concat(Array.from(this_form[0].getElementsByTagName('textarea')))
163    inputs.forEach(item => {
164      if($(item).valid()) {
165        $(item).closest('dd').find('.errors').text('')
166      }
167    })
168  }
169}
170
171$('body').on('click', '.formContact .back-contact', function() {
172  let this_form = $(this).closest('.formContact')
173  $('section.widget_form.block_form').not(this_form.closest('section')).removeClass('hidden-in-contact');
174  this_form.find(`.btn-in-confirm`).addClass('hidden-in-contact');
175  this_form.find(`.btn-in-form`).removeClass('hidden-in-contact');
176  this_form.siblings().removeClass('hidden-in-contact');
177  this_form.find('div:first').remove();
178  this_form.find(`dd p`).removeClass('hidden-in-contact');
179  this_form.find(":input:text, select, textarea").each(function() {
180    $(this).removeClass('hidden-in-contact').nextAll().not(`.errors`).not(this_form.find(`dd p`)).remove();
181  });
182  this_form.find(":input:checkbox, :input:radio").each(function() {
183    $(this).removeClass('hidden-in-contact')
184    $(this).next("label").removeClass('hidden-in-contact')
185    if($(this).is(":checked")){
186      $(this).next("label").next().remove();
187    }
188  });
189  this_form.find(":input:file").each(function() {
190    $(this).removeClass('hidden-in-contact').nextAll().not('.errors').not('.file-list').remove();
191    $(this).next('.file-list').removeClass('hidden-in-contact');
192  });
193});
194
195$("body").on('change', '.formContact :input:file', function(e) {
196  let files = e.target.files;
197  let inputField = $(this);
198  let inputKey = this.name || this.id;
199  let form = inputField.closest('.formContact');
200
201  let allFileData = form.data("fileData") || {};
202  let allFileLists = form.data("fileList") || {};
203
204  let fileData = allFileData[inputKey] || new FormData();
205  let fileList = allFileLists[inputKey] || [];
206
207  for (let i = 0; i < files.length; i++) {
208    fileData.append("files[]", files[i]);
209    fileList.push(files[i]);
210  }
211
212  allFileData[inputKey] = fileData;
213  allFileLists[inputKey] = fileList;
214
215  form.data("fileData", allFileData);
216  form.data("fileList", allFileLists);
217
218  renderFileList(inputField);
219});
220
221function renderFileList(inputField) {
222  let fileDisplayArea = inputField.next(".file-list");
223  
224  if (fileDisplayArea.length === 0) {
225    fileDisplayArea = $("<div class='file-list'></div>");
226    inputField.after(fileDisplayArea);
227  }
228
229  let form = inputField.closest('.formContact');
230  let inputKey = inputField.attr('name') || inputField.attr('id');
231  let allFileLists = form.data("fileList") || {};
232  let fileList = allFileLists[inputKey] || [];
233  fileDisplayArea.empty();
234
235  fileList.forEach((file, index) => {
236    let fileItem = $(`
237      <div class="file-item" data-index="${index}" data-input-key="${inputKey}">
238        <span>${file.name}</span>
239        <a href="javascript:void(0);" class="remove-file" data-index="${index}" data-input-key="${inputKey}"><i class="fas fa-trash-alt"></i></a>
240      </div>
241    `);
242    fileDisplayArea.append(fileItem);
243  });
244}
245
246$("body").on("click", ".formContact .remove-file", function() {
247  let index = $(this).data("index");
248  let form = $(this).closest('.formContact');
249  let inputKey = $(this).data("input-key");
250
251  let allFileLists = form.data("fileList") || {};
252  let allFileData = form.data("fileData") || {};
253
254  let fileList = allFileLists[inputKey] || [];
255  fileList.splice(index, 1);
256
257  let fileData = new FormData();
258  fileList.forEach(file => fileData.append("files[]", file));
259
260  allFileLists[inputKey] = fileList;
261  allFileData[inputKey] = fileData;
262
263  form.data("fileData", allFileData);
264  form.data("fileList", allFileLists);
265
266  let targetInput = form.find(`:input:file[name="${inputKey}"], :input:file[id="${inputKey}"]`);
267  if (fileList.length === 0) {
268    targetInput.val('');
269  }
270  renderFileList(targetInput);
271});
272
273
274$( "body").on('submit', '.formContact', function(e) {
275  e.preventDefault()
276  let form_this = $(this);
277  const form = this.closest("form")
278  const contactDetailIds = form.getAttribute('data-contact-detail-ids').split(',')
279  const contactId = form.getAttribute('data-contact_id')
280  const idString = form.getAttribute('data-id_string')
281  const grv3_secretkey = form_this.data('grv3_secretkey')
282  const grv3_sitekey = form_this.data('grv3_sitekey')
283  const contactDetails = form.getAttribute('data-contact-details')
284  var tag4 = $('#client-info').attr("data-client-tag4");
285  var tag5 = $('#client-info').attr("data-client-tag5");
286  var conversion_tag2 = form_this.find(".conversion_tag2").text()
287  var formData = new FormData();
288  formData.append("contact_id", contactId)
289  formData.append("id_string", idString)
290  formData.append("contact_details", JSON.stringify(contactDetails))
291  contactDetailIds.map((item) => {
292    if(item.name != "") {
293      formData.append("contact_details_ids[]", item)
294      const inputs = form_this.find("[data-contact-detail-id='" + item + "'], [data-contact-detail-id='" + item + "[]']");
295      if(inputs.length == 1) {
296        if(inputs[0].getAttribute('type') === 'file') {
297          const inputKey = inputs[0].name || inputs[0].id;
298          const allFileData = form_this.data("fileData") || {};
299          let files = (allFileData[inputKey] || new FormData()).getAll("files[]") || [];
300
301          for (let i = 0; i < files.length; i++)
302            formData.append(item + "[]", files[i])
303        } else {
304          if(inputs[0].type === 'checkbox' || inputs[0].type === 'radio') {
305            const lable = $(inputs[0]).next('label')
306            let val = ''
307            if($(inputs[0]).is(":checked")) {
308              val = lable.text()
309            }
310            formData.append(item, val)
311          }
312          else {
313            formData.append(item, inputs[0].value)
314          }
315        }
316      }
317      else {
318        formData.append(item, inputValue(inputs))
319      }
320    }
321  })
322  if(grv3_secretkey != "" && grv3_sitekey != "") {
323    grecaptcha.ready(function() {
324      grecaptcha.execute(grv3_sitekey, {action: 'submit'}).then(function(token) {
325        formData.append("g-token", token)
326        submitForm(form, form_this, tag4, tag5, conversion_tag2, formData)
327      });
328    });
329  }
330  else {
331    submitForm(form, form_this, tag4, tag5, conversion_tag2, formData)
332  }
333});
334
335function submitForm(form, form_this, tag4, tag5, conversion_tag2, formData) {
336  let request = new XMLHttpRequest();
337  request.open("POST", form.getAttribute('data-api'));
338  request.onload = function() {
339    if (request.status == 201) {
340      let data = $.parseJSON(request.response)
341      const inner_item_txt = form_this.siblings('.inner_item_txt')
342      inner_item_txt.removeClass('hidden-in-contact').append("<p class='done_message pre-wrap'></p><p class='conversion_tag pre-wrap'></p><p class='conversion_tag2 pre-wrap'></p>");
343      inner_item_txt.find('p').text('')
344      inner_item_txt.find('.done_message').text(data['done_message'])
345      inner_item_txt.find('.conversion_tag').text(data['conversion_tag'])
346      if(conversion_tag2.length > 0) {
347        inner_item_txt.find('.conversion_tag2').text(conversion_tag2)
348      }
349      form_this.siblings('.inner_item_txt').nextAll().addClass('hidden-in-contact');
350      $('body').prepend(tag4);
351      $('body').append(tag5);
352    }
353  }
354  request.send(formData);
355}
356
357$("body").on('change', '.postal_code', function(e) {
358  var addressElement = this.closest("form").getElementsByClassName("address")[0]
359  $.ajax({
360    url: `https://postal-codes-jp.azurewebsites.net/api/PostalCodes/${this.value}`,
361    type: "GET",
362    dataType: 'json',
363    success: function(data) {
364      const address = data[0].city.pref.name + data[0].city.name + data[0].name
365      addressElement.value = address
366    }
367  })
368});
369
370function inputValue(inputs) {
371  let value = ""
372  const checkedInputs = Array.from(inputs).filter(item => item.checked)
373  if(checkedInputs.length < 1) {
374    return value
375  }
376
377  if(checkedInputs.length == 1) {
378    value = checkedInputs[0].value
379    return value
380  }
381  value = []
382  checkedInputs.forEach(item => {
383    value.push(item.value)
384  })
385  return value.join(',')
386}
387
388var TERM_LOCKED_MESSAGE = '利用規約をご確認のうえ、同意にチェックを入れてください。';
389
390$(function () {
391  $('.confirmation-checkbox.locked').prop('checked', false);
392});
393
394$('body').on('click auxclick', 'a.term-link', function (e) {
395  if (e.type === 'auxclick' && e.button !== 1) return;
396  var $dd = $(this).closest('dd');
397  $dd.find('.confirmation-checkbox').removeClass('locked');
398  var $errors = $dd.find('.errors');
399  if ($errors.text() === TERM_LOCKED_MESSAGE) $errors.text('');
400});
401
402$('body').on('change', '.confirmation-checkbox.locked', function () {
403  $(this).prop('checked', false);
404  $(this).closest('dd').find('.errors').text(TERM_LOCKED_MESSAGE);
405});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.