var $beauty = (function(window) {
/** Beauty JavaScript Library */
/**
* $beautyの名前で公開
*/
function Beauty() {
// コンストラクタ
};
/**
* 環境依存変数
*/
Beauty.env = {
imgCtx : ''
};
Beauty.prototype.setEnv = function(object) {
Beauty.env.imgCtx = object.imgCtx;
};
Beauty.prototype.getEnv = function() {
return Beauty.env;
};
/**
* URLの正規表現
*/
Beauty.URL_PATTERN = /^http[s]?:\/\/.+/;
/**
* AJAXデフォルト通信設定
* $.ajax関数をコールする場合には本設定を利用します
*/
Beauty.AJAX_DEFAULT_SETTINGS = {
cache : false,
type : "POST",
timeout : 10000,
async : true,
contentTypeString : 'application/x-www-form-urlencoded',
success : function(data, textStatus, req) {
if (!Beauty.fn.alertIfAjaxError(data)) {
$(this).html(data);
}
},
error : function(req, textStatus, errorThrown) {
alert("通信に失敗しました");
}
};
/**
* 非同期で通信を行う。(リンククリック時)
* 引数に設定するコールバック関数は以下シグネチャである必要があります。
*
* - 第1引数:JSON結果オブジェクト
* - 第2引数:書き換えられる領域を囲むタグのid属性値
*
* @param {string} url 非同期通信を行うサーバURL
* @param {object} params クエリパラメータ
* @param {string} targetAreaId 書き換えられる領域を囲むタグのid属性値
* @param {function} func 通信成功時に実行するコールバック関数
*/
Beauty.prototype.asyncLink = function(url, params, targetAreaId, func) {
$.getJSON(url, params, function(json) {
func(json, targetAreaId);
});
};
/**
* 2重押しチェックフラグ
*/
var doubleClickCheck;
/**
* 2重押し判定用オブジェクト
*/
var DoubleClick = function () {
var id = 0;
var isLock = false;
this.setLock = function () {
isLock = true;
};
this.isLocked = function () {
return isLock;
};
this.clear = function (ele) {
$(ele).prop("disabled", false);
isLock = false;
};
this.getId = function () {
return id;
};
this.cancel = function() {
isLock = false;
};
};
/**
* 2重押しチェックをキャンセル(ロック解除)する
*/
function cancelDoubleClickCheck() {
if (doubleClickCheck && doubleClickCheck.isLocked()) {
doubleClickCheck.cancel();
}
};
// ======================================================================
// 2重押しチェック
// ==============
/**
* 2重押しチェックを行う
* 2重押しチェック間隔は3秒間それ以上経過すると、再度遷移可能になる
* @return 2重押しの場合にfalse、問題なければtrueを返す
*/
Beauty.prototype.checkDoubleClick = function() {
doubleClickCheck = new DoubleClick();
$("input[type='submit']").on("click", function () {
if (doubleClickCheck.isLocked()) {
return false;
}
doubleClickCheck.setLock();
setTimeout(
function() {
cancelDoubleClickCheck();
}, 3000);
return true;
});
};
/**
* ターゲットに指定された要素の2回目のサブミットを抑制する。
* @param {object} $target クリックされた対象のセレクタ(jQueryオブジェクト)
* @return 2重押しの場合にfalse、問題なければtrueを返す
*/
Beauty.prototype.preventDoubleClick = function($target) {
doubleClickCheck = new DoubleClick();
$target.on("click", function () {
if (doubleClickCheck.isLocked()) {
return false;
}
doubleClickCheck.setLock();
return true;
});
};
/**
* 2重押しチェックを行い、問題が無ければ指定したfunctionを実行する
* 2重押しチェック間隔は3秒間それ以上経過すると、再度遷移可能になる
* @param {object} $target クリックされた対象のセレクタ(jQueryオブジェクト)
* @param {function} execfunc クリックされた際に実行するfunction
* @return 2重押しの場合にfalse、問題なければtrueを返す
*/
Beauty.prototype.checkDoubleClickAndExecFunction = function($target, execfunc) {
doubleClickCheck = new DoubleClick();
$target.on("click", function () {
if (doubleClickCheck.isLocked()) {
return false;
}
doubleClickCheck.setLock();
setTimeout(
function() {
cancelDoubleClickCheck();
}, 3000);
execfunc();
return true;
});
};
/**
* テキストボックスでEnterキーが押下された際、submitを抑止する
*/
Beauty.prototype.preventEnterKeySubmit = function() {
$("input[type='text']").on("keydown.preventEnterKeySubmit", function(e) {
if (e.which === 13) {
return false;
}
});
};
/**
* パスワードでEnterキーが押下された際、submitを抑止する
*/
Beauty.prototype.preventEnterKeyPasswdSubmit = function() {
$("input[type='password']").on("keydown.preventEnterKeyPasswdSubmit", function(e) {
if (e.which === 13) {
return false;
}
});
};
// ======================================================================
// ダイアログ
// ==============
/**
* 確認ダイアログを表示する
* @param {string} clickableId ボタン、リンクのid属性値
* @param {string} message 表示するメッセージ(オプション)
*/
Beauty.prototype.confirm = function(clickableId, message) {
$(Beauty.fn.idSelector(clickableId)).on("click", function() {
var msg = message || "作業を継続しますよろしいですか?";
return window.confirm(msg);
});
};
/**
* 警告ダイアログを表示する
* @param {string} clickableId ボタン、リンクのid属性値
* @param {string} message 表示するメッセージ(オプション)
*/
Beauty.prototype.alert = function(clickableId, message) {
$(Beauty.fn.idSelector(clickableId)).on("click", function() {
var msg = message || "作業を継続できません";
return window.alert(msg);
});
};
// ======================================================================
// 反映
// ==============
/**
* リンククリック時に指定されたhiddenの値を書き換える
* @param {string} linkId クリックされるリンクのid属性値
* @param {string} hiddenId 値を書き換えるhiddenのid属性値
* @param {string} val hiddenに設定する値
*/
Beauty.prototype.rewriteHiddenValue = function(linkId, hiddenId, val) {
$(Beauty.fn.idSelector(linkId)).on("click.rewriteHidden", function() {
$(Beauty.fn.idSelector(hiddenId)).val(val);
return false;
});
};
/**
* ○検索結果一覧のこだわり条件/エリア選択時(ライトボックス)にこの関数を呼び出します
* prefixを付加した命名規則のhtml構成になっている必要があります。
*
* @param {string} submitBtn 絞込みボタン名
* @param {string} prefix Area or Kodawari
* @param {string} type サイカタ
* @param {string} pageName サイカタ
* @param {string} wak サイカタ
* @param {object} $form 対象のFormセレクタ(jQueryオブジェクト)
*/
var forPopupSelectCondition = function(submitBtn, prefix, type, pageName, wak, $form) {
var idVal;
var labelText;
var $conditionChecker;
var $conditionBox = $(Beauty.fn.idSelector('condition' + prefix + 'Target'));
var $checkObj = $conditionBox.find("input[type='checkbox']");
var $panelOpen = $(Beauty.fn.classSelector('panel' + prefix + 'Open'));
var $panelClose = $(Beauty.fn.classSelector('panel' + prefix + 'Close'));
var $addCondition = $(Beauty.fn.idSelector('add' + prefix + 'Condition'));
var $submitBtn = $(Beauty.fn.inputNameSelector(submitBtn));
var $hidden = $('.jscHidden');
var $menuPrice = $('.jscMenuPrice');
var $couponPrice = $('.jscCouponPrice');
var $conditionModal = $('.jscConditionModal');
$panelOpen.on("click", function() {
$conditionChecker = $checkObj.filter(":checked");
tb_show('', '#TB_inline?width=627&inlineId=condition' + prefix + 'Target&modal=true', '');
try{
// サイカタの設定(外部js)
cspUserSelectConditionPopup(type, pageName, wak);
} catch(e) {
//nop
}
});
$panelClose.on("click", function() {
parent.tb_remove();
$checkObj.prop('checked', false);
$conditionChecker.prop('checked', true);
});
$addCondition.on("click", function() {
// hidden値は消しておく
$hidden.remove();
// パラメータが重複するため、以下の値を消しておく
$menuPrice.remove();
$couponPrice.remove();
var $checker = $checkObj.filter(":checked");
// thickbox表示時はformの外にobjectがいってしまうため、hiddenタグでpostする
// キレイではthickbox表示ではないためhiddenタグでpostすると2重でpostされるので行わない
if (!($conditionModal.length)) {
$checker.each(function(i) {
$form.append('');
});
$form.trigger("submit");
parent.tb_remove();
} else {
$checkObj.each(function(i){
if ($(this).attr('name') === 'searchGender') {
if ($(this).prop('checked')) {
$('input:hidden[name="searchGender"]').val('MENS');
} else {
$('input:hidden[name="searchGender"]').val('ALL');
}
}
});
$('body').removeAttr('style');
$form.trigger("submit");
}
return false;
});
$submitBtn.on("click", function() {
// hidden値は消しておく
$hidden.remove();
// パラメータが重複するため、以下の値を消しておく
$menuPrice.remove();
$couponPrice.remove();
});
};
/**
* ○検索結果一覧のこだわり条件/エリア選択時(ライトボックス)にこの関数を呼び出します
* prefixを付加した命名規則のhtml構成になっている必要があります。
*
* @param {string} submitBtn 絞込みボタン名
* @param {string} prefix Area or Kodawari
* @param {string} type サイカタ
* @param {string} pageName サイカタ
* @param {string} wak サイカタ
* @param {object} $form 対象のFormセレクタ(jQueryオブジェクト)
*/
Beauty.prototype.popupSelectConditionForm = function(submitBtn, prefix, type, pageName, wak, $form) {
forPopupSelectCondition(submitBtn, prefix, type, pageName, wak, $form);
};
/**
* リンククリック(スタイル選択)時、以下の処理を行います。
*
* - 親画面の指定項目を上書く
* - 親画面の画像を選択した画像に差し替える
* - 親画面の画像横に「スタイルを削除する」リンクを表示(活性化)
* - ウィンドウ(子画面)をクローズ
*
* またタグは以下の構成になっている必要があります。
*
* - スタイル画像番号ID属性値が設定されたタグのボディ=スタイル名に設定する内容
* - スタイル画像番号ID属性値が設定されたタグはクリックされたAタグと兄弟関係(次の要素)
*
* この関数はPCのスタイル選択で使用。SPのスタイル選択は/hpd/pc/CSP/javascript/spReserveSelectImage.js - reserveSelectImageを使用します。
* @param {object} $target クリックされた対象のセレクタ(jQueryオブジェクト)
* @param {string} deleteImgId スタイル削除リンクの親タグID属性値
* @param {string} favoriteStyleImgId 画像差し替え先の親要素ID
* @param {string} destStyleIdName 反映先フィールドのname属性値(なりたいスタイルID)
* @param {string} destStyleImageName 反映先フィールドのname属性値(なりたいスタイル画像名)
* @param {string} destStyleName 反映先フィールドのname属性値(なりたいスタイル名)
* @param {string} destImgWidth 反映画像のWidth(なりたいスタイル画像の幅)
* @param {string} destImgHeight 反映画像のHeight(なりたいスタイル画像の高さ)
* @param {string} destImgPolicy 反映画像のimpolicy(なりたいスタイル画像に適用するポリシー)
* @param {string} destFormId 反映先フォームID
* @param {string} destVideoTime 反映先動画秒数ラベルクラス(なりたいスタイル動画の時間)
*/
Beauty.prototype.attachAndSwitchImageOnClose = function($target, deleteImgId, favoriteStyleImgId, destStyleIdName, destStyleImageName, destStyleName, destImgWidth, destImgHeight, destImgPolicy, destFormId, destVideoTime) {
// 親ウィンドウ取得
var parent = window.opener;
if (!parent || typeof parent.document !== 'object') {
alert("親画面が存在しません");
return false;
}
var linkId = $target.prop("id");
var $linkSiblingTag = $target.next();
var styleImageId = $linkSiblingTag.prop("id");
var styleName = $linkSiblingTag.text();
// 親ウィンドウのformタグ
var $parentForm = $(Beauty.fn.idSelector(destFormId), parent.document);
var $imgChangeArea = $(Beauty.fn.idSelector(favoriteStyleImgId), parent.document);
const $targetImage = $('img[src*="\/' + styleImageId + '\/"]');
var targetImageAlt = $targetImage.prop("alt");
var matchingExp = /impolicy=[^&]+&w=\d+&h=\d+/;
var imgFileName = "impolicy=" + destImgPolicy + "&w=" + destImgWidth + "&h=" + destImgHeight;
var targetImageSrc = $targetImage.prop("src").replace(matchingExp, imgFileName);
const videoTime = $targetImage.next(".jscVideoTime").html();
if ($('#jsiIsBiyo').text()) {
const styleInfo = getStyle(linkId);
$(Beauty.fn.inputNameSelector('rsvStyleStylePageType'), $parentForm).val(styleInfo.stylePageType);
$(Beauty.fn.inputNameSelector('rsvStyleStyleMovieId'), $parentForm).val(styleInfo.styleMovieId);
$(Beauty.fn.inputNameSelector('rsvStyleThumbnailFileName'), $parentForm).val(styleInfo.thumbnailFileName);
$(Beauty.fn.inputNameSelector('rsvStyleMoviePlayTime'), $parentForm).val(styleInfo.moviePlayTime);
// 動画の場合、なりたいスタイル画像名を削除
if (styleInfo.stylePageType === '1') {
styleImageId = '';
}
}
$(Beauty.fn.inputNameSelector(destStyleIdName), $parentForm).val(linkId);
$(Beauty.fn.inputNameSelector(destStyleImageName), $parentForm).val(styleImageId);
$(Beauty.fn.inputNameSelector(destStyleName), $parentForm).val(styleName);
// 削除リンク表示
$(Beauty.fn.idSelector(deleteImgId), parent.document).removeClass("dn");
// 画像を差し替え
$imgChangeArea.find("div").addClass("dn");
$("img", $imgChangeArea).remove();
$(".jscVideoTime", $imgChangeArea).remove();
$(parent.document.createElement("img"))
.prop({
alt: targetImageAlt,
src: targetImageSrc
}).appendTo($imgChangeArea);
if (videoTime) {
$(parent.document.createElement("span"))
.prop({
class: destVideoTime
}).html(videoTime).appendTo($imgChangeArea);
}
// ウィンドウクローズ
window.close();
};
/**
* 反映後に置換するタグ名
*/
var DEFAULT_REPLACE_TAGNAME = {
tagName : "strong"
};
/**
* リンククリック時に、ID値で対象の入力項目の値を上書きする。
*
* @param {object} $target クリックされた対象のセレクタ(jQueryオブジェクト)
* @param {string} reflectItemName 反映先フィールドのname属性値
*/
Beauty.prototype.attachLinkId = function($target, reflectItemName) {
var linkId = $target.prop("id");
if (!linkId || linkId === "") {
$(Beauty.fn.inputNameSelector(reflectItemName)).val("");
} else {
$(Beauty.fn.inputNameSelector(reflectItemName)).val(linkId);
}
};
/**
* リンククリック時に、ID値で対象の入力項目の値を上書きする。
* 反映後、クリックされた要素は指定のタグに置き換えます。
*
* @param {object} $target クリックされた対象のセレクタ(jQueryオブジェクト)
* @param {string} reflectItemName 反映先フィールドのname属性値
* @param {object} tagNameSetting リンククリック時、置換する(ラップし直す)タグ名(オプション)
*/
Beauty.prototype.attachLinkIdAfterLabel = function($target, reflectItemName, tagNameSetting) {
var replaceTagName = $.extend({}, DEFAULT_REPLACE_TAGNAME, tagNameSetting);
var $siblingLabelTag = $target.siblings(replaceTagName.tagName);
var linkId = $target.prop("id");
var startTag;
if (!linkId || linkId === "") {
startTag = "<" + replaceTagName.tagName + ">";
$(Beauty.fn.inputNameSelector(reflectItemName)).val("");
} else {
startTag = "<" + replaceTagName.tagName + " id='"+ linkId +"'>";
$(Beauty.fn.inputNameSelector(reflectItemName)).val(linkId);
}
var endTag = "" + replaceTagName.tagName + ">";
if ($siblingLabelTag) {
// 兄弟タグを全てリンクに変更
var $siblingLabelTagId = $siblingLabelTag.prop("id");
if (!$siblingLabelTagId || $siblingLabelTagId === "") {
$siblingLabelTag.replaceWith("" + $siblingLabelTag.text() + "");
} else {
$siblingLabelTag.replaceWith("" + $siblingLabelTag.text() + "");
}
}
$target.replaceWith(startTag + $target.text() + endTag);
};
/** メニューカテゴリCDの文字数 */
var MENU_CATEGORY_CD_LENGTH = 4;
/** 予約・メニュー選択画面のチェックボックスID属性値プレフィックス */
var RESERVE_CHECKBOX_ID_PREFIX = "menu";
// ======================================================================
// チェックボックス
// ==============
/**
*
* 美容(セットメニュー対応以降)のメニュー選択画面に利用しているファンクション
*
* メニューで選択された施術時間を計算し、選択済みクーポンの施術時間に加算します。
* デザインは以下の規約に沿っている必要があります。
* チェックボックスのID属性値の命名ルール「menu + メニューカテゴリCD + シーケンス」
*
* @param {string} menuCategoryCdId メニューカテゴリCDのID属性値。命名ルールは末尾がシーケンス。
* @param {string} durationProcedureId 施術時間のID属性値。命名ルールは末尾がシーケンス。
* @param {string} menuContentId メニューのID属性値。命名ルールは末尾がシーケンス。
* @param {string} totalTimeId 計算結果を表示するTDタグのID属性値。
* @param {string} menuPriceId メニュー料金のID属性値
* @param {boolean} isAppend 追加メニューかどうか。(オプション)true:追加メニュー, false:メニュー
*/
const calcDurationProcedureBtSelectCheckedMenuCategory = function(menuCategoryCdId, durationProcedureId, menuContentId, totalTimeId, menuPriceId, isAppend) {
var selectCheckedMenuCategory = function() {
var checkId;
var seq;
var menuContent;
var minutes;
var hour;
var minute;
var dispAllTime;
var couponTime = 0;
var allTime = 0;
$('.jscAddedMenu').remove();
// afterを用いてメニューを出力するため、get.reverseでeachを逆順で回す
$($('.jscAddMenuSelect').find(':checked').get().reverse()).each(function() {
checkId = $(this).prop('id');
// チェックボックスのID属性値から、シーケンス、メニューカテゴリCDを取得
seq = checkId.slice((RESERVE_CHECKBOX_ID_PREFIX.length + MENU_CATEGORY_CD_LENGTH), checkId.length);
const fee = $(Beauty.fn.idSelector(menuPriceId) + seq).text();
minutes = $(Beauty.fn.idSelector(durationProcedureId) + seq).text();
var menuCategoryNames = '';
$.each($(Beauty.fn.idSelector(menuCategoryCdId) + seq).val().split(','), function(index, value) {
menuCategoryNames = menuCategoryNames + '';
});
menuContent = '';
$('.jscSelectedCoupon').after(menuContent);
});
// 総施術時間の計算
$('.jscCalculatedTable').eq(0).find('input[name="jsRsvMenuTimes"]').each(function(index, el){
couponTime += $(el).val().replace(/([0-9]+)分/,'$1') - 0;
});
allTime = (!isNaN(couponTime)) ? allTime + couponTime : allTime ;
hour = Math.floor(allTime / 60);
minute = allTime % 60;
dispAllTime = (hour < 1) ? '' : hour + '時間' ;
dispAllTime = (minute === 0) ? dispAllTime : dispAllTime + minute + '分' ;
dispAllTime = (dispAllTime === '' ) ? ' ' : dispAllTime;
$(Beauty.fn.idSelector(totalTimeId)).text(dispAllTime);
$('.jscTotalTime').text(dispAllTime);
}
selectCheckedMenuCategory();
};
/**
*
* 美容(セットメニュー対応以降)のメニュー選択画面表示時に施術時間を計算するイベントリスナーを登録する
*
* @param {string} menuCategoryCdId メニューカテゴリCDのID属性値。命名ルールは末尾がシーケンス。
* @param {string} durationProcedureId 施術時間のID属性値。命名ルールは末尾がシーケンス。
* @param {string} menuContentId メニューのID属性値。命名ルールは末尾がシーケンス。
* @param {string} totalTimeId 計算結果を表示するTDタグのID属性値。
* @param {string} menuPriceId メニュー料金のID属性値
* @param {boolean} isAppend 追加メニューかどうか。(オプション)true:追加メニュー, false:メニュー
*/
Beauty.prototype.calcDurationProcedureBtPageshow = function(menuCategoryCdId, durationProcedureId, menuContentId, totalTimeId, menuPriceId, isAppend) {
// ブラウザバック時に選択済メニューに選択されているメニューを追加
window.addEventListener('pageshow', () => {
calcDurationProcedureBtSelectCheckedMenuCategory(menuCategoryCdId, durationProcedureId, menuContentId, totalTimeId, menuPriceId, isAppend);
});
};
/**
*
* 美容(セットメニュー対応以降)のメニュー選択画面のチェックボックス選択時に施術時間を計算するイベントリスナーを登録する
*
* @param {string} menuCategoryCdId メニューカテゴリCDのID属性値。命名ルールは末尾がシーケンス。
* @param {string} durationProcedureId 施術時間のID属性値。命名ルールは末尾がシーケンス。
* @param {string} menuContentId メニューのID属性値。命名ルールは末尾がシーケンス。
* @param {string} totalTimeId 計算結果を表示するTDタグのID属性値。
* @param {string} menuPriceId メニュー料金のID属性値
* @param {boolean} isAppend 追加メニューかどうか。(オプション)true:追加メニュー, false:メニュー
*/
Beauty.prototype.calcDurationProcedureBtOnClick = function(menuCategoryCdId, durationProcedureId, menuContentId, totalTimeId, menuPriceId, isAppend) {
$('.jscAddMenuSelect').find('input[type="checkbox"]').on('click.calcDurationProcedureBt', function() {
calcDurationProcedureBtSelectCheckedMenuCategory(menuCategoryCdId, durationProcedureId, menuContentId, totalTimeId, menuPriceId, isAppend);
var afterWindowPos;
var targetcheckId = '#jsi' + $(this).val();
var windowPos = $(window).scrollTop();
var deletedElementsHeight = $(targetcheckId).outerHeight() ?? 0; // チェックを外した時に利用(要素が削除されると高さがとれなくなる)
// 対応するセル分スクロール
if($(this).is(':checked')) {
// チェックを付けた時
afterWindowPos = windowPos + ($(targetcheckId).outerHeight() ?? 0);
if($('#jsiErrors').length === 1) {
$('html,body').scrollTop(afterWindowPos - ($('#jsiErrors').outerHeight() ?? 0) - 20);
} else {
$('html,body').scrollTop(afterWindowPos);
}
} else {
// チェックを外した時
$('html,body').scrollTop(windowPos - deletedElementsHeight);
}
if ($('.jscTotalTime').text() !== '') {
$('#jsiErrors').remove();
}
});
};
/**
* 新現行キレイのメニュー選択画面用の toggleTable
*/
const calcDurationProcedureKrToggleTable = function() {
var fixedCnt = $('tbody.jscFixedArea').children().length;
var selectedCnt = $('.jscAddMenuSelect').find(":checked").length;
if (fixedCnt > 0 || selectedCnt > 0) {
$('table.jscCalculatedTable').removeClass('dn');
$('#jsiAfterMenu').removeClass('dn').closest('div').removeClass('dn');
$('#jsiPlzSelectMenu').html('追加メニューを選択してください');
} else {
$('table.jscCalculatedTable').addClass('dn');
$('#jsiAfterMenu').addClass('dn').closest('div').addClass('dn');
$('#jsiPlzSelectMenu').html('メニューを選択してください');
}
};
/**
*
* 新現行キレイのメニュー選択画面に利用しているファンクション
*
* メニューで選択された施術時間を計算し、選択済みクーポンの施術時間に加算します。
* デザインは以下の規約に沿っている必要があります。
* チェックボックスのID属性値の命名ルール「menu + メニューカテゴリCD + シーケンス」
*
* @param {string} menuCategoryCdId メニューカテゴリCDのID属性値。命名ルールは末尾がシーケンス。
* @param {string} durationProcedureId 施術時間のID属性値。命名ルールは末尾がシーケンス。
* @param {string} menuContentId メニューのID属性値。命名ルールは末尾がシーケンス。
* @param {string} selectedCouponAreaId 選択済みクーポンの施術時間(TD)のID属性値。
* @param {string} totalTimeId 計算結果を表示するTDタグのID属性値。
* @param {string} menuPriceId メニュー料金のID属性値
* @param {boolean} isAppend 追加メニューかどうか。(オプション)true:追加メニュー, false:メニュー
*/
const calcDurationProcedureKrSelectCheckedMenuCategory = function(menuCategoryCdId, durationProcedureId, menuContentId, selectedCouponAreaId, totalTimeId, menuPriceId, isAppend) {
var checkId;
var seq;
var menuCategoryCd;
var menuContent;
var minutes;
var hour;
var minute;
var dispAllTime;
var tmpCouponTime;
var couponTime = 0;
var allTime = 0;
var menuSelected = false;
$('.jscSelectedMenuArea').empty();
$('.jscAddMenuSelect').find(":checked").each(function() {
checkId = $(this).prop('id');
// チェックボックスのID属性値から、シーケンス、メニューカテゴリCDを取得
seq = checkId.slice((RESERVE_CHECKBOX_ID_PREFIX.length + MENU_CATEGORY_CD_LENGTH), checkId.length);
const fee = $(Beauty.fn.idSelector(menuPriceId) + seq).text();
menuCategoryCd = checkId.slice(RESERVE_CHECKBOX_ID_PREFIX.length, RESERVE_CHECKBOX_ID_PREFIX.length + MENU_CATEGORY_CD_LENGTH);
minutes = $(Beauty.fn.idSelector(durationProcedureId) + seq).text();
minute = minutes.slice(0, minutes.length - 1);
var menuCategoryNames = '';
var menuCategory = $(Beauty.fn.idSelector(menuCategoryCdId) + seq);
$.each(menuCategory.val().split(','), function(index, value) {
menuCategoryNames = menuCategoryNames + '';
});
menuContent = '| '+ fee + ' | '
+ '
';
$(menuContent).appendTo('.jscSelectedMenuArea');
$('.jscCalculatedTable').eq(0).find('.jscSelectedMenuArea').children('tr').last().children('td').eq(0).attr('id', 'jsi' + $(this).val());
menuSelected = true;
});
// 総施術時間の計算
$('.jscCalculatedTable').eq(0).find('.jsRsvMenuTimes').each(function(index, el) {
couponTime += $(el).text().replace(/([0-9]+)分/,'$1') - 0;
});
allTime = (!isNaN(couponTime)) ? allTime + couponTime : allTime ;
hour = Math.floor(allTime / 60);
minute = allTime % 60;
dispAllTime = (hour < 1) ? '' : hour + '時間' ;
dispAllTime = (minute === 0) ? dispAllTime : dispAllTime + minute + '分';
dispAllTime = (dispAllTime === '' ) ? ' ' : dispAllTime;
$('.jscTotalTime').text(dispAllTime);
calcDurationProcedureKrToggleTable();
};
/**
*
* 新現行キレイのメニュー選択画面で、画面表示時のイベントリスナーを登録する
*
* @param {string} menuCategoryCdId メニューカテゴリCDのID属性値。命名ルールは末尾がシーケンス。
* @param {string} durationProcedureId 施術時間のID属性値。命名ルールは末尾がシーケンス。
* @param {string} menuContentId メニューのID属性値。命名ルールは末尾がシーケンス。
* @param {string} selectedCouponAreaId 選択済みクーポンの施術時間(TD)のID属性値。
* @param {string} totalTimeId 計算結果を表示するTDタグのID属性値。
* @param {string} menuPriceId メニュー料金のID属性値
* @param {boolean} isAppend 追加メニューかどうか。(オプション)true:追加メニュー, false:メニュー
*/
Beauty.prototype.calcDurationProcedureKrPageshow = function(menuCategoryCdId, durationProcedureId, menuContentId, selectedCouponAreaId, totalTimeId, menuPriceId, isAppend) {
// ブラウザバック時に選択済メニューに選択されているメニューを追加
window.addEventListener('pageshow', () => {
calcDurationProcedureKrSelectCheckedMenuCategory(menuCategoryCdId, durationProcedureId, menuContentId, selectedCouponAreaId, totalTimeId, menuPriceId, isAppend);
});
};
/**
*
* 新現行キレイのメニュー選択画面で、チェックボックス・ラジオボタンクリック時のイベントリスナーを登録する。
*
* @param {string} menuCategoryCdId メニューカテゴリCDのID属性値。命名ルールは末尾がシーケンス。
* @param {string} durationProcedureId 施術時間のID属性値。命名ルールは末尾がシーケンス。
* @param {string} menuContentId メニューのID属性値。命名ルールは末尾がシーケンス。
* @param {string} selectedCouponAreaId 選択済みクーポンの施術時間(TD)のID属性値。
* @param {string} totalTimeId 計算結果を表示するTDタグのID属性値。
* @param {string} menuPriceId メニュー料金のID属性値
* @param {boolean} isAppend 追加メニューかどうか。(オプション)true:追加メニュー, false:メニュー
*/
Beauty.prototype.calcDurationProcedureKrOnClick = function(menuCategoryCdId, durationProcedureId, menuContentId, selectedCouponAreaId, totalTimeId, menuPriceId, isAppend) {
$("input[type='checkbox'], input[type='radio']").on("click.calcDurationProcedureKr", function() {
calcDurationProcedureKrSelectCheckedMenuCategory(menuCategoryCdId, durationProcedureId, menuContentId, selectedCouponAreaId, totalTimeId, menuPriceId, isAppend);
var targetcheckId = '#jsi' + $(this).val();
var windowPos = $(window).scrollTop();
var deletedElementsHeight = $(targetcheckId).outerHeight() ?? 0; // チェックを外した時に利用(要素が削除されると高さがとれなくなる)
var tableVisibled = $('.jscCalculatedTable').eq(0).is(':visible');
var frameHeight = $('#jsiframeHeight').height(); // テーブルの枠の高さ
var deletedFrameHeight = frameHeight; // チェックを外した時に利用(要素が削除されると高さがとれなくなる)
// 対応するセル分スクロール
if ($(this).is(':checked')) {
// チェックを付けた時
afterWindowPos = windowPos + ($(targetcheckId).outerHeight() ?? 0);
frameHeight = $('#jsiframeHeight').height() - ($(targetcheckId).outerHeight() ?? 0) + 20;
// 枠の有無でスクロールする高さを調節する
if (!tableVisibled) {
if ($('#jsiErrors').length === 1) {
$('html,body').scrollTop(afterWindowPos + frameHeight - ($('#jsiErrors').outerHeight() ?? 0) - 20);
} else {
$('html,body').scrollTop(afterWindowPos + frameHeight);
}
} else {
if ($('#jsiErrors').length === 1) {
$('html,body').scrollTop(afterWindowPos - ($('#jsiErrors').outerHeight() ?? 0) - 20);
} else {
$('html,body').scrollTop(afterWindowPos);
}
}
} else {
// チェックを外した時
tableVisibled = $('.jscCalculatedTable').eq(0).is(':visible');
afterWindowPos = windowPos - deletedElementsHeight;
frameHeight = deletedFrameHeight - deletedElementsHeight + 20;
// 枠の有無でスクロールする高さを調節する
if (!tableVisibled) {
$('html,body').scrollTop(afterWindowPos - frameHeight);
} else {
$('html,body').scrollTop(afterWindowPos);
}
}
if ($('.jscTotalTime').text() !== '') {
$('#jsiErrors').remove();
}
});
calcDurationProcedureKrToggleTable();
};
// ======================================================================
// ラジオボタン
// ==============
/**
*
* 現行キレイのオフ選択画面に利用しているファンクション
*
* メニューで選択された施術時間を計算し、選択済みクーポン/追加メニューの施術時間に加算します。
* デザインは以下の規約に沿っている必要があります。
* ラジオボタンのID属性値の命名ルール「menu + メニューカテゴリCD + シーケンス」
*
* @param {string} durationProcedureId 施術時間のID属性値。命名ルールは末尾がシーケンス。
* @param {string} menuContentId メニューのID属性値。命名ルールは末尾がシーケンス。
* @param {string} resultTableId 計算結果を表示するテーブル(TBODY)のID属性値。
* @param {string} selectedCouponAreaId 選択済みクーポンの施術時間(TD)のID属性値。
* @param {string} totalTimeId 計算結果を表示するTDタグのID属性値。
* @param {boolean} isAppend 追加メニューかどうか。(オプション)true:追加メニュー, false:メニュー
*/
Beauty.prototype.calcDurationProcedureRadioKr = function(menuCategoryCdId, durationProcedureId, menuContentId, resultTableId, selectedCouponAreaId, totalTimeId, menuPriceId, isAppend) {
$('input[type="radio"]').on('change', function() {
var checkId;
var seq;
var fee;
var menuCategoryCd;
var menuContent;
var minutes;
var hour;
var minute;
var dispAllTime;
var tmpCouponTime;
var couponTime = 0;
var allTime = 0;
var menuSelected = false;
var tmpRowspan = 1;
var $resultTableTd = $(Beauty.fn.idSelector(resultTableId) + " td");
var $fixed = $('tr.jscFixed');
var isFixed = $fixed.length > 0;
var isRadio = $(this).prop('type') === 'radio';
if ($resultTableTd.is('[id^="addTd"]') && !isFixed) {
$resultTableTd.filter('[id^="addTd"]').parent().remove();
}
if (isFixed) {
tmpRowspan += $fixed.length;
}
$('.jscOffResult').remove();
checkId = $(this).prop('id');
// チェックボックスのID属性値から、シーケンス、メニューカテゴリCDを取得
seq = checkId.slice((RESERVE_CHECKBOX_ID_PREFIX.length + MENU_CATEGORY_CD_LENGTH), checkId.length);
fee = $(Beauty.fn.idSelector(menuPriceId) + seq).text();
menuCategoryCd = checkId.slice(RESERVE_CHECKBOX_ID_PREFIX.length, RESERVE_CHECKBOX_ID_PREFIX.length + MENU_CATEGORY_CD_LENGTH);
minutes = $(Beauty.fn.idSelector(durationProcedureId) + seq).text();
minute = minutes.slice(0, minutes.length - 1);
allTime = allTime + (minute - 0);
var menuCategoryNames = '';
var menuCategory = $(Beauty.fn.idSelector(menuCategoryCdId) + seq);
$.each(menuCategory.val().split(','), function(index, value) {
menuCategoryNames += '';
});
menuContent = '| '+ fee + ' | ' +
''+ minutes +' |
';
if (seq != 0) {
$(menuContent).appendTo(Beauty.fn.idSelector(resultTableId));
menuSelected = true;
tmpRowspan++;
} else {
if (isFixed) {
menuSelected = true;
}
}
if (!menuSelected) {
if (isAppend && typeof isAppend === "boolean") {
$("追加メニューが選択されていません。 | | ").appendTo(Beauty.fn.idSelector("jsAddMenuBaseTr"));
} else {
$("メニューが選択されていません。 | | ").appendTo(Beauty.fn.idSelector("jsAddMenuBaseTr"));
}
} else {
$(Beauty.fn.idSelector("jsAddMenuBaseTr") + " td").remove();
}
$(Beauty.fn.idSelector("jsAddMenuBaseTr") + " th[rowSpan]").prop("rowSpan", tmpRowspan);
// 総施術時間の計算
if (isFixed) {
for (var i = 0, max = $fixed.length; i < max; i++) {
allTime += (($fixed.find('#addTdRight' + i +'').text().replace('分', '')) * 1);
}
}
tmpCouponTime = $(Beauty.fn.idSelector(selectedCouponAreaId)).text();
if (tmpCouponTime && tmpCouponTime.trim() !== "") {
tmpCouponTime = tmpCouponTime.replace("分", "");
couponTime = tmpCouponTime - 0;
allTime = (!isNaN(couponTime)) ? allTime + couponTime : allTime ;
}
hour = Math.floor(allTime / 60);
minute = allTime % 60;
dispAllTime = (hour < 1) ? "" : hour +"時間" ;
dispAllTime = (minute === 0) ? dispAllTime : dispAllTime + minute +"分" ;
dispAllTime = (dispAllTime === "" ) ? " " : dispAllTime;
$(Beauty.fn.idSelector(totalTimeId)).text(dispAllTime);
});
};
/**
* 選択したスタイリストとその他のスタイリストの表示を切り替えます。
* (デザイン会社納品ソースをjQueryにポーティング)
*
* @param {string} stylistTabId スタイリストタブのID属性値
* @param {string} otherStylistTabId 他のスタイリストID属性値
* @param {string} otherStylistCnt 他のスタイリスト数
*/
Beauty.prototype.changeStylist = function(stylistTabId, otherStylistTabId, otherStylistCnt) {
$(Beauty.fn.idSelector(stylistTabId)).on("click.changeStylist", function() {
if ($(Beauty.fn.idSelector(otherStylistTabId)).hasClass("reserveDateTabOn")) {
$(Beauty.fn.idSelector(otherStylistTabId)).removeClass("reserveDateTabOn");
}
$(Beauty.fn.idSelector(otherStylistTabId)).addClass("rsvS reserveDateTabOff");
if ($(this).hasClass("reserveDateTabOff")) {
$(this).removeClass("reserveDateTabOff");
}
$(this).addClass("rsvS reserveDateTabOn");
$(Beauty.fn.idSelector(otherStylistCnt)).hide();
});
$(Beauty.fn.idSelector(otherStylistTabId)).on("click.otherStylist", function() {
if ($(Beauty.fn.idSelector(stylistTabId)).hasClass("reserveDateTabOn")) {
$(Beauty.fn.idSelector(stylistTabId)).removeClass("reserveDateTabOn");
}
$(Beauty.fn.idSelector(stylistTabId)).addClass("rsvS reserveDateTabOff");
if ($(this).hasClass("reserveDateTabOff")) {
$(this).removeClass("reserveDateTabOff");
}
$(this).addClass("rsvS reserveDateTabOn");
$(Beauty.fn.idSelector(otherStylistCnt)).show();
});
$("#jsStylistWrap a").on("click.otherStylistA", function() {
$("#jsStylistName").html($(this).html());
var currentStylist = $("#jsCurrentStylist");
currentStylist.parent().html("" + currentStylist.text() + "");
$(this).parent().html("" + $(this).text() + "");
$("#jsRsvCdTbl").show();
$(Beauty.fn.idSelector(stylistTabId)).addClass("rsvS reserveDateTabOn");
$(Beauty.fn.idSelector(otherStylistTabId)).addClass("rsvS reserveDateTabOff");
$(Beauty.fn.idSelector(otherStylistCnt)).hide();
});
};
/**
* 利用可能ポイントからプルダウンで選択された利用ポイントを減算し、支払い予定金額に反映します。
*
* @param {string} selectedPointId 利用するポイント(プルダウン)のID属性値
* @param {string} usePointId 利用可能ポイント(減算対象)タグのID属性値
* @param {string} reflectPointId 支払い予定金額タグのID属性値
*/
Beauty.prototype.recalcEnablePoint = function(selectedPointId, usePointId, reflectPointId) {
$(Beauty.fn.idSelector(selectedPointId)).on("change.recalcEnablePoint", function() {
// 減算した結果のポイント数
var result;
var resultText;
// 利用ポイント
var tmpSelectedPoint = $(this).val();
var selectedPoint = tmpSelectedPoint - 0;
// 現在の利用可能ポイント
var tmpUsePoint = $(Beauty.fn.idSelector(usePointId)).text();
tmpUsePoint = unFormatNumber(tmpUsePoint);
var usePoint = tmpUsePoint - 0;
if ((!usePoint || isNaN(usePoint)) || isNaN(selectedPoint)) {
// 引数のID指定されたタグのコンテンツのいずれかが数値ではない場合、処理終了
return false;
}
result = usePoint - selectedPoint;
resultText = "¥" + formatNumber(result);
// 減算結果を支払い予定金額に反映
$(Beauty.fn.idSelector(reflectPointId)).html(resultText);
});
};
// ======================================================================
// Functions
// ==============
/**
* 【Beauty.fn】汎用的なFunctionを定義
*/
Beauty.fn = Beauty.prototype.fn = {
/**
* id属性値からセレクタを返す
*/
idSelector : function(id) {
return "#" + id;
},
/**
* クラス属性値からセレクタを返す
*/
classSelector : function(className) {
return "." + className;
},
/**
* inputのname値からセレクタを返す
*/
inputNameSelector : function(name) {
return "input[name='" + name + "']";
},
/**
* 値を数値として返す。数値に変換できない場合はnullを返す
* @param val 変換元の値
*/
num : function(val) {
if (!val || isNaN(val)) {
return null;
} else {
return val - 0;
}
},
/**
* チェック状態にする
* @param {string} id属性値
*/
check : function(id) {
$(this.idSelector(id)).prop("checked", true);
},
/**
* ポップアップウィンドウを新規に作成する
* 自由にカスタマイズしたいとき向け
* @param settings 設定
* @return ポップアップクラスのインスタンス
*/
createPopup : function(settings) {
return new Popup(settings);
},
/**
* disabled設定可能な部品を非活性化する
* @param targetId ターゲットID
*/
disable : function(targetId) {
var $target = $(this.idSelector(targetId));
$target.prop("disabled", true);
},
/**
* disabled設定可能な部品をすべて非活性化する
* @param targetClass ターゲットCLASS
*/
disableAll : function(targetClass) {
var $targets = $(this.classSelector(targetClass));
$targets.prop("disabled", true);
},
/**
* disabled設定可能な部品を活性化する
* @param targetId ターゲットID
*/
enable : function(targetId) {
var $target = $(this.idSelector(targetId));
$target.prop("disabled", false);
},
/**
* disabled設定可能な部品をすべて非活性化する
* @param targetClass ターゲットCLASS
*/
enableAll : function(targetClass) {
var $targets = $(this.classSelector(targetClass));
$targets.prop("disabled", false);
},
/**
* リンクを非活性化する
* @param linkId リンクのID
*/
disableLink : function(linkId) {
var $a = $(this.idSelector(linkId));
$a.data("disabled", true);
$a.on("click.capability", function() {
return false;
});
},
/**
* リンクを活性化する
* @param linkId リンクのID
*/
enableLink : function(linkId) {
var $a = $(this.idSelector(linkId));
$a.data("disabled", false);
$a.off("click.capability");
},
/**
* input部品のうち、サブミット時に除外されるtype属性であればtrueを返す
* @param type input部品
*/
isExcludeType : function(type) {
return type === "file" || type === "submit" || type === "button" || type === "reset" || type === "image";
},
/**
* 文字列をHTMLサニタイジングします。
* @param str 文字列
*/
escape : function(str) {
return str.replace(/&/g, "&")
.replace(//g, ">");
},
/**
* 文字列をHTMLサニタイジングします。(対象文字列全対応)
* @param str 文字列
*/
escapeAll : function(str) {
return str.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
},
/**
* 非同期通信でvalidateエラーになった場合は、アラートでメッセージを表示する
* システムエラーの場合は、元画面をエラー画面へ遷移させる
* @param data データ
*/
alertIfAjaxError : function(data) {
var status = $(data).prop("id");
if (status === "ajaxSystemError") {
var url = $(data).prop("url");
window.location.href = url;
return true;
} else if (status === "ajaxMsgError") {
var message = "";
$("li", $(data)).each(function(){
message += $(this).text() + "\n";
});
alert(message);
return true;
}
return false;
}
};
/**
* 入力部品かどうか判別する
* 入力部品の場合にtrueを返す
* @param {jquery} jQueryオブジェクト
*/
function hasValue($obj) {
return $obj.is("input,textarea,select");
};
/**
* チェック部品かどうか判別する
* チェックボックス・ラジオボタンの場合にtrueを返す
* @param {jquery} jQueryオブジェクト
*/
function hasCheckedValue($obj) {
return $obj.is("input[type='checkbox'],input[type='radio']");
};
/**
* 1000桁区切り(カンマ)を取り除く。
* @param input カンマ区切りの金額
*/
function unFormatNumber(input) {
return input.toString().replace(/,/g, "");
};
/**
* 数値を1000桁区切り(カンマ)の文字列に書式設定する。
* @param input 数値
*/
function formatNumber(input) {
var output = input.toString();
output = unFormatNumber(output);
output = output.replace(/(\d{1,3})(?=(\d{3})+(?!\d))/g, "$1,");
return output;
};
/**
* 文字列からファセット件数の箇所を取り除く。
* @param input 文字列
*/
function trimFacetCount(input) {
var output = input.toString();
output = output.replace(/[(][0-9]+[)]/g, "");
return output;
};
/**
* 値を取得する
*
* - チェックボックス、ラジオボタンはチェックされていればtrueを返す
* - 他のinput部品はvalueを返す
* - input部品ではない場合は、表示文字列を返す
*
* @param {string} $target セレクタ
* @return チェック状態、値、表示文字列のいずれか
*/
function getValue($target) {
var val;
if (hasCheckedValue($target)) {
val = $target.prop("checked");
} else if (hasValue($target)) {
val = $target.val();
} else {
val = $target.text();
}
return val;
};
// ======================================================================
// ポップアップウィンドウ
// ==============
var DEFAULT_WINDOW_SETTINGS = {
url : "about:blank",
name : "child",
location : "yes",
resizable : "yes",
status : "yes",
menubar : "yes",
scrollbars : "yes",
width : 630,
height : 600,
left : 0,
top : 0,
dependent : "no",
directories : "no",
action : null,
toolbar : "yes",
rootFormId : null,
closeOnUnload : false
};
/**
* リンククリックでポップアップ画面を表示する
* onclickイベントのバインド対象となるタグのid属性値を引数にとる
*
* @param {string} linkId タグのid属性値
* @param {object} properties windowの追加設定(オプション)
* @return false 画面遷移を行わない
*/
Beauty.prototype.linkPopup = function(linkId, properties) {
var settings = $.extend({}, DEFAULT_WINDOW_SETTINGS, properties);
$(Beauty.fn.idSelector(linkId)).on("click", function() {
var popup = Beauty.fn.createPopup(settings);
popup.data(settings);
var win = popup.open();
if (settings.closeOnUnload) {
closeWindowOnUnload(win);
}
return false;
});
};
/**
* リンククリックでポップアップ画面を表示し、引数で指定した親画面のプロパティ値を
* 子画面のチェックボックスに反映する。
*
* @param {string} linkId タグのid属性値
* @param {object} properties windowの追加設定(オプション)
* @param {string} reflectItemName チェックボックスに反映するinputのname属性値
* @return false 画面遷移を行わない
*/
Beauty.prototype.linkPopupReflectCheckbox = function(linkId, properties, reflectItemName) {
var settings = $.extend({}, DEFAULT_WINDOW_SETTINGS, properties);
var actionPath;
$(Beauty.fn.idSelector(linkId)).on("click.linkPopupReflect", function() {
if (!actionPath || actionPath.length === 0) {
actionPath = settings.url;
}
var $reflectItemName = $(Beauty.fn.inputNameSelector(reflectItemName));
var reflectItemId;
var queryParams = "";
if ($reflectItemName) {
$reflectItemName.each(function(i) {
reflectItemId = $(this).val();
if (i === 0) {
queryParams = "?" + reflectItemName + "=" + reflectItemId;
} else {
queryParams = queryParams + "&" + reflectItemName + "=" + reflectItemId;
}
});
}
settings.url = actionPath + queryParams;
var popup = Beauty.fn.createPopup(settings);
popup.open();
return false;
});
};
/**
* リンククリックでポップアップ画面を表示する(動的にリンクの数が変わる場合用)
* onclickイベントのバインド対象となるタグのclass属性値を引数にとる
* @param {string} linkClass タグのclass属性値
* @param {object} properties windowの追加設定(オプション)
* @return false 画面遷移を行わない
*/
Beauty.prototype.linksPopup = function(linkClass, properties) {
var settings = $.extend({}, DEFAULT_WINDOW_SETTINGS, properties);
$(Beauty.fn.classSelector(linkClass)).on("click.linksPopup", function() {
var popup = Beauty.fn.createPopup(settings);
popup.data(settings);
var win = popup.open();
if (settings.closeOnUnload) {
closeWindowOnUnload(win);
}
return false;
});
};
function closeWindowOnUnload(win) {
$(win.opener).on("unload", function() {
win.close();
});
};
/**
* ポップアップオブジェクト
* window一つにつき、新たにインスタンスを生成する
* settings: ポップアップウィンドウの設定値
*/
var Popup = function(settings) {
var config = settings;
/**
* 追加設定を行う
* @param {string} key 設定用キー
* @param {object} value 設定値
*/
this.put = function(key, value) {
config[key] = value;
};
/**
* 追加設定を行う
* 引数が存在しない、またはObjectでない場合は何もしない
* @param {object} map key:valueペアの配列
*/
this.data = function(map) {
if (map && typeof map === "object") {
for (let key in map) {
this.put(key, map[key]);
}
}
};
this.setUrl = function(url) {
config.url = url;
};
this.setName = function(name) {
config.name = name;
};
this.setResizable = function(resizable) {
config.resizable = resizable;
};
this.setScrollbars = function(scrollbars) {
config.scrollbars = scrollbars;
};
this.setWidth = function(width) {
config.width = width;
};
this.setHeight = function(height) {
config.height = height;
};
this.setLeft = function(left) {
config.left = left;
};
this.setTop = function(top) {
config.top = top;
};
this.setAction = function(action) {
config.action = action;
};
this.setRootFormId = function(rootFormId) {
config.rootFormId = rootFormId;
};
this.setToolbar = function(toolbar) {
config.toolbar = toolbar;
};
this.getAction = function() {
return config.action;
};
this.getUrl = function() {
return config.url;
};
this.getName = function() {
// iOS26 popuplinkの暫定対応
// 強制的にconfig.nameを'_blank'に変更させる
return '_blank';
};
this.getLocation = function() {
return config.location;
};
this.getResizable = function() {
return config.resizable;
};
this.getStatus = function() {
return config.status;
};
this.getMenubar = function() {
return config.menubar;
};
this.getScrollbars = function() {
return config.scrollbars;
};
this.getWidth = function() {
return config.width;
};
this.getHeight = function() {
return config.height;
};
this.getLeft = function() {
return config.left;
};
this.getTop = function() {
return config.top;
};
this.getDependent = function() {
return config.dependent;
};
this.getDirectories = function() {
return config.directories;
};
this.getSubmitFormId = function() {
return config.submitFormId;
};
this.getRootFormId = function() {
return config.rootFormId;
};
this.getToolbar = function() {
return config.toolbar;
};
};
/**
* 新しいWindowを開く
* @return 開いたwindowへの参照
*/
Popup.prototype.open = function() {
var w = window.open(this.getUrl(), this.getName(), "location="
+ this.getLocation() + ",resizable="
+ this.getResizable() + ",status=" + this.getStatus()
+ ",menubar=" + this.getMenubar() + ",scrollbars="
+ this.getScrollbars() + ",width=" + this.getWidth()
+ ",height=" + this.getHeight() + ",left="
+ this.getLeft() + ",top=" + this.getTop()
+ ",toolbar="+ this.getToolbar());
var rootFormId = this.getRootFormId();
if (rootFormId) {
var rootForm = $(Beauty.fn.idSelector(rootFormId)).get(0);
var lastAction = rootForm.action;
rootForm.action = this.getAction();
rootForm.target = this.getName();
rootForm.method = "post";
rootForm.submit();
rootForm.action = lastAction;
}
return w;
};
/**
* Windowを閉じる
*/
Popup.prototype.close = function(fn, args) {
this.getWindow().close();
if (fn && fn instanceof Function) {
fn.apply(this, args);
}
};
/**
* クリック時に、指定classをもつ要素のdisabledを解除する
* @param {string} clickableId クリックされる要素のid属性値
* @param {string} enableClass disabledを解除する対象要素のclass属性値
*/
Beauty.prototype.resetDesabled = function(clickableId, enableClass) {
$(document).on("click", Beauty.fn.idSelector(clickableId), function() {
Beauty.fn.enableAll(enableClass);
});
};
/**
* キレイ差し込みファイルを切り替える
* @param {string} genreNaviGroupName 選択されているジャンル名
*/
Beauty.prototype.genreNaviChange = function(genreNaviGroupName) {
switch (genreNaviGroupName) {
case 'relax':
$('.jscGenreNail, .jscGenreRelax').toggleClass('dn');
break;
case 'esthe':
$('.jscGenreNail, .jscGenreEsthe').toggleClass('dn');
break;
default:
return;
}
};
/**
* IE判定
* @returns {boolean}
*/
Beauty.prototype.isMsie = function() {
var ua = window.navigator.userAgent.toLowerCase();
return (ua.indexOf('msie') >= 0 || ua.indexOf('trident') >= 0);
};
/**
* IEバージョン取得
* @returns {string} IEバージョン
*/
Beauty.prototype.getMsieVersion = function() {
var browserVer = '0';
var ua = window.navigator.userAgent.toLowerCase();
var array;
if(ua.indexOf('msie') >= 0 || ua.indexOf('trident') >= 0) {
array = /(msie|rv:?)\s?([\d\.]+)/.exec(ua);
browserVer = (array) ? array[2] : '0';
}
return browserVer;
};
window.Beauty = Beauty;
return new Beauty();
})(window);