PageSourceSearch

https://tamayaab.com/base/js/opc/Utils.js?cacheKey=202609c

js tamayaab.com collected 2026-10-09 23:28:00 UTC 14,561 bytes, 572 lines download raw bytes

1/**
2 * ローディング表示開始
3 */
4var startLoading = function (cancelable) {
5  if (Sys('#sysOpcLoading').length !== 0) {
6    return;
7  }
8
9  var loadingMessage = '';
10  if (typeof cancelable === 'undefined' || cancelable) {
11    loadingMessage = '<div id="sysOpcLoading"><div id="sysOpcLoadingMessage">処理中...<button id="loadingCancelBtn">キャンセル</button></div></div>'
12  } else {
13    loadingMessage = '<div id="sysOpcLoading"><div id="sysOpcLoadingMessage">処理中...</div></div>'
14  }
15
16  Sys('body').append(loadingMessage);
17
18  Sys('#loadingCancelBtn').click(function () {
19    Sys('#sysOpcLoading').remove()
20  });
21};
22
23/**
24 * ローディング表示終了
25 */
26var endLoading = function () {
27  Sys('#sysOpcLoading').remove();
28};
29
30/**
31* 不正状態の項目(Observable)のリストを取得する
32* @param viewModel バリデーション対象VM
33*/
34var getIllegalObservables = function (viewModel) {
35  var result = [];
36  var validateTargetObservables = viewModel.getValidateTargetObservables();
37
38  for (index in validateTargetObservables) {
39    var validateTargetObservable = validateTargetObservables[index];
40
41    //エラー有り、または、入力残
42    if (validateTargetObservable.validator.hasError() || validateTargetObservable.validator.needToInput()) {
43      result.push(validateTargetObservable);
44    }
45  }
46
47  return result;
48};
49
50/**
51* エラー状態の項目(Observable)のリストを取得する
52* @param viewModel バリデーション対象VM
53*/
54var getErrorObservables = function (viewModel) {
55  var result = [];
56  var validateTargetObservables = viewModel.getValidateTargetObservables();
57
58  for (index in validateTargetObservables) {
59    if (validateTargetObservables[index].validator.hasError()) {
60      result.push(validateTargetObservables[index]);
61    }
62  }
63
64  return result;
65};
66
67/**
68* エラー状態の項目(Observable)のリストを取得する
69* @param viewModel バリデーション対象VM
70*/
71var getRequiredObservables = function (viewModel) {
72  var result = [];
73  var validateTargetObservables = viewModel.getValidateTargetObservables();
74  for (index in validateTargetObservables) {
75    if (validateTargetObservables[index].validator.needToInput()) {
76      result.push(validateTargetObservables[index]);
77    }
78  }
79
80  return result;
81};
82
83/**
84* 全てのバリデーション対象に対して送信前チェックを行う
85* @param viewModel バリデーション対象VM
86*/
87var checkOnComplete = function (viewModel) {
88  clearErrors(viewModel);
89  var validateTargetObservables = viewModel.getValidateTargetObservables();
90
91  for (index in validateTargetObservables) {
92    validateTargetObservables[index].validator.checkOnComplete();
93  }
94};
95
96/**
97* 全てのバリデーション対象に対してエラーメッセージのクリアを行う
98* @param viewModel バリデーション対象リストを持つVM
99*/
100var clearErrors = function (viewModel) {
101  var validateTargetObservables = viewModel.getValidateTargetObservables();
102
103  for (index in validateTargetObservables) {
104    validateTargetObservables[index].errors.removeAll();
105  }
106
107  viewModel.headerErrors.removeAll();
108};
109
110/**
111 * 住所検索する
112 * @param Observable zipcode
113 * @param Observable prefStateId
114 * @param Observable address1
115 * @param Observable address2
116 */
117var searchAddress = function (zipcode, prefStateId, address1, address2) {
118  startLoading();
119
120  var data = {
121    url: '/api/front/getAddressFromZipcode',
122    zipcode: zipcode.input(),
123  };
124
125  Sys.ajax({
126    type: 'POST',
127    url: data['url'],
128    data: data
129  }).then(function (resp) {
130    var json = JSON.parse(resp);
131    zipcode.hasError(false);
132    if (json.pref_state_id) {
133      prefStateId.input(convertNullToBlank(json.pref_state_id));
134    } else if(app.useZipCodeErrorCheckFlag()) {
135      //住所取得できず、郵便番号エラーチェックを使用するなら
136      zipcode.errors.push(createSimpleObservable(self, 'errors', '無効な郵便番号です'));
137      // 「次へ」ボタンを押下した後もエラーがあることを保持する
138      zipcode.hasError(true);
139    }
140
141    if (json.address1) {
142      address1.input(json.address1);
143    }
144
145    if (json.address2) {
146      address2.input(json.address2);
147    }
148
149    endLoading();
150  });
151};
152
153/**
154 * booleanに変換する
155 * @param value
156 * @returns {boolean}
157 */
158var convertToBoolean = function (value) {
159  if (value == '1' || value == 'true') {
160    return true;
161  } else if (value == '0' || value == 'false') {
162    return false;
163  }
164
165  if (value) {
166    return true;
167  }
168
169  return false;
170};
171
172/**
173 * booleanを1・0の文字列に変換する
174 * @param value
175 * @returns {string}
176 */
177var convertBooleanToString = function (value) {
178  if (value) {
179    return '1';
180  }
181
182  return '0';
183};
184
185/**
186 * 文字型に変換する
187 * @param value
188 * @returns {string}
189 */
190var convertToString = function (value) {
191  if (value == null) {
192    return null;
193  }
194
195  return String(value);
196};
197
198/**
199 * 文字型に変換する
200 * @param value
201 * @returns {string}
202 */
203var convertToStringOrNullString = function (value) {
204  if (value == null) {
205    return 'null';
206  }
207
208  return String(value);
209};
210
211/**
212 * nullをブランクに変換する
213 * @param value
214 * @returns {string}
215 */
216var convertNullToBlank = function (value) {
217  if (value == null) {
218    return '';
219  }
220
221  return String(value);
222};
223
224/**
225 * Number型に変換する
226 * @param value
227 * @returns {Number}
228 */
229var convertToNumber = function (value) {
230  return Number(value);
231};
232
233/**
234 * 郵便番号をフォーマット化する
235 * @param zipcode
236 * @returns {string}
237 */
238var formatZipcode = function (zipcode) {
239  if (!zipcode) {
240    return '〒';
241  }
242
243  return '〒' + zipcode.substr(0, 3) + '-' + zipcode.substr(3);
244};
245
246/**
247 * 性別名を取得する
248 * @param gender
249 * @returns {string}
250 */
251var getGenderName = function (gender) {
252  if (!gender) {
253    return '未指定';
254  }
255
256  if (gender == '1') {
257    return '男性';
258  } else if (gender == '2') {
259    return '女性';
260  } else {
261    return '未指定';
262  }
263};
264
265/**
266 * カンマ区切りにする
267 * @param price
268 * @returns {string}
269 */
270var withComma = function (price) {
271  if (price) {
272    return price.toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,');
273  }
274
275  return 0;
276};
277
278/**
279 * 金額を表示形式に変換する
280 * @param price
281 * @param isWithTax
282 * @return String
283 */
284var convertToDisplayPriceFormat = function(price, isWithTax) {
285  result = null;
286  if (app.yenMarkUseFlag()) {
287    result = "Â¥" + withComma(price);
288  } else {
289    result = withComma(price) + "円";
290  }
291
292  if (isWithTax) {
293    result = result + "(税込)";
294  }
295
296  return result;
297}
298
299/**
300 * 金額をマイナスの表示形式に変換する
301 * @param price
302 * @param isWithTax
303 * @return String
304 */
305var convertToDisplayNegativePriceFormat = function(price, isWithTax) {
306  result = null;
307  if (app.yenMarkUseFlag()) {
308    result = "-Â¥" + withComma(price);
309  } else {
310    result = withComma(price) + "円引き";
311  }
312
313  if (isWithTax) {
314    result = result + "(税込)";
315  }
316
317  return result;
318}
319
320/**
321 * ポイントを表示形式に変換する
322 * @param point
323 * @return String
324 */
325var convertToDisplayPointFormat = function(point) {
326  return withComma(point) + "ポイント";
327}
328
329/**
330 * 数量を表示形式に変換する
331 * @param num
332 * @return String
333 */
334var convertToDisplayNumFormat = function(num) {
335  return withComma(num) + "点";
336}
337
338/**
339 * 標準形式(name, value)のオプションリストから、valueに合致するオプション名を取得する
340 * @param value
341 * @returns {string}
342 */
343var getOptionName = function (value, options) {
344  for (index in options) {
345    var option = options[index];
346
347    if(option.value == value) {
348      return option.name;
349    }
350  }
351
352  return null;
353};
354
355/**
356 * ◯月◯日をYYYYMMDD文字列に変換する
357 * @param targetString
358 * @returns {string}
359 */
360var convertToYYYYMMDD = function(targetString) {
361  if (!targetString) {
362    return null;
363  }
364
365  var today = new Date();
366  var todayYYYYMMDD = today.getFullYear() + ('00' + (today.getMonth() + 1)).slice(-2) + ('00' + today.getDate()).slice(-2);
367
368
369  var splitMonth = targetString.split('月');
370  var splitDay = splitMonth[1].split('日');
371
372  var paddingMonth = ('0' + splitMonth[0]).slice(-2);
373  var paddingDay = ('0' + splitDay[0]).slice(-2);
374
375  var mmdd = paddingMonth + paddingDay;
376
377  var yyyymmdd = today.getFullYear() + mmdd;
378
379  if (todayYYYYMMDD > yyyymmdd) {
380    yyyymmdd = (today.getFullYear() + 1) + mmdd;
381  }
382
383  return yyyymmdd;
384};
385
386/**
387 * DateオブジェクトをYYYYMMDD文字列に変換する
388 * @param date
389 * @returns {string}
390 */
391var convertDateToYYYYMMDD = function(date) {
392  var yyyy = date.getFullYear();
393  var mm = ('00' + (date.getMonth()+1)).slice(-2);
394  var dd = ('00' + date.getDate()).slice(-2);
395
396  return yyyy + mm + dd;
397}
398
399/**
400 * リクエスト処理
401 * @param viewModel ViewModel
402 * @param data POST対象データ
403 * @param isAsync 非同期通信を行うかどうか
404 * @param doneSuccess 通信成功時に行うコールバック処理
405 */
406var onCallRequest = function (viewModel, data, isAsync, doneSuccess) {
407  clearErrors(viewModel);
408  startLoading();
409  Sys.ajax({
410    type: 'POST',
411    url: data['url'],
412    data: data,
413    async: isAsync
414  }).done(function (resp) {
415    var json = JSON.parse(resp);
416    if (convertToBoolean(json.isError)) {
417      viewModel.headerErrors(json.errorMessages);
418
419      if (viewModel == app.deliveryMethodList) {
420        app.removeDeliveryMethodInitialErrors();
421        // お届け方法エラーを反映
422        app.applyInitialSessionCartDeliveryMethodError(json);
423      }
424    } else {
425      app.refresh(json);
426      doneSuccess();
427    }
428  }).fail(function () {
429    viewModel.headerErrors.push(createSimpleObservable(self, 'headerErrors', '通信に失敗しました'));
430  }).always(function () {
431    endLoading();
432  });
433};
434
435/**
436 * リクエスト処理(カート情報の一時保存実行時)
437 *
438 * @param viewModel ViewModel
439 * @param data POST対象データ
440 * @param isAsync 非同期通信を行うかどうか
441 * @param doneSuccess 通信成功時に行うコールバック処理
442 */
443var onCallRequestToSaveMemberSessionCart = function (viewModel, data, isAsync, doneSuccess) {
444  clearErrors(viewModel);
445  startLoading();
446  Sys.ajax({
447    type: 'POST',
448    url: data['url'],
449    data: data,
450    async: isAsync
451  }).done(function (resp) {
452    var json = JSON.parse(resp);
453    if (convertToBoolean(json.isError)) {
454      viewModel.headerErrors(json.errorMessages);
455    } else {
456      app.refresh(json);
457      endLoading();
458      doneSuccess();
459    }
460  }).fail(function () {
461    viewModel.headerErrors.push(createSimpleObservable(self, 'headerErrors', '通信に失敗しました'));
462  }).always(function () {
463    endLoading();
464  });
465};
466
467/**
468 * リクエスト処理(一時保存した注文を再開する)
469 * @param viewModel ViewModel
470 * @param data POST対象データ
471 * @param isAsync 非同期通信を行うかどうか
472 * @param doneSuccess 通信成功時に行うコールバック処理
473 */
474var onCallRequestToResumeMemberSessionCart = function (viewModel, data, isAsync, doneSuccess) {
475  clearErrors(viewModel);
476  startLoading();
477  Sys.ajax({
478    type: 'POST',
479    url: data['url'],
480    data: data,
481    async: isAsync
482  }).done(function (resp) {
483    var json = JSON.parse(resp);
484    if (convertToBoolean(json.isError)) {
485      viewModel.headerErrors(json.errorMessages);
486      endLoading();
487    } else if (json.basketUrl) {
488      // バスケットへリダイレクト
489      location.href = json.basketUrl;
490    } else {
491      // 一時保存の商品情報に更新するために既存カートの商品情報をクリアする
492      app.items.initializeItems();
493      app.refresh(json);
494      doneSuccess();
495      endLoading();
496    }
497  }).fail(function () {
498    viewModel.headerErrors.push(createSimpleObservable(self, 'headerErrors', '通信に失敗しました'));
499    endLoading();
500  });
501};
502
503/**
504 * 指定のobservableArrayに複数の要素を追加します。
505 *
506 * 第一引数に指定したko.observableArrayに第二引数で指定した配列を追加する。
507 * 第三引数が指定されている場合は第二引数の配列の要素を加工して第一引数のko.observableArrayに追加する。
508 * @param observableArray 追加先のko.observableArray
509 * @param extraArray 追加する要素の配列
510 * @param extraArrayCallBack 要素追加時に行う加工のコールバック処理
511 */
512var pushApply = function (observableArray, extraArray, extraArrayCallBack) {
513  if (!extraArrayCallBack) {
514    var _extraArrayCallBack = function (x) {return x;};
515  } else {
516    var _extraArrayCallBack = extraArrayCallBack;
517  }
518  var _arrayMap = associativeArrayMap(extraArray, _extraArrayCallBack);
519  observableArray.push.apply(observableArray, _arrayMap);
520};
521
522/**
523 * 指定のobservableArrayを第二引数の要素で置き換えます。
524 * 第一引数に指定した要素と第二引数に指定した要素が完全に異なる場合のã
524¿ç½®ãæ›ãˆãŒç™ºç”Ÿã—ます。
525 * 現状第三匹数が指定されている場合は必ず置き換わります。
526 *
527 * 第一引数に指定したko.observableArrayを第二引数で指定した配列で置き換える。
528 * 第三引数が指定されている場合は第二引数の配列の要素を加工して第一引数のko.observableArrayに追加する。
529 *
530 * @param observableArray 追加先のko.observableArray
531 * @param extraArray 追加する要素の配列
532 * @param extraArrayCallBack 要素追加時に行う加工のコールバック処理
533 */
534var economicalReplaceApply = function (observableArray, extraArray, extraArrayCallBack) {
535  var old = observableArray().concat();
536  if (JSON.stringify(old, getCircularReplacer()) != JSON.stringify(extraArray, getCircularReplacer())) {
537    observableArray.removeAll();
538    pushApply(observableArray, extraArray, extraArrayCallBack);
539  } else {
540    //
541  }
542};
543
544/**
545 * 連想配列に対応したko.utils.arrayMap
546 * @returns array
547 */
548var associativeArrayMap = function (array, mapping, mappingOwner) {
549  var result = [];
550  if (array) {
551      for (var index in array) {
552        result.push(mapping.call(mappingOwner, array[index], index));
553      }
554  }
555  return result;
556};
557
558/**
559 * 循環参照の防止
560 */
561var getCircularReplacer = function () {
562  const seen = new WeakSet();
563  return (key, value) => {
564    if (typeof value === "object" && value !== null) {
565      if (seen.has(value)) {
566        return;
567      }
568      seen.add(value);
569    }
570    return value;
571  };
572};

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.