/**
* 掲載中一覧(list.js createBuildingCard)と同じ building-card HTML を共有。
* TOP 新着・条件検索・view=all で同一の画像集約・カード構造を使う。
*/
(function (root, factory) {
if (typeof module === 'object' && module.exports) {
module.exports = factory();
} else {
root.BuildingListCard = factory();
}
})(typeof globalThis !== 'undefined' ? globalThis : this, function () {
'use strict';
var LCI = typeof ListCardImages !== 'undefined' ? ListCardImages : null;
var PPI = typeof PropertyPublicImageUrl !== 'undefined' ? PropertyPublicImageUrl : null;
function text(v, fb) {
var s = v == null ? '' : String(v).trim();
return s || (fb == null ? '' : fb);
}
function escAttr(s) {
return String(s == null ? '' : s)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(//g, '>');
}
function sanitizeUrl(u) {
u = text(u, '');
if (!u) return '';
if (PPI && PPI.sanitize) return PPI.sanitize(u);
return u;
}
function enrichRow(row) {
if (LCI && LCI.enrichListRowForCard) return LCI.enrichListRowForCard(row);
return row;
}
function enrichGroup(group) {
group = group || { representative: {}, rooms: [] };
if (group.representative) group.representative = enrichRow(group.representative);
if (group.rooms) {
group.rooms = group.rooms.map(function (r) {
return enrichRow(r);
});
}
return group;
}
function normalizeImageKind(kindText) {
var t = text(kindText, '').toLowerCase();
if (!t) return 'other';
if (LCI && LCI.classifyListImageKind && kindText && typeof kindText === 'object') {
return LCI.classifyListImageKind(kindText);
}
var known = ['exterior', 'building', 'facade', 'appearance', 'room', 'living', 'interior', 'common', 'other', 'floorplan'];
if (known.indexOf(t) >= 0) return t;
if (t.indexOf('外観') >= 0 || t.indexOf('exterior') >= 0) return 'exterior';
if (t.indexOf('建物') >= 0 || t.indexOf('building') >= 0) return 'building';
if (t.indexOf('間取') >= 0 || t.indexOf('floorplan') >= 0 || t.indexOf('madori') >= 0) return 'floorplan';
return 'other';
}
function collectCardImages(row) {
var out = [];
var seen = Object.create(null);
var items = LCI && LCI.collectCardImageItemsForRow ? LCI.collectCardImageItemsForRow(row) : [];
items.forEach(function (item) {
var src = sanitizeUrl(text(item && item.src, ''));
if (!src || seen[src]) return;
seen[src] = true;
var kind =
LCI && LCI.classifyListImageKind && item.raw
? LCI.classifyListImageKind(item.raw)
: normalizeImageKind(text(item && item.kind, ''));
out.push({ src: src, kind: kind, raw: item.raw });
});
return out;
}
function collectOrderedUrlsForBuildingGroup(group) {
if (LCI && LCI.collectOrderedUrlsForBuildingGroup) {
return LCI.collectOrderedUrlsForBuildingGroup(group);
}
var ordered = [];
var seen = Object.create(null);
function pushUrl(u) {
u = sanitizeUrl(text(u, ''));
if (!u || seen[u]) return;
seen[u] = true;
ordered.push(u);
}
var rep = group && group.representative;
if (rep && LCI && LCI.collectOrderedUrlsForRow) {
LCI.collectOrderedUrlsForRow(rep).forEach(pushUrl);
} else if (rep) {
collectCardImages(rep).forEach(function (it) {
pushUrl(it.src);
});
}
(group && group.rooms ? group.rooms : []).forEach(function (r) {
if (LCI && LCI.collectOrderedUrlsForRow) {
LCI.collectOrderedUrlsForRow(r).forEach(pushUrl);
} else {
collectCardImages(r).forEach(function (it) {
pushUrl(it.src);
});
}
});
return ordered;
}
function urlKindOverlayForBuildingGroup(group) {
if (LCI && LCI.urlKindOverlayForBuildingGroup) {
return LCI.urlKindOverlayForBuildingGroup(group);
}
var o = Object.create(null);
collectCardImages(group.representative).forEach(function (it) {
if (it.src) o[it.src] = it.kind || 'other';
});
(group.rooms || []).forEach(function (r) {
collectCardImages(r).forEach(function (it) {
if (it.src) o[it.src] = it.kind || 'other';
});
});
return o;
}
function urlKindOverlayFromRow(row) {
if (LCI && LCI.urlKindOverlayFromRow) return LCI.urlKindOverlayFromRow(row);
var o = Object.create(null);
collectCardImages(row).forEach(function (it) {
if (it.src) o[it.src] = it.kind || 'other';
});
return o;
}
function collectOrderedUrlsForRow(row) {
if (LCI && LCI.collectOrderedUrlsForRow) return LCI.collectOrderedUrlsForRow(row);
return collectCardImages(row)
.map(function (it) {
return it.src;
})
.filter(Boolean);
}
function buildUrlKindMapFromRow(row) {
if (LCI && LCI.urlKindOverlayFromRow) return LCI.urlKindOverlayFromRow(row);
return urlKindOverlayFromRow(row);
}
function mergeCardSliderSlides(mainImage, orderedUrls, row, urlKindOverlay) {
var urls = [];
var kinds = [];
var kindMap = Object.assign(Object.create(null), buildUrlKindMapFromRow(row), urlKindOverlay || {});
var seen = Object.create(null);
function kindOf(u) {
return kindMap[u] || 'other';
}
function push(u) {
u = sanitizeUrl(text(u, ''));
if (!u || seen[u]) return;
seen[u] = true;
urls.push(u);
kinds.push(kindOf(u));
}
push(mainImage);
if (Array.isArray(orderedUrls)) {
for (var j = 0; j < orderedUrls.length; j++) push(orderedUrls[j]);
}
collectCardImages(row).forEach(function (it) {
push(it.src);
});
return { urls: urls, kinds: kinds };
}
function rotateSlides(urls, kinds) {
if (LCI && LCI.rotateSlidesByPreferredKind) {
return LCI.rotateSlidesByPreferredKind(urls, kinds);
}
return { urls: urls, kinds: kinds };
}
var BUILDING_KIND_PREF = [
'exterior',
'building',
'facade',
'appearance',
'room',
'living',
'interior',
'common',
'other',
'floorplan',
];
function pickByKind(items, preferred) {
if (!Array.isArray(items) || !items.length) return '';
var i;
for (i = 0; i < preferred.length; i++) {
var k = preferred[i];
var hit = items.find(function (x) {
return normalizeImageKind(text(x && x.kind, '')) === k && text(x && x.src, '');
});
if (hit) return sanitizeUrl(hit.src);
}
var any = items.find(function (x) {
return text(x && x.src, '');
});
return any ? sanitizeUrl(any.src) : '';
}
function pickBuildingImageForGroup(group) {
var all = [];
if (group && group.representative) {
all = all.concat(collectCardImages(group.representative));
}
(group.rooms || []).forEach(function (r) {
all = all.concat(collectCardImages(r));
});
return pickByKind(all, BUILDING_KIND_PREF);
}
function pickRoomFloorplanImage(row, fallback) {
var items = collectCardImages(row);
var src = pickByKind(items, ['floorplan', 'madori', '間取り', 'other', 'interior']);
return src || fallback || '';
}
function cardPhotoSliderInnerClass(wrapperBase) {
var w = text(wrapperBase, 'building-card__photo');
if (w.indexOf('building-card__photo') >= 0) {
return 'building-card__photo-inner card-photo-slider-inner';
}
if (w.indexOf('room-row__thumb') >= 0) {
return 'list-card-thumb-inner card-photo-slider-inner';
}
return 'card-photo-slider-inner';
}
function renderCardImageSliderHtml(mainImage, title, mergedUrls, opts) {
opts = opts || {};
var roomThumbNoSlider = !!opts.roomThumbNoSlider;
var kinds =
Array.isArray(opts.imageKinds) && opts.imageKinds.length === mergedUrls.length
? opts.imageKinds
: mergedUrls.map(function () {
return 'photo';
});
var firstImage = sanitizeUrl(text(mainImage, ''));
if (!firstImage && mergedUrls.length) firstImage = mergedUrls[0];
var hasMany = mergedUrls.length > 1 && !roomThumbNoSlider;
var wrapperBase = text(opts.wrapperBase, 'building-card__photo');
var firstKind = kinds[0] === 'floorplan' ? 'floorplan' : 'photo';
var wrapCls = wrapperBase + (firstKind === 'floorplan' ? ' is-floorplan' : '') + (hasMany ? ' js-card-slider' : '');
var alt = text(title, '物件画像');
var inner = '';
if (firstImage) {
var imgHtml =
'';
if (roomThumbNoSlider) {
inner = imgHtml;
} else if (hasMany) {
inner =
'
' + h(rent) + '
'; return ( '' + h(mgmt) + ' / ' + h(dep) + ' / ' + h(key) + '
' + '' + h(layout) + ' ・ ' + h(area) + ' ・ ' + h(floorSummaryRoom) + '
' + '