');
let lwtprcset = false;
let totalRoom = 0;
$jQ.each(rmA, function(i, rmO) {
var rmJ = $jQ(`
`);
var rmOptsCtrJ = $jQ('.rm-prc-opts', rmJ);
opts = $jQ.extend({}, {grpByRtCd:true, maxCnt:2, validRooms: rmUIds, rmNo: rmNo}, opts || {});
if (!me.hSel.opts.prHtlSrch && opts.isMultiRmType && opts.selectedPrIds && !lwtprcset) {
me.lwtPrcArr = me.lwtPrcArr || {};
me.lwtPrcArr[opts.hId] = me.lwtPrcArr[opts.hId] || {};
let rmQty = opts.selectedPrIds.length;
let prc = opts.prIdPrc[rmNo < rmQty ? rmNo : rmQty -1] - opts.prcEncKey;
me.lwtPrcArr[opts.hId][rmNo] = prc;
lwtprcset = true;
}
let rmCnt = populateRoomOpts(rmO, rmO.roptA, rmOptsCtrJ, opts);
totalRoom += rmCnt;
if ($jQ('.rmOptItm', rmOptsCtrJ).length <= 0) return true;
rmsJ.append(rmJ);
});
if (totalRoom == 1 && me.isRmWSrch){
let mrJ = $jQ(`
`).appendTo(rmsJ);
$jQ('a', mrJ).click(function() {
me.hSel.hSrchBx.roomSrch = true;
me.advSrch = true
me.hSel.hSrchBx.searchRoom(parseInt($jQ(this).attr('rm-no')));
if (me.isRmWSrch) {
$jQ(this).parent().addClass('hide')
}
return false;
});
}
if (isSrt) {
$jQ('.rm-itm', rmsJ).sort(function(a, b) {
var aJ = $jQ(a), aOpt = $jQ('.rmOptItm:first', aJ).data('room-opt'), aprc = aOpt ? (aOpt.opr ? aOpt.opr: aOpt.pr): 0;
var bJ = $jQ(b), bOpt = $jQ('.rmOptItm:first', bJ).data('room-opt'), bprc = bOpt ? (bOpt.opr ? bOpt.opr: bOpt.pr): 0;
if (aprc && bprc) return aprc - bprc;
return (aprc == bprc) ? 0: bprc - aprc;
}).each(function(_, pJ) {
$jQ(pJ).parent().append(pJ);
});
}
$jQ('.rm-itm .rm--dsc', rmsJ).truncate({max_length:150});
var rmCtrJ = opts.isMultiRmType || opts.roomSrch ? $jQ(`.rm-${rmNo}`, ctrJ) : ctrJ;
var ermsJ = $jQ('.rms-lst', rmCtrJ);
if (ermsJ.length > 0) {
ermsJ.replaceWith(rmsJ);
} else {
rmCtrJ.append(rmsJ);
}
let rmIdx = parseInt(opts.defaultRm || 0);
if (opts.isMultiRmType || opts.autoSelect) {
//Auto select lowest price Rooms or the selected rooms
var roomToSelect = $jQ(`.rmOptItm:eq(`+rmIdx+`)`, rmsJ);
// var selectedPrIdList = opts.selectedPrIds;
if (opts.selectedPrIds) {
let prIdsLen = opts.selectedPrIds.length;
var selectedPrId = opts.selectedPrIds[prIdsLen > rmNo ? rmNo : prIdsLen - 1];
// Find the room with matching prId in the data
roomToSelect = $jQ(`.rmOptItm`, rmsJ).filter(function() {
var roomOptData = $jQ(this).data('roomOpt');
return roomOptData && roomOptData.prId === selectedPrId;
});
if (!opts.isFilter) {
if (!roomToSelect || roomToSelect.length == 0) {
roomToSelect = $jQ(`.rmOptItm:eq(`+rmIdx+`)`, rmsJ)
if (roomToSelect && roomToSelect.length > 0) {
me.selectedPrcArr.splice(rmNo, me.prcArr.length, roomToSelect.data('roomOpt').absPrc);
}
if (opts.prIdPrc && opts.prIdPrc.length > 0) {
let prc = opts.prIdPrc[prIdsLen > rmNo ? rmNo : prIdsLen - 1] - opts.prcEncKey;
me.selectedPrcArr.splice(rmNo, me.prcArr.length, parseInt(prc));
}
} else {
me.selectedPrcArr.splice(rmNo, me.prcArr.length, roomToSelect.data('roomOpt').absPrc);
}
}
}
selectRoom(roomToSelect, rmNo, ctrJ, opts);
}
}
var populateMultiRooms = function (rmA, ctrJ, isSrt, opts) {
var nRMap = me.dtlO.rmCfg.nRMap || {};
var rmPaxTxt = me.dtlO.rmCfg.rmPaxTxt || [];
$jQ.each(nRMap, function (i, cmb) {
var headerDiv = $jQ(`
`);
headerDiv.appendTo(ctrJ);
});
var rmUIds = Object.keys(nRMap[0]);
//check default room available for all the occupancy
let defaultRm = 0;
for (let rmUId in rmUIds) {
defaultRm = rmUId;
let rmValid = true;
for(var i = 1; i < Object.keys(nRMap).length - 1; i++) {
if(!nRMap[i][defaultRm] || nRMap[i][defaultRm].length == 0){
rmValid = false;
break;
}
}
if(rmValid) break;
}
opts = $jQ.extend({}, {rmNo: 0, rmUIds: rmUIds, isMultiRmType: true, defaultRm : defaultRm}, opts || {});
populateRooms(rmA, ctrJ, isSrt, opts);
// $jQ('.cntToBk', me.dtlOptsCtrJ).click(function (e) {
// return me.cntToBook(e);
// });
}
var showNextRooms = function (selectedRoomType, rmNo, ctrJ, opts) {
opts = opts || {};
var rmUIds = getNextRooms(selectedRoomType, rmNo);
if (rmUIds.length === 0 && (!me.mltrmdtlO.rmCfg.nRMap || rmNo == me.mltrmdtlO.rmCfg.nRMap.length -1)) {
var selectedTotalPrice = me.selectedPrcArr.reduce((currentSum, currentValue) => currentSum + currentValue, 0);
var totalPrice = me.prcArr.reduce((currentSum, currentValue) => currentSum + currentValue, 0);
var priceDiff = totalPrice
var sign = "";
if (!me.hSel.opts.prHtlSrch && opts.shwPrcDiff) {
if (!isNaN(selectedTotalPrice) && !isNaN(totalPrice)) {
priceDiff = totalPrice - selectedTotalPrice;
sign = (priceDiff >= 0) ? "+ " : "- "
priceDiff = Math.abs(priceDiff);
} else {
priceDiff = 0;
$jQ(".slctd-rm .rmOptPrcCtr .prcD", ctrJ).each(function(i, obj){
let prc = obj.innerText.replace(/^\D+/g, '');
if (prc.length > 0){
sign = obj.innerText.charAt(0);
if (sign == "+") priceDiff += parseInt(prc.replace(",", ""));
else if(sign == "-") priceDiff -= parseInt(prc.replace(",", ""))
}
});
priceDiff = Math.abs(priceDiff);
}
}
$jQ('.ttlPrc .prc', me.dtlOptsCtrJ).html(`${!me.hSel.opts.prHtlSrch && opts.shwPrcDiff ? sign : ''} ${me.dtlO.roptA ? me.dtlO.roptA[0].cur : me.dtlO.rmA[0].roptA[0].cur} ${priceDiff.toLocaleString()}`);
$jQ('.ttlPrc .txt', me.dtlOptsCtrJ).html('Total Price');
$jQ('.htlRmBk', me.dtlOptsCtrJ).show();
return;
}
populateRooms(me.dtlO.rmA, ctrJ, false, {rmNo: rmNo + 1, hId: opts.hId, rmUIds: rmUIds, isMultiRmType: true, isFilter: opts.isFilter, selectedPrIds : opts.selectedPrIds, shwPrcDiff: opts.shwPrcDiff, prcEncKey : opts.prcEncKey, prIdPrc : opts.prIdPrc});
}
var getNextRooms = function (selectedRoomType, rmNo) {
if (me.mltrmdtlO) me.dtlO = me.mltrmdtlO;
var nRMap = me.dtlO.rmCfg.nRMap || {};
var uId = selectedRoomType.uId;
return nRMap[rmNo][uId];
}
var populateRoomOpts = function(rmO, rmA, ctrJ, opts) {
opts = $jQ.extend({}, {maxCnt:-1, grpByRtCd:false}, opts || {});
var topRmA = [], rtCdGrpO = {};
rmA = rmA.filter((rO) => {
var isValid = true;
$jQ.each(me.fltrOpts, function(typ, fItm) {
if (opts.validRooms && !opts.validRooms.includes(rO.uId)) {
isValid = false; return false;
}
if (!fItm.txt && !fItm.sltd && !fItm.rfsltd && (!fItm.applA || fItm.applA.length == 0)) return true;
if (typ == 'search-rm') {
if (fItm.txt && (rO.name.toLowerCase().indexOf(fItm.txt) < 0 && (rO.key && rO.key.join(' ').toLowerCase().indexOf(fItm.txt) < 0))) {
isValid = false; return false;
}
} else if (typ == 'rm-combo') {
if (fItm.sltd && (!rmO || !rmO.iCmb)) {
isValid = false; return false;
}
} else if (typ == 'meal') {
if (fItm.applA.indexOf(rO.mp) < 0) {
isValid = false; return false;
}
} else if (typ == 'refundable') {
if (fItm.rfsltd && (rO.isNR || (!rO.isNR && !rO.xpSmry))) {
isValid = false; return false;
}
}
});
if (isValid && opts.grpByRtCd && rO.rtcd && !rtCdGrpO[rO.rtcd]) {
rtCdGrpO[rO.rtcd] = true; topRmA.push(rO);
return false;
}
return isValid;
});
if (topRmA.length > 0) {
rmA = topRmA.concat(rmA);
if (opts.maxCnt <= 0 || opts.maxCnt < topRmA.length) {
opts.maxCnt = topRmA.length;
}
}
var rCnt = 0, isAddMore = false, rCntInMr = 0, rCtrJ = ctrJ;
$jQ.each(rmA, function(i, rO) {
rCnt++;
if (opts.maxCnt > 0 && rCnt == opts.maxCnt + 1) {
isAddMore = true;
rCtrJ = $jQ('
').appendTo(ctrJ);
}
if (isAddMore) rCntInMr++;
var priceDiff = rO.prD, opriceDiff = rO.oprD;
// In the package flow, the price for each room type is displayed as the price difference for each room type (room 1 to n)
// by comparing it with the lowest priced room type within its respective room
// The price difference is computed as the difference between the current room type's price (rO.pr) and the lowest
// price of its room.
if (!me.hSel.opts.prHtlSrch && opts.isMultiRmType && opts.shwPrcDiff && me.lwtPrcArr[opts.hId] && me.lwtPrcArr[opts.hId][opts.rmNo]) {
priceDiff = rO.absPrc - me.lwtPrcArr[opts.hId][opts.rmNo];
var sign = (priceDiff >= 0) ? "+ " : "- "
priceDiff = sign + ' ' + rO.cur + ' ' + Math.abs(priceDiff).toLocaleString();
opriceDiff = null;
}
if (me.hSel.opts.prHtlSrch && rO.isRmWSrch && me.fltrOpts['adv-srch']) me.fltrOpts['adv-srch']['isAvl'] = true;
var optJ = $jQ(`
${rO.name}${rO.splTxtA ? ` `: ``}${rO.isTxfrInc ? `${JS_UTIL.getTranslated("Transfers_Included")} `: ``}${rO.selected ? `${JS_UTIL.getTranslated("selected")} `: ``}
${rO.mlD ? `
${rO.mlD}
`: ``}
${rO.key && rO.key.length > 0 ? `
${rO.key.length <= 3 ? `${rO.key.join(', ')}`: `
${rO.key.map((k) => `${k} `).join('')} `}
`: ``}
${rO.iOnRq ? `
On Request
`: ``}
${rO.offrA ? `${rO.offrA.map((offrO) => `
${offrO.tn} ${offrO.ttl}${offrO.tmA ? `Terms `: ``}
`).join('')}`: ``}
${rO.xpSmry ? `
${rO.xpSmry}
`: ``}
${rO.rtInf ? `
${rO.rtInf}
`: ``}
${opriceDiff ? `
${opriceDiff}
`: ``}
${priceDiff}
${JS_UTIL.getTranslated(rO.prQ)}
${rO.nprD ? `
${rO.nprD}
`: (rO.cmsD ? `
${rO.cmsD}
`: ``)}
${rO.cbeD || rO.cbrD ? `
${rO.cbeD ? `
${me.dtlO.cbeTxt} ${rO.cbeD}
`: ``}${rO.cbrD ? `
${me.dtlO.cbrTxt} ${rO.cbrD}
`: ``}
`: ``}
${rO.vchCd ? `
${rO.vchCd} coupon applied
`: ``}
${rO.iBlkAvl ? `
${me.dtlO.blkTxt ? me.dtlO.blkTxt: JS_UTIL.getTranslated('Block_pay_later')}
`: ``}
`).data('hotel-id', opts.hId).data('room-opt', rO).data('room-no', opts.rmNo).data('room-idx', rCnt).data('rmWise-srch', rO.isRmWSrch).appendTo(rCtrJ);
optJ.find('#rmOptActCtr').click(function (){
var rmOptItem = $jQ(this).closest('.rmOptItm');
var hId = rmOptItem.data('hotel-id');
var rmNo = rmOptItem.data('room-no');
var rO = rmOptItem.data('room-opt');
var isRmWSrch = rmOptItem.data('rmWise-srch');
if (me.hSel.origSrchO && me.hSel.origSrchO.paxes.rooms.length == 1) {
me.prIds.splice(rmNo, me.prIds.length, rO.prId);
me.cntToBook(this);
return false;
}
if (rmNo == 0) {
me.isRmWSrch = isRmWSrch;
if(!isRmWSrch) me.advSrch = isRmWSrch;
}
if (me.dtlO.rmCfg && me.dtlO.rmCfg.isMultiRmType || me.hSel.hSrchBx.roomSrch) {
me.lwtPrcArr[hId] = me.lwtPrcArr[hId] || {}
me.lwtPrcArr[hId][rmNo] = rO.absPrc;
selectRoom(rmOptItem, rmNo, undefined, {hId: hId, shwPrcDiff: opts.shwPrcDiff, prIdPrc: opts.prIdPrc, selectedPrIds : opts.selectedPrIds, prcEncKey : opts.prcEncKey, roomSrch : isRmWSrch});
} else {
me.prIds.splice(rmNo, me.prIds.length, rO.prId);
me.cntToBook(this);
}
JS_UTIL.scrollTo($jQ(`.rm-${rmNo}`), 200, {offset:-200});
return false;
})
if (rCnt >= 200) return false;
});
if (isAddMore) {
var mrJ = $jQ(`
`).appendTo(ctrJ);
$jQ('a', mrJ).click(function() {
var mrCtrJ = $jQ('.rmOptsMore', ctrJ);
mrCtrJ.toggleClass('hide');
$jQ(this).text(mrCtrJ.hasClass('hide') ? `Show ${rCntInMr} more`: `Show less`)
return false;
});
}
return rCnt;
}
var displayPrice = function(ctrJ) {
let priceDiff = 0;
if ($jQ(".slctd-rm .rmOptPrcCtr .prcD", ctrJ).length >= me.prIds.length) {
$jQ(".slctd-rm .rmOptPrcCtr .prcD", ctrJ).each(function(i, obj){
let prc = obj.innerText.replace(/^\D+/g, '');
if (prc.length > 0) {
sign = obj.innerText.charAt(0);
if (sign != "-") priceDiff += parseInt(prc.replace(",", ""));
else priceDiff -= parseInt(prc.replace(",", ""));
}
});
} else {
priceDiff = me.prcArr.reduce((currentSum, currentValue) => currentSum + currentValue, 0);
}
priceDiff = Math.abs(priceDiff);
$jQ('.ttlPrc .prc', me.dtlOptsCtrJ).html(`${!me.hSel.opts.prHtlSrch && opts.shwPrcDiff ? sign : ''} ${me.dtlO.roptA ? me.dtlO.roptA[0].cur : me.dtlO.rmA[0].roptA[0].cur} ${priceDiff.toLocaleString()}`);
$jQ('.ttlPrc .txt', me.dtlOptsCtrJ).html('Total Price');
$jQ('.htlRmBk', me.dtlOptsCtrJ).show();
}
var selectRoom = function (rmOptItem, rmNo, ctrJ, opts) {
opts = opts || {}
if (!rmOptItem || rmOptItem.length <= 0) {
return;
}
var rO = rmOptItem.data('room-opt');
// Remove all the selections of the rooms after this and add the selection of this room
me.prIds.splice(rmNo, me.prIds.length, rO.prId);
me.prcArr.splice(rmNo, me.prcArr.length, rO.absPrc);
ctrJ = ctrJ || me.dtlOptsCtrJ;
// changing the select option to selected
$jQ(`.rm-${rmNo} .rmOptActCtr .selected`, ctrJ).hide();
$jQ(`.rm-${rmNo} .rmOptActCtr a`, ctrJ).show();
rmOptItem.find('.rmOptActCtr a').hide();
rmOptItem.find('.selected').show();
showSelectedRoom(rmNo, rmOptItem, ctrJ);
if (opts.roomSrch) {
me.hSel.hSrchBx.roomSrch = true;
let totalRmCount = parseInt(me.hSel.hSrchBx.getQueryJSON().paxes.rooms.length);
if (parseInt(rmNo) < totalRmCount -1) {
me.hSel.hSrchBx.srchRmIdx = parseInt(rmNo);
me.hSel.hSrchBx.roomIds = rmNo ? me.hSel.hSrchBx.roomIds : [];
me.hSel.hSrchBx.roomIds[rmNo] = rO.prId;
if (me.advSrch) {
me.hSel.hSrchBx.searchRoom(rmNo + 1);
} else {
showNextRooms(rO, rmNo, ctrJ, opts);
}
return false;
} else {
displayPrice(ctrJ);
}
} else {
me.hSel.hSrchBx.roomSrch = false;
showNextRooms(rO, rmNo, ctrJ, opts);
}
}
var showSelectedRoom = function (rmNo, rmOptItem, ctrJ) {
$jQ(`.rm-${rmNo} .rms-lst`, ctrJ).addClass('hide');
var selectedRoom = $jQ(`.rm-${rmNo} .slctd-rm`, ctrJ).empty();
var rmItm = $jQ(rmOptItem).closest('.rm-itm').clone();
rmItm.find('.rm--nm').remove();
rmItm.find('.rm-prc-opts').empty().append(rmOptItem.clone());
$jQ(selectedRoom).append(rmItm).show();
$jQ(`.rm-${rmNo} .rm-header a`, ctrJ).removeClass('hide').text(JS_UTIL.getTranslated("Change_Rooms"));
}
this.init();
}
function HotelResults(hSel, rsltCtr) {
var me = this; me.hSel = hSel; me.rsltCtr = rsltCtr; me.srchO = null;
me.htls = []; me.htlKeys = {}; me.fltdHtls = []; me.isMapMode = false;
this.init = function() {
me.rsltLstCtr = $jQ(".hRsltLst", me.rsltCtr);
me.rsltMapCtr = $jQ(".hRsltMap", me.rsltCtr);
me.rsltFltrCtr = $jQ(".htlFltrsCtr", me.rsltCtr);
me.rsltSortCtr = $jQ(".htlSortCtr", me.rsltCtr);
me.rsltFltrApplCtr = $jQ(".hFltrApplCtr", me.rsltCtr);
me.rsltTlbrCtr = $jQ(".hRsltTlbr", me.rsltCtr);
me.rsltFltrOpnActCtr = $jQ(".hFltrOpnActCtr", me.rsltTlbrCtr);
me.rsltSdSctCtr = $jQ(".hRsltSdSct", me.rsltCtr);
me.rsltOvlyCtr = $jQ(".hRsltSdSctOvly", me.rsltCtr);
me.rsltTlbrScCtr = $jQ(".hRsltTlbrSec", me.rsltCtr);
me.rsltFltrOpnActCtr.click(function() {
me.rsltCtr.addClass('hSrchRslt-fopen');
return false;
});
me.rsltOvlyCtr.click(function() {
me.rsltCtr.removeClass('hSrchRslt-fopen');
return false;
});
}
this.onWindowScroll = function() {
if (!me.hFltrs || !me.hFltrs.fltrApplyJ) {return;}
var wH = $jQ(window).height(), wST = $jQ(window).scrollTop();
var fH = me.rsltFltrCtr.outerHeight(), fST = me.rsltFltrCtr.offset().top;
var loc = wH - (fST - wST);
if (me.rsltSdSctCtr.css('position') == 'fixed') {
me.hFltrs.fltrApplyJ.css('top', (loc - me.hFltrs.fltrApplyJ.outerHeight()) + 'px');
return;
}
if (loc < 350 || loc > fH) {
return;
}
me.hFltrs.fltrApplyJ.css('top', (loc - me.hFltrs.fltrApplyJ.outerHeight()) + 'px');
}
this.clear = function() {
me.htls = []; me.htlKeys = {}; me.fltdHtls = [];
me.rsltO = null; me.hFltrs = null; me.isMapMode = false;
}
this.hasResults = function() {
return !!me.rsltO;
}
this.setResults = function(rsltO, opts) {
me.htls = []; me.htlKeys = {}; me.fltdHtls = [];
me.rsltO = rsltO;
if (!me.hFltrs || !opts || !opts.isFltr) {
me.hFltrs = new HotelFilters(me.hSel, me);
}
if (!rsltO || !rsltO.rsltA) return;
me.srchO = rsltO.srchO;
if(!opts.prcEncKey) opts.prcEncKey = 0;
$jQ.extend(me.hSel.opts || {}, {prcEncKey : opts.prcEncKey, selectedPrIds : opts.selectedPrIds, prIdPrc : opts.prIdPrc});
me.hSel.opts.srhotels = me.srchO.srhotels;
$jQ.each(rsltO.rsltA, function(i, hO) {
var hItm = new HotelResultItem(me.hSel, me, i, hO);
me.htls.push(hItm); me.htlKeys[hO.id] = hItm;
});
}
this.showResults = function(opts) {
opts = $jQ.extend({}, {resetFltr:false}, opts || {});
me.hSel.setupScrollEvent();
if (opts.resetFltr) {
// me.hFltrs.resetApplied();
}
if (!opts.fltrClbk) {
opts.fltrClbk = function(sltdO, _opts) {
if (sltdO && sltdO.isSort) {
me.showResults(opts);
return;
}
opts.isFltr = true;
if (_opts && _opts.ovFltPrms) opts.ovFltPrms = _opts.ovFltPrms;
me.hSel.fetchResults(null, opts);
}
}
me.rsltOvlyCtr.click();
me.filter();
me.sort(me.hSel.curSort.fld, me.hSel.curSort.asc);
me.renderResultsFilters(opts);
// me.renderResultsToolbar(opts);
me.hSel.ctrJ.toggleClass('htlSrchOnMap', me.isMapMode);
me.rsltLstCtr.html('').toggleClass('hide', me.isMapMode && me.fltdHtls.length > 0);
if (me.rsltO.cdrGpsO) {
me.rsltCtr.addClass('hSrchRsltCrtMd');
var cdrLstJ = $jQ('
');
$jQ.each(me.rsltO.cdrGpsO.idA, function(i, cdrId) {
var cdrO = me.rsltO.cdrGpsO[cdrId];
var cdrJ = $jQ(`
${cdrO.nm}
`);
var hCnt = 0;
$jQ.each(cdrO.hIdA, function(j, hId) {
var hItm = me.htlKeys[hId];
if (!hItm) return true;
cdrJ.append(hItm.getNode().clone(true).attr('data-hotel-id', hItm.hO.id));
hCnt++;
});
if (hCnt == 0) {
return true;
}
me.rsltLstCtr.append(cdrJ);
cdrLstJ.append(`
`);
});
if (me.hSel.opts.isAllowHotelLookup) cdrLstJ.append(`
`);
me.rsltLstCtr.prepend(cdrLstJ);
$jQ('a', cdrLstJ).click(function() {
var cdrId = $jQ(this).attr('data-cdr-id');
if (!cdrId) {
if (opts && opts.fltrClbk) {
me.rsltCtr.removeClass('hSrchRsltCrtMd');
me.hSel.opts.isByAreaMode = false;
me.hSel.opts.isCdrGroupMode = false;
opts.fltrClbk();
}
return false;
}
JS_UTIL.scrollTo($jQ('.htlCdrGrp'+cdrId, me.rsltLstCtr), 200, {offset:-30});
return false;
});
if (me.hSel.opts.isAllowHotelLookup) {
me.rsltLstCtr.append($jQ(`'
`).click(function() {
if (opts && opts.fltrClbk) {
me.rsltCtr.removeClass('hSrchRsltCrtMd');
me.hSel.opts.isByAreaMode = false;
me.hSel.opts.isCdrGroupMode = false;
opts.fltrClbk();
}
return false;
}));
}
} else if (me.rsltO.mnAreaA) {
me.rsltCtr.addClass('hSrchRsltCrtMd');
var tabsJ = $jQ('
');
var mapCntJ = $jQ(`
`);
me.rsltLstCtr.append(tabsJ);
me.rsltLstCtr.append(mapCntJ);
var ctyArMap = new TFMap($jQ('.ctyArMap', mapCntJ), {map:{height:400}});
var mapArLstJ = $jQ('.areaLst', mapCntJ), arOnMapA = [];
$jQ.each(me.rsltO.mnAreaA, function(i, arDstO) {
var arCntJ = $jQ(`
${arDstO.dsc ? `
${arDstO.dsc}
`: ``}
${arDstO.whyA && arDstO.whyA.length > 0 ? `
${arDstO.whyA.map((why) => `${why} `).join('')} `: ``}
`);
var arSmryJ = $jQ(`
${arDstO.nm}
${arDstO.whyA && arDstO.whyA.length > 0 ? `
${arDstO.whyA.map((why) => `${why} `).join('')} `: `${arDstO.dsc ? `
${arDstO.dsc}
`: ``}`}
${arDstO.hasSltdHtl ? `
Current hotel is in this area
`: ``}
`).appendTo(mapArLstJ);
arSmryJ.click(function() {
if (!arDstO._mrkr) return false;
if (arSmryJ.hasClass('areaItm-sltd')) {
arSmryJ.removeClass('areaItm-sltd')
ctyArMap.autoZoomVisibleMarkers(11);
} else {
arSmryJ.addClass('areaItm-sltd').siblings().removeClass('areaItm-sltd');
ctyArMap.setCenterOnMarkerAndZoom(arDstO._mrkr);
}
return false;
});
arOnMapA.push(arDstO);
var hCnt = 0, arHtlLstJ = $jQ('.hRsltCdLst', arCntJ);
$jQ.each(arDstO.hIdA, function(j, hId) {
var hItm = me.htlKeys[hId];
if (!hItm) return true;
arHtlLstJ.append(hItm.getNode().clone(true).attr('data-hotel-id', hItm.hO.id));
hCnt++;
});
if (hCnt == 0) {
return true;
}
if (me.hSel.opts.isAllowHotelLookup) {
arCntJ.append($jQ(`'
`).click(function() {
if (opts && opts.fltrClbk) {
me.rsltCtr.removeClass('hSrchRsltCrtMd');
me.hSel.opts.isCdrGroupMode = false;
me.hSel.opts.isByAreaMode = false;
opts.fltrClbk(null, {ovFltPrms:arDstO.fltPrms});
}
return false;
}));
}
me.rsltLstCtr.append(arCntJ);
$jQ(`
${arDstO.nm} `).appendTo(tabsJ);
arSmryJ.addClass('areaItm-wcnt').append(`
`);
$jQ('.arHtlsAct', arSmryJ).click(function() {
$jQ('li[data-tab="'+arDstO.id+'"]', tabsJ).click();
return false;
});
});
$jQ(`
Map `).prependTo(tabsJ);
$jQ('li', tabsJ).click(function() {
var tabJ = $jQ(this), attr = tabJ.attr('data-tab');
tabJ.addClass('htlTab-sltd').siblings().removeClass('htlTab-sltd');
$jQ('.hRsltTabCnt', me.rsltLstCtr).addClass('hide').filter('.hRsltTabCnt'+attr).removeClass('hide');
return false;
}).filter(':first').click();
ctyArMap.initialize(function() {
$jQ.each(arOnMapA, function(i, arDstO) {
arDstO.staticLabel = arDstO.nm;
var arMrkr = ctyArMap.createCustomMarker(arDstO.id, arDstO, '', {showFIcon:false, showLblOnMO:false, clkClbk:function() {
var arJ = $jQ('.areaItm', mapArLstJ).removeClass('areaItm-sltd').filter('[data-area="'+arDstO.id+'"]').addClass('areaItm-sltd');
$jQ('.arLstCtr', mapCntJ).scrollTo(arJ, 200);
}});
arMrkr.setVisible(true);
arDstO._mrkr = arMrkr;
});
ctyArMap.autoZoomVisibleMarkers(11);
});
if (me.hSel.opts.isAllowHotelLookup) {
mapCntJ.append($jQ(`'
`).click(function() {
if (opts && opts.fltrClbk) {
me.rsltCtr.removeClass('hSrchRsltCrtMd');
me.hSel.opts.isCdrGroupMode = false;
me.hSel.opts.isByAreaMode = false;
opts.fltrClbk();
}
return false;
}));
}
} else {
me.rsltCtr.removeClass('hSrchRsltCrtMd');
me.hSel.opts.isCdrGroupMode = false;
me.hSel.opts.isByAreaMode = false;
me.rsltCtr.toggleClass('hSrchRsltCdVw hRsltCdLst', (me.srchO && !!me.srchO.srhotels) || !!me.rsltO.isRstPkgCty);
$jQ.each(me.fltdHtls, function(i, hItm) {
me.rsltLstCtr.append(hItm.getNode().clone(true).attr('data-hotel-id', hItm.hO.id));
});
if (me.hSel.opts.isAllowHotelLookup && me.srchO && !!me.srchO.srhotels) {
me.rsltLstCtr.append($jQ(`'
`).click(function() {
if (opts && opts.fltrClbk) {
me.rsltCtr.removeClass('hSrchRsltCrtMd');
me.srchO.srhotels = false;
opts.fltrClbk();
}
return false;
}));
}
}
if (me.fltdHtls.length == 0) {
me.rsltLstCtr.append(`
${JS_UTIL.getTranslated('No_matching_results')}
`);
}
if (me.isMapMode) {
me.rsltMapCtr.removeClass('hide');
if (!me.hSel.htlMap) {
me.hSel.htlMap = new TFMap(me.rsltMapCtr, {map:{height:400}});
me.hSel.htlMap.initialize(function() {
me.showResultsOnMap(opts);
});
} else {
me.showResultsOnMap(opts);
}
} else {
me.rsltMapCtr.addClass('hide');
}
JS_UTIL.scrollTo(me.rsltCtr, 200, {offset:-50});
}
this.showResultsOnMap = function(opts) {
me.hSel.htlMap.clearMarkersWithType('CUSTOM');
me.hSel.htlMap.closeInfoBox();
$jQ.each(me.fltdHtls, function(i, hItm) {
var mrkr = hItm.getMarker(opts);
if (!mrkr) return true;
mrkr.setVisible(true);
});
me.hSel.htlMap.autoZoomVisibleMarkers();
}
this.renderResultsFilters = function(opts) {
me.hFltrs.renderFilters(me.rsltO, opts);
var vwMdJ = null;
if (me.isMapMode) {
vwMdJ = $jQ('
' + JS_UTIL.getTranslated("View_as_List") + '').click(function() {
me.isMapMode = false; me.showResults(opts);
return false;
});
} else {
vwMdJ = $jQ('
' + JS_UTIL.getTranslated("View_on_Map") + '').click(function() {
me.isMapMode = true; me.showResults(opts);
return false;
});
}
$jQ('.hRsltVwMd', me.rsltTlbrScCtr).html(vwMdJ);
if (me.rsltO && (me.rsltO.isShwCms || me.rsltO.isShwNet)) {
$jQ(`
${me.rsltO.isShwCms ? `Show ${me.rsltO.cmsTxt}`: 'Show Net'} `).click(function() {
me.rsltCtr.toggleClass('showHtlInctv'); return false;
}).appendTo($jQ('.hRsltVwMd', me.rsltTlbrScCtr));
}
if (me.hSel.opts.isAllowNoStay && me.hSel.opts.isPkgCfgMode) {
var noStayAct = $jQ('
' + JS_UTIL.getTranslated("No_stay_required") + '').click(function() {
if (me.hSel.opts.rmSlctClbk) me.hSel.opts.rmSlctClbk(-1);
return false;
});
$jQ('.hRsltNotRqd', me.rsltTlbrScCtr).show().html(noStayAct);
}
}
this.filter = function() {
me.fltdHtls = [];
$jQ.each(me.htls, function(i, htlItm) {
me.fltdHtls.push(htlItm);
});
}
this.sort = function(srtKey, asc) {
return me.fltdHtls.sort(function(h1, h2) {
if (srtKey == 'nm') return h1.sorts[srtKey].localeCompare(h2.sorts[srtKey]) * (asc ? 1: -1);
return (h1.sorts[srtKey] - h2.sorts[srtKey]) * (asc ? 1: -1);
});
}
this.init();
}
function HotelResultItem(hSel, hRslt, idx, hO) {
var me = this; this.hO = hO; this.hRslt = hRslt; this.hSel = hSel;
this.init = function() {
me.sorts = {rscr:idx, st: me.hO.st, prc: me.hO.opr ? me.hO.opr: me.hO.pr, nm:me.hO.nm};
me.makeHTML();
}
this.makeHTML = function() {
me.node = $jQ('#htlRsltItmTpl').clone().attr('id', '').data('htl', me.hO.id);
$jQ('.htl-pic-ctr', me.node).css('backgroundImage', 'url(' + (me.hO.img ? me.hO.img: '//cdn.yourholiday.me/static/img/noimage.jpg') + ')');
if (me.hO.iPfd) me.node.prepend(`
${JS_UTIL.getTranslated('Preferred')}
`);
var rtCtrJ = $jQ('.urtgCtr', me.node).html(''), hasRt = false;
if (me.hO.urtO) {
var rtO = me.hO.urtO;
rtCtrJ.append(`
${rtO.rtTxt}
${rtO.numRt ? `
${rtO.numRt} ratings
`: ``}
${rtO.rt}
`);
hasRt = true;
}
if (me.hO.hlA || me.hO.nhA) {
var htipsJ = $jQ('
');
if (hasRt) {
rtCtrJ.html($jQ('
').append(rtCtrJ.html()));
} else rtCtrJ.prepend('
');
rtCtrJ.append(htipsJ);
hasRt = true;
if (me.hO.hlA) {
htipsJ.append($jQ(`
Pros `).attr('title', `
${me.hO.hlA.map((hl) => `${hl} `).join('')} `));
}
if (me.hO.nhA) {
htipsJ.append($jQ(`
Cons `).attr('title', `
${me.hO.nhA.map((hl) => `${hl} `).join('')} `));
}
}
if (!hasRt) rtCtrJ.hide();
if(me.hO.flt){
$jQ('.htlExpAtrb', me.node).html(`${me.hO.flt.map((flt) => `
${flt}
`).join('')}`);
}
if(me.hO.ai_data){
if(me.hO.ai_data.reason){
$jQ('.htlExpAtrb', me.node).append($jQ(`
${me.hO['ai_data']['reason']}
`));
}
// Extract pros & cons arrays safely
var prosArr = me.hO['ai_data']['pros'] || [];
var consArr = me.hO['ai_data']['cons'] || [];
console.log(prosArr);
console.log(consArr);
// Create a container to hold both badges
var hCtrJ = $jQ('
');
// --- PROS ---
if (prosArr.length > 0) {
$jQ(`
${prosArr.length} Pros `)
.attr('title', `
${prosArr.map((hl) => `${hl} `).join('')} `).appendTo(hCtrJ);
}
// --- CONS ---
if (consArr.length > 0) {
$jQ(`
${consArr.length} Cons `)
.attr('title', `
${consArr.map((hl) => `${hl} `).join('')} `).appendTo(hCtrJ);
}
if(prosArr.length > 0 || consArr.length > 0){
$jQ('.htlExpAtrb', me.node).append(hCtrJ);
}
} else $jQ('.htlExpAtrb', me.node).hide();
$jQ('.name', me.node).text(me.hO.nm);
if (me.hO.st > 0) {
$jQ('.stars', me.node).html(`${Array(me.hO.st).fill().map((st) => `
`).join('')}`);
} else $jQ('.stars', me.node).hide();
if(me.hO.ctag && Array.isArray(me.hO.ctag)){
$jQ('.ctags', me.node).html(me.hO.ctag.map(tag => `
${tag.nm} `).join(''));
} else $jQ('.ctags', me.node).hide();
if (me.hO.area || me.hO.loc) {
$jQ('.loc', me.node).text(me.hO.area ? me.hO.area: me.hO.loc);
} else $jQ('.htl--loc', me.node).hide();
if (me.hO.mtchT) {
$jQ('.htl--mtch', me.node).text(me.hO.mtchT);
} else $jQ('.htl--mtch', me.node).remove();
if (me.hO.whyA) {
$jQ('.htl--dsc', me.node).html(`${me.hO.whyA.length > 1 ? `
${me.hO.whyA.map((why) => `${why} `).join('')} `: `${me.hO.whyA.join('')}`}`);
} else $jQ('.htl--dsc', me.node).remove();
$jQ('.rm--nm', me.node).text(me.hO.rnm);
if (me.hO.mpN) {
$jQ('.rm--mp', me.node).text(me.hO.mpN);
} else {
$jQ('.rm--mp', me.node).hide();
}
if (me.hO.xpSmry) {
$jQ('.rm--xcl', me.node).html(`
${me.hO.xpSmry} `).addClass(me.hO.isNR ? 'rm--xcl-nr': '');
} else $jQ('.rm--xcl', me.node).hide();
if (me.hO.hsPromo) {
$jQ('.rm-dtl', me.node).append(`
`);
}
if (me.hO.prD) {
$jQ('.prcQ', me.node).html(JS_UTIL.getTranslated(me.hO.prQ));
if (me.hO.oprD) {
$jQ('.oprD', me.node).html(me.hO.oprD);
} else {
$jQ('.oprD', me.node).hide();
}
$jQ('.prcD', me.node).html(me.hO.prD).toggleClass('prcCut', !!me.hO.iprCut);
} else {
$jQ('.prcQ', me.node).addClass('notAvl').html('Not Available');
$jQ('.prcD', me.node).hide();
$jQ('.oprD', me.node).hide();
}
if (me.hO.nprD) {
$jQ('.cmsD', me.node).html(`
${me.hO.nprD} `).attr('title', 'Net price');
} else if (me.hO.cmsD) {
$jQ('.cmsD', me.node).html(`
${me.hO.cmsD} `).attr('title', `Total ${hRslt.rsltO.cmsTxt}`);
} else $jQ('.cmsD', me.node).remove();
if (me.hO.prTxt) {
$jQ('.prcMsg', me.node).html(me.hO.prTxt);
} else $jQ('.prcMsg', me.node).remove();
}
this.getNode = function() {
return me.node;
}
this.getMarker = function() {
if (!me.hO.lt) return null;
me.hO.content = $jQ(`
${me.hO.img ? `
`: ``}
${me.hO.nm}
${me.hO.st ? `
`: ``}
${me.hO.rnm}
${me.hO.mpN ? `
${me.hO.mpN}
`: ``}
${me.hO.xpSmry ? `
${me.hO.xpSmry}
`: ``}
${me.hO.oprD ? `
${me.hO.oprD}
`: ``}
${me.hO.prD}
${JS_UTIL.getTranslated(me.hO.prQ)}
`);
$jQ('.actCtr a', me.hO.content).click(function() {
me.hSel.loadHotelDetails(me.hO.id, {htlUrl:me.hO.url, isOpenTab:me.hSel.opts.prHtlSrch});
return false;
});
me.mrkr = me.hSel.htlMap.createCustomMarker(me.hO.id, me.hO, '', {showLblOnMO:false, isHTML:true, text:me.hO.prD});
}
this.init();
}
function HotelFilters(hSel, hRslt) {
var me = this; this.hSel = hSel; this.hRslt = hRslt;
this.fltsApplO = {}; this.applFltrA = [];
this.renderFilters = function(rsltO, opts) {
if (!rsltO.fltrs) {
return;
}
me.fltsApplO = {}; me.applFltrA = [];
var fltrsJ = $jQ('
');
$jQ.each(rsltO.fltrs.fltrA, function(i, fltrFld) {
var fltrO = rsltO.fltrs[fltrFld];
if (!fltrO || !fltrO.shw) return true;
var fJ = me.getFilterHTM(fltrO, opts);
fltrsJ.append(fJ);
});
me.hRslt.rsltFltrCtr.html(fltrsJ);
if (me.hSel.opts.blkFltrSelect) {
me.hRslt.rsltFltrCtr.removeClass('htlFltrsChg');
me.fltrApplyJ = $jQ(`
`).appendTo(me.hRslt.rsltFltrCtr);
$jQ('a', me.fltrApplyJ).click(function() {
if (opts && opts.fltrClbk) opts.fltrClbk();
return false;
});
}
me.hRslt.rsltFltrApplCtr.html('');
if (rsltO.appFltrs && rsltO.appFltrs.length > 0) {
$jQ.each(rsltO.appFltrs, function(i, applFltrO) {
var fO = {typ:applFltrO.ft, nm:applFltrO.fn, fld:applFltrO.fd}, fOpt = {nm:applFltrO.d, val:applFltrO.v};
var afJ = $jQ(`
${getFacetAppliedHTM(fO, fOpt)}
`).appendTo(me.hRslt.rsltFltrApplCtr);
afJ.click(function() {
me.updateAppliedFilter(fO, {val:fOpt.val});
if (opts && opts.fltrClbk) opts.fltrClbk();
return false;
});
me.updateAppliedFilter(fO, fOpt);
me.applFltrA.push({fO:fO, fOpt:fOpt});
});
if (rsltO.appFltrs.length > 1) {
var afJ = $jQ(`
`).appendTo(me.hRslt.rsltFltrApplCtr);
afJ.click(function() {
me.fltsApplO = {}; me.applFltrA = [];
if (opts && opts.fltrClbk) opts.fltrClbk();
return false;
});
}
}
// me.hRslt.rsltFltrApplCtr.toggleClass('hide', me.applFltrA.length == 0);
me.hRslt.rsltSortCtr.html(me.getSortHTM(opts)).toggleClass('hide', !me.hRslt.fltdHtls || me.hRslt.fltdHtls.length <= 2);
}
this.getFilterHTM = function(fO, opts) {
var fJ = null, fCtrJ = null;
fJ = $jQ(`
${fO.nm}${fO.snm ? `${fO.snm} `: ``}
`);
fCtrJ = $jQ('').appendTo(fJ);
if (fO.opts.length > 8) {fCtrJ = $jQ('
').appendTo(fCtrJ);}
if (fO.typ == 'HOTEL_ID') {
var oJ = $jQ(``).appendTo(fCtrJ.addClass('ddMenuACCtr'));
if (fO.opts && fO.opts.length > 0) {
$jQ('input', oJ).val(fO.opts[0].nm);
}
var htlAC = new TFAutocomplete({inpF:$jQ('input', oJ), wclass:'tt-fwidth tt-minwidth tt-nowrap', acOpts: {highlight:true},
datasets:new TFACDataset({remote:{url:'/gen/msc/hotel-suggest'}, extraParams:{city:me.hRslt.srchO.cid, iSltrMd:true, iSlFw:true}}),
events: {'select': function(e, item) {
me.hSel.loadHotelDetails(item.data.id, {htlUrl:item.data.url, isOpenTab:me.hSel.opts.prHtlSrch});
// me.updateAppliedFilter(fO, {val:item.data.id});
// if (opts && opts.fltrClbk) opts.fltrClbk();
}}});
} else if (fO.typ == 'NEAR_LOCATION_GEN') {
var oJ = $jQ(``).appendTo(fCtrJ.addClass('ddMenuACCtr'));
if (fO.opts && fO.opts.length > 0) {
$jQ('input', oJ).val(fO.opts[0].nm);
}
var pAddrAC = new PAddrAutocompleter({addrInp:$jQ('input', oJ), wclass:'tt-fwidth tt-minwidth tt-nowrap', extraParams:{ptyp:'', cid:me.hRslt.srchO.cid}, callBk:function(rspO) {
pAddrAC.setVal(rspO.pnm ? rspO.pnm: rspO.ad1);
me.updateAppliedFilter(fO, {val:JS_UTIL.stringifyJSON(rspO)});
if (opts && opts.fltrClbk) opts.fltrClbk();
}});
} else {
$jQ.each(fO.opts, function(i, fOpt) {
var oJ = $jQ(``);
oJ.click(function() {
me.updateAppliedFilter(fO, fOpt);
if (me.hSel.opts.blkFltrSelect) {
oJ.toggleClass('btnSltd');
me.hRslt.rsltFltrCtr.addClass('htlFltrsChg');
me.hRslt.onWindowScroll();
} else if (opts && opts.fltrClbk) opts.fltrClbk();
return false;
});
fCtrJ.append(oJ);
});
}
return fJ;
}
var getFacetDisplayHTM = function(fO, fOpt) {
if (fO.typ == 'STAR_RATING') {
var st = parseInt(fOpt.val, 10);
return `
${Array(st).fill().map((st) => ` `).join('')} `;
}
return fOpt.nm;
}
var getFacetAppliedHTM = function(fO, fOpt) {
if (fO.typ == 'STAR_RATING') {
var st = parseInt(fOpt.val, 10);
return `${st} star`;
}
return fOpt.nm;
}
this.updateAppliedFilter = function(fO, fOpt) {
var applOptA = me.fltsApplO[fO.fld];
if (!applOptA) {
applOptA = []; me.fltsApplO[fO.fld] = applOptA;
}
var idx = fOpt ? $jQ.inArray(fOpt.val, applOptA): -1;
if (idx >= 0) {
applOptA.splice(idx, 1);
} else {
if (fO.iSngl) {applOptA = []; me.fltsApplO[fO.fld] = applOptA;}
if (fOpt) applOptA.push(fOpt.val);
}
}
this.getAppliedFiltersQueryParams = function() {
var prmsA = [];
$jQ.each(me.fltsApplO, function(fld, applOptA) {
$jQ.each(applOptA, function(i, applOpt) {
var prm = {}; prm[fld+'Fltr'] = applOpt;
prmsA.push($jQ.param(prm));
});
});
return prmsA;
}
this.getSortHTM = function(opts) {
var fSrtJ = $jQ('
').append(`
${JS_UTIL.getTranslated("Sort")}: ${me.hSel.curSort.nm}
`);
var fSrtCtrJ = $jQ('