{"id":3784,"date":"2026-08-10T16:04:19","date_gmt":"2026-08-10T16:04:19","guid":{"rendered":"https:\/\/www.molrev.com\/?page_id=3784"},"modified":"2026-08-10T16:04:19","modified_gmt":"2026-08-10T16:04:19","slug":"compare","status":"publish","type":"page","link":"https:\/\/www.molrev.com\/zh\/compare\/","title":{"rendered":"Compare Yachts"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3784\" class=\"elementor elementor-3784\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d480999 e-con-boxed e-flex e-con e-parent\" data-id=\"d480999\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5fed4d0 elementor-widget elementor-widget-heading\" data-id=\"5fed4d0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">COMPARE<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-32c137b elementor-widget elementor-widget-yacht-compare-table\" data-id=\"32c137b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"yacht-compare-table.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t                <div class=\"yc-table-widget\" id=\"yc-32c137b\" data-inquiry=\"#\">\n                    <div class=\"yc-empty\" style=\"display:none;\">No yachts selected for comparison. Browse the brokerage and tap the heart on any yacht to add it.<\/div>\n                    <div class=\"yc-content\" style=\"display:none;\">\n                        <div class=\"yc-cards\"><\/div>\n                        <div class=\"yc-cnav-row\"><div class=\"yc-cbar\"><div class=\"yc-cbar-thumb\"><\/div><\/div><\/div>\n                        <div class=\"yc-sections\"><\/div>\n                    <\/div>\n                <\/div>\n\n                <script>\n                (function(){\n                    var widget = document.getElementById('yc-32c137b');\n                    if (!widget || widget.dataset.ycInit) return;\n                    widget.dataset.ycInit = '1';\n                    var empty = widget.querySelector('.yc-empty');\n                    var content = widget.querySelector('.yc-content');\n                    var cardsEl = widget.querySelector('.yc-cards');\n                    var sectionsEl = widget.querySelector('.yc-sections');\n                    var inquiry = widget.dataset.inquiry || '#';\n\n                    function fetchYacht(id) {\n                        return fetch('https:\/\/www.molrev.com\/wp-admin\/admin-ajax.php?action=yacht_compare_get&id=' + id).then(function(r){ return r.json(); });\n                    }\n\n                    function readIdsDirect() { try { return JSON.parse(localStorage.getItem('yacht_compare_ids') || '[]'); } catch(e) { return []; } }\n                    function render() {\n                        var ids = (window.YachtCompare && window.YachtCompare.list()) || readIdsDirect() || [];\n                        if (!ids.length) {\n                            empty.style.display = 'block';\n                            content.style.display = 'none';\n                            return;\n                        }\n                        empty.style.display = 'none';\n                        content.style.display = 'block';\n                        Promise.all(ids.map(fetchYacht)).then(function(yachts){\n                            yachts = yachts.filter(function(y){ return y && y.id; });\n                            renderCards(yachts);\n                            renderSections(yachts);\n                            sectionsEl.style.setProperty('--yc-cols', yachts.length);\n                            cardsEl.style.gridTemplateColumns = 'repeat(' + yachts.length + ', minmax(180px, 1fr))';\n                        });\n                    }\n\n                    function renderCards(yachts) {\n                        cardsEl.innerHTML = yachts.map(function(y){\n                            return '<div class=\"yc-card\">' +\n                                '<button class=\"yc-remove\" data-id=\"' + y.id + '\" aria-label=\"Remove\">&times;<\/button>' +\n                                '<a href=\"' + y.url + '\"><div class=\"yc-card-img\" style=\"background-image:url(\\'' + y.thumb + '\\')\"><\/div><\/a>' +\n                                '<div class=\"yc-card-name\">' + y.title + '<\/div>' +\n                                '<div class=\"yc-card-meta\">' + (y.length ? y.length + 'm  |  ' : '') + (y.year || '') + '<\/div>' +\n                                '<div class=\"yc-card-cta\">' + (Number(y.price) > 0 ? 'US$ ' + Number(y.price).toLocaleString() : 'ON REQUEST') + '<\/div>' +\n                                '<\/div>';\n                        }).join('');\n                        cardsEl.querySelectorAll('.yc-card').forEach(function(card, i){\n                            card.style.cursor = 'pointer';\n                            card.addEventListener('click', function(e){\n                                if (e.target.closest('.yc-remove')) return;\n                                var y = yachts[i];\n                                if (y && y.url) location.href = y.url;\n                            });\n                        });\n                        cardsEl.querySelectorAll('.yc-remove').forEach(function(b){\n                            b.addEventListener('click', function(){\n                                var ids = window.YachtCompare.list();\n                                var idx = ids.indexOf(b.dataset.id);\n                                if (idx !== -1) { ids.splice(idx, 1); localStorage.setItem('yacht_compare_ids', JSON.stringify(ids)); document.dispatchEvent(new CustomEvent('yacht-compare-change', { detail: { ids: ids }})); render(); }\n                            });\n                        });\n                    }\n\n                    function renderSections(yachts) {\n                        function checkmark(v){ return v ? '<span style=\"color:#1a2a4a;font-weight:600;\">&#10003;<\/span>' : '<span style=\"color:#ccc;\">&minus;<\/span>'; }\n                        var sections = [\n                            { title: 'Overview', rows: [\n                                ['Builder', 'builder'],\n                                ['Model', 'model'],\n                                ['Configuration', 'configuration'],\n                                ['Built\/Refit', function(y){ return [y.year, y.year_refit].filter(Boolean).join(' \/ ') || '-'; }],\n                                ['Asking Price', function(y){ return Number(y.price) > 0 ? 'US$ ' + Number(y.price).toLocaleString() : 'On Request'; }],\n                            ]},\n                            { title: 'Dimensions & Volumes', rows: [\n                                ['Length', function(y){ return y.length ? y.length + ' m' : '-'; }],\n                                ['Beam', function(y){ return y.beam ? y.beam + ' m' : '-'; }],\n                                ['Draft', function(y){ return y.draft ? y.draft + ' m' : '-'; }],\n                                ['Gross Tonnage', function(y){ return y.gross_tonnage ? y.gross_tonnage + ' GT' : '-'; }],\n                            ]},\n                            { title: 'Accommodation', rows: [\n                                ['Cabins', 'staterooms'],\n                                ['Berths', 'berths'],\n                                ['Guests', 'guests'],\n                                ['Crews', 'crew'],\n                                ['Cabins Configuration', 'cabins_config'],\n                            ]},\n                            { title: 'Machinery & Performance', rows: [\n                                ['Max Speed', function(y){ return y.max_speed ? y.max_speed + ' knots' : '-'; }],\n                                ['Cruising Speed', function(y){ return y.cruising_speed ? y.cruising_speed + ' knots' : '-'; }],\n                                ['Cruising Range', function(y){ return y.cruising_range ? y.cruising_range + ' nm' : '-'; }],\n                                ['Engines', 'engines'],\n                                ['Generators', 'generators'],\n                                ['Fuel Capacity', function(y){ return y.fuel_capacity ? Number(y.fuel_capacity).toLocaleString() + ' L' : '-'; }],\n                                ['Water Capacity', function(y){ return y.water_capacity ? Number(y.water_capacity).toLocaleString() + ' L' : '-'; }],\n                                ['Holding Tank', function(y){ return y.holding_tank ? Number(y.holding_tank).toLocaleString() + ' L' : '-'; }],\n                            ]},\n                            { title: 'Design & Construction', rows: [\n                                ['Exterior Design', 'exterior_designer'],\n                                ['Interior Design', 'interior_designer'],\n                                ['Naval Architecture', 'naval_architecture'],\n                                ['Construction', 'construction'],\n                                ['Hull Material', 'hull_material'],\n                                ['Superstructure Material', 'superstructure_material'],\n                            ]},\n                            { title: 'Class & Flag', rows: [\n                                ['Classification', 'classification'],\n                                ['Flag', 'flag'],\n                                ['Lying', 'lying'],\n                            ]},\n                            { title: 'Features', rows: [\n                                ['Stabilizers', function(y){ return y.stabilizers ? y.stabilizers : checkmark(false); }],\n                                ['Folding Bulwark', function(y){ return checkmark(y.has_folding_platform); }],\n                                ['Lifting Platform', function(y){ return checkmark(y.has_lifting_platform); }],\n                                ['Tender Garages', function(y){ return checkmark(y.has_tender_garages); }],\n                                ['Helipad', function(y){ return checkmark(y.has_helipad); }],\n                                ['Cranes & Davits', function(y){ return checkmark(y.has_cranes_davits); }],\n                                ['Pool', function(y){ return checkmark(y.has_pool); }],\n                                ['Jacuzzi', function(y){ return checkmark(y.has_jacuzzi); }],\n                                ['Sauna', function(y){ return checkmark(y.has_sauna); }],\n                                ['Spa', function(y){ return checkmark(y.has_spa); }],\n                                ['Gym', function(y){ return checkmark(y.has_gym); }],\n                                ['Cinema', function(y){ return checkmark(y.has_cinema); }],\n                                ['Beach Club', function(y){ return checkmark(y.has_beach_club); }],\n                                ['Elevator', function(y){ return checkmark(y.has_elevator); }],\n                            ]},\n                        ];\n                        sectionsEl.innerHTML = sections.map(function(sec, si){\n                            return '<div class=\"yc-section\" data-yc-sec=\"' + si + '\">' +\n                                '<button type=\"button\" class=\"yc-section-toggle\" aria-expanded=\"true\">' +\n                                    '<span class=\"yc-section-title\">' + sec.title + '<\/span>' +\n                                    '<svg class=\"yc-chevron\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"\/><\/svg>' +\n                                '<\/button>' +\n                                '<div class=\"yc-section-body\">' +\n                                sec.rows.map(function(r){\n                                    var label = r[0]; var key = r[1];\n                                    var values = yachts.map(function(y){\n                                        var v = typeof key === 'function' ? key(y) : (y[key] || '-');\n                                        return '<div>' + (v || '-') + '<\/div>';\n                                    }).join('');\n                                    return '<div class=\"yc-row\"><div class=\"yc-row-label\">' + label + '<\/div><div class=\"yc-row-values\">' + values + '<\/div><\/div>';\n                                }).join('') +\n                                '<\/div><\/div>';\n                        }).join('');\n                        sectionsEl.querySelectorAll('.yc-section-toggle').forEach(function(btn){\n                            btn.addEventListener('click', function(){\n                                var sec = btn.closest('.yc-section');\n                                var collapsed = sec.classList.toggle('collapsed');\n                                btn.setAttribute('aria-expanded', collapsed ? 'false' : 'true');\n                            });\n                        });\n                    }\n\n                    document.addEventListener('yacht-compare-change', render);\n                    \/\/ Carousel nav for cards (mobile only) - rows follow via sync\n                    (function(){\n                        var nav = widget.querySelector('.yc-cnav-row');\n                        if (!nav) return;\n                        var prev = nav.querySelector('.yc-cnav-prev');\n                        var next = nav.querySelector('.yc-cnav-next');\n                        var thumb = nav.querySelector('.yc-cbar-thumb');\n                        function step(){ var card = cardsEl.querySelector('.yc-card'); return (card ? card.offsetWidth : 196) + 16; }\n                        if (prev) prev.addEventListener('click', function(){ cardsEl.scrollBy({left:-step(), behavior:'smooth'}); });\n                        if (next) next.addEventListener('click', function(){ cardsEl.scrollBy({left:step(), behavior:'smooth'}); });\n                        function upd(){\n                            var max = cardsEl.scrollWidth - cardsEl.clientWidth;\n                            if (max <= 2) { nav.style.visibility = 'hidden'; return; }\n                            nav.style.visibility = '';\n                            var frac = cardsEl.clientWidth \/ cardsEl.scrollWidth;\n                            var t = Math.max(0.15, Math.min(1, frac));\n                            thumb.style.width = (t * 100) + '%';\n                            var p = cardsEl.scrollLeft \/ max;\n                            thumb.style.left = (p * (1 - t) * 100) + '%';\n                            if (prev) prev.style.opacity = cardsEl.scrollLeft <= 2 ? '.35' : '1';\n                            if (next) next.style.opacity = cardsEl.scrollLeft >= max - 2 ? '.35' : '1';\n                        }\n                        cardsEl.addEventListener('scroll', upd, {passive:true});\n                        window.addEventListener('resize', upd);\n                        new MutationObserver(upd).observe(cardsEl, {childList:true});\n                        upd();\n                    })();\n                    \/\/ Prevent native link\/image drag out of the browser\n                    widget.addEventListener('dragstart', function(e){ e.preventDefault(); });\n                    var ycSyncing=false; var ycSnapping=false;\n                    \/\/ Mouse drag-to-scroll on cards & value rows (touch scrolls natively)\n                    (function(){\n                        var drag=null, snapTimer=null;\n                        function ycSnapNearest(){\n                            var x = cardsEl.scrollLeft, cb = cardsEl.getBoundingClientRect().left, best=null, bd=Infinity;\n                            cardsEl.querySelectorAll('.yc-card').forEach(function(it){ var rel = it.getBoundingClientRect().left - cb + x; var dd=Math.abs(rel-x); if(dd<bd){bd=dd;best=rel;} });\n                            if(best===null || Math.abs(best-x)<2) return;\n                            ycSnapping=true;\n                            cardsEl.scrollTo({left:best, behavior:'smooth'});\n                            setTimeout(function(){ ycSnapping=false; }, 550);\n                        }\n                        cardsEl.addEventListener('scroll', function(){\n                            if (drag || ycSnapping) return;\n                            clearTimeout(snapTimer);\n                            snapTimer=setTimeout(ycSnapNearest, 160);\n                        }, {passive:true});\n                        document.addEventListener('pointerdown', function(e){ if(e.pointerType!=='mouse') return; var t=e.target.closest('.yc-cards,.yc-row-values'); if(!t) return; if(!cardsEl.contains(t)&&!sectionsEl.contains(t)&&t!==cardsEl) return; cardsEl.style.scrollSnapType='none'; drag={el:t, x:e.clientX, sl:t.scrollLeft, moved:false}; });\n                        document.addEventListener('pointermove', function(e){ if(!drag) return; var dx=e.clientX-drag.x; if(Math.abs(dx)>5) drag.moved=true; drag.el.scrollLeft=drag.sl-dx; });\n                        document.addEventListener('pointerup', function(e){ if(drag){ if(drag.moved){ var el=drag.el; el.dataset.dragged='1'; setTimeout(function(){ delete el.dataset.dragged; },50); ycSnapNearest(); } else { cardsEl.style.scrollSnapType=''; } } drag=null; });\n                        document.addEventListener('click', function(e){ var t=e.target.closest('.yc-cards,.yc-row-values'); if(t&&t.dataset.dragged){ e.preventDefault(); e.stopPropagation(); } }, true);\n                    })();\n                    document.addEventListener('scroll', function(e){\n                        var t=e.target; if(!t||!t.classList) return;\n                        if(!(t.classList.contains('yc-cards')||t.classList.contains('yc-row-values'))) return;\n                        if(ycSnapping && t!==cardsEl) return;\n                        if(!cardsEl.contains(t)&&!sectionsEl.contains(t)&&t!==cardsEl) return;\n                        if(ycSyncing) return; ycSyncing=true;\n                        var x=t.scrollLeft;\n                        var all=[cardsEl].concat(Array.prototype.slice.call(sectionsEl.querySelectorAll('.yc-row-values')));\n                        all.forEach(function(o){ if(o!==t) o.scrollLeft=x; });\n                        requestAnimationFrame(function(){ ycSyncing=false; });\n                    }, true);\n                    window.addEventListener('storage', function(e){ if (e.key === 'yacht_compare_ids') render(); });\n                    \/\/ Render now; if YachtCompare not yet ready, retry briefly\n                    (function tryRender(tries){\n                        if (window.YachtCompare) { render(); return; }\n                        if (tries > 20) { render(); return; }\n                        setTimeout(function(){ tryRender(tries + 1); }, 50);\n                    })(0);\n                })();\n                <\/script>\n                \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-3784","page","type-page","status-publish","hentry"],"acf":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/pages\/3784","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/comments?post=3784"}],"version-history":[{"count":1,"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/pages\/3784\/revisions"}],"predecessor-version":[{"id":4160,"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/pages\/3784\/revisions\/4160"}],"wp:attachment":[{"href":"https:\/\/www.molrev.com\/zh\/wp-json\/wp\/v2\/media?parent=3784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}