/**
* 一覧ページ検索サイドバー
* 条件検索・掲載中(?view=all): #searchForm(条件検索と同一 DOM)
* 駅・エリア: data-station-filter-form(絞り込み専用フォーム)
*/
(function (root, factory) {
if (typeof module === 'object' && module.exports) {
module.exports = factory();
} else {
root.StationSearchSidebar = factory();
}
})(typeof globalThis !== 'undefined' ? globalThis : this, function () {
'use strict';
function escHtml(s) {
return String(s == null ? '' : s)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"');
}
function publicPathPrefix() {
if (typeof globalThis !== 'undefined' && globalThis.RakusumoPublicPath && typeof globalThis.RakusumoPublicPath.getPrefix === 'function') {
return globalThis.RakusumoPublicPath.getPrefix();
}
if (typeof globalThis !== 'undefined' && typeof globalThis.__RAKUSUMO_PUBLIC_PATH_PREFIX__ === 'string') {
return globalThis.__RAKUSUMO_PUBLIC_PATH_PREFIX__;
}
return '';
}
function publicSiteHref(segment) {
var pre = publicPathPrefix();
var seg = String(segment == null ? '' : segment).replace(/^\/+|\/+$/g, '');
if (!seg) return pre === '' ? '/' : pre + '/';
return (pre === '' ? '' : pre) + '/' + seg + '/';
}
var RENT_MIN_OPTIONS = [
{ value: '40000', label: '4万円以上' },
{ value: '50000', label: '5万円以上' },
{ value: '60000', label: '6万円以上' },
{ value: '70000', label: '7万円以上' },
{ value: '80000', label: '8万円以上' },
{ value: '90000', label: '9万円以上' },
];
var RENT_MAX_OPTIONS = [
{ value: '60000', label: '6万円以下' },
{ value: '70000', label: '7万円以下' },
{ value: '80000', label: '8万円以下' },
{ value: '90000', label: '9万円以下' },
{ value: '100000', label: '10万円以下' },
{ value: '120000', label: '12万円以下' },
{ value: '150000', label: '15万円以下' },
{ value: '200000', label: '20万円以下' },
];
var LAYOUT_OPTIONS = ['1R', '1K', '1DK', '1LDK', '2K', '2DK', '2LDK', '3K', '3DK', '3LDK+'];
var WALK_OPTIONS = [
{ value: '5', label: '5分以内' },
{ value: '7', label: '7分以内' },
{ value: '10', label: '10分以内' },
{ value: '15', label: '15分以内' },
];
var BUILT_OPTIONS = [
{ value: 'new', label: '新築・築浅' },
{ value: '5', label: '築5年以内' },
{ value: '10', label: '築10年以内' },
{ value: '20', label: '築20年以内' },
{ value: '30', label: '築30年以内' },
];
var WARD_OPTIONS = ['横浜市青葉区', '横浜市緑区', '町田市'];
/** フォーム表示用(条件検索と同一) */
var KODAWARI_TILES = [
{ name: 'k_pet', label: 'ペット相談・ペット可', feature: 'pet' },
{ name: 'k_bt', label: 'バス・トイレ別', feature: 'btSep' },
{ name: 'k_parking', label: '駐車場あり', feature: 'parking' },
{ name: 'k_autolock', label: 'オートロック', feature: 'autolock' },
{ name: 'k_netfree', label: 'ネット無料', feature: 'netfree' },
{ name: 'k_laundry', label: '室内洗濯機置場', feature: 'laundry' },
{ name: 'k_reheat', label: '追い焚き', feature: 'reheat' },
{ name: 'k_sink', label: '独立洗面台', feature: 'sink' },
{ name: 'k_ac', label: 'エアコン', feature: 'ac' },
{ name: 'k_floor2', label: '2階以上', feature: 'floor2' },
{ name: 'k_corner', label: '角部屋', feature: 'corner' },
{ name: 'k_nosk', label: '敷金なし', feature: 'nosk' },
{ name: 'k_nokey', label: '礼金なし', feature: 'nokey' },
{ name: 'k_noskm', label: '敷金・礼金なし', feature: 'noskm' },
];
function selectOptionsHtml(options, emptyLabel) {
return (
'' +
options
.map(function (o) {
return '';
})
.join('')
);
}
function sidebarCountLoadingHtml() {
if (typeof PropertyListCount !== 'undefined' && PropertyListCount.loadingInnerHtml) {
return PropertyListCount.loadingInnerHtml();
}
return (
'物件を読み込み中…'
);
}
function kodawariTilesHtml() {
return KODAWARI_TILES.map(function (t) {
return (
''
);
}).join('');
}
function wardTilesHtml() {
return WARD_OPTIONS.map(function (w) {
return (
''
);
}).join('');
}
function layoutTilesHtml() {
return LAYOUT_OPTIONS.map(function (lv) {
return (
''
);
}).join('');
}
function hiddenInputsHtml(hidden) {
hidden = hidden || {};
return Object.keys(hidden)
.map(function (k) {
return (
''
);
})
.join('');
}
/** 条件検索 rssg_render_search_filters_form_html と同一構造 */
function renderSearchFiltersFormHtml(opts) {
opts = opts || {};
var action = escHtml(opts.formAction || publicSiteHref('search'));
var hidden = hiddenInputsHtml(opts.hidden || {});
return (
'
'
);
}
var STATION_KODAWARI_TILES = [
{ name: 'k_pet', label: 'ペット相談・ペット可', feature: 'pet' },
{ name: 'k_bt', label: 'バス・トイレ別', feature: 'btSep' },
{ name: 'k_parking', label: '駐車場あり', feature: 'parking' },
{ name: 'k_autolock', label: 'オートロック', feature: 'autolock' },
{ name: 'k_netfree', label: 'ネット無料', feature: 'netfree' },
{ name: 'k_laundry', label: '室内洗濯機置場', feature: 'laundry' },
{ name: 'k_sink', label: '独立洗面台', feature: 'sink' },
{ name: 'k_ac', label: 'エアコン', feature: 'ac' },
{ name: 'k_floor2', label: '2階以上', feature: 'floor2' },
{ name: 'k_noskm', label: '敷金・礼金なし', feature: 'noskm' },
];
var AREA_MIN_OPTIONS = [
{ value: '20', label: '20㎡以上' },
{ value: '25', label: '25㎡以上' },
{ value: '30', label: '30㎡以上' },
{ value: '40', label: '40㎡以上' },
{ value: '50', label: '50㎡以上' },
];
var AREA_MAX_OPTIONS = [
{ value: '30', label: '30㎡以下' },
{ value: '40', label: '40㎡以下' },
{ value: '50', label: '50㎡以下' },
{ value: '60', label: '60㎡以下' },
{ value: '80', label: '80㎡以下' },
];
function stationKodawariTilesHtml() {
return STATION_KODAWARI_TILES.map(function (t) {
return (
''
);
}).join('');
}
/** 駅・エリア用絞り込みフォーム(条件検索フォーム丸ごとではない) */
function renderStationFilterFormHtml(opts) {
opts = opts || {};
var regionFixedHtml = '';
if (opts.regionKind === 'area' && opts.regionLabel) {
regionFixedHtml =
'エリア
' +
'
' +
escHtml(opts.regionLabel) +
'
';
}
return (
''
);
}
function renderStationFilterSidebarHtml(countNum, opts) {
opts = opts || {};
var title = escHtml(opts.title || '絞り込み検索');
var lead = escHtml(
opts.lead ||
(opts.regionKind === 'area' && opts.regionLabel
? '条件を選ぶと、' + opts.regionLabel + 'の物件だけを絞り込めます。'
: opts.regionKind === 'station' && opts.regionLabel
? '条件を選ぶと、' + opts.regionLabel + '周辺の物件だけを絞り込めます。'
: '賃料・間取り・設備条件で物件を絞り込めます。'),
);
var countHtml =
typeof countNum === 'number' && countNum >= 0
? '該当 ' +
escHtml(String(countNum)) +
'件'
: sidebarCountLoadingHtml();
return (
''
);
}
function renderFilterSidebarHtml(countNum, opts) {
opts = opts || {};
var title = escHtml(opts.title || '検索条件');
var lead = escHtml(
opts.lead ||
(opts.regionKind === 'area' && opts.regionLabel
? '条件を選ぶと、' + opts.regionLabel + 'の物件だけを絞り込めます。'
: opts.regionKind === 'station' && opts.regionLabel
? '条件を選ぶと、' + opts.regionLabel + '周辺の物件だけを絞り込めます。'
: '条件を変更すると結果に反映されます。'),
);
var regionFixedHtml = '';
if (opts.regionKind === 'area' && opts.regionLabel) {
regionFixedHtml =
'エリア
' +
'
' +
escHtml(opts.regionLabel) +
'
';
} else if (opts.regionKind === 'station' && opts.regionLabel) {
regionFixedHtml =
'駅
' +
'
' +
escHtml(opts.regionLabel) +
'
';
}
var formHtml = renderSearchFiltersFormHtml({
formAction: opts.formAction || publicSiteHref('search'),
hidden: opts.hidden || {},
regionFixedHtml: regionFixedHtml,
});
return (
''
);
}
function kodawariCheckboxNames() {
return KODAWARI_TILES.map(function (t) {
return t.name;
});
}
function kodawariFeaturesFromForm(form) {
if (!form) return [];
var out = [];
KODAWARI_TILES.forEach(function (t) {
if (!t.feature) return;
var el = form.querySelector('[name="' + t.name + '"]');
if (el && el.checked) out.push(t.feature);
});
return out;
}
function setFieldValue(form, sel, v) {
if (v == null || v === '') return;
var el = form.querySelector(sel);
if (el && 'value' in el) el.value = v;
}
function applyFormFromUrl(form, params, opts) {
if (!form || !params) return;
opts = opts || {};
form.querySelectorAll('input[type="checkbox"]').forEach(function (inp) {
inp.checked = false;
});
form.querySelectorAll('select').forEach(function (sel) {
sel.value = '';
});
var areaKw = form.querySelector('#areaKw');
if (areaKw) areaKw.value = params.get('areaKw') || params.get('q') || '';
setFieldValue(form, '#rentMin', params.get('rentMin') || '');
setFieldValue(form, '#rentMax', params.get('rentMax') || '');
setFieldValue(form, '#walkMax', params.get('walkMax') || '');
setFieldValue(form, '#built', params.get('built') || params.get('builtAgeMax') || '');
var wardRaw = params.get('ward');
if (wardRaw) {
wardRaw.split(',').forEach(function (raw) {
var n = decodeURIComponent(String(raw || '').trim());
if (!n) return;
var inp = Array.prototype.slice
.call(form.querySelectorAll('input[name="ward"]'))
.find(function (i) {
return i.value === n;
});
if (inp) inp.checked = true;
});
}
var layoutValues = params.getAll('layout');
if (!layoutValues.length && params.get('layout')) layoutValues = [params.get('layout')];
Array.prototype.forEach.call(form.querySelectorAll('input[name="layout"]'), function (inp) {
inp.checked = layoutValues.indexOf(inp.value) >= 0;
});
kodawariCheckboxNames().forEach(function (k) {
var cb = form.querySelector('[name="' + k + '"]');
if (cb) cb.checked = params.get(k) === 'on' || params.get(k) === '1';
});
var stValues = params.getAll('st');
if (!stValues.length && params.get('st')) stValues = [params.get('st')];
Array.prototype.forEach.call(form.querySelectorAll('input[name="st"]'), function (inp) {
inp.checked =
stValues.indexOf(inp.value) >= 0 ||
stValues.indexOf(inp.value.replace(/駅$/, '')) >= 0 ||
stValues.indexOf(inp.value + '駅') >= 0;
});
if (opts.lockStation && opts.lockStationLabel) {
var lockName = String(opts.lockStationLabel).replace(/駅$/, '') + '駅';
Array.prototype.forEach.call(form.querySelectorAll('input[name="st"]'), function (inp) {
inp.checked = inp.value === lockName || inp.value === opts.lockStationLabel;
});
}
if (opts.lockWard && opts.lockWardLabel) {
Array.prototype.forEach.call(form.querySelectorAll('input[name="ward"]'), function (inp) {
inp.checked = inp.value === opts.lockWardLabel;
});
}
syncAccordionOpenState(form);
}
function syncUrlFromForm(form, baseUrl, opts) {
if (!form) return;
opts = opts || {};
try {
var u = new URL(baseUrl || location.href);
var preserve = opts.preserveParams || [];
preserve.forEach(function (k) {
if (!u.searchParams.has(k) && opts.staticParams && opts.staticParams[k]) {
u.searchParams.set(k, opts.staticParams[k]);
}
});
if (opts.staticParams) {
Object.keys(opts.staticParams).forEach(function (k) {
u.searchParams.set(k, opts.staticParams[k]);
});
}
[
'areaKw',
'rentMin',
'rentMax',
'walkMax',
'built',
'sort',
'q',
].forEach(function (k) {
u.searchParams.delete(k);
});
u.searchParams.delete('layout');
kodawariCheckboxNames().forEach(function (k) {
u.searchParams.delete(k);
});
u.searchParams.delete('st');
u.searchParams.delete('ward');
var areaKwEl = form.querySelector('#areaKw');
var areaKw = areaKwEl ? String(areaKwEl.value || '').trim() : '';
if (areaKw) u.searchParams.set('areaKw', areaKw);
['rentMin', 'rentMax', 'walkMax', 'built'].forEach(function (name) {
var el = form.querySelector('[name="' + name + '"]');
if (el && el.value) u.searchParams.set(name, el.value);
});
Array.prototype.forEach.call(form.querySelectorAll('input[name="layout"]:checked'), function (inp) {
u.searchParams.append('layout', inp.value);
});
Array.prototype.forEach.call(form.querySelectorAll('input[name="st"]:checked'), function (inp) {
u.searchParams.append('st', inp.value);
});
Array.prototype.forEach.call(form.querySelectorAll('input[name="ward"]:checked'), function (inp) {
u.searchParams.append('ward', inp.value);
});
kodawariCheckboxNames().forEach(function (k) {
var cb = form.querySelector('[name="' + k + '"]');
if (cb && cb.checked) u.searchParams.set(k, 'on');
});
var qs = u.searchParams.toString();
history.replaceState(null, '', u.pathname + (qs ? '?' + qs : '') + (u.hash || ''));
} catch (_e) {
/* noop */
}
}
function formHasActiveFilters(form) {
if (!form) return false;
var areaKw = form.querySelector('#areaKw');
if (areaKw && String(areaKw.value || '').trim()) return true;
if (form.querySelector('input[name="ward"]:checked')) return true;
if (form.querySelector('input[name="st"]:checked')) return true;
if (form.querySelector('input[name="layout"]:checked')) return true;
var selects = ['rentMin', 'rentMax', 'walkMax', 'built', 'areaMin', 'areaMax'];
for (var i = 0; i < selects.length; i++) {
var el = form.querySelector('[name="' + selects[i] + '"]');
if (el && el.value) return true;
}
for (var ki = 0; ki < KODAWARI_TILES.length; ki++) {
var cb = form.querySelector('[name="' + KODAWARI_TILES[ki].name + '"]');
if (cb && cb.checked) return true;
}
for (var si = 0; si < STATION_KODAWARI_TILES.length; si++) {
var scb = form.querySelector('[name="' + STATION_KODAWARI_TILES[si].name + '"]');
if (scb && scb.checked) return true;
}
return false;
}
function accordionBodyHasActiveFields(body) {
if (!body) return false;
var selects = body.querySelectorAll('select');
for (var i = 0; i < selects.length; i++) {
if (String(selects[i].value || '').trim() !== '') return true;
}
var checks = body.querySelectorAll('input[type="checkbox"]:checked');
for (var j = 0; j < checks.length; j++) {
if (checks[j].id === 'stationShowAll') continue;
return true;
}
var textInputs = body.querySelectorAll('input[type="search"], input[type="text"]');
for (var k = 0; k < textInputs.length; k++) {
if (String(textInputs[k].value || '').trim() !== '') return true;
}
return false;
}
function syncAccordionOpenState(form) {
if (!form) return;
form.querySelectorAll('.tp-search-acc').forEach(function (det) {
var body = det.querySelector('.tp-search-acc__body');
if (accordionBodyHasActiveFields(body)) {
det.setAttribute('open', '');
} else {
det.removeAttribute('open');
}
});
}
return {
renderFilterSidebarHtml: renderFilterSidebarHtml,
renderStationFilterSidebarHtml: renderStationFilterSidebarHtml,
renderStationFilterFormHtml: renderStationFilterFormHtml,
renderSearchFiltersFormHtml: renderSearchFiltersFormHtml,
kodawariFeaturesFromForm: kodawariFeaturesFromForm,
kodawariCheckboxNames: kodawariCheckboxNames,
applyFormFromUrl: applyFormFromUrl,
syncUrlFromForm: syncUrlFromForm,
formHasActiveFilters: formHasActiveFilters,
syncAccordionOpenState: syncAccordionOpenState,
KODAWARI_TILES: KODAWARI_TILES,
};
});