BANGKOK HILL THAI RESTAURANT, Lunenburg – Menu, Prices & Restaurant Reviews
Posted by:
Category:
Comments:
Post Date:
BANGKOK HILL THAI RESTAURANT, Lunenburg – Menu, Prices & Restaurant Reviews
[]
BANGKOK HILL THAI RESTAURANT, Lunenburg - Menu, Prices & Restaurant Reviews - Tripadvisor 0;)define.apply(e,t.d.shift());for(;t.r.length>0;)require.apply(e,t.r.shift());e.getRequireJSQueue=null}l&&+new Date-i<5e3&&a.apply(e,l)}if(!e||!e.requireCallLast){var l,i,u=!1,a=e.requireCallLast=function(e,r){l=null;var a=[].slice.call(arguments,2);t(e)?n(require(e),r,a):t("trjs")?require(["trjs!"+e],function(e){n(e,r,a)}):u||(i=+new Date,l=[].slice.call(arguments))},c=e.requireCallIfReady=function(n){t(n)&&a.apply(e,arguments)},o=function(t,n,r,l)"click"!==r.type&&"submit"!==r.type;e.remoteModule=function(e,t){return o("remoteModule",null,e,[].slice.call(arguments))},e.requireEvCall=function(e,t,n,r){return e=e.match(/^((?:[^/]+/)*[^/.]+).([^/]*)?$/),o(e[1],e[2],t,[].slice.call(arguments,1))},e.widgetEvCall=function(e,t,n,r){return o("ta/prwidgets","call",t,[].slice.call(arguments))},e.placementEvCall=function(e,t,n,r,l){return o("ta/p13n/placements","evCall",n,[].slice.call(arguments))},document.addEventListener?document.addEventListener("DOMContentLoaded",r):e.addEventListener?e.addEventListener("load",r):e.attachEvent&&e.attachEvent("onload",r)}}(window); ]]> RATINGS
=l.limit&&(l.list=l.list.slice(0,l.list.length-1),l.callbacks=l.callbacks.slice(0,l.callbacks.length-1)),l.list.unshift(e),l.callbacks.unshift(t);var r=l.handlerModule;r&&l.handlerMethod&&(l.handlerModule=null,require([r+""],function(e){n(l,e[l.handlerMethod],0)}))}}function e(l,e){if(e=Array.prototype.slice.call(e),l.handler)try{l.handler.apply(null,e)}catch(l){}else if(l.list&&l.list.length=t)return!1;l.handler=n,l.priority=t;var a=l.list;l.list=null;for(var i=0;i0&&"function"==typeof e[0]&&l(o,e.slice(1),e[0])}}}); define("ns-exporter",["vanillajs"],function(r){function n(r){if("undefined"==typeof window)return null;if("undefined"==typeof r&&(r=window),!r)return require.defined("ta/util/Error")&&require("ta/util/Error").record(null,"Using ns-exporter:exportTo without a namespace"),null;if("string"==typeof r){var n=window;n.ta||(ta={}),r.split(".").forEach(function(r){n[r]||(n[r]={}),n=n[r]}),r=n}return r}return{exportTo:function(r,e,t),createNs:function(r,e,t){return!!(e=n(e))&&void(e[t]=r)}}}); define("ta/Core/TA.FireEvent",["vanillajs"],function(){var n={},e={};return n.on=function(n,r),n.fireEvent=function(n,r){var i=Array.prototype.slice.call(arguments),t=e[n];i.shift(),t&&t.slice(0).forEach(function(n){try{n.apply(null,i)}catch(n)})},n.off=function(n,r){if(r){var i,t=e[n];t instanceof Array&&(i=t.indexOf(r),i>=0&&t.splice(i,1))}else delete e[n]},n.hasEventListener=function(n){return!!e[n]},n}); define("ta/Core/TA.Event",["vanillajs","common/trackingStreams","ns-exporter","ta/Core/TA.FireEvent"],function(vanilla,tracks,nsExporter,fireEvent){function _makeClosure(e,t){var n=this;return t=Array.prototype.slice.call(t),function(){e.apply(n,t)}}function QueueTimer(e,t){var n=0,r=0,o=[],a=0,u=!1;this.start=function(){n&&clearTimeout(n),a=Date.now()},this.end=function(i){var c=Date.now(),f=c-a;r+=f;var l=""+f+"ms ["+(i||"")+"]",s=e+(t?"-after":"");u?console.error("Straggler for "+s+": "+l):(o.push(l),n=setTimeout(function(){console.error("Timing for "+s+": "+r+"msn"+o.sort(function(e,t){return parseInt(e)-parseInt(t)}).join("n")),u=!0},2e3))}}var exports={on:fireEvent.on,off:fireEvent.off,fireEvent:fireEvent.fireEvent,hasEventListener:fireEvent.hasEventListener};exports.call=function(e,t,n,r){if(null==t)return IS_DEBUG&&alert("You must pass the event.nnUsage:nta.call('ta.namespace.Class.function', event);"),!1;if(null==e)return IS_DEBUG&&alert("ta.call of undefined function"),!1;var o=e;if("function"==typeof e)e="";else if(!/^ta.[wd.]+$/.test(e))return IS_DEBUG&&alert("Invalid function name. Must be of the form: ta.namespace.Class.function"),!1;var a=t||window.event;["stopPropagation","preventDefault"].forEach(function(e){a[e]||(a[e]=function(){})}),a.stop||(a.stop=function(){a.preventDefault(),a.stopPropagation()}),n||(n=a.target||a.srcElement),n||tracks.error(null,"ta.call re-wrap fail (non-DOM element) - "+e,t,{"funcName":e});var u=arguments,i=Array.prototype.slice.call(u,3);i.splice(0,0,a,n);try{return i.unshift({callback:_ta_call_defer,evt:a}),i.unshift(o),exports.run.apply(null,i)}catch(n){tracks.error(n,"ta.call - "+e,t)}return!1};var _ta_call_defer=function(e,t){t&&delete t.evt,exports.run.apply(null,arguments)};exports.run=function(e,t){var n=arguments,r=Array.prototype.slice.call(n,2);try{var o=exports.fn(e);if("function"==typeof o){var a=o.apply(window,Array.prototype.slice.call(r));if(t&&t.onComplete){var u=exports.fn(t.onComplete);u&&u(a)}return a}t&&t.evt&&(t.evt.stopPropagation?t.evt.stopPropagation():t.evt.cancelBubble=!0,t.evt.preventDefault?t.evt.preventDefault():t.evt.returnValue=!1);var i=_makeClosure(t&&t.callback||exports.run,arguments);require(["trjs!ta/Core/TA.Load"],function(t){try{t.load(e,i)}catch(t){tracks.error(t,"ta.run - "+e)}})}catch(t){tracks.error(t,"ta.run - "+e)}return!1};var OneTimeFunctionQueue=function(e,t,n){function r(){u=!0,c()}var o,a=[],u=!!n,i=function(n,r){o&&o.start();try{n()}catch(n){try{tracks.error(n,"OneTimeFunctionQueue "+e+(t?"-after":"")+(r?"-"+r:""))}catch(e){}}o&&o.end(r)},c=function(){if(a.sort(function(e,t)),t){var e=1;a.forEach(function(t){setTimeout(i.bind(null,t.func,t.name),e++)})}else a.forEach(function(e){i(e.func,e.name)});a=[]};null!=e&&(window.addEventListener?window.addEventListener(e,r,!1):window.attachEvent&&("DOMContentLoaded"==e?window.attachEvent("onload",r):"load"==e?window.attachEvent("on"+e,function(){setTimeout(r,1)}):window.attachEvent("on"+e,r))),this.addToQueue=function(t,n,r){return t?("string"==typeof n&&(r=n,n=!1),void(u?i(t,r):(n=n||100+a.length,a.push({func:t,priority:n,name:r,subpriority:a.length})))):void tracks.error(null,"addToQueue for "+e+" queue - no function")},this.executeQueue=function(){c()}},loaded="undefined"!=typeof document&&"complete"===document.readyState,ready="undefined"!=typeof document&&"interactive"===document.readyState||loaded,_readyQ=new OneTimeFunctionQueue("DOMContentLoaded",!1,ready),_loadQ=new OneTimeFunctionQueue("load",!1,loaded),_afterLoadQ=new OneTimeFunctionQueue("load",!0);ready||_loadQ.addToQueue(function(){_readyQ.executeQueue()},-999999999,"checkReadyQueue"),_loadQ.addToQueue(function(){_afterLoadQ.executeQueue()},999999999,"afterLoadQueue"),exports.queueForReady=function(e,t,n){_readyQ.addToQueue(e,t,n)},exports.queueForLoad=function(e,t,n){_loadQ.addToQueue(e,t,n)},exports.queueForAfterLoad=function(e,t){_afterLoadQ.addToQueue(e,0,t)},exports.fn=function(fn){switch(typeof fn){case"function":return fn;case"string":var f=!1;try{f=eval(fn)}catch(e){}if(!f){var ns=fn.split("."),n=ns.pop();try{ns=eval(ns.join(".")),f=ns&&ns._magic&&ns._magic.partial(n)}catch(e){}}if(f&&"function"==typeof f)return f}return null},exports.fireClick=function(e){if(document.createEvent){var t=document.createEvent("MouseEvents");t.initEvent("click",!0,!1),e.dispatchEvent(t)}else document.createEventObject?e.fireEvent("onclick"):"function"==typeof e.onclick&&e.onclick()},exports.throttle=function(e,t,n,r){function o(){delete m_throttles[t],a.cb()}var a,u=(new Date).getTime();if(t in m_throttles){if(a=m_throttles[t],u-a.lastResetr?o():(a.lastReset=u,a.timeout=setTimeout(o,n))};var m_throttles={};return nsExporter.exportTo(exports,ta),exports}); define("ta/Core/TA.LocalStorage",["vanillajs","common/trackingStreams","ns-exporter"],function(e,t,n){"use strict";var r=!1,o="taLsTest",i="1",a="TALocalStorageCurrentSessionId",u=!1,s="session-",l=!1,c=[],f=[],v=[],g=function(){return!(!u&&!l)},m=function(e),S=function(e){return d(e,"value")},y=function(e){return d(e,"now")},d=function(e,t){if(!t)return null;trycatch(e){}return null},h=function(e,t){try"0");return n&&n.hasOwnProperty(t)?n[t]:nullcatch(e){return null}},w=function(e){try"0");return t?t.ttl&&t.ttl+t.now<(new Date).getTime()?(r.removeItem(e),null):t.value:nullcatch(e){}return null},I=function(e){try{r.removeItem(e)}catch(e){}},p=function(e,t){var n=y(e);if(t&&n&&n<(new Date).getTime()-t)try{r.removeItem(e)}catch(e){}},O=function(e){try{var t=r.getItem(e);if(null!==t&&void 0!==t)return!0}catch(e){}return!1},T=function(e,t,n){try{r.setItem(e,JSON.stringify())}catch(e){}},k=function(e){if(l=!0,!e)return t.error(null,"Attempting to initialize localStorage with invalid sesion key: "+e),!1;if(!V())return!1;if(u=S(a),!u||u!=e){u=e,T(a,u);var n=S("latestPageServlet");n&&T("sessionEntryServlet",n),E(),O(a)&&require.defined("ta/Core/TA.Store")&&require("ta/Core/TA.Store").store("isFirstSessionPageView",!0)}for(var r=0;r0;if(this.delegate&&this.delegate.hasListeners)return this.delegate.hasListeners(e)}return!1},t.prototype.emit=function(e,t){if(this.events[e]){var r=Array.prototype.slice.call(arguments,1);this.events[e].slice(0).forEach(function(t){if(t)try{t.apply(this,r)}catch(t){"string"==typeof t&&(t=new Error(t));var i="Error in event handler for "+e;if(require.defined("ta/util/Error"))require("ta/util/Error").record(t,i);elseconsole.log)(i,t)}},this)}else this.delegate&&this.delegate.emit&&this.delegate.emit.apply(delegate,arguments);return this},t.prototype.addOrReplaceListener=function(e,t){this.off(e,t).on(e,t)},t}); define("ta/registration/RegEvents",["mixins/Events"],function(e){return new e("success")}); define("post_rollup_globals_shim",["page-model","ns-exporter","common/trackingStreams","ta/registration/RegEvents"],function(e,r,t,i){var n=e.session;i.on("success",function(){e.session.loggedIn=!0});var o={uid:n.uid,userLoggedIn:n.loggedIn,userSecurelyLoggedIn:n.securelyLoggedIn};r.exportTo(o,"ta");try{var s=XMLHttpRequest.prototype,u=s.send;s.send=function(e){try{var r=new RegExp("^(/[^/]|(http(s)?:)?//"+window.location.hostname+")");if(this._url&&r.test(this._url)){var t=n.uid;if(require.defined("redux-init")){var i=require("redux-init");i&&i.tracking&&i.tracking.uid&&(t=i.tracking.uid)}this.setRequestHeader("X-Puid",t)}}catch(e){}u.call(this,e)};var a=s.open;s.open=function(e,r){return this._url=r,a.apply(this,arguments)}}catch(e){t.error(e,"Error intercepting AJAX for tracking")}}); define("servlets/standardTemplateSupport",["page-model","mobile/lite/image-loader","ta/Core/TA.Event","ta/Core/TA.LocalStorage","ta/util/LocalStorage","ta/util/Currency","ta/util/SessionStorage","post_rollup_globals_shim"],function(e,o,s,t,a,i,n,l){function r(){s.queueForLoad(function(){o.init(200)},"lazy load images"),e&&e.session&&e.session.sessionId&&t.updateSessionId(e.session.sessionId)}return{footerInit:r}}); define("purify",["vanillajs"],function(e){function n(e,n){return e?t(e)?(window.IS_DEBUG&&console.error("You're using a jQuery object where you shouldn't. Check the stack trace and fix it!"),n&&e.length>1?e.get():e.get(0)):e.forEach&&(e.length1){for(var f=Array(u),l=0;l0&&(n=n.substring(0,n.indexOf(":"))),n}function l(){var e=Array.prototype.slice.call(arguments);require(["trjs!ta/p13n/placements-ajax"],function(n){n.loadDynamicPlacement.apply(n,e)})}function c(){var e=Array.prototype.slice.call(arguments);require(["trjs!ta/p13n/placements-ajax"],function(n){n.loadDynamicPlacement.apply(n,e)})}var i=new t(function(e){var n={};if(e)for(var a in e)e.hasOwnProperty(a)&&(n[a]=e[a]);return n.requestAJAXPlacement||(n.requestAJAXPlacement=function(e,a,t,r){require(["trjs!ta/p13n/placements-ajax"],function(l){l.requestAJAXPlacement(n,e,a,t,r)})}),{placement:n}}),o={"define":i.define,"redefine":i.redefine,"load":i.load,"evCall":i.evCall,"loadDynamicPlacement":l,"enableAutoRefresh":c,"getTemplateBaseFromPlacementName":r};return n.exportTo(o,"ta.p13n.placements"),o}); define("lib/jquery-amd",[],function()ta.jquery); define("mixins/mixin",[],function(){"use strict";return function(r){var i,n,t=Array.prototype.slice.call(arguments,1);for(var e in t)if(t.hasOwnProperty(e)){i=t[e];for(n in i)r[n]=i[n]}return r}}); define("common/Radio",["babel/babel-helpers"],function(e){var t={},n=/s+/,r=function(){function t(n){e.classCallCheck(this,t),this.channel=n,this.events={},this.replies={}}return e.createClass(t,[{key:"reply",value:function(e,t,r){var i=this;return e.split(n).forEach(function(e),this),this}},{key:"request",value:function(e){if(!this.replies[e])return null;var t=this.replies[e];t=t[t.length-1];for(var n=arguments.length,r=Array(n>1?n-1:0),i=1;i1?t-1:0),r=1;r2?r-2:0),u=2;u2?r-2:0),u=2;u1?t-1:0),r=1;r=0&&e.push(n);return e}function a(t){var e=ta.page.getDates(t);return e&&e[0]?new n(e[0]):null}var u="zu",T={CHECKIN:{queryString:null,pathString:null},CHECKOUT:{queryString:null,pathString:null},STAYDATES:{children:["CHECKIN","CHECKOUT"],queryString:"staydates",pathString:u+"s"},EATERY:{queryString:"eaterydate",pathString:u+"r"},DEPARTURE:{queryString:null,pathString:null},RETURN:{queryString:null,pathString:null},ROUNDTRIP:{children:["DEPARTURE","RETURN"],queryString:"rtdates",pathString:u+"t"},ONEWAYFLIGHT:{queryString:"oneway",pathString:u+"o"},LEG_1:{queryString:"leg1date",pathString:u+"1"},LEG_2:{queryString:"leg2date",pathString:u+"2"},LEG_3:{queryString:"leg3date",pathString:u+"3"},ATTRACTION:{queryString:"attrdate",pathString:u+"a"},ATTRACTION_FROM:{queryString:null,pathString:null},ATTRACTION_TO:{queryString:null,pathString:null},ATTRACTIONRANGE:{children:["ATTRACTION_FROM","ATTRACTION_TO"],queryString:"attrrange",pathString:u+"e"},VPDATES:{children:["VPDEPARTURE","VPRETURN"],queryString:"vpdates",pathString:null},VPDEPARTURE:{queryString:null,pathString:null},VPRETURN:{queryString:null,pathString:null}};return T.getStartDateType=function(t){var e=i(t);if(0==e.length){var n=T[t].children;return n&&n.length>0?n[0]:t}return T[e[0]].children[0]},T.getEndDateType=function(t){var e=i(t);if(0==e.length){var n=T[t].children;return n&&n.length>0?n[n.length-1]:t}var r=T[e[0]];return r.children[r.children.length-1]},T.isChildDateType=function(t){return i(t).length>0},T.isSingleDateType=function(t)e&&e.children&&e.children.length>0),T.getParents=i,T.isHotelDateType=function(t){return i(t).indexOf("STAYDATES")>=0},T.isRoundTripDateType=function(t){return i(t).indexOf("ROUNDTRIP")>=0},T.isAttractionRangeDateType=function(t){return i(t).indexOf("ATTRACTIONRANGE")>=0},T.isVacationPackagesDateType=function(t){return i(t).indexOf("VPDATES")>=0},T.allowsSameDayRange=function(t)T.isRoundTripDateType(t),T.isMultiCityDateType=function(t),T.isStartDateType=function(t){var e=i(t);return 0!=e.length&&0==T[e[0]].children.indexOf(t)},T.isEndDateType=function(t){var e=i(t);if(0==e.length)return!1;var n=T[e[0]];return n.children.indexOf(t)==n.children.length-1},T.getStartDate=function(t){var e=T.getStartDateType(t);return null==e?ta.page.getDates(t)[0]:ta.page.getDates(e)[0]},T.getEndDate=function(t){var e=T.getEndDateType(t);return null==e?ta.page.getDates(t)[0]:ta.page.getDates(e)[0]},T.getMinEnabledDate=function(t){if(T.isHotelDateType(t)||T.isRoundTripDateType(t)){var i=e.retrieve("multiDP.minCheckInDate");if(i)return new n(r.fromString(i))}elsereturn null},T.flattenType=function(t){var e=T[t];return e?e.children?e.children.slice(0):[t]:[]},T.getCorrespondingDateType=function(t){switch(t){case"CHECKIN":return"CHECKOUT";case"CHECKOUT":return"CHECKIN";case"DEPARTURE":return"RETURN";case"RETURN":return"DEPARTURE";case"ATTRACTION_FROM":return"ATTRACTION_TO";case"ATTRACTION_TO":return"ATTRACTION_FROM";case"VPDEPARTURE":return"VPRETURN";case"VPRETURN":return"VPDEPARTURE";default:return null}},T}); define("mixins/page-dates/Base",["vanillajs","ta","mixins/page-dates/Utils","mixins/page-dates/DateTypeStore"],function(e,r,t,n){"use strict";function a(e){return e instanceof Date&&!isNaN(e.getTime())}function i(e){if(!n[e])throw"Invalid date type: "+e}function s(e){var r=[];for(var t in n)n.hasOwnProperty(t)&&n[t].children&&n[t].children.indexOf(e)>=0&&r.push(t);return r}function o(e,r){var a=n[e],i="";if(a.children)for(var s=0,o=a.children.length;s0?"_":"")+t.dateToIso(r[a.children[s]])}else{if("_"===r[e])return"_";i+=t.dateToIso(r[e])}return i}function h(e,r){var t=n[e];if(t.children){for(var a=0,i=t.children.length;af.x-a.left-l.x?o.left:o.right}return o[t]},r.injectContent=function(t,e,r,i,o){n.isElement(r)?n.adopt(t,r):i?(r=n.find(i,e),n.removeClass(r,"hidden"),n.adopt(t,r)):o?(r=n.find(o),r&&(t.innerHTML+=r.innerHTML)):t.innerHTML+=r},r.injectContentWithDataAttrs=function(t,e,n,i,o),r.parseOffsets=function(t){return t&&t.length?0:{x:0,y:0}},r.loadingSpinnerHtml=e,r}); define("utils/array/flatten",["vanillajs"],function(){return function n(r){return r.reduce(function(r,t){return r.concat(Array.isArray(t)?n(t):t)},[])}}); define("utils/bindAll",["babel/babel-helpers"],function(n){return function(n){for(var r=arguments.length,e=Array(r>1?r-1:0),i=1;i1?h-1:0),u=1;ui.x-r.left-e.x?r.left-t.x-o.x-(l?n.scrollLeft():0):r.left+e.x+o.x-(l?n.scrollLeft():0)},function(t,o,e,r,i,l){return r.top+e.y/2-t.y/2-(l?n.scrollTop():0)}),a.center=l(function(t,n,o,e,r){return r.x/2-t.x/2},function(t,o,e,r,i,l){return i.y/2-t.y/2+(l?0:n.scrollTop())}),a.centerBelow=l(function(t,n,o,e,r){return r.x/2-t.x/2},function(t,o,e,r,i,l){return r.top+e.y+o.y-(l?n.scrollTop():0)}),a.topCenter=l(function(t,n,o,e,r){return r.x/2-t.x/2},function(t,n,o,e,r,i){return 0}),a.topLeft=l(null,function(t,o,e,r,i,l){return r.top-t.y-o.y-(l?n.scrollTop():0)},function(t,o,e,r,i,l){return i.x-(r.left+e.x)+(l?n.scrollLeft():0)}),a.movingCenter=u(!0,!0),a.movingCenterX=u(!0,!1),a.movingCenterY=u(!1,!0),a.cssCentered=f(),a.absolute=l(function(){return 0},function(){return 0}),a.framed=l(function(){return 0},function(){return 0},function(){return 0},function(){return 0}),a.offScreen=l(function(){return-1e4},function(){return-1e4}),a.noop=function(){return function(){}},a.rightEvenInRtl=a.right,a.leftEvenInRtl=a.left,"undefined"!=typeof document&&n.hasClass(document.body,"rtl")){a.left=a.rightEvenInRtl,a.right=a.leftEvenInRtl;var p=a.bottomRight;a.bottomRight=a.bottomLeft,a.bottomLeft=p,p=a.rightTop,a.rightTop=a.leftTop,a.leftTop=p,p=a.overlapRightTop,a.overlapRightTop=a.overlapLeftTop,a.overlapLeftTop=p}return a}); define("overlays/options/closeOnDocClick",["vanillajs","api-mod"],function(t,e){"use strict";function n(t)e.getParent(t.target,"ui_dropdown"))function i(t){return function(){var i=e.bind(n,this);this.on("show",function(){setTimeout(function(){this.isOpen()&&(e.addEvent(document,"click",i),t&&e.addEvent(document,"touchstart",i))}.bind(this),1)}).on("hide",function(){e.removeEvent(document,"click",i),t&&e.removeEvent(document,"touchstart",i)})}}var o=i(!0);return o.withoutTouchEvents=i(!1),o}); define("overlays/options/repositionOnEvent",["vanillajs","api-mod"],function(n,i){"use strict";function t(){this.emit("positionDirty")}return function(n,o){return function(){var e=o.splice?o:[o],c=i.bind(t,this);this.on("show",function(){e.forEach(function(t){i.addEvent(n,t,c)})}).on("hide",function(){e.forEach(function(t){i.removeEvent(n,t,c)})})}}}); define("overlays/options/repositionOnTaEvent",["vanillajs","ta/Core/TA.Event"],function(n,i){"use strict";return function(n){return function(){var t=this.emit.bind(this,"positionDirty");this.on("show",function(){i.on(n,t)}).on("hide",function(){i.off(n,t)})}}}); define("overlays/options/storeOverlayOnElement",["vanillajs","api-mod"],function(e,t){"use strict";var n=function(){this.sourceElement&&t.store(this.sourceElement,"overlay",this)};return n}); define("overlays/options/closeOnTaEvent",["vanillajs","ta/Core/TA.Event"],function(n,t){"use strict";function o(){this.hide("on-event")}return function(n){return function(){var i=o.bind(this);this.on("show",function(){t.on(n,i)}).on("hide",function(){t.off(n,i)})}}}); define("overlays/options/centerArrowOnSrcElement",["vanillajs","api-mod"],function(t,i){"use strict";var o=function(t){function o(){if(t=t||this.sourceElement,this.container&&t&&this.arrow){var o=i.getCoords(this.container),r=i.getCoords(t),n=i.hasClass(this.container,"arrow_top")||i.hasClass(this.container,"arrow_bottom");if(n){var s=r.left+r.width/2,e=i.getSize(this.arrow).x/2,a=Math.max(e,Math.min(o.width-e,s-o.left));i.setStyle(this.arrow,{"left":a+"px","right":"auto","margin":"0 0 0 -"+e+"px"})}else{var s=r.top+r.height/2,e=i.getSize(this.arrow).y/2,h=Math.max(e,Math.min(o.height-e,s-o.top));i.setStyle(this.arrow,{"top":h+"px","bottom":"auto","margin":"-"+e+"px 0 0 0"})}}}return function(){this.on("show",i.bind(o,this)),this.on("positionDirty",i.bind(o,this)),this.on("repositionArrow",i.bind(o,this))}};return o}); define("overlays/options/moveIntoView",["lib/jquery-amd"],function(t){"use strict";var o=500;return function(e,n){return e="undefined"==typeof e||e,n="undefined"!=typeof n||isNaN(n)?n:0,function(){this.on("show",function(){var i,f,r=t(this.container),s=t(this.sourceElement);e?(i=Math.min(r.offset().top,s.offset().top),f=Math.max(r.offset().top+r.outerHeight(),s.offset().top+s.outerHeight())):(i=r.offset().top,f=r.offset().top+r.outerHeight());var u=window.innerHeight,a=t(window).scrollTop(),h=a+u;if(!(i>=a&&fu||i=97&&e=65&&e=48&&e",0,0,0,0,0,0,"`","__2D__","X","<","slot",0,"ShowUrl","Owners",0,"[","q",0,"MemberProfile",0,"ShowUserReviews",'"',"Hotel",0,0,"Expedia","Vacation","Discount",0,"UserReview","Thumbnail",0,"__2F__","Inspiration","V","Map",":","@",0,"F","help",0,0,"Rental",0,"Picture",0,0,0,"hotels",0,"ftp://"],"x":[0,0,"J",0,0,"Z",0,0,0,";",0,"Text",0,"(","x","GenericAds","U",0,"careers",0,0,0,"D",0,"members","Search",0,0,0,"Post",0,0,0,"Q",0,"$",0,"K",0,"W",0,"Reviews",0,",","__2E__",0,0,0,0,0,0,0,"{","}",0,"Cheap",")",0,0,0,"#",".org"],"z":[0,"Hotels",0,0,"Icon",0,0,0,0,".net",0,0,"z",0,0,"pages",0,"geo",0,0,0,"cnt","~",0,0,"]","|",0,"tripadvisor","Images","BookingBuddy",0,"Commerce",0,0,"partnerKey",0,"area",0,"Deals","from","",0,"urlKey",0,"'",0,"WeatherUnderground",0,"MemberSign","Maps",0,"matchID","Packages","E","Amenities","Travel",".htm",0,"!","^","G"]},r="",a=0;a0&&(e+=("?"===a[0]?"":"?")+a,a=null),u.open(o,e,!r.synchronous),s(e,u,r),u.send(a)})}}); define("utils/object/set-props",["vanillajs"],function(){"use strict";return function(n,r){for(var t in r)r.hasOwnProperty(t)&&(n[t]=r[t]);return n}}); define("utils/object/shallow-copy",["utils/object/set-props","vanillajs"],function(t){"use strict";return function(r){var e;if("object"!=typeof r||null===r)return r;if(r.constructor===Array){e=[];for(var n=0;n4,a=(15&c)>2,h=(3&f)c}function i(e).+?(?=%2F)/.exec(e),n=t[0],r=o(n),u=e.replace(n,r);window.open(u)var d="TAP|",c=d.length;return{decodeUrl:t,getUrl:n,goToLink:r,decodeProductCode:o,isObfuscatedProductCode:u,goToCommerceLinkWithProductCode:i}}); define("ta/Core/TA.Record",["vanillajs","ns-exporter","ta/Core/TA.Store","purify","ajax-request","utils/objutils","utils/urlDecoder"],function(e,t,n,r,a,i,o){"use strict";var u={},l={},c=[],s=8,d="impressionTrackingTree",g=0,f=1,v=2,p="UserTracking",m="impression",h="action",k="pageview",y="search",E=[],T=60,P=function(e){return"function"==typeof e},b=function(e,t){try{if(!e||"object"!=typeof t)return;if(window.JSON&&JSON.stringify){var n=JSON.stringify(t);n&&n.length<1e5&&(E.push([e,n]),E.length>T&&E.shift())}}catch(e){}},_=function(e,t,n,r){a(e,t).then(n,r),b(e,t)},S=function(){if(require.defined("ta/util/Error")){var e=require("ta/util/Error");e.record.apply(e,arguments)}else ta&&ta.m&&P(ta.m.recordJSError)&&ta.m.recordJSError(arguments)},C=function(e),w=function(e){var t=[];for(var n in e){var r=e[n];t.push(C(n)+"."+C(r))}return t.join("*")},A=function(e)null===e?"":("string"!=typeof e&&(e=e.toString()),e.replace(/!/g,"!!").replace(/./g,"!.").replace(/*/g,"!*").replace(/~/g,"!~")),N=function(e){var t=[];for(var n in e){var r=e[n];t.push(A(n)+"."+A(r))}return t.join("*")},R=function(e){var t=/(https?://[^/]+)?/([^#.?-]*)/,n=t.exec(e);return n&&"undefined"!=typeof n[2]?n[2]?n[2]:"Home":null},O=function(){var e=u.getPageData();if(e&&e.url)return e.url.substring(1);var t=//([^-]*)/.exec(window.location.pathname);return t?t[1]:null},I=function(){var e=ta.uid;if(require.defined("redux-init")){var t=require("redux-init");t&&t.tracking&&t.tracking.uid&&(e=t.tracking.uid)}return e},x=function(e,t,n){var r=new RegExp("(-"+t+"([0-9]+))|([?&]"+n+"=([0-9]+))"),a=r.exec(e);if(a){if("undefined"!=typeof a[2])return a[2];if("undefined"!=typeof a[4])return a[4]}return null},M=function(e)x(e,"g","geo"),q=function(e);)s*"+e+"=([^;]*)");return!!t&&(t=t[1],0===t.indexOf("%1%")&&(t=t.substring(3)),decodeURIComponent(t)),L=function(e,t,n){try{var r;n.encode&&(t=encodeURIComponent(t)),n.domain&&(t+="; domain="+n.domain),n.path&&(t+="; path="+n.path),n.duration&&(r=new Date,r.setTime(r.getTime()+1e3*n.duration),t+="; expires="+r.toGMTString()),n.secure&&(t+="; secure"),document.cookie=e+"="+t}catch(e){S(e,"_setCookieInSeconds",null,arguments)}},D=function(){return ta.m&&ta.m.store&&ta.m.store.has("bookingSessionId")?ta.m.store.get("bookingSessionId"):null},H=function(){var e=!1;return"boolean"==typeof ta.userLoggedIn&&(e="boolean"==typeof ta.userSecurelyLoggedIn?ta.userLoggedIn?ta.userSecurelyLoggedIn?v:f:g:ta.userLoggedIn),e},U=function(e,t){var r={gac:e[1],gaa:e[2],gal:e[3],gav:e[4],gani:e[5],gass:O(),gasl:M(document.location.href),gads:R(t),gadl:M(t),gapu:I(),gams:H()},a=D();if(!r.gass)throw new Error("Src servlet undefined, gac:"+r.gac+", gaa:"+r.gaa+", gal:"+r.gal);if(!r.gads)throw new Error("Dst servlet undefined. gac:"+r.gac+", gaa:"+r.gaa+", gal:"+r.gal);n.has("gatt")&&(r.gatt=n.retrieve("gatt")),a&&(r.bsid=a),L("EVT",w(r),{domain:cookieDomain,duration:5,encode:!0,path:"/"})},j=function(e),J=function(){};require.defined("page-model")&&require(["page-model"],function(e){var t=e.session,r=t.analyticsInfo;r&&(n.keep("partials.pageProperties",r.pagePropertyStringForCurrentPageview),n.store("gaMemberState",r.memberState),t.analyticsInfo&&require.defined("ta/Core/TA.Prerender")&&require("ta/Core/TA.Prerender")._init(!0)),J=function(){r&&c.push(JSON.parse(r.jsonForCurrentPageview)),J=function(){}}}),u.getPageData=function(){return J(),c[c.length-1]},u.pushPageData=function(e){J(),e&&c.push(e)},u._GARecordRequest=function(e,t){var r,a={gac:e[1],gaa:e[2],gal:e[3],gav:e[4],gani:e[5],gass:O(),gasl:document.location?M(document.location.href):null,gapu:I(),gams:H()},i=D();return t&&(a.gacl=t),n.has("gatt")&&(a.gatt=n.retrieve("gatt")),i&&(a.bsid=i),r=require.defined("utils/BatchRequest")?{get:function(){require("utils/BatchRequest").queue("/GARecord",a)}}:{get:function(){setTimeout(function(){var e=new XMLHttpRequest;e.open("GET","/GARecord?"+W(a),!0),e.send(null)},1)}},b("/GARecord",a),r};var W=function(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")};l.urlArgLookup=function(e,t){var n=new RegExp("[?&]"+e+"=(w+)"),r=n.exec(t);return r&&"undefined"!=typeof r[1]?r[1]:null},u._validatedTrackEventArray=function(e,t,n,r,a){return e&&"string"!=typeof e&&(e=e.toString()),t&&"string"!=typeof t&&(t=t.toString()),n&&"string"!=typeof n&&(n=n.toString()),r?"number"!=typeof r&&(r=parseFloat(r),isNaN(r)&&(r=0)):r=0,"boolean"!=typeof a&&(a=a===!0),["_trackEvent",e,t,n,r,a]},u._toEvtParams=function(e){try{var t={gac:e.module,gaa:e.action,gal:e.context,gav:e.value,gani:e.noninteraction};return t.gass=O(),t.gasl=M(document.location.href),t.gapu=I(),t.gams=H(),t}catch(t){S(t,"analytics._toEvtParams",null,e)}},u._trackEventAfterAjax=function(e){try{l.trackDMPBehavior(e.module,e.action,e.context,e.value,e.noninteraction)}catch(t){S(t,"analytics._trackEventAfterAjax",null,e)}},l.getEventPathOptions=function(e,t,n){try{var r=z(n,e);if(!r)return void S(null,"ta.getEventPathOptions - invalid element",null,arguments);var a=$(r);return t&&(a.noninteraction=t),a}catch(e){S(e,"ta.getEventPathOptions",null,arguments)}},u._trackEventPathAfterAjax=function(e){try{l.trackEventOnPage(e.category,e.action,e.label,e.value,e.noninteraction)}catch(e){S(e,"analytics._trackEventPathAfterAjax",null,arguments)}},l.trackPhysicalCommerce=function(e,t,n,r){try{var a=u._validatedTrackEventArray(e,"Commerce-Physical",t,n,!1);u._GARecordRequest(a,r).get()}catch(e){S(e,"ta.trackPhysicalCommerce",null,arguments)}},l.trackAttemptedCommerce=function(e,t,n){try{l.trackDMPBehavior(e,t,n,null,null)}catch(e){S(e,"ta.trackAttemptedCommerce",null,arguments)}},l.trackPhysicalAndAttemptedCommerce=function(e,t,n,r,a){l.trackPhysicalCommerce(e,t,r,a),l.trackAttemptedCommerce(e,t,n,r)},l.trackImpressionEventOnPage=function(e,t,n,r)"",n=n,l.trackEventOnPage=function(e,t,n,r,a){o.isObfuscatedProductCode(e)&&(e=o.decodeProductCode(e)),o.isObfuscatedProductCode(t)&&(t=o.decodeProductCode(t)),o.isObfuscatedProductCode(n)&&(n=o.decodeProductCode(n));try{var i=u._validatedTrackEventArray(e,t,n,r,a);u._GARecordRequest(i).get()}catch(e){S(e,"ta.trackEventOnPage",null,arguments)}},l.trackEventOnPageOnce=function(e,t,r,a){var i,o="eventsAlreadyTracked";i="object"==typeof ta&&ta.m&&ta.m.store?ta.m.store.get(o):n.retrieve(o),i||(i={},"object"==typeof ta&&ta.m&&ta.m.store?ta.m.store.add(o,i):n.store(o,i));var u=e+"|"+t+"|"+r;i[u]||(l.trackEventOnPage(e,t,r,0,a),i[u]=!0)},l.trackDMPBehavior=function(e,t,n,r,a){},l.setEvtCookie=function(e,t,n,r,a){try{var i=u._validatedTrackEventArray(e,t,n,r,!1);if(U(i,a),require.defined("ta/common/behavior/dmp/DMP")){var o=require("ta/common/behavior/dmp/DMP");o.isEnabled()&&o.sendEventBehavior(e,t,n,r,Z())}}catch(e){S(e,"ta.setEvtCookie",null,arguments)}};var G=function(e){var t;try{if(t=q("MEVT")||"",t.length>0&&(t+="~"),t+=N(e),t.length>1024)throw"MEVT Cookie is full";L("MEVT",t,{domain:cookieDomain,duration:5,encode:!0})}catch(e){return S(e,"_appendMevtCookie",null,arguments),!1}return!0},B="trk",V=B.length,F="etk",X=/^([A-Z]{1,2}:)?[A-Za-z_0-9-.]+$/,Z=function();u.getCommentTrackingPath=function(e,t){return z(e,t)};var z=function(e,t){if(e=r(e),!e&&(e=Z(),!e))return S(null,"_getCommentTrackingPath - no element provided or event target element",null,arguments),null;if(1!=e.nodeType)return null;var n=[];if(t&&"string"==typeof t&&""!==t&&X.test(t)){if("P:"==t.substring(0,2))return n.push(t.substring(2)),n;n.push(t)}if("undefined"==typeof e.previousSibling)return S(null,"_getCommentTrackingPath - browser does not support previousSibling",null,arguments),n;e:for(var a=e;a!=document.body;a=a.parentNode){if(null==a){S(null,"_getCommentTrackingPath - LOOP_PARENT_NODES got unexpected null node",null,arguments);break}for(var i=0,o=a.previousSibling;null!=o;o=o.previousSibling)if(o.nodeType==s){var u=o.nodeValue;if(u==F){i++;continue}if(u.substring(0,V)!=B)continue;if(i>0){i--;continue}var l=u.substring(V).split("/");l||S(null,'ta._getCommentTrackingPath - cannot split context class: "'+u+'"',null,arguments);for(var c=l.length-1;c>=0;c--){var d=l[c],g=X.exec(d);if(g){if("P:"==g[1]){var f=g[0].substring(2);n.push(f);break e}n.push(g[0])}else S(null,'ta._getCommentTrackingPath - tracking prefix used with invalid context: "'+l[c]+'"',null,arguments)}}}return n},$=function(e){if(0===e.length)return null;var t={"action":e[0],"label":"","value":"1","category":e[e.length-1]};e.shift();for(var n=e.length-2;n>=0;n--)t.label+=e[n],n>0&&(t.label+="/"),"N:"==e[n].substring(0,2)&&(t.value=e[n].substring(2));return""===t.label&&(t.label="Unknown"),t};l.trk=function(e,t,n,a){n=r(n);try{var i=n?n.getAttribute("data-trk-path"):null;if(i)i=i.replace("P:",""),i=i.split("/"),i.reverse();else if(i=z(n,e),!i||!i.length){var o="";if(n)if(n.outerHTML){var u=document.createTextNode(n.outerHTML),c=document.createElement("div");c.appendChild(u),o=c.innerHTML.substring(0,100)}else n.nodeName?o=n.nodeName:o+=n;else void 0===n?o="undefined":null===n&&(o="null");return e||(e=null===i?"null path":void 0===i?"undefined path":i.hasOwnProperty("length")?0===i.length?"empty path":i.join(","):"path: "+i),void S(null,"ta.trk - invalid element for "+e+" from "+o,null,arguments)}l.trkWithPath(i,t,a)}catch(e){S(e,"ta.trk",null,arguments)}},l.trkWithPath=function(e,t,n){try!e.length)return void S(null,"ta.trkWithPath - no path in arguments",null,arguments);if(n&&n.length>0&&e.length&&e.splice)for(var r=n.length-1;r>=0;r--)"string"==typeof n[r]&&e.splice(1,0,n[r]);var a=$(e);l.trackEventOnPage(a.category,a.action,a.label,a.value,t)catch(e){S(e,"ta.trkWithPath - "+e,null,arguments)}},l.trkImpTree=function(e){try{if(!j(e))return void S(null,"ta.trkImpTree called with invalid trackTreeElem!",null,arguments);var t=e.firstChild.nodeValue;ne(t)}catch(e){S(e,"ta.trkImpTree",null,arguments)}},l.recordImpression=function(e,t){if(!e)return void(t&&t());try{ne(Y(e),t)}catch(e){S(e,"ta.recordImpression",null,arguments),t&&t()}};var K="",Y=function(e){var t=e.indexOf(K),n=0,r=e.indexOf(Q);return t!==-1&&(n=t+K.length),r===-1&&(r=e.length),e.substring(n,r)};u.stripCommentsFromTree=Y;var ee="",te="/";u.appendAscendTokens=function(e){var t=0,n=0,r=0;for(t=0;t0&&oe.ERUserTrackingEventNames.indexOf(e)<0)},le=function(e,t,n){if(ue(e,t)){var r=oe.uid&&{request_uid:oe.uid}||{},a={event_name:e,event_type:t,attr:JSON.stringify(i.extend(n,r))},o={get:function(){setTimeout(function(){var e=new XMLHttpRequest;e.open("GET","/UserTrackingRecord?"+W(a),!0),e.send(null)},1)}};return o.get()}n.event_name=e,l.trackEventOnPage(p,t,JSON.stringify(n))};l.trackImpressionWithJson=function(e,t){le(e,m,t)},l.trackActionWithJson=function(e,t){le(e,h,t)},l.trackPageviewWithJson=function(e,t){le(e,k,t)},l.trackSearchWithJson=function(e,t){le(e,y,t)},l.trackUnifiedEvent=le,t.createNs(u,"ta","analytics"),t.exportTo(l,"ta");var ce={};return t.exportTo(u,ce),t.exportTo(l,ce),ce}); define("utils/ajax",["lib/jquery-amd","ta/Core/TA.Record","utils/form-to-json"],function(e,t,i){function n(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName}return function(r,a){r.substr||(a=r);var s=e.extend({},a,{dataFilter:function(e,t){return"json"==t&&(e=e.replace(/^s*whiles*([^)]*);?/,"")),a&&a.dataFilter&&a.dataFilter.call(this,e,t),e}});s.xhrFields=s.xhrFields||{},s.xhrFields.withCredentials=!0,n(s.data)&&(s.data=i(s.data));var c=s.trackEvent;return c&&(e.extend(s,t._toEvtParams(c)),s.complete=function(){t._trackEventAfterAjax(c),a&&a.complete&&a.complete.apply(this,arguments)}),s.evalScripts&&(s.success=function(t,i,n){if(t&&t.substr){var r,s;e.parseHTML?(r=e(e.parseHTML(t,document,!0)),s=r.filter("script").add(r.find("script"))):(r=e(""+t+""),s=r.find("script")),s.each(function(e,t){if(t.innerHTML)if(window.execScript)window.execScript(t.innerHTML);else if(window.eval)window.eval(t.innerHTML);else{var i=document.createElement("script");i.setAttribute("type","text/javascript"),i.text=t.innerHTML,document.head.appendChild(i),document.head.removeChild(i)}})}a&&a.success&&a.success.apply(this,arguments)}),r.substr?e.ajax(r,s):e.ajax(s)}}); define("ta/util/Error",["vanillajs","api-mod","utils/ajax","ns-exporter","mixins/Events","utils/browserutils","ta/util/Cookie","ta"],function(r,e,t,o,n,a,i,c){function s(r,t){var o="_extraInfoError_:Problem storing extra info.",n={},a="";try{if(Array.isArray(t)||"[object Arguments]"===Object.prototype.toString.call(t)){for(var i={},c=0;cy&&(a=a.substring(0,y)),a.replace(/[rn]/g,"")}catch(r){}return o}function l(r){return"undefined"!=typeof r&&null!==r?r.toString().replace(/[rn]/g,""):"null or undefined"}function f(r,e,t){var o,n="";if(r&&r.stack)try{var a,i,c=r.stack.split("n"),s=[],l=0;c[1]&&c[1].match(/.record /)&&c.splice(1,1);for(var f=0;f=0)){var d=!!u.match(//jquery-|/mootools|(native)|(native code)|[native code]/);u=u.replace(/^(.*)http.+/([^/]*)/,"$1$2").replace(/(?.{20})[^:)]+/,"$1...").replace(/^(?:s+w+s*([^s]+)|([^s]+)@)s*(?([^)]*))?$/,"$1$2 ($3)").replace(/s*()/,""),a&&d?i||(s.push("..."),i=!0,l++):(s.push(u),d&&l++),d||(i=!1),a=d}}s.length-l=0;return r&&!e}function v(r){if(m()){var e={eMsg:"msg",eStak:"stack",eUrl:"url"};for(var t in e){var o=e[t];r[o]=r[t]}r.file=r.url||document.URL,r.site=window.SITE_VERSION,r.loaded=O?"dom_ready":"not_loaded"}}var p={},S=new n("error","beforeSend"),h=window.IS_DEBUG,y=3e3,R=h?100:10,w=4,E="unset",b=0,O=!1;return p.record=function(r,e,o,n,a,y){y=y||{},r?"string"==typeof r&&(r=new Error(r)):r=new Error("Stub error to build stack.");var w=!1;trycatch(r){}if(w&&!r.stack)try{throw r}catch(e){e&&e.stack&&(r=e)}o=o||window.event||{};var N=o.target;if(b>=R)return void(h&&console.error("Maximum JS errors reached. Not reporting."));b++;var j=!1;trym()catch(r){}if(j){var _=!0;n&&n.hasOwnProperty("error_script")&&!d(n.error_script)&&!g(n.error_script)&&(_=!1);var k={};if(N)try{k.eTarg=p.getSelectorString(N)}catch(r){}"undefined"!=typeof debugCacheKey&&(k.key=debugCacheKey);var T=window.pageServlet;T||(T="unknown"),k.servlet=T,a&&"string"==typeof a||(a="ERROR"),_?!h&&b>1?(a="WARN",k.warnReason="notFirstJSError"):"object"==typeof r&&"WARN"===r.level&&(a="WARN"):(a="WARN",k.warnReason="externalError");var A={"extraInfoError":"Problem storing extra info"},x={};try{var D="",L="";N&&("function"!=typeof N.id&&(D=N.id),L=N.className);var P=window.serverPool||"",I="";window.MooTools&&(I+="MooTools "),require.defined("lib/jquery-amd")&&(I+="jQuery "),x={"TARGET_ID":D,"TARGET_CLASS":L,"PAGE_UID":c&&c.uid,"INTERNAL_JS":u(),"CLIENT_POOL":P,"COOKIES_ENABLED":i.canSet(),"JS_LIBS":I},_||(x.INTERNAL_ERROR="false"),b>1&&(x.PRIOR_JS_PAGE_ERRORS=b-1)}catch(r){n=A}k.xInfo=s(x,n);try{k.eUrl=window.location.href}catch(r){}try{var J=c.page.getDates("STAYDATES");J?k.eDates=J[0].toLocaleDateString("en-US")+" - "+J[1].toLocaleDateString("en-US"):k.eDates="No dates set"}catch(r){}var $="No Error";try{if(w)$=r.name+"-"+r.message;else if("object"==typeof r)if(r.name&&r.message)$=r.name+"-"+r.message;else{$="non-Error object "+Object.prototype.toString.call(r)+" passed, sample properties - ";var M=0;for(var C in r)if(r.hasOwnProperty(C)&&($+=C.substring(0,30)+": "+(r[C]&&r[C].toString?r[C].toString().substring(0,20):r[C])+", ",++M>4))break}else $="non-Object error passed: "+(""+r).substring(0,60);$=$.replace(/[rn]/g,"")}catch(r){}k.eMsg=$;try{k.eBlk=l(e).substring(0,150)}catch(r){}var U;if(!r.stack)tryarguments&&arguments.calleecatch(r){}var B=f(r,N,U);B&&(k.eStak=B);try{S.emit("beforeSend",k)}catch(r){}k.eLogLevel=a,v(k),h&&!y.isglobal&&(console.error("/JSErrorRecord:"),r.stack?console.error(r.stack):B?console.error(B):console.error("No stack"));try{t({url:"/JSErrorRecord",data:k,method:"POST",type:"POST"})}catch(r){k={"eBlk":"JSErrorRecord Error","servlet":T,"eLogLevel":"ERROR","eMsg":"no error retrieved"},t({url:"/JSErrorRecord",data:k})}if(h&&(window.ERRORS||(window.ERRORS=[])).push(k),S.emit("error",$,e,a,k.eStak),"unset"==E&&(E=i.readRaw("JS_ERROR_HANDLING")),E){if(E.match(/alert/)){var G="";for(var F in k)k.hasOwnProperty(F)&&(G=G+F+": "+k[F]+"n");alert(G)}E.match(/console/)&&window.console&&console.error(k)}}},p.getSelectorString=function(r){for(var e=[];r&&"HTML"!=r.tagName&&r!=document;r=r.parentNode){var t=r.tagName;r.id&&(t+="#"+r.id),r.className&&(t+="."+r.className.trim().replace(/s+/g,".")),e.unshift(t)}return e.join(">")},p.ajaxFailure=function(r,t,o,n){p.record(null,r,null,e.merge({status:t.status},o),n||"ERROR")},p.enableDomReadyParam=function(){O=!0},p.on=S.on.bind(S),p.off=S.off.bind(S),(a.firefox&&a.version<5||a.ie&&a.version<10)&&(p.record=function(){window.console&&console.error("Unreported error: "+[].slice.call(arguments).join(", "))}),o.createNs(p,"ta.util","error"),p}); define("ta/util/Deferred",["vanillajs","ns-exporter"],function(e,r){"use strict";function t(e){l.prototype[e]=function(r,t){return i(this,e,t?r.bind(t):r)}}for(var n=["success","failure","always","progress"],u={"resolved":["success","always"],"rejected":["failure","always"]},l=function(){},a=0;a=n}}function r(n){return function(){return t()n()},portrait:function(){return n()>t()},currentBreakpoints:function(){return u.filter(function(t){return"function"==typeof c[t]&&c[t]()})},is:function(t,n,e){var r="function"!=typeof t&&c[t]?c[t]:t;return function(t,i){return r()?"undefined"!=typeof t?t:n:"undefined"!=typeof i?i:e}}};return c}); define("calendars/DesktopStayDates",["vanillajs","api-mod","overlays/Overlay","overlays/styles/modal","overlays/styles/popover","overlays/position","overlays/options/closeOnDocClick","overlays/options/repositionOnEvent","overlays/options/repositionOnTaEvent","overlays/options/storeOverlayOnElement","calendars/CalendarDate","overlays/options/closeOnTaEvent","overlays/options/centerArrowOnSrcElement","overlays/options/moveIntoView","ta/util/I18N","ta/Core/TA.Dust","ta/util/Deferred","ta/util/Date","mixins/page-dates/DateTypeStore","ta/Core/TA.Record","utils/responsive"],function(e,t,n,a,r,o,i,d,s,l,c,u,p,h,f,v,m,D,y,T,w){"use strict";function C(e,t){var n,a=[],r=!1,o=y.isSingleDateType(t.dateType);e.eachDayInMonth(function(e){var n=!r&&0===e.compare(t.today);r=r||n;var i=t.startDate&&0===e.compare(t.startDate);a.push({label:e.day(),date:_(e,t)?null:e.toString(),today:n,start:!o&&i,end:t.endDate&&0===e.compare(t.endDate),selected:o?i:e.inRange(t.startDate,t.endDate)})}),n=e.firstDayOfMonth()-jsGlobalDayOffset,n+=n<0?7:0;for(var i=0;i0&&(t=e.thisMonth))),t}function _(e,t){var n=t.today,a=t.startDate,r=t.dateType,o=t.minEnabledDate,i=t.maxEnabledDate,d=t.maxStayLength,s=t.availableDates,l=t.excludedDates;if(!R(r)){if(s){for(var u=0;u0)||(!!(R(r)&&a&&a.daysTo(e)>d)||!!(i&&i.compare(e)<0))}function x(e,n,a){var r=2,o=e>0?r:-1,i=n.currentMonth.relativeMonth(o),d=f.isRtl()?"dsdc-scroll-right":"dsdc-scroll-left";i.compare(n.minEnabledDate.thisMonth())<0||i.compare(n.maxEnabledDate.thisMonth())>0||(i.compare(n.today.relativeMonth(12))>0&&!L&&(L=!0,T.trackEventOnPage("DATEPICKER","viewed_year_out")),N=!0,v.renderToString(F,{month:C(i,n)}).then(function(r){var o=t.find(".dsdc-months",a),i=document.createElement("div");i.innerHTML=r,e<0?(t.addClass(o,"dsdc-no-anim"),o.insertBefore(i.firstChild,o.firstChild),t.addClass(o,d),t.forceReflow(o),t.removeClass(o,"dsdc-no-anim")):o.appendChild(i.firstChild),e<0?t.removeClass(o,d):t.addClass(o,d),setTimeout(function(){e<0?o.removeChild(o.lastChild):(t.addClass(o,"dsdc-no-anim"),o.removeChild(o.firstChild),t.removeClass(o,d),t.forceReflow(o),t.removeClass(o,"dsdc-no-anim")),N=!1},B?I:0),n.currentMonth=n.currentMonth.relativeMonth(e),S(n)}))}function S(e,n){e.currentMonth.compare(e.minEnabledDate.thisMonth())=0?t.addClass(t.find(".dsdc-next",n),"dsdc-inactive"):t.removeClass(t.find(".dsdc-next",n),"dsdc-inactive")}function k(){document.selection&&document.selection.empty?document.selection.empty():window.getSelection&&window.getSelection().removeAllRanges()}function O(e,t,n,a){if(a=a||window.event,a&&a.target&&!N){var r=a.target.className;return r.indexOf("dsdc-next")>=0?x(1,t,n):r.indexOf("dsdc-prev")>=0?x(-1,t,n):a.target.getAttribute("data-date")&&(e.resolve([c.fromString(a.target.getAttribute("data-date")).date]),A&&A.hide()),k(),!1}}function P(e)"")function R(e){return y.isChildDateType(e)&&!y.isStartDateType(e)&&!y.isRoundTripDateType(e)}var A,N,j="calendars/desktop_stay-dates/calendar.dust",F="calendars/desktop_stay-dates/month.dust",I=300,B=!!window.TransitionEvent,L=!1,H=543;return{open:function(e,r){A&&A.destroy();var s=m(!0),c=E(r);return v.renderToString(j,M(c)).then(function(r){var p=[a(e,"below",P(c),null,null,r),o.bottomRight(),i,l,d(window,"date_bar_docked"),d(window,"date_bar_undocked"),u("dualSearchTypeaheadOpen")];A=new n(e,p),A.on("hide",function()s.reject(),A=null),A.show(),S(c,A.container),t.addEvent(A.container,"click",O.bind(null,s,c,A.container))}),s.promise()},openInline:function(e,n,a){var r=m(!0),o=E(n),i=a.querySelector(".innerCalendarWrapper");t.destroy(i),i=document.createElement("div"),i.className="innerCalendarWrapper",a.appendChild(i),o.showPrices=!ta.page.hasDates("STAYDATES");var d=function();return v.renderToString(j,M(o)).then(function(n){i.innerHTML=n,S(o,i),t.addEvent(i,"click",O.bind(null,r,o,i)),t.addEvent(t.find(".update_results_button",i),"click",function(){t.addClass(e,"greenFocus")}),t.addEvent(t.find(".dsdc-close-x",i),"click",d),t.addEvent(t.find(".clearDatesBox",i),"click",function(){b(o.dateType),d()})}),r.promise()},openInContainer:function(e,n,a){var r=m(!0),o=E(n),i=t.getParent(a,"calendarFlyout"),d=t.find(".innerCalendarWrapper",a),s=a.overlay;return t.destroy(d),d=document.createElement("div"),d.className="innerCalendarWrapper",a.appendChild(d),s&&s.on("hide",function()r.reject()),v.renderToString(j,M(o)).then(function(e){d.innerHTML=e,S(o,d),t.addEvent(d,"click",O.bind(null,r,o,d))}),i.deferred=r,r.promise()},closeCalendar:function(){A&&A.destroy()},openAsPopover:function(e,a){function c(e){return"function"==typeof o[e]&&"below"!=e?o[e]([0,0]):o.bottomRight([-16,-8])}function f(e){return e&&e.calendarPopupDirection&&""!=e.calendarPopupDirection?e.calendarPopupDirection:"below"}A&&A.destroy();var D=m(!0),y=E(a);return v.renderToString(j,M(y)).then(function(o){var v=f(y),m=t.find(".trip_search"),T=t.find(".ui_icon.calendar",e);m&&(v="below");var w=c(v),C=[r(e,v,P(y),null,o),w,p(T),i,l,d(window,["resize","date_bar_docked","date_bar_undocked"]),s("makeTextFitResizedText"),u("dualSearchTypeaheadOpen")];a.moveIntoView&&C.push(h(!0,30)),A=new n(e,C),A.on("hide",function()D.reject(),A=null),t.addEvent(t.find(".dsdc-close-x",A.container),"click",function(){A.hide()}),t.addEvent(t.find(".dsdc-wrapper .ui_close_x",A.container),"click",function(){A.hide()}),t.addEvent(t.find(".clearDatesBox",A.container),"click",function(){b(y.dateType),A.hide()}),A.show(),S(y,A.container),t.addEvent(A.container,"click",O.bind(null,D,y,A.container))}),D.promise()}}}); define("mixins/page-dates/Validator",["vanillajs","ta","mixins/page-dates/DateTypeStore","calendars/CalendarDate","ta/util/Date"],function(e,t,a,n,r){"use strict";function i(e)!t.page.hasDates(e))return!0;var n=a[e].children,r=t.page.getDates(e);return a.isStartDateType(n[0])&&a.isEndDateType(n[1])&&r[0]<=r[1]function s(e)!t.page.hasDates(e))return!0;var n=t.page.getDates(e);return n[0].getTime()!==n[1].getTime()function u(e){return function(n)}function D(e,t){var a=e instanceof n?e:new n(e),r=t instanceof n?t:new n(t);return Math.abs(a.daysTo(r))}var T=function(e){var t=e&&e.hasOwnProperty("maxStayLength")?e.maxStayLength:r.MAX_STAY_DURATION_DAYS;this.VALIDATORS={STAYDATES:[i,s,u(t)],ROUNDTRIP:[i],ATTRACTIONRANGE:[i],VPDATES:[i,s,u(t)]}};return T.prototype.validate=function(e){var t=this.VALIDATORS[e];return!t||0==t.length||!t.some(function(t){return!t(e)})},T}); define("ta/support/Qualtrics",["vanillajs","ns-exporter","page-model","ta/Core/TA.LocalStorage"],function(e,t,n,s){"use strict";var i={},r=function(e,t,n,s){this.get=function(e){for(var e=e+"=",t=document.cookie.split(";"),n=0,s=t.length;n=e/100?0:100),s=[t,e,0],this.set(n,s.join(":"))}var i=s[1];if(100==i)return!0;switch(s[0]){case"v":return!1;case"r":return i=s[2]%Math.floor(100/i),s[2]++,this.set(n,s.join(":")),!i}return!0},this.go=function(){if(this.check()){var e=document.createElement("script");e.type="text/javascript",e.src=s+"&t="+(new Date).getTime(),document.body&&document.body.appendChild(e)}},this.start=function(){var e=this;e.go()}};i.displaySurvey=function(e){var t=n.session.uid,s="QSI_S_"+e,i="//znbkpczkrl5wwqzj3-tripadvisor.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_SIID="+e+"&UID="+t+"&Q_LOC="+encodeURIComponent(window.location.href);try{require(["@ta/platform.runtime"],function(e){e.importBundle("@ta/platform.consent").then(function(e){e.requestConsent(e.CategoriesEnum.ANALYTICS,function(){new r(100,"r",s,i).start()})})})}catch(e){}R(!0)};var a=2592e6,o=6048e5,u=!1,c=!1,l=4,p=3,f=2,g=Math.round(10*Math.random())%2,d=!1,h=function(){return s.get("qualtrics-debug")},v=function(),q=function(){return!!s.getSessionKey("qualtrics-session-count-incremented")},m=function()(s.set("qualtrics-session-count",e+1,o),s.setSessionKey("qualtrics-session-count-incremented",!0)),S=function(e){s.setSessionKey("qualtrics-ignored",e)},y=function(){return!!s.getSessionKey("qualtrics-ignored")},w=function(e){s.set("qualtrics-responded",e,a)},I=function(){return!!s.get("qualtrics-responded")},b=function()0),D=function()0),K=function(){var e=D();s.setSessionKey("qualtrics-intercept-views",++e),4===e&&S(!0)},T=function(),C=function(){var e=T();s.setSessionKey("qualtrics-intercept-reqs",e+1)},N=function(){return d},k=function(e){d=e},L=function(){var e=!1,t=N();if(t)return e};i.isDebug=h,i.setResponded=w,i.hasResponded=I,i.getPageViews=b,i.getSmartSurvey=N,i.setSmartSurvey=k,i.updateInterceptViews=K,i.canDisplaySmart=L,i.getSessionCount=v,i.updateSessionCount=m,i.getInterceptViews=D,i.updateInterceptReqs=C,i.getInterceptReqs=T;var R=function(e){e?(s.set("qualtrics-last-seen",Date.now()),u=!0):s.remove("qualtrics-last-seen")},j=function(){var e=parseFloat(s.get("qualtrics-last-seen")),t=isNaN(e)?0:e,n=t<0?0:t+a;return Date.now()=200&&this.status=0&&w&&w>0)return H*w>=6e4?-1:(H*(w+1)>=6e4&&(E=!0),H);var e=w||0;return 0<=e&&e0?w:w+1)):(o.fireEvent(e,{},-1),l.reply("initialPollComplete",function(){return!0}),l.reply("polling_complete",function(){return!0}),l.emit("polling_complete"),o.fireEvent(N+"-polling-complete"))}function d(){R=R>0?R+1:1}function f(){if(R>1)return void(R-=1);R=0;var e=g||[];g=null;for(var t;t=e.shift();)try{t()}catch(e){}}function v(){return y}e=e||{};var h,m,g,w=1,y=0,T=!1,E=!1,P=0,x=null,S={},j=!1,A={},b={},q={},M=!!e.evaluateScripts,N=e.placement||"page",R=0,H=e.pollTimeoutOverride||-1,L=Date.now(),O=e.tracker,C=(e.inspector,s[e.pollIntervalName||"normal"]||s.normal),X=function(e){return e?decodeURIComponent(e.replace(/+/g," ")):e},U=function(e){var t,n;h=e.split("#")[0],m=h.split("?")[0],t=h.split("?")[1]||"",n=t.split("&");for(var r=0;r=0;t--){var n=e[t];delete A[n],T=!0}},z=function(e,t){if(!t)return!1;for(var n=!1,r=Object.keys(t||{}),o=r.length-1;o>=0;o--){var a=r[o];e[a]!==t[a]&&(n=!0),e[a]=t[a]}return n&&(T=!0),n},B=function(e,t){if(!t)return!1;for(var n=Object.keys(t||{}),r=n.length-1;r>=0;r--){var o=n[r];e[o]=t[o]}},G=function(){ee(!1)},J=function(e){var t,n,r,o=(e&&e.getAttribute("data-paramNames")||"").split(",");for(t=0;t=0?(j=!0,T&&y++,T=!1,r=++P,window.setTimeout(function(){te(r)},i),a&&p()):(o.fireEvent("hac-could-not-complete"),re())}},te=function(e){if(!x&&j&&e===P){if(R>0)return g=g||[],g.push(te.bind(this,e)),void(window.console&&console.log&&console.log("request held while updates are paused"));var r=++w,o=t.extend({},A,b),a=null;o.reqNum=r,o.isLastPoll=E,o.paramSeqId=y,o.waitTime=Date.now()-L,O&&O.start(r),q.UNKNOWN||(a=[],t.each(q,function(e,t){t&&a.push(e)}),o.changeSet=a.toString()),i.session.uid&&(o.puid=i.session.uid),j=!1,b={},S=q,q={};var l;try{l=new XMLHttpRequest}catch(e){try{l=new ActiveXObject("MSXML2.XMLHTTP")}catch(e){try{l=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){throw new Error("Can't create XMLHttpRequest or similar")}}}l.onreadystatechange=c.bind(l,r),l.open("POST",m,!0),"responseType"in l&&(l.responseType="document");try{l.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8")}catch(e){}try{l.setRequestHeader("X-Requested-With","XMLHttpRequest")}catch(e){}try{l.setRequestHeader("Accept","text/html, */*")}catch(e){}l.send(n.toQueryString(o)),x=l}},ne=function(e){if(R>0)return g=g||[],g.push(ne.bind(this,e)),void(window.console&&console.log&&console.log("update held while updates are paused"));var t;"string"==typeof e?(t=document.createElement("div"),t.innerHTML=e):t=e;var n=j;if(x=null,S={},M){var r=t.querySelectorAll("script");r=r?Array.prototype.slice.call(r):[];for(var i=0;i0)return g=g||[],g.push(re.bind(this)),void(window.console&&console.log&&console.log("error held while updates are paused"));var e=j;x=null,S={},e?te(++P):o.fireEvent(N+"-repoll-failed"),p()};return o.on(N+"-repoll-not-done",G),o.on(N+"-repoll-ajax-params",J),U(e.pageUrl||window.location.href),e.ajaxParams&&(A=t.extend(A,e.ajaxParams)),setTimeout(function(),0),{setPageUrl:U,repoll:D,pause:d,resume:f,getAjaxParams:F,setAjaxParams:I,setAjaxParamsNoPoll:k,setAjaxParamsNoPollForSP:_,setOneTimeParams:W,setOneTimeParamsNoPoll:K,removeAjaxParams:Q,setNotDone:G,isUpdatePending:V,getLastRequestNum:Y,setScriptsEval:Z,isScriptsEvalEnabled:$,fireTargetEvents:a,getParamSeqId:v}};return c}); define("mixins/ReviewPagination",["ta/common/Repoll"],function(e){"use strict";function t(o){function a(e,t){var a=location.pathname!==e;if(a){if(!history.replaceState)return void setTimeout(function(){window.location.href=e},10);if(history.replaceState(history.state,document.title,e),t)if(o.scrollCallback)o.scrollCallback();else{var n=document.querySelector(l);n&&n.scrollIntoView&&n.scrollIntoView()}i.setPageUrl(e),i.setOneTimeParams(r,"REVIEW_LIST")}}o=o||{};var i=o.repoll||new e({evaluateScripts:!0}),l=o.scrollToSelector||"[data-reviewsScrollTarget]",r=o.oneTimeParams||{};t.prototype.applyPaginationOffset=a}return t}); define("historyinject/HistoryInject",["utils/browserutils","common/trackingStreams"],function(i,t){"use strict";function n(i,n)function o(){return window.history&&"pushState"in window.history}function e(i,t){t&&t.call(i);var o=n.bind(null,i);return window.addEventListener("popstate",o),window.addEventListener("hashchange",o),!!i.isNewTab()&&(i.urlSuffix=i.options.query?i.originalSearch:i.originalHash,void i.updateState())}function r(i){return i.state&&i.state.backUrl}function a(){var t=null;return"ios"===i.Platform.name&&(i.chrome||i.crios)?t="iOSMobileChrome":i.android&&i.firefox&&(t="androidFirefox"),t?new Promise(function(i){require(["trjs!historyinject/browser/"+t],function(t){i(t)})}):Promise.resolve(null)}function l(i,t){try{if(t&&t.backButtonUrl)return t.backButtonUrl;if(window.opener&&window.opener.location&&window.opener.location.pathname){if(window.opener.location.origin===window.location.origin){if(window.opener.location.href&&"/Search"===window.opener.location.pathname)return window.opener.location.href;if("H_NEARBY_HISTORY_INJECT"!==i&&"EXP_NEARBY_HISTORY_INJECT"!==i&&"RESTAURANT_NEARBY_HISTORY_INJECT"!==i&&"R_R_HISTORY_INJECT"!==i&&"A_R_HISTORY_INJECT"!==i)return window.opener.location.pathname;if(window.opener.location.href&&window.opener.location.pathname.includes("/Hotel_Review"))return window.opener.location.pathname}}else if(document.referrer&&document.referrer.length>0){var n=new URL(document.referrer);if(n.hostname===document.location.hostname){if("H_NEARBY_HISTORY_INJECT"!==i&&"EXP_NEARBY_HISTORY_INJECT"!==i&&"RESTAURANT_NEARBY_HISTORY_INJECT"!==i&&"R_R_HISTORY_INJECT"!==i&&"A_R_HISTORY_INJECT"!==i)return n.pathname;if(window.opener.location.href&&window.opener.location.pathname.includes("/Hotel_Review"))return n.pathname}}}catch(i){}return null}var c=function(i,t){this.originalPath=window.location.pathname,this.originalHash=window.location.hash,this.originalSearch=window.location.search,this.backUrl=null,this.backUrlPlaceholder="-BackUrl",this.urlSuffix="",this.options=t||{},this.module=i,this.mixin=a(),this.backUrl=l(i,this.options)};return c.prototype.isNewTab=function(){return 1===window.history.length},c.prototype.updateState=function(){var i=this.originalPath+this.backUrlPlaceholder;if(!(this.backUrl.indexOf("WidgetEmbed")>=0)){if(this.backUrl.indexOf(".htm")>=0){var t=this.originalPath.split(".htm");i=t[0]+this.backUrlPlaceholder+".htm"+t[1]}history.replaceState({backUrl:this.backUrl},document.title,i+this.urlSuffix),history.pushState({},document.title,this.originalPath+this.urlSuffix)}},c.prototype.init=function(){o()&&this.backUrl&&this.mixin.then(e.bind(null,this))},c}); define("common/page-filters",["babel/babel-helpers","mixins/mixin","mixins/Events"],function(t,e,n){"use strict";function r(t,e){var n=v[t];return n&&e(n)}function i(t,e,n,r){return v[t]=new e(t,n,r),this}function u(t){return r(t,function(t){return t.isModified()})}function o(e,n){var i=this;r(e,function(r){var u=r.get();r.set(n);var o=r.get();u!==o&&i.emit("change",t.defineProperty({},e,{from:u,to:o}))})}function c(e,n){var i=this;r(e,function(r){var u=r.get();r.clearAll(),n.forEach(function(t){return r.set(t)});var o=r.get();u!==o&&i.emit("change",t.defineProperty({},e,{from:u,to:o}))})}function s(t){return t?r(t,function(t){return t.get()}):Object.keys(v).reduce(function(t,e){return t[e]=v[e].get(),t},{})}function a(t,e){return!!(t&&e&&Array.isArray(e))&&r(t,function(t){return t.isSelected(e)})}function f(e,n){var i=this;r(e,function(r){var u=r.get();r.clear(n);var o=r.get();u!==o&&i.emit("change",t.defineProperty({},e,{from:u,to:o}))})}function l(e){var n=this;if(!e){var i=this.get(),u=Object.keys(v).reduce(function(t,e){var n=v[e];if(!n.excludeClearAll){var r=n.get();n.clearAll(),r!=n.get()&&(t[e]={from:r,to:n.get()})}return t},{});return void(JSON.stringify(i)!==JSON.stringify(u)&&this.emit("change",u))}r(e,function(r){var i=r.get();r.clearAll();var u=r.get();i!==u&&n.emit("change",t.defineProperty({},e,{from:i,to:u}))})}function h(t,e){return r(t,function(t){return t.parse(e)})}function p(t,e){return r(t,function(t){return t.format(e)})}var v={},d=",",y="#",g=function(t,e,n){var r=this,i=!1,u=e;this.param=t,this.excludeClearAll=n,this.set=function(t)u!==t,u=t,this.get=function(){return u},this.clear=function(t){return r.set("")},this.clearAll=function(){return r.set("")},this.parse=function(t){return t?[t]:[]},this.format=function(t){return t},this.isModified=function(t){return i},this.isSelected=function(t){return t.every(function(t){return u===t})}},m=function(t,e,n){var r=this,i=!1;this.parse=function(t){return"string"!=typeof t?[]:t.split(d).filter(function(t){return""!==t}).map(function(t){return t.split(y)}).filter(function(t){return t.length>0&&""!==t[0]}).map(function(t){return})},this.format=function(t){return Object.entries(t).map(function(t){return t.join(y)}).join(d)};var u=e?this.parse(e).reduce(function(t,e){return t[e.key]=e.value,t},{}):{};this.param=t,this.excludeClearAll=n,this.set=function(t){return r.parse(t).map(function(t))},this.get=function(){return r.format(u)},this.clear=function(t){"string"==typeof t&&t.split(d).filter(function(t){return""!==t}).map(function(t))},this.clearAll=function(){return u={}},this.isModified=function(t){return i},this.isSelected=function(t){return t.every(function(t){return u.hasOwnProperty(t.key)&&u[t.key]===t.value})}},O=function(t,e,n){var r=!1;this.parse=function(t){return t.split(d).filter(function(t){return!!t})},this.format=function(t){return t.join(d)};var i=e?this.parse(e).reduce(function(t,e){return t[e]=!0,t},{}):{};this.param=t,this.excludeClearAll=n,this.set=function(t){var e=t.split(",");for(var n in e)if(e.hasOwnProperty(n))!i.hasOwnProperty(u),i[u]=!0},this.get=function(){return Object.keys(i).join(d)},this.clear=function(t){var e=t.split(",");for(var n in e)if(e.hasOwnProperty(n))},this.clearAll=function(){r=r||Object.keys(i).length>0,i={}},this.isModified=function(t){return r},this.isSelected=function(t){return t.every(function(t){return i.hasOwnProperty(t)&&i[t]})}},A=function(t,e,n){var r=this;this.parse=function(t){},this.format=function(t){return""};var i=!1;this.param=t,this.excludeClearAll=n,this.set=function(t){return i=!0},this.get=function(){return null},this.clear=function(t){i&&(P.emit("cleared-"+r.param),i=!1)},this.clearAll=function(){return r.clear(null)},this.isModified=function(t){return!1},this.isSelected=function(t){return!1}},P=e({SingleValueFilter:g,MultiValueFilter:O,FauxFilter:A,KeyValueFilter:m,register:i,set:o,isModified:u,setAll:c,get:s,isSelected:a,clear:f,clearAll:l,parse:h,format:p},new n("change"));return P}); define("common/pixels-loader",["vanillajs","mixins/page-dates/DateEvents","ta/Core/TA.FireEvent"],function(n,o,i){"use strict";function e(){return Date.now()-r}function t(n){console.log("pixels-loader: "+e()+" "+n)}var a,r,c=2e3,l=!1;r=window.performance&&window.performance.timing&&window.performance.timing.navigationStart?window.performance.timing.navigationStart:Date.now();var s=function(){l&&t("_load starting"),window.require(["trjs!ta/common/behavior/Ads-pagemoniker"],function(n){l&&t("Ads-pagemoniker starting"),n.loadMonikers(),o.on("dateSelected",function(o,i){"STAYDATES"==i&&window.setTimeout(n.loadMonikerForEnterDates,2e3)})}),a&&a.shouldInitFlightsEvents&&u(),s=function(){}},u=function(){var n=new Promise(require.bind(null,["trjs!ta/common/behavior/Ads-pagemoniker"]));i.on("lcbPop",function(){n.then(function(n){n.loadMonikerForLCBPop()})}),i.on("packageClick",function(){n.then(function(n){n.loadVacationPackageMetaMonikers()})}),i.on("metaLinkClickPixelLoad",function(o){n.then(function(n){n.loadFlightsMetaMonikers(o)})}),i.on("metaLightboxLoad",function(o){n.then(function(n){n.loadLightboxMonikers(o)})}),i.on("flightSearchPixelLoad",function(){n.then(function(n){n.loadMonikerForFlightSearch()})})};return{init:function(n){a=n,n&&n.pixelsEnabled&&(n.pixelLoadingTracing&&(l=!0),n.hotelsPixelLoadingStrategyEnabled?(l&&t("init: setting timeout of zero before running _load"),setTimeout(s,0)):(l&&t("init: setting timeout"),setTimeout(s,c)))},remarketingOptions:function(){return a}}}); define("responsive_servlets/restaurant_review",["lib/jquery-amd","mixins/mixin","mixins/page-dates/DateEvents","mixins/page-dates/Desktop","mixins/ReviewPagination","historyinject/HistoryInject","common/page-filters","common/pixels-loader","mobile/lite/image-loader","ta/common/Repoll","ta/Core/TA.Event"],function(e,t,i,n,a,r,o,l,s,c,m){"use strict";function p(e){return h||(d=new c(e.repollOptions||{evaluateScripts:!0}),t(this,i),t(this,new n(e.pageDates)),t(this,new a({repoll:d,scrollCallback:f})),g(e.filtersInit),l.init(e.remarketingOptions),s.init(200),m.on("reasons-keywordClick",u),h=!0,e.nearbyHistoryInject&&new r("R_R_HISTORY_INJECT").init()),this}function u(e){o.clearAll(),o.set("t",e),f()}function f(){var t=e("[data-reviewsScrollTarget]").offset().top-50;e("html,body").animate({scrollTop:t},400)}function g(e){e&&(e.forEach(function(e){var t="multi"===e.type?o.MultiValueFilter:o.SingleValueFilter;o.register(e.name,t,e.value,"true"===e.excludeFromClearAll)}),o.on("change",function(){v(o.get());var e=location.pathname.replace(/-ord+/,"");ta.page.applyPaginationOffset(e)}))}function v(e){d.setOneTimeParams(e,"REVIEW_LIST")}var d,h=!1;return{init:p,refreshWithParams:v}}); define("maps/v3/providers/providerShim",["babel/babel-helpers","mixins/Events"],function(e,r){"use strict";function n(){return s?s:s=new Promise(function(e){i||(v=!0,a.emit("providerRequested")),u.then(function(){i.loadLibrary(e)})})}function t(e){var r=c[e];return r||(r={},r.promise=new Promise(function(e){r.resolve=e}),c[e]=r),r}var i=null,o=null,u=new Promise(function(e){return o=e}),s=null,a=new r("providerRequested"),v=!1,c={};return{registerProvider:function(e){if(i)throw"provider already registered";if(!e)throw"Attempted to register a null provider";i=e,o()},providerRequested:function(){return v},createMap:function(e){var r=n();return new Promise(function(n){r.then(function(){var r=i.getMapInstance(e);n(r);var o=t(e.container);o.resolve(r)})})},waitForMap:function(e){var r=t(e);return r.promise},on:a.on.bind(a)}}); define("maps/v3/tracking",["babel/babel-helpers","common/trackingStreams"],function(t,a){"use strict";function n(t,n){a.trackEvent("map_view",t?"open":"close",n,null)}function c(t,n,c){a.trackEvent(t,n,c,null)}function e(t,n){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;a.trackEvent("map_pin",t,c,n)}function i(){n(!0,null)}function o(t){a.trackEvent("map_view","open_requested",t)}function r(t){window.setTimeout(function(){n(!0,t.offsetWidth)},0)}function p(t,c){n(!1,t.offsetWidth),a.trackEvent("map_view","map_close_num_pins",c)}function l(t,n){var c={loaded:t,timeSpentOnMap:n};a.trackEvent("map_view","map_close_load_test",JSON.stringify(c))}function k(t){a.trackEvent("map_view","map_impl",t)}function u(t){c("map_view","empty",t)}function m(t,a){c("map_view",a?"redo_auto":"redo",t)}function _(){a.trackEvent("map_view","grow")}function v(){a.trackEvent("map_view","shrink")}function f(t){c("map_move","pan",t)}function d(t){c("map_move","zoom_in",t)}function s(t){c("map_move","zoom_out",t)}function M(t,a){e("hover",t,a)}function w(t,a){e("click",t,a)}function C(t){a.trackEvent("map_detail_card","photo_click",t,null)}function E(t){a.trackEvent("map_detail_card","saveCTA_click",t,null)}function h(t){a.trackEvent("map_detail_card","title_click",t,null)}function S(t){a.trackEvent("map_card_cta","click",t,null)}function O(t){a.trackEvent("map_carousel","swipe",t,null)}function P(t,n){a.trackEvent("also_show",t,n)}return{trackMapOpen:r,trackMapClose:p,trackMapFirstOpen:i,trackMapOpenRequested:o,trackRedoSearch:m,trackMapGrow:_,trackMapShrink:v,trackNoPins:u,trackMapPan:f,trackMapZoomIn:d,trackMapZoomOut:s,trackMapPinHover:M,trackMapPinClick:w,trackMapDetailCardPhotoClick:C,trackMapDetailCardSaveClick:E,trackMapDetailCardTitleClick:h,trackMapDetailCardCTAClick:S,trackCarouselSwipe:O,trackAlsoShowClick:P,trackMapLoadedWhenClosed:l,trackMapProvider:k}}); require(["ta/p13n/placements"],function(r){var a=r.define.bind(r,"map_provider_loader","handlers",["handlers"]);a(["placement","maps/v3/providers/providerShim","maps/v3/tracking"],function(r,a,e){"use strict";function i(){var i="trjs!"+r.params.map_impl;if(r.params.includeRollup){var p="trjs!"+r.params.map_rollup;r.require([i,p],function(i,p){if(!p)throw"Unable to load map rollup";i.configureLibrary(r.params.mapConfig||{}),e.trackMapProvider(r.params.map_rollup),a.registerProvider(i)})}else r.require([i],function(i){i.configureLibrary(r.params.mapConfig||{}),e.trackMapProvider(r.params.map_rollup),a.registerProvider(i)})}a.providerRequested()?i():a.on("providerRequested",i)})}); ]]>u003cul>u003cli>Food: 4.5u003c/li>u003cli>Service: 4.5u003c/li>u003cli>Value: 4u003c/li>u003cli>Atmosphere: 4u003c/li>u003c/ul>","answerJsonLd":"Bangkok Hill Thai Restaurant is rated accordingly in the following categories by Tripadvisor travelers:u003cbr>u003cul>u003cli>Food: 4.5u003c/li>u003cli>Service: 4.5u003c/li>u003cli>Value: 4u003c/li>u003cli>Atmosphere: 4u003c/li>u003c/ul>"}]]}"},"2855208093":{"data":"{"RestaurantPresentation_searchRestaurantsById":{"restaurants":[{"external_reference":{"id":"1315559","namespace":"TA"},"reviewSummary":{"count":92,"rating":4.5},"open_hours":{"is_open":null,"is_permanently_closed":true,"mins_until_open":null,"mins_until_close":null,"schedule":null},"ta_location":{"isClosed":true},"name":"Bangkok Hill Thai Restaurant","telephone":null,"localizedRealtimeAddress":"177 Massachusetts Ave, Lunenburg, MA 01462-1216","url":null,"ranking":{"webRoute":null,"text":null,"textWithStyle":null},"updateListingPageRoute":{"url":"/UpdateListing-d1315559"},"menu":{"has_provider":true,"menu_url":null},"topTags":[{"id":10955,"secondary_name":"$$ - $$$","tag":{"localizedName":"Mid-range"},"webRoute":{"url":"/Restaurants-g41650-zfp10955-Lunenburg_Massachusetts.html"}},{"id":10660,"secondary_name":null,"tag":{"localizedName":"Thai"},"webRoute":{"url":"/Restaurants-g41650-c39-Lunenburg_Massachusetts.html"}},{"id":10665,"secondary_name":null,"tag":{"localizedName":"Vegetarian Friendly"},"webRoute":{"url":"/Restaurants-g41650-zfz10665-Lunenburg_Massachusetts.html"}},{"id":10697,"secondary_name":null,"tag":{"localizedName":"Vegan Options"},"webRoute":{"url":"/Restaurants-g41650-zfz10697-Lunenburg_Massachusetts.html"}}]}]}}"},"2885073791":{"data":"{"commercePlacements":{"locationIdOfferMap":[{"value":{"slot1Offer":null,"slot2Offer":null,"restaurantSpecialOffer":null}}]}}"},"3037784617":{"data":"{"AbTesting_evaluateTests":[{"testResults":[{"experimentKey":"trips_saves_login_gate_1714411683","bucket":"Test Variant 2"}]}]}"},"3106376620":{"data":"{"menuResponse":{"providerMenu":{"obfuscated":false,"attributionImage":"https://a.singleplatform.com/TripAdvisor/bangkok-hill-restaurant/provided_by.png?sp_dt=20200205","attributionLink":"https://www.singleplatform.com/partner-lp?ref=TripAdvisor&sp_channel=viral&sp_source=publisher&sp_campaign=sp&sp_dt=20200205","providerName":"SinglePlatform","menu":[{"title":"Main Menu","sections":[{"sections":[],"title":"Appetizers","description":"","items":[{"title":"Thai Rolls","description":"crispy springrolls filled with chicken or vegetables, served with house sweet sauce (available vegetarian)","prices":[{"title":"","unit":"","priceText":"$6.00"}]},{"title":"Ravioli","description":"bite size pork and vegetable ravioli, choice of fried or steamed, served with ginger soy sauce.","prices":[{"title":"","unit":"","priceText":"$6.00"}]},{"title":"Scallion Pancake","description":"crispy vegetarian pancake served with ginger soy sauce.","prices":[{"title":"","unit":"","priceText":"$6.00"}]},{"title":"Crab Rangoon","description":"crispy wonton filled with crabmeat, onion, carrot and cream cheese, served with pineapple sauce.","prices":[{"title":"","unit":"","priceText":"$6.00"}]},{"title":"Tempura","description":"an assortment of vegetables or bite size chicken dipped in tempura batter, fried until golden brown, served with house sweet sauce.","prices":[{"title":"","unit":"","priceText":"$7.00"}]}]},{"sections":[],"title":"Soup","description":"","items":[{"title":"Tom Yam","description":"thai style hot and sour shrimp or chicken soup with mushrooms, scallions and cilantro.","prices":[{"title":"","unit":"","priceText":"$5.00"}]},{"title":"Tom Khar","description":"mild chicken coconut soup with mushrooms, scallions and cilantro.","prices":[{"title":"","unit":"","priceText":"$5.00"}]},{"title":"Wonton","description":"minced spiced pork wonton with scallions, cilantro, and crispy garlic in light broth.","prices":[{"title":"","unit":"","priceText":"$5.00"}]},{"title":"Chicken Noodle","description":"thin rice noodle with chicken, scallions, cilantro and crispy garlic in light broth.","prices":[{"title":"","unit":"","priceText":"$5.00"}]},{"title":"Seafood Rice","description":"an assortment of seafood with rice, celery and crispy garlic in light broth","prices":[{"title":"","unit":"","priceText":"$5.00"}]}]},{"sections":[],"title":"Salads","description":"","items":[{"title":"Som Tam","description":"thai style papaya salad with shrimp, string beans, tomatoes, and peanuts tossed in spicy lime dressing, served with sticky rice.","prices":[{"title":"","unit":"","priceText":"$12.00"}]},{"title":"Larb Chicken","description":"choice of ground chicken or tofu with red onions, ground roasted rice, cilantro, scallions and mint tossed in spicy lime dressing, served with sticky rice.","prices":[{"title":"","unit":"","priceText":"$12.00"}]},{"title":"Bangkok Salad","description":"choice of grilled beef or pork with red onions, ground roasted rice, cilantro, scallions, and mint tossed in spicy lime dressing, served with sticky rice.","prices":[{"title":"","unit":"","priceText":"$13.00"}]},{"title":"Seaweed Salads","description":"thai style papaya salad with shrimp beans, tomatoes, and peanuts tossed in spicy lime dressing, served with sticky rice","prices":[{"title":"","unit":"","priceText":"$7.00"}]},{"title":"Green Salad","description":"an assortment of fresh vegetable with tofu, served with homemade peanut sauce).","prices":[{"title":"","unit":"","priceText":"$6.00"}]}]},{"sections":[],"title":"Noodle & Rice","description":"","items":[{"title":"Pad Thai (available Vegetarian)","description":"thin rice noodle with chicken, shrimp, ground peanuts, scallions, egg, and bean sprouts.","prices":[{"title":"Lunch","unit":"","priceText":"$9.00"},{"title":"Dinner","unit":"","priceText":"$12.00"}]},{"title":"Yellow River","description":"soft egg noodle with shrimp, scallop, squid, mussels, onions, carrots, scallions, mushrooms and bean sprout.","prices":[{"title":"Lunch","unit":"","priceText":"$11.00"},{"title":"Dinner","unit":"","priceText":"$14.00"}]},{"title":"Kau Gai","description":"wide rice noodle with chicken, scallions, cilantro, crispy garlic and egg.","prices":[{"title":"Lunch","unit":"","priceText":"$9.00"},{"title":"Dinner","unit":"","priceText":"$12.00"}]},{"title":"Drunken Noodle (chicken, Beef, Pork Or Tofu)","description":"wide rice noodle with peppers, onions, bamboo shoots, basil leaves, egg and chili pepper sauce.","prices":[{"title":"Lunch","unit":"","priceText":"$9.00"},{"title":"Dinner","unit":"","priceText":"$12.00"}]},{"title":"Bangkok Fried Rice","description":"with chicken, shrimp, green peas, tomatoes, onions, scallions and egg.","prices":[{"title":"Lunch","unit":"","priceText":"$9.00"},{"title":"Dinner","unit":"","priceText":"$12.00"}]}]},{"sections":[],"title":"Desserts","description":"","items":[{"title":"Ice Cream (coconut)","description":"","prices":[{"title":"","unit":"","priceText":"$3.00"},{"title":"With Sticky Rice Add","unit":"","priceText":"$2.00"}]},{"title":"Fried Banana","description":"","prices":[{"title":"","unit":"","priceText":"$5.00"},{"title":"With Ice Cream Add","unit":"","priceText":"$3.00"}]},{"title":"Mango With Stike Rice","description":"","prices":[{"title":"","unit":"","priceText":"$5.00"},{"title":"With Ice Cream Add","unit":"","priceText":"$3.00"}]},{"title":"Ice Cream (ginger)","description":"","prices":[{"title":"","unit":"","priceText":"$3.00"},{"title":"With Sticky Rice Add","unit":"","priceText":"$2.00"}]},{"title":"Fried Ice Cream","description":"","prices":[{"title":"","unit":"","priceText":"$5.00"}]}]}]}]}}}"},"3254931351":{"data":"{"AbTesting_evaluateTests":[{"testResults":[{"experimentKey":"google_secure_signals_1715974152","bucket":"control"}]}]}"},"3290676975":{"data":"{"AbTesting_evaluateTests":[{"testResults":[{"experimentKey":"pos_mismatch_messaging_1692196825","bucket":null}]}]}"},"3330606214":{"data":"{"RestaurantAwards_getRestaurantAwards":[{"awards":[],"summaries":[],"awardHeader":null,"awardReadMore":null}]}"},"3386082221":{"data":"{"AbTesting_evaluateTests":[{"testResults":[{"experimentKey":"write_a_review_form_web_experiences_1666008828","bucket":"test"}]}]}"},"3403285075":{"data":"{"AbTesting_evaluateTests":[{"testResults":[{"experimentKey":"sticky_horizon_revere_test_1687368705","bucket":"test"}]}]}"},"3460326833":{"data":"{"AdMissionControl_getPageSlotSettings":[{"slots":[{"slot":"rail3","overrides":[]},{"slot":"rail4","overrides":[]},{"slot":"inline1","overrides":[]},{"slot":"inline2","overrides":[]},{"slot":"rail1","overrides":[]},{"slot":"horizon","overrides":[]},{"slot":"inline3","overrides":[]},{"slot":"locationphotoalbum","overrides":[]},{"slot":"rail2","overrides":[]},{"slot":"inline4","overrides":[]},{"slot":"RailNova","overrides":[]},{"slot":"footer","overrides":[]}]}]}"},"3715796302":{"data":"{"ReviewsProxy_getReviewDraftsForUser":[[]]}"},"3833219988":{"data":"{"AbTesting_evaluateTests":[{"testResults":[{"experimentKey":"srp_lithium_v2_1711113947","bucket":"test"}]}]}"},"3888010134":{"data":"{"feed":{"sectionGroups":[],"status":{"partial":false}}}"},"4067969379":{"data":"{"RestaurantPresentation_getUpdatesAndOffers":{"locationId":1315559,"specialOffer":null,"businessPosts":[]},"locations":[{"name":"Bangkok Hill Thai Restaurant","thumbnail":{"photoSizeDynamic":{"maxHeight":858,"maxWidth":1091,"urlTemplate":"https://dynamic-media-cdn.tripadvisor.com/media/photo-o/23/19/df/db/bangkok-hill.jpg?w={width}&h={height}&s=1"}}}]}"},"4095295837":{"data":"{"alertSection":{"alerts":[]}}"},"4130270433":{"data":"{"locations":[{"parents":[{"locationId":28942},{"locationId":191},{"locationId":19},{"locationId":1}]}]}"},"4157022595":{"data":"{"gptInfo":[{"adBase":"/5349/ta.ta.com.s/na.us.massachusetts","ppid":"CRUTLI23QGFGTZXOVDMG5YUXVQWUWEFL37XC7XZKEFUQFI3VSZKQ","pageLevelTargeting":[{"value":["ie"],"key":"browser"},{"value":["191"],"key":"country"},{"value":["1315559"],"key":"detail"},{"value":["41650"],"key":"geo"},{"value":["4672736"],"key":"virtualgeoid"},{"value":["21827"],"key":"geo_ctx"},{"value":["restaurants"],"key":"loctype"},{"value":["Restaurant_Review"],"key":"PageType"},{"value":["desktop"],"key":"platform"},{"value":["rail2:sufficient/inline5:sufficient/railnova:sufficient/inline6:sufficient/inline3:sufficient/inline1:sufficient/rail4:sufficient/modalhorizon:premium/locationphotoalbum:premium/inline4:premium/rail1:premium/inline2:premium/horizon:premium/footer:insufficient/rail3:insufficient/inlinenova:insufficient"],"key":"premium_category"},{"value":["com"],"key":"rd"},{"value":["28942"],"key":"region"},{"value":["Thai"],"key":"cuisine"}]}]}"}}},"redux":{"i18n":{"locale":"en_US","language":"en","ietfLocale":"en-US","isRtl":false,"distanceUnit":"MILES","firstDayOfWeek":0},"api":{"requests":{"_data_1_0_restaurants_1315559_commerce_providers":{"loading":false,"result":["/data/1.0/restaurants/1315559/commerce/providers"],"url":"/data/1.0/restaurants/1315559/commerce/providers"},"_data_1_0_restaurant_1315559_ownerStatus":{"loading":false,"result":["/data/1.0/restaurant/1315559/ownerStatus"],"url":"/data/1.0/restaurant/1315559/ownerStatus"},"_data_1_0_location_1315559_hours":{"loading":false,"result":["/data/1.0/location/1315559/hours"],"url":"/data/1.0/location/1315559/hours"},"_data_1_0_cmspromo_Restaurant_Review_1315559_get_POPUP_placement_":{"loading":false,"result":["/data/1.0/cmspromo/Restaurant_Review-1315559/get/POPUP?placement="],"url":"/data/1.0/cmspromo/Restaurant_Review-1315559/get/POPUP?placement="},"_data_1_0_cmspromo_Restaurant_Review_1315559_get_RIGHT_placement_":{"loading":false,"result":["/data/1.0/cmspromo/Restaurant_Review-1315559/get/RIGHT?placement="],"url":"/data/1.0/cmspromo/Restaurant_Review-1315559/get/RIGHT?placement="},"_data_1_0_brand_header_servlet_Restaurant_Review_viewportCategory_DESKTOP_geoId_41650_pageName_Restaurant_Review_isTaReferrer_false":{"loading":false,"result":["/data/1.0/brand/header?servlet=Restaurant_Review&viewportCategory=DESKTOP&geoId=41650&pageName=Restaurant_Review&isTaReferrer=false"],"url":"/data/1.0/brand/header?servlet=Restaurant_Review&viewportCategory=DESKTOP&geoId=41650&pageName=Restaurant_Review&isTaReferrer=false"},"_data_1_0_restaurant_1315559_overview":{"loading":false,"result":["/data/1.0/restaurant/1315559/overview"],"url":"/data/1.0/restaurant/1315559/overview"},"_data_1_0_restaurant_1315559_ownerLikelihood":{"loading":false,"result":["/data/1.0/restaurant/1315559/ownerLikelihood"],"url":"/data/1.0/restaurant/1315559/ownerLikelihood"},"_data_1_0_cmspromo_Restaurant_Review_1315559_get_CENTER_placement_":{"loading":false,"result":["/data/1.0/cmspromo/Restaurant_Review-1315559/get/CENTER?placement="],"url":"/data/1.0/cmspromo/Restaurant_Review-1315559/get/CENTER?placement="},"_data_1_0_location_1315559":{"loading":false,"result":["/data/1.0/location/1315559"],"url":"/data/1.0/location/1315559"}},"responses":{"/data/1.0/restaurant/1315559/ownerLikelihood":{"data":{"isOwner":false,"likelihood":"LOW"},"error":null},"/data/1.0/cmspromo/Restaurant_Review-1315559/get/POPUP?placement=":{"data":null,"error":null},"/data/1.0/cmspromo/Restaurant_Review-1315559/get/RIGHT?placement=":{"data":null,"error":null},"/data/1.0/cmspromo/Restaurant_Review-1315559/get/CENTER?placement=":{"data":null,"error":null},"/data/1.0/restaurants/1315559/commerce/providers":{"data":{"slot1Offer":null,"slot2Offer":null},"error":null},"/data/1.0/restaurant/1315559/overview":{"data":{"name":"Bangkok Hill Thai Restaurant, Massachusetts","detailId":1315559,"geo":"Lunenburg, Massachusetts","geoId":41650,"isOwner":false,"links":{"warUrl":"/UserReviewEdit-g41650-d1315559-Bangkok_Hill_Thai_Restaurant-Lunenburg_Massachusetts.html","addPhotoUrl":"/PostPhotos-g41650-d1315559","ownerAddPhotoUrl":"/ManagePhotos-d1315559-Bangkok_Hill_Thai_Restaurant"},"location":{"latitude":42.59047,"longitude":-71.7642,"directionsUrl":"V0lnX2h0dHBzOi8vbWFwcy5nb29nbGUuY29tL21hcHM/c2FkZHI9JmRhZGRyPTE3NytNYXNzYWNodXNldHRzK0F2ZSUyQytMdW5lbmJ1cmclMkMrTUErMDE0NjItMTIxNkA0Mi41OTA0NywtNzEuNzY0Ml9rYXY=","landmark":null,"neighborhood":null},"contact":{"address":"177 Massachusetts Ave, Lunenburg, MA 01462-1216","email":null,"phone":null,"website":null},"rating":{"primaryRanking":null,"secondaryRanking":null,"primaryRating":4.5,"reviewCount":92,"ratingQuestions":[{"name":"Food","rating":45,"icon":"restaurants"},{"name":"Service","rating":45,"icon":"bell"},{"name":"Value","rating":40,"icon":"wallet-fill"},{"name":"Atmosphere","rating":40,"icon":"ambience"}]},"tags":{"reviewSnippetSections":null},"detailCard":{"tagTexts":{"priceRange":{"tagCategoryId":240,"tags":[{"tagId":10955,"tagValue":"Mid-range"}]},"cuisines":{"tagCategoryId":231,"tags":[{"tagId":10660,"tagValue":"Thai"}]},"dietaryRestrictions":{"tagCategoryId":285,"tags":[{"tagId":10665,"tagValue":"Vegetarian Friendly"},{"tagId":10697,"tagValue":"Vegan Options"},{"tagId":10992,"tagValue":"Gluten Free Options"}]},"meals":{"tagCategoryId":233,"tags":[{"tagId":10598,"tagValue":"Lunch"},{"tagId":10599,"tagValue":"Dinner"}]},"features":{"tagCategoryId":234,"tags":[{"tagId":10601,"tagValue":"Takeout"},{"tagId":10852,"tagValue":"Seating"},{"tagId":10602,"tagValue":"Reservations"},{"tagId":10603,"tagValue":"Outdoor Seating"},{"tagId":10854,"tagValue":"Parking Available"},{"tagId":10860,"tagValue":"Highchairs Available"},{"tagId":10861,"tagValue":"Wheelchair Accessible"},{"tagId":10865,"tagValue":"Accepts American Express"},{"tagId":10866,"tagValue":"Accepts Mastercard"},{"tagId":10867,"tagValue":"Accepts Visa"},{"tagId":10871,"tagValue":"Accepts Discover"},{"tagId":11780,"tagValue":"Accepts Credit Cards"},{"tagId":16547,"tagValue":"Table Service"},{"tagId":21379,"tagValue":"Non-smoking restaurants"},{"tagId":21907,"tagValue":"Gift Cards Available"}]},"establishmentType":{"tagCategoryId":230,"tags":[{"tagId":10591,"tagValue":"Restaurants"}]}},"numericalPrice":"$10 - $24","improveListingUrl":"/ImproveListing-d1315559.html","updateListingUrl":"/ManageListing-g41650-d1315559-Bangkok_Hill_Thai_Restaurant-Lunenburg_Massachusetts.html","restaurantOwner":{"text":"This property has identified as Asian-owned and Women-owned.","tooltip":"Tripadvisor does not verify the accuracy of this information.","trackingItemName":"22126,22129"}}},"error":null},"/data/1.0/brand/header?servlet=Restaurant_Review&viewportCategory=DESKTOP&geoId=41650&pageName=Restaurant_Review&isTaReferrer=false":{"data":{"adjustForSmartBanner":false,"showGeopill":true,"numLines":2,"isPersistentHeader":false,"usePersistentIcons":true,"hideLogo":false,"liteHeader":false},"error":null},"/data/1.0/restaurant/1315559/ownerStatus":{"data":{"isVerified":true,"isMemberOwner":false,"isUserInCountry":true},"error":null},"/data/1.0/location/1315559/hours":{"data":null,"error":null},"/data/1.0/location/1315559":{"data":{"location_id":"1315559","name":"Bangkok Hill Thai Restaurant","latitude":"42.59047","longitude":"-71.7642","num_reviews":"92","timezone":"America/New_York","location_string":"Lunenburg, Massachusetts","awards":[],"doubleclick_zone":"na.us.massachusetts","preferred_map_engine":"default","distance":null,"distance_string":null,"bearing":null,"rating":"4.5","is_closed":true,"is_long_closed":false,"price_level":"$$ - $$$","price":"$10 - $24","description":"","web_url":"https://www.tripadvisor.com/Restaurant_Review-g41650-d1315559-Reviews-Bangkok_Hill_Thai_Restaurant-Lunenburg_Massachusetts.html","write_review":"https://www.tripadvisor.com/UserReview-g41650-d1315559-Bangkok_Hill_Thai_Restaurant-Lunenburg_Massachusetts.html","ancestors":[{"subcategory":[{"key":"city","name":"City"}],"name":"Lunenburg","abbrv":null,"location_id":"41650"},{"subcategory":[{"key":"state","name":"State"}],"name":"Massachusetts","abbrv":"MA","location_id":"28942"},{"subcategory":[{"key":"country","name":"Country"}],"name":"United States","abbrv":null,"location_id":"191"}],"category":{"key":"restaurant","name":"Restaurant"},"subcategory":[{"key":"sit_down","name":"Sit down"}],"parent_display_name":"Lunenburg","is_jfy_enabled":false,"nearest_metro_station":[],"address_obj":{"street1":"177 Massachusetts Ave","street2":"","city":"Lunenburg","state":"MA","country":"United States","postalcode":"01462-1216"},"address":"177 Massachusetts Ave, Lunenburg, MA 01462-1216","is_candidate_for_contact_info_suppression":false,"cuisine":[{"key":"10660","name":"Thai"},{"key":"10665","name":"Vegetarian Friendly"},{"key":"10697","name":"Vegan Options"},{"key":"10992","name":"Gluten Free Options"}],"dietary_restrictions":[{"key":"10665","name":"Vegetarian Friendly"},{"key":"10697","name":"Vegan Options"},{"key":"10992","name":"Gluten Free Options"}],"photo":{"id":"588898267","caption":"Bangkok Hill","published_date":"2022-04-19T14:41:47-0400","helpful_votes":"0","is_blessed":true,"uploaded_date":"2022-04-19T14:41:47-0400","images":{"small":{"url":"https://media-cdn.tripadvisor.com/media/photo-l/23/19/df/db/bangkok-hill.jpg","width":"150","height":"150"},"thumbnail":{"url":"https://media-cdn.tripadvisor.com/media/photo-t/23/19/df/db/bangkok-hill.jpg","width":"50","height":"50"},"original":{"url":"https://media-cdn.tripadvisor.com/media/photo-o/23/19/df/db/bangkok-hill.jpg","width":"1091","height":"858"},"large":{"url":"https://media-cdn.tripadvisor.com/media/photo-s/23/19/df/db/bangkok-hill.jpg","width":"550","height":"433"},"medium":{"url":"https://media-cdn.tripadvisor.com/media/photo-f/23/19/df/db/bangkok-hill.jpg","width":"250","height":"197"}}},"tags":null,"display_hours":null},"error":null}}},"page":{"name":"LOCATION_DETAIL","geoId":41650,"detailId":1315559,"crossSells":null},"travelerInfo":{"preferences":{"currency":"USD"},"hotels":null,"vr":{"start":null,"end":null,"adults":2,"children":0},"attractions":{"singleDate":"","fromDate":"","toDate":"","attractionPaxAdults":0,"attractionPaxChildren":0},"restaurants":{"date":"2024-06-11","time":"8:00 PM","partySize":"2","isDefault":true,"displayDate":"Tue, 6/11"},"home":null,"flights":{"oneWayDate":"2024-06-25","departureDate":"2024-06-25","returnDate":"2024-07-02","originAirportCode":null,"destinationAirportCode":null}},"auth":{"isMember":false,"csrfToken":"TNI1625!AGstDRRyKdaYYSOXbSjkxViT+yA4QGr5HBj7+vRqUdtolnWgYfr4p2LuMXaisENbOy3C1zIpRA2KOBtVqVrPjZ9E9EuEaxfU+5trPYok/+bRnyqxKjudHpTDUJYtXKzP1KSZI+wHxY5nZFPD7jP2jmJZU31GRXrmhShSG4h2Pn9YMENnNTROykIHCjKZJM3w+g==","altSessId":"88DB4588C0AB53B631765AB8EA76E956","loggedInUserId":null,"captcha":null,"fbApi":{"apiVersion":"v15.0","facebookConnectApiKey":"162729813767876","facebookConnectAppId":"162729813767876","facebookConnectAppName":"tripadvisor","taServerTime":1718130283,"skipFacebookSessionCheck":false,"sdkUrl":"//connect.facebook.net/en_US/sdk.js","facebookPermissions":"email,user_friends"}},"route":{"geo":"41650","detail":"1315559","page":"Restaurant_Review"},"lithiumRoute":[{"page":"Restaurant_Review","params":{"geoId":41650,"detailId":1315559},"path":"/Restaurant_Review-g41650-d1315559-Reviews-Bangkok_Hill_Thai_Restaurant-Lunenburg_Massachusetts.html","fragment":""},{"uid":"0c612313-b3d9-4b51-9b1b-2ad0371be988"}],"overlays":{"global":null,"fab":null,"locals":{},"toasts":[]},"meta":{"initialServletName":"Restaurant_Review","device":{"viewportCategory":"DESKTOP","userAgentCategory":"DESKTOP","os":{"family":"UNKNOWN","majorVersion":-1},"browser":{"family":"IE","majorVersion":11},"securityToken":"fef938a3d0dc52d5d211dbca3d0823c7487b6ddcffc604b8991c5113ea109da3"},"readonlyMode":false,"initialRelativeUrl":"/Restaurant_Review-g41650-d1315559-Reviews-Bangkok_Hill_Thai_Restaurant-Lunenburg_Massachusetts.html","initialAbsoluteUrl":"https://www.tripadvisor.com/Restaurant_Review-g41650-d1315559-Reviews-Bangkok_Hill_Thai_Restaurant-Lunenburg_Massachusetts.html","baseUrl":"https://www.tripadvisor.com","imageCdnUrl":"https://static.tacdn.com","cookieDomain":".tripadvisor.com","taUnique":"0c612313.b3d9.4b51.9b1b.2ad0371be988.190088B931B","isTaReferrer":false,"referrerUrl":"http://www.bing.com/","forceFullSite":false,"environment":"Live","isNativeWebview":false,"commerceCountryId":191,"impressionData":{"pageLoadUid":"0c612313-b3d9-4b51-9b1b-2ad0371be988"},"lineItemsByLoc":{}},"tracking":{"mcid":10570,"uid":"0c612313-b3d9-4b51-9b1b-2ad0371be988","analytics":{"cv":[["_deleteCustomVar",1],["_deleteCustomVar",47],["_setCustomVar",11,"Detail","Bangkok Hill Thai Restaurant-1315559",3],["_setCustomVar",12,"Country","United States-191",3],["_setCustomVar",25,"Continent","North America-19",3],["_setCustomVar",13,"Geo","Lunenburg-41650",3],["_setCustomVar",20,"PP","--",3],["_deleteCustomVar",19],["_deleteCustomVar",14],["_deleteCustomVar",8],["_deleteCustomVar",10]],"url":"/Restaurant_Review"},"searchSessionId":"D811588CE94B4C3EAAFB99EFC68FE4891718130283371ssid","sessionId":"D811588CE94B4C3EAAFB99EFC68FE489","uniqueId":"0c612313.b3d9.4b51.9b1b.2ad0371be988.190088B931B","serverName":"www.tripadvisor.com","hostName":"web688a.a.tripadvisor.com","vcsRevision":1619773,"vcsBranch":"releases/PRODUCTION_1619772_20240610_0401","uvmScore":"","retargetingUrl":"www.tamgrt.com/RT","domainName":"www.tripadvisor.com"}},"assets":["/assets/n/e.js","/assets/dyfdn5.8IrbOoG.css","/assets/qndsds.jRclDEP.css","/assets/jppfwt.gMRF3c8.css","/assets/q213pt.s-7A6r7.css","/assets/gw8uw6.T1b82g1.css","/assets/2r4qug.1bh0KRG.css","/assets/frf6ac.vAKFss0.css","/assets/essqvy.4nu2z42.css","/assets/lr6tb6.travetz.css","/assets/nntg4s.N7G9AzX.css","/assets/uvk21c.Oee9anf.css","/assets/vjlqzu.UWscTYd.css","/assets/hxluky.13gNtFh.css","/assets/l9qeu7.cQqkwfo.css","/assets/q13wda.ZTrxbKZ.css","/assets/uzmmz7.698CG1G.css","/assets/d8oes5.X1Ukfy5.css","/assets/iog21h.sEl2Y77.css","/assets/60mj7v.aYgCOTC.css","/assets/vpo3wt.CCGqhW_.css","/assets/0of6qq.fCsTphr.css","/assets/4q9l40.beP_3sf.css","/assets/79a2um.JKAkjJH.css","/assets/ybxsmg.lfiKMZ3.css","/assets/tr3542.9Rebxvj.css","/assets/83pm0d.3k5TtiZ.css","/assets/973cci.UExExJK.css","/assets/5xz9bl.8CS9gQc.js","/assets/b8gyi1.qiJSkgP.js","/assets/6nmgrj.FpQk1TI.js","/assets/qlcuu5.wOjfK5j.js","/assets/1sioa0.gORM5NV.js","/assets/gyzem5.JW9w1w2.js","/assets/bt3bv2.KLnVjr7.js","/assets/xg719z.kPOGK9k.js","/assets/yau6qy.YRFGDlG.js","/assets/r73jw8.PdCzbQ8.js","/assets/etaac9.uDTwcM-.js","/assets/bxkng5.fDCt6XC.js","/assets/mqwhqn.EaBuWf8.js","/assets/98810w.PA2qgxU.js","/assets/mb2nze.XCL1KWk.js","/assets/nnprhg.HR6uO9w.js","/assets/gugp1d.LJCgr4F.js","/assets/p5p2yo.R008T4f.js","/assets/al4vil.5BzDM7h.js","/assets/52far5.YurGPag.js","/assets/7thqz4.l4o0oam.js","/assets/ys6v1o.AU1oX_f.js","/assets/9b9b10.ahg5_pz.js","/assets/ltllz9.UwnfLxL.js","/assets/xo1is3.Mgfv1qc.js","/assets/4x6ber.0dkTn3u.js","/assets/bwm4qt.o_A9fuh.js","/assets/dyfdn5.8IrbOoG.en-US.js","/assets/qndsds.jRclDEP.js","/assets/fkji80.vtofiVN.js","/assets/jppfwt.gMRF3c8.en-US.js","/assets/4ilds0.-uydFPi.js","/assets/q213pt.s-7A6r7.js","/assets/i0z8n1.sN_Cgdg.js","/assets/nlswq2.Tl9mHiL.js","/assets/ue4abb.Q8_51Me.js","/assets/u9jlwp.jmIN34x.js","/assets/gjtatx.jf5-rHm.js","/assets/90bo0h.u3MZdHL.js","/assets/evvugf.nYuiaK3.js","/assets/gw8uw6.T1b82g1.js","/assets/2r4qug.1bh0KRG.js","/assets/frf6ac.vAKFss0.js","/assets/kq4q2w.FulUHut.js","/assets/essqvy.4nu2z42.js","/assets/lr6tb6.travetz.js","/assets/904jnz.HvNmbAG.js","/assets/b5nukb.T-obIUV.js","/assets/eww825.k7Btycz.js","/assets/gbnboa.vIp8beE.js","/assets/ltf8dz.sxj1oW5.js","/assets/btbawi._BJbV7k.js","/assets/tm6ey6.aBHrZra.js","/assets/nexzid.4wHA2Vq.js","/assets/5gpqhx.kECZDyx.js","/assets/98inwa.PgzqckT.js","/assets/8pymbz.OyppyEU.js","/assets/qjohxf.FXnwJlu.js","/assets/nntg4s.N7G9AzX.en-US.js","/assets/9w33la.GEl8VbU.js","/assets/4euaes.P3atH1x.js","/assets/nnmev3.4ViPbsF.js","/assets/1olf6x.UWhSGrb.js","/assets/bvz1zl.MWD_l1u.js","/assets/sdpjgr.H9mIrtZ.js","/assets/uvk21c.Oee9anf.js","/assets/vjlqzu.UWscTYd.js","/assets/rdycz1.X4OedKP.js","/assets/z2lnv4.D9XegvW.js","/assets/hxluky.13gNtFh.js","/assets/l9qeu7.cQqkwfo.js","/assets/7u7gib.KNMZugC.js","/assets/q13wda.ZTrxbKZ.js","/assets/uzmmz7.698CG1G.en-US.js","/assets/qkjm8h.QMO74F_.js","/assets/gttbjc.5EXnuKA.js","/assets/65rb8q.8xF3LJF.js","/assets/d8oes5.X1Ukfy5.js","/assets/iog21h.sEl2Y77.js","/assets/tp1g68.jrWosDv.js","/assets/60mj7v.aYgCOTC.en-US.js","/assets/tbkd43.jtKYASI.js","/assets/lchj5q.nsZnIiZ.js","/assets/xj2t7q.9jn0yxz.js","/assets/3dy54m.Y1u7kJe.js","/assets/vumu0s.Pt_ePPG.js","/assets/dsbyen.C7uU3Mj.js","/assets/c3xckd.BKFWIOP.js","/assets/kb5au4.An0sSGg.js","/assets/u5g3tb.gsMwy3y.js","/assets/t9nvqo.hVDQ6Jq.js","/assets/vbk5jk.1JuI0lA.js","/assets/g05qlv.l8j-yoJ.js","/assets/vpo3wt.CCGqhW_.js","/assets/s6q22n.HK-d5qo.js","/assets/ahlu9q.ZA6WqXb.js","/assets/fbuhsy.4HIIt-4.js","/assets/591izp.m4DGso5.js","/assets/sh5o32.sPuqBD9.js","/assets/fgwvq1.FXAiqjx.js","/assets/j8lyt5.MU-h-zv.js","/assets/ulejzu.dQ9JZ3a.js","/assets/mtbtnn.TXGMBN6.js","/assets/32pwc7.7hGelH2.js","/assets/promjz.i-NfUZG.js","/assets/q7wvkq.eU3CggF.js","/assets/45ddp0.POoJsy6.js","/assets/bqgabj.Ra6u6Jq.js","/assets/txqepv.tOn4XiV.js","/assets/fzzo52.lrfwj3o.js","/assets/bvvaww.7oUYDGL.js","/assets/4axon3.fyXtQhS.js","/assets/3btuy0.K5Uerbo.js","/assets/w0dpwq.4ueWc6g.js","/assets/w1vb4i.HA2HYx4.js","/assets/qbn8x2.ygmxkiv.js","/assets/uedfnc.xde4mt0.js","/assets/f7mzgd.lKS68RD.js","/assets/lajpgs.iAI_KgM.js","/assets/7v9w42.hb8u27f.js","/assets/0of6qq.fCsTphr.js","/assets/4q9l40.beP_3sf.js","/assets/x9dv95.lmriWDB.js","/assets/79a2um.JKAkjJH.js","/assets/jbz0uy.L9zc0fL.js","/assets/ja55rt.ZRW2lNA.js","/assets/d6vj30.VA2My3r.js","/assets/ybxsmg.lfiKMZ3.js","/assets/tr3542.9Rebxvj.js","/assets/skjzuv.4G0udqS.js","/assets/83pm0d.3k5TtiZ.js","/assets/973cci.UExExJK.en-US.js","/assets/6z5q2p.B-6zwUi.js","/assets/t05m6z.4V7Ut_F.js","/assets/uujvhg.HXPJLkP.js","/assets/5vmpsm.k7-h2-y.js","/assets/2mj4nv.My6HdSj.js","/assets/wr50cf.ecWqgl2.js","/assets/voprus.XgT3Zdr.js","/assets/o4yt4q.2yx8sMy.js","/assets/teh9fa.YpQlmxu.js","/assets/ifbjcg.eheveWm.js","/assets/21h32l.YnQhWI0.js","/assets/l2u3je.wvYZh0D.js","/assets/hjmqlv.Anlzmc_.js","/assets/im/9b596e62.js","/assets/5hcrwr.1UiXKcV.css","/assets/94v69w.gI4zW4M.css","/assets/lq6xsf.MSyxuqi.css","/assets/pwoff0.NNWwFKq.css","/assets/eozxiw.PgS2HOr.css","/assets/oz3g7e._VWHID7.css","/assets/xm2jzo.aYA9Agi.css","/assets/34bu7w.AuQRHbG.css","/assets/fa3gob.-YnJSOK.css","/assets/hwdnu5.CZtij33.css","/assets/gppdva.s-HiNxm.css","/assets/7gmtsf.TLXXr_Y.css","/assets/ljqkwp.r2XRgjr.css","/assets/ntn269.jRdNEnE.css","/assets/b1cljk.ZxkCQ-_.css","/assets/aa8hvr.PL8PFLO.css","/assets/227h6c.mZnR6dI.css","/assets/i3sz5h.LEPLhPu.css","/assets/lfeddg.BnR5feb.css","/assets/ex1xu3.oyMj-Ju.css","/assets/5hcrwr.1UiXKcV.en-US.js","/assets/egodks.ZTs0KIb.js","/assets/80hn7v.Nc3aAfw.js","/assets/z6c0ez.8lKMLCh.js","/assets/y52xss.87exUn8.js","/assets/w2pv0e.9_4LB-1.js","/assets/94v69w.gI4zW4M.js","/assets/lq6xsf.MSyxuqi.en-US.js","/assets/eq3hjy.B3EwuV8.en-US.js","/assets/68fm7o.pqfUZb-.js","/assets/1b5l5d.HAJR7Ih.en-US.js","/assets/pwoff0.NNWwFKq.en-US.js","/assets/eozxiw.PgS2HOr.en-US.js","/assets/oz3g7e._VWHID7.en-US.js","/assets/sw5ax0.rxnEaVQ.js","/assets/j8mzb2.crkzUTD.js","/assets/xm2jzo.aYA9Agi.en-US.js","/assets/conwso.3tECGK7.js","/assets/zq967r.Hb7Ry6d.js","/assets/34bu7w.AuQRHbG.js","/assets/fa3gob.-YnJSOK.js","/assets/l75rcq.AKYs9lq.js","/assets/zb2uaz.mV7omnd.js","/assets/nc3gmf.Hh2WW0V.js","/assets/7l5hpv.r6wEzhR.en-US.js","/assets/flcs8h.lUcvw_a.js","/assets/j1i9fl.HVQOHiS.js","/assets/qx89h8.tyl0XqZ.js","/assets/o3mm96.b3MHnQZ.js","/assets/c5q3iu.v7mzeUh.js","/assets/uc42ar.v2cPWKZ.js","/assets/hwdnu5.CZtij33.en-US.js","/assets/gppdva.s-HiNxm.en-US.js","/assets/7nq86i.xX-vsz4.js","/assets/a6i9w3.EfIGbif.js","/assets/7gmtsf.TLXXr_Y.js","/assets/bp96i9.Vlj9Q6b.js","/assets/w1yg77.wvSQGf6.js","/assets/5jr1ur.l1XQBT3.js","/assets/55gplo.IqDCpAH.js","/assets/9ygz84.9zCVZts.js","/assets/0khkbz.ngppRV9.js","/assets/s1ymgp.zYvqJZh.js","/assets/ljqkwp.r2XRgjr.js","/assets/ntn269.jRdNEnE.en-US.js","/assets/b1cljk.ZxkCQ-_.en-US.js","/assets/af72y8.eN_yie2.js","/assets/43er8k.NDjyc_i.js","/assets/cbdk2b.CRN_Qb5.en-US.js","/assets/dvdzap.OsO2-_T.js","/assets/j56vim.zkI1l3j.js","/assets/rfo7hc.IL9XkG_.js","/assets/b3ve7j.znBXt5S.js","/assets/a2qxj9.VpzEpGH.js","/assets/w5k17a.Gh_-IU9.js","/assets/0ad67e.LgPWGZT.js","/assets/aa8hvr.PL8PFLO.en-US.js","/assets/6qmqhw.wqBKfSs.js","/assets/7a7jm3.f_3ZyHx.js","/assets/556vjb.E9UvOvu.js","/assets/obdupk.Vjl25R5.js","/assets/q18gbm.d4QBQje.js","/assets/nylcph.K6b2omX.js","/assets/227h6c.mZnR6dI.js","/assets/i3sz5h.LEPLhPu.en-US.js","/assets/u3wokd.Un5esL3.js","/assets/lfeddg.BnR5feb.en-US.js","/assets/zzfm0c.yJmQI-d.js","/assets/rdeq8t.3_n6wgd.js","/assets/kqywgi.NmmGQ2J.js","/assets/ku7suo.0_ZnKAw.js","/assets/ex1xu3.oyMj-Ju.en-US.js","/assets/t5lgqc.dTpOAMX.css","/assets/6g4avl.uwlEOJe.css","/assets/cnyhjq.Go9HvFB.css","/assets/poggee.IX-NtUL.js","/assets/iyqcwg.YfGqIaA.js","/assets/3309mt.OPbhR9u.js","/assets/r6ayw2.30QABbv.en-US.js","/assets/dlu2yg.wVtENV8.js","/assets/o5y7tg.EVCm__-.en-US.js","/assets/ag9b0s.CGM6RVn.js","/assets/t5lgqc.dTpOAMX.js","/assets/6g4avl.uwlEOJe.js","/assets/cnyhjq.Go9HvFB.js","/assets/8m6oju.ibBMZov.js","/assets/k7dpqn.mX2va0m.js","/assets/665v5s.26mOYYu.js","/assets/yug3zc.whsCPlD.css","/assets/cjerkd.PPGnhl3.css","/assets/dl4tf4.h3pTyRW.css","/assets/76j3t0.Qw7Yrdq.css","/assets/1uaudg.4ZeKpve.css","/assets/uovzt8.VlK5Ic8.css","/assets/yug3zc.whsCPlD.en-US.js","/assets/cyrz7y.I0aGElA.js","/assets/cjerkd.PPGnhl3.en-US.js","/assets/wsk8ra.ozh98UL.js","/assets/eqoaya.Dk0FFtr.js","/assets/dl4tf4.h3pTyRW.js","/assets/76j3t0.Qw7Yrdq.js","/assets/1uaudg.4ZeKpve.en-US.js","/assets/uovzt8.VlK5Ic8.js","/assets/qhneqr.gJKnqD9.js","/assets/vnfaws.AyNqFKG.js","/assets/xnjg71.leojR_W.js","/assets/gbsde2.Nl-JkrK.js","/assets/jnxuv9.OUkpiqS.js","/assets/p4adue.EPFj6bM.js","/assets/b1qg3y.IU6teMh.js","/assets/c5kzk2.80tCCp-.js","/assets/2l7tdf.gg5DCYY.js","/assets/do522n.zVgVuVM.js","/assets/kqf4x0.NXD6o13.js","/assets/0hkn24.ZQCiWiq.js","/assets/5c85y0.qzBmYZd.js","/assets/losr6p.l-q178o.js","/assets/igyuz7.pSuhJYy.js","/assets/jk772q.eid1JOJ.en-US.js","/assets/y591su.q7ADFUd.css","/assets/bkeq24.iKdQA0e.css","/assets/m5f61p.bsSDEsO.css","/assets/n6iz1t.yJruy13.css","/assets/n48gd3.O3pHfLu.css","/assets/vbytol.lzhWZZy.css","/assets/tm42hr.MiJggjd.css","/assets/p6ynyy.xrAIbSt.css","/assets/livpad.SrGAlAY.css","/assets/wgun1f.u4JauGJ.css","/assets/9m9122.4JZE8bQ.css","/assets/7oyc3j.0d2QH9w.css","/assets/7s4pzp.Db5opfS.css","/assets/2j5if1.qFFdavf.css","/assets/jkvskb.RxK0mHQ.css","/assets/49c7br.DJnMra1.css","/assets/fm6nx5.akr2219.css","/assets/us1vwl.No67_yF.css","/assets/6mugfq.Ojq4FDf.css","/assets/ifcufe.Up1qfJo.css","/assets/ay1l3c.mVPYX7a.css","/assets/7yaz66.bc48ntf.css","/assets/iwbyl5.DDjYKWy.css","/assets/yk7it8.J_-Db8n.css","/assets/dpzonz.XripcCQ.css","/assets/u5pild.6rk6ALT.css","/assets/mgk0ro.YqC9cpw.css","/assets/nunr2w.v_fqqra.css","/assets/ih0468.Cm_xZXL.css","/assets/asj0sy.h5g1BfC.css","/assets/p9ucm8.4e7FKXP.css","/assets/dpmjfu.NKq1gO6.css","/assets/4wi38e.0-KvPuu.css","/assets/lsgvo8.NCKUAhi.css","/assets/u59av4.peVNUSH.css","/assets/wxz5a4.LP5LwCJ.css","/assets/y591su.q7ADFUd.en-US.js","/assets/e3vm87.gz5zJuS.en-US.js","/assets/bkeq24.iKdQA0e.en-US.js","/assets/sbz3c6.wCe5eA_.js","/assets/00m0uy.UGd-XT4.js","/assets/m5f61p.bsSDEsO.en-US.js","/assets/n6iz1t.yJruy13.en-US.js","/assets/3z23w8.WMS0-0h.en-US.js","/assets/sa2a6q.AeIlCFh.js","/assets/2gg3s2.J6G1cfw.js","/assets/wq4l6o.BfLmCF2.js","/assets/qk22ay.W25iedb.js","/assets/ibebqy.miq-tIV.js","/assets/n48gd3.O3pHfLu.en-US.js","/assets/kgvmhy.5ed_Zpd.js","/assets/2xmlss.z_UOYs-.js","/assets/9irlvm.lKC0q-n.js","/assets/vbytol.lzhWZZy.js","/assets/gagan6.TIrMFSB.js","/assets/tm42hr.MiJggjd.en-US.js","/assets/p6ynyy.xrAIbSt.en-US.js","/assets/livpad.SrGAlAY.en-US.js","/assets/wgun1f.u4JauGJ.en-US.js","/assets/9m9122.4JZE8bQ.en-US.js","/assets/7oyc3j.0d2QH9w.en-US.js","/assets/7s4pzp.Db5opfS.en-US.js","/assets/aqiall.YQuh7-L.js","/assets/y0uq31.zwMPVUk.js","/assets/2j5if1.qFFdavf.en-US.js","/assets/qu1mdn.1FeISQ1.js","/assets/g6hkol.Bb0qAiB.js","/assets/jkvskb.RxK0mHQ.en-US.js","/assets/ql7kzy.U2awDWq.js","/assets/96enn3.yJenyxR.js","/assets/49c7br.DJnMra1.js","/assets/acx4g3.jO5I_IB.js","/assets/48k7uc.SUq2oyq.js","/assets/lyah0x.s3m33b2.js","/assets/q6iser.rVqvB62.js","/assets/fm6nx5.akr2219.js","/assets/us1vwl.No67_yF.en-US.js","/assets/mxujx7.0Nku1vM.js","/assets/2wld0u.w-RUdCj.js","/assets/5xqg72.DZhjmZx.js","/assets/frb1r3.esAqGVB.js","/assets/57efgr.HiwPwqh.js","/assets/6mugfq.Ojq4FDf.js","/assets/ifcufe.Up1qfJo.js","/assets/bhr54q.LwvHqyP.js","/assets/jgmezl.JeGVTl7.js","/assets/5witma.uf2KxeF.js","/assets/q6pt2j.0fcbiSi.js","/assets/56m2z6.NN6sO5v.js","/assets/xv8zsa.Hf4-AWw.js","/assets/2t8e04.oTOe2rB.js","/assets/5zxkkr.EzleJTW.js","/assets/h9r6r6.3xt4ioV.js","/assets/8slqg9.BeQ5yx3.js","/assets/iwv3t7.sHyyCmk.js","/assets/1k892k.cgRuB1Q.js","/assets/1417aa.k05RH1Z.js","/assets/cbyjc7.QN728iz.js","/assets/0adx0g.eCdW_Ye.js","/assets/dk1ohz.w-9DlAc.js","/assets/yy6083.VMA08az.js","/assets/0c1i8x.8d_ts6d.js","/assets/u9ykn9.zU3_MfU.js","/assets/z9k2tj.zRAl5-9.js","/assets/mim557.IX8oT7J.js","/assets/vwspdx.4szDKSg.js","/assets/hjfzd7.p0xbzAM.js","/assets/wp1i76.5YRuj1q.js","/assets/ecgxx4.Ajp5l7M.js","/assets/rmu6wn.XrBboqB.js","/assets/df03dz.1BT7MWi.js","/assets/2mm5ve.T-vgwRc.js","/assets/55nvbk.50Qlp4L.js","/assets/yr8sh8.MPYUTFY.js","/assets/gtcmoc.pngnJdw.js","/assets/ghg8co.FBwEIrh.js","/assets/9qbdxh.hybcUVO.js","/assets/q76prz.APaldye.js","/assets/axz19q.gF2a8O0.js","/assets/zsadmq.9bsMwjn.js","/assets/2jooyn.nIG7MYB.js","/assets/iq7kpa.GSz8sKH.en-US.js","/assets/ay1l3c.mVPYX7a.js","/assets/gudzb7.LxpzFj5.js","/assets/x55bmb.K7UaayK.js","/assets/zj3q0t.mHyGkVd.js","/assets/00mpxl._qgGVeP.js","/assets/7yaz66.bc48ntf.en-US.js","/assets/iwbyl5.DDjYKWy.en-US.js","/assets/74j83y.TUiF3ad.js","/assets/yk7it8.J_-Db8n.js","/assets/2heyv0.ugoZyKu.js","/assets/vfymw1.AxR-bCI.js","/assets/iwue3h.FbSE_GS.js","/assets/dpzonz.XripcCQ.js","/assets/u5pild.6rk6ALT.en-US.js","/assets/9rb8bq.i96Y8Oo.en-US.js","/assets/juddza.EPs69RF.js","/assets/mgk0ro.YqC9cpw.en-US.js","/assets/irfizf.TNQq-XD.js","/assets/mc5s4b.JtRBcET.en-US.js","/assets/nunr2w.v_fqqra.en-US.js","/assets/uw9rn6.WBI8iMs.js","/assets/ih0468.Cm_xZXL.en-US.js","/assets/0506zk.Mb3poS4.js","/assets/1gwwxv.CYJ3r31.js","/assets/asj0sy.h5g1BfC.en-US.js","/assets/p9ucm8.4e7FKXP.en-US.js","/assets/joj99y.xfYFpsI.js","/assets/dpmjfu.NKq1gO6.en-US.js","/assets/4wi38e.0-KvPuu.en-US.js","/assets/lsgvo8.NCKUAhi.en-US.js","/assets/gx3qoj.ggRFmHO.js","/assets/u59av4.peVNUSH.js","/assets/x4scmz.TZTO-m2.js","/assets/wxz5a4.LP5LwCJ.en-US.js","/assets/a7906a.yltqvD2.en-US.js","/assets/izffpf.kBoNi_F.js","/assets/46822j.lHN-FZX.js","/assets/cdp6m7.tqLvlj1.en-US.js","/assets/ttyi9i.XEcFf3g.css","/assets/cb79np.rfLAcsL.css","/assets/ttyi9i.XEcFf3g.js","/assets/l7164z.rKKqDzK.js","/assets/m7w66t.B5DWZsf.js","/assets/cb79np.rfLAcsL.js","/assets/943fsy.4ez6AGM.css","/assets/o8gqrw.LFaZJL6.css","/assets/943fsy.4ez6AGM.en-US.js","/assets/ezmx4w.Sj856oT.js","/assets/9btuwa.LaPpVdf.js","/assets/o8gqrw.LFaZJL6.en-US.js","/assets/fmnymu.20z0UEK.js","/assets/bw5mmp.clGDW_T.css","/assets/2q3kwo.JeeULWD.css","/assets/3mqm4w.xHjkKGO.css","/assets/bw5mmp.clGDW_T.js","/assets/2q3kwo.JeeULWD.en-US.js","/assets/3mqm4w.xHjkKGO.en-US.js","/assets/mhkl02.wZJRWlW.css","/assets/ahn2ts.sklEQvm.css","/assets/covaqn.DbwOi6J.css","/assets/mhkl02.wZJRWlW.en-US.js","/assets/ahn2ts.sklEQvm.en-US.js","/assets/covaqn.DbwOi6J.js","/assets/8ggxuf.znJEZbK.css","/assets/8ggxuf.znJEZbK.en-US.js","/assets/2ve3zv.ESQsaSi.js","/assets/qmiz3l.olZwuc9.js","/assets/b4296f.hyziwOA.js","/assets/7j6z14.uguPz_k.css","/assets/9enknt.h73Xsny.css","/assets/iw69pc.fR_WP5t.css","/assets/5i37eo.2StbCOt.js","/assets/7j6z14.uguPz_k.en-US.js","/assets/9enknt.h73Xsny.en-US.js","/assets/nev0g8.M8IsW16.js","/assets/iw69pc.fR_WP5t.js","/assets/jz56j2._7m79LJ.js","/assets/yjij17.xLGnHrI.js","/assets/yc8qq2.eGJ2Y8i.js","/assets/vgfso9.hM-w4pi.js","/assets/r5tkzy.0FXzGc7.css","/assets/r5tkzy.0FXzGc7.en-US.js","/assets/4nzso8.DhcAnyq.js","/assets/5n3iuq.loXPwJc.css","/assets/lt9m20.FZ7Q62F.css","/assets/lyyh8d.whCmSeG.css","/assets/5n3iuq.loXPwJc.js","/assets/lt9m20.FZ7Q62F.en-US.js","/assets/lyyh8d.whCmSeG.js","/assets/633gr8.KXDeWYD.css","/assets/633gr8.KXDeWYD.en-US.js","/assets/epp8eq.OznZMEh.js","/assets/bckiht.VJo9yPW.js","/assets/wvntj1.JyhzIpO.css","/assets/8ec5k9.Wys4zgb.css","/assets/ueacbr.79yDUBI.css","/assets/g5mqn8.zxcZSkB.css","/assets/bqhoek.fHrf3OS.css","/assets/t9pxn7.QDJJCfw.css","/assets/bttvi0.nzPweHv.css","/assets/d0lmv3.hgGpGVF.css","/assets/ynqy3n.jEHWEvo.css","/assets/u3aiot.7PZCsln.css","/assets/lmi3nj.awB7rZ3.js","/assets/wvntj1.JyhzIpO.en-US.js","/assets/tefbkk.IZJJeAB.js","/assets/8ec5k9.Wys4zgb.en-US.js","/assets/pn8thk.CcVtElK.js","/assets/ueacbr.79yDUBI.en-US.js","/assets/q7jm9a.-kXsEt2.js","/assets/gcjubj.gotZwFM.js","/assets/g5mqn8.zxcZSkB.en-US.js","/assets/bqhoek.fHrf3OS.js","/assets/8gzfcs.ttWi9nl.js","/assets/l82a96.T9ivw4H.js","/assets/6ac2ea.Iz14u38.js","/assets/r5wn4z.vGkZTyv.js","/assets/t9pxn7.QDJJCfw.en-US.js","/assets/amsjo9.yI5x4HN.js","/assets/9l9n46.ClcpelL.js","/assets/ctn2v9.MPn8nWF.js","/assets/0xaw8s.DtGn8rd.js","/assets/eki1kt.uTf-4ao.js","/assets/e1vyie.miL1fic.js","/assets/tochuq.wmrdXhU.js","/assets/rodcqa.kI_K-_w.js","/assets/8ny8va.ARLSugf.js","/assets/bttvi0.nzPweHv.en-US.js","/assets/mvpl5y.6fNXFjZ.js","/assets/d0lmv3.hgGpGVF.en-US.js","/assets/rko5gs.DZuaWZc.js","/assets/ynqy3n.jEHWEvo.en-US.js","/assets/s9vc2i.Nq0mHO3.js","/assets/u3aiot.7PZCsln.en-US.js","/assets/my7i5t.AUckW4E.js","/assets/an500m.TBSz27k.js","/assets/dvcr7s.zyj4ujx.js","/assets/tj4q1a.En8g8I2.js","/assets/crdfjq.qkC70d1.js","/assets/inugb1.UhxglfQ.js","/assets/rbmelg.lVPkCHc.css","/assets/wt5b21.r2JxptP.css","/assets/rbmelg.lVPkCHc.en-US.js","/assets/wt5b21.r2JxptP.js","/assets/it954g.dnuFcmB.js","/assets/qhdojo.5ESdLef.css","/assets/k9d0qe.hnbUYAO.js","/assets/qhdojo.5ESdLef.js","/assets/k64pus.Uo6DAoA.js","/assets/51qnrz.a8pymOr.css","/assets/51qnrz.a8pymOr.js","/assets/y2yzxt.VtjDZ8t.js","/assets/bxtwp3.ZyCCees.css","/assets/c24k6s.4tT7wLO.js","/assets/bxtwp3.ZyCCees.en-US.js","/assets/i4iifm.hy3J8V_.css","/assets/i4iifm.hy3J8V_.en-US.js","/assets/otn3pf.1SGIxms.css","/assets/kwwpub.IgkEzwj.css","/assets/k3tmpy.NHrRX_A.css","/assets/wzx6xx.sxDqs2J.css","/assets/2z6i3l.kh_jNvq.css","/assets/gmgko3.PiXfInB.css","/assets/mhdyoo.A8bMdDC.css","/assets/ura2hp.7okRksT.css","/assets/nj5fmi.XgehWsH.css","/assets/vmdfg2.txpckfa.css","/assets/ilfmgg.-95rlsP.css","/assets/0tr9w6.iWmLOr_.css","/assets/nv3m6p.AJj3hs5.css","/assets/ko0hl1.6BR8RUP.css","/assets/nv22hj.Y0pjbn3.css","/assets/7qvnt6.a7IpS0l.css","/assets/38pxm6.lfHZ_Lw.css","/assets/bddcdc.Y9sLSww.css","/assets/5z319n.oHPqCOt.css","/assets/xba3jb.AocEVcn.css","/assets/j0casb.Z3gVRZs.css","/assets/z2nh2s.O5qfdci.css","/assets/otn3pf.1SGIxms.en-US.js","/assets/lm2mdj.EWkPsI7.js","/assets/kwwpub.IgkEzwj.en-US.js","/assets/k3tmpy.NHrRX_A.en-US.js","/assets/wzx6xx.sxDqs2J.en-US.js","/assets/89zkcy.wNLMciP.js","/assets/ipqm0v.3WJHxG4.js","/assets/2z6i3l.kh_jNvq.en-US.js","/assets/ptdiqu.TEAhSc9.js","/assets/gmgko3.PiXfInB.en-US.js","/assets/k5n2qt.r4QZgpg.js","/assets/4ecb70.68dC5lQ.js","/assets/3w1vrt.Dw0MvQt.js","/assets/j9pg61.Az4ChUm.en-US.js","/assets/t73tmt.C5Q4oi7.js","/assets/tsg6fc.LxrysE1.js","/assets/mhdyoo.A8bMdDC.en-US.js","/assets/8vod40.bAi-DOd.js","/assets/3ky3cf.Mv66vFg.js","/assets/ura2hp.7okRksT.en-US.js","/assets/0l1dx6.eG9AwXF.js","/assets/itms4k.JyxprIU.js","/assets/axzhv5.iUmyeFx.js","/assets/uredq7.Mw89S0b.js","/assets/nj5fmi.XgehWsH.js","/assets/4s11lg.EhqefCz.js","/assets/4f7bla.VLBOdX4.js","/assets/vmdfg2.txpckfa.js","/assets/3aiijo.cH4ZMHm.js","/assets/ilfmgg.-95rlsP.js","/assets/hmckhk.LnO9Bgl.js","/assets/0tr9w6.iWmLOr_.js","/assets/y0u43e.aoWg7Zz.js","/assets/sqipqa.iSN9eSD.js","/assets/nv3m6p.AJj3hs5.js","/assets/ko0hl1.6BR8RUP.en-US.js","/assets/nv22hj.Y0pjbn3.en-US.js","/assets/hmc04z.8i9R1Pf.js","/assets/1vxup5.zSjED3g.js","/assets/7qvnt6.a7IpS0l.en-US.js","/assets/v5ce81.MbiV6aM.js","/assets/shk8zi.M9QKWf2.js","/assets/38pxm6.lfHZ_Lw.en-US.js","/assets/adx92b.x0CB4SN.js","/assets/bddcdc.Y9sLSww.en-US.js","/assets/uu0jru.Dc_KLxd.js","/assets/5z319n.oHPqCOt.js","/assets/xba3jb.AocEVcn.js","/assets/j0casb.Z3gVRZs.en-US.js","/assets/z2nh2s.O5qfdci.js","/assets/5ntslg.YA6n90X.js","/assets/ibnuox.DKD_4mw.js","/assets/7sf9ju.qSTBiM7.js","/assets/lw6u8y.ezrHew-.css","/assets/sevubl.3ScdA-F.css","/assets/lw6u8y.ezrHew-.js","/assets/sevubl.3ScdA-F.js","/assets/fbj18l.3tu7LJa.css","/assets/arzycm.GCE2ghA.css","/assets/zuzegh.fiEkUor.js","/assets/tl3yll.mtz8zBe.en-US.js","/assets/fbj18l.3tu7LJa.js","/assets/7f44s6.xsZc2Sc.js","/assets/azylvk.pqb7X8Y.js","/assets/arzycm.GCE2ghA.js","/assets/4z4yyg.LCp5Zjn.js","/assets/yldu11.jaHj9-Z.js","/assets/6u6l0s.umcUOzM.css","/assets/d8i7gt.GdKkvjN.css","/assets/e2vvg2.ig84jFM.css","/assets/d0nzl4.8MV9kFM.css","/assets/2kokoi.Ws9N3ed.css","/assets/bor2pt.xm9NU5v.css","/assets/2wh22i.6B_VLVG.css","/assets/b478w0.2B8fUSH.css","/assets/b7to7i.31ynCkB.css","/assets/69zgye.i4S8DCa.css","/assets/ek9axc.4z7h67D.css","/assets/6u6l0s.umcUOzM.en-US.js","/assets/d8i7gt.GdKkvjN.js","/assets/e2vvg2.ig84jFM.en-US.js","/assets/d0nzl4.8MV9kFM.en-US.js","/assets/pl54pb.0YXUSfQ.js","/assets/u67rh6.3KUgjFE.js","/assets/2kokoi.Ws9N3ed.js","/assets/bor2pt.xm9NU5v.en-US.js","/assets/2wh22i.6B_VLVG.en-US.js","/assets/93tgdv.f9UFf9J.js","/assets/b478w0.2B8fUSH.en-US.js","/assets/c2bvyd.nm7j6Tr.js","/assets/b7to7i.31ynCkB.js","/assets/69zgye.i4S8DCa.en-US.js","/assets/ek9axc.4z7h67D.js","/assets/47l9qb.42wBHQ6.css","/assets/pafhay.pj1NVcm.js","/assets/47l9qb.42wBHQ6.en-US.js","/assets/d5rizv.YXETCA0.js","/assets/ogfpsz.1N78T0J.css","/assets/ogfpsz.1N78T0J.en-US.js","/assets/p3y1zq.fsODuNk.js","/assets/v6moqe.vERG1hJ.css","/assets/v6moqe.vERG1hJ.js","/assets/kgn6ua.choHucS.js","/assets/a349lq.wYum60U.css","/assets/2tx7su.VCMrWYK.css","/assets/bj0rkj.wzjq7SF.css","/assets/a349lq.wYum60U.en-US.js","/assets/75vfyw.IoyHNtL.js","/assets/6hf0eg.IEW7xdI.js","/assets/2tx7su.VCMrWYK.js","/assets/c96qj3.X5m20FA.js","/assets/5hne4v.34aSMRW.js","/assets/bj0rkj.wzjq7SF.en-US.js","/assets/z2i5er.zygl0se.js","/assets/5azdze.2NZEZ4R.js","/assets/it6k5j.3wVgYCf.js","/assets/ue3yko.ee9wjg6.js","/assets/008v8e.qyMh87h.js","/assets/0v7vxf.EdFtGVz.js"],"bundles":["hjmqlv","l2u3je","5xz9bl","21h32l","o4yt4q","voprus","2mj4nv","5vmpsm","@ta/import-map","uujvhg","6z5q2p","973cci","83pm0d","skjzuv","7v9w42","f7mzgd","bvvaww","45ddp0","q7wvkq","promjz","32pwc7","mtbtnn","fgwvq1","qjohxf","8pymbz","98inwa","tm6ey6","btbawi","904jnz","4x6ber","bt3bv2","b8gyi1","qlcuu5","6nmgrj","gyzem5","1sioa0","xo1is3","ltllz9","9b9b10","ys6v1o","7thqz4","52far5","al4vil","gugp1d","nnprhg","mb2nze","mqwhqn","etaac9","r73jw8","xg719z","yau6qy","bxkng5","98810w","p5p2yo","dyfdn5","bwm4qt","lr6tb6","essqvy","frf6ac","jppfwt","qndsds","fkji80","2r4qug","gw8uw6","evvugf","90bo0h","gjtatx","u9jlwp","ue4abb","nlswq2","i0z8n1","4ilds0","q213pt","kq4q2w","gbnboa","eww825","b5nukb","ltf8dz","5gpqhx","nexzid","fbuhsy","ahlu9q","s6q22n","g05qlv","vbk5jk","t9nvqo","u5g3tb","kb5au4","c3xckd","dsbyen","vumu0s","xj2t7q","lchj5q","iog21h","rdycz1","vjlqzu","uvk21c","nntg4s","sdpjgr","4euaes","9w33la","nnmev3","1olf6x","bvz1zl","hxluky","z2lnv4","7u7gib","l9qeu7","d8oes5","q13wda","uzmmz7","65rb8q","gttbjc","qkjm8h","tbkd43","60mj7v","tp1g68","3dy54m","@ta/lithium-page-config","vpo3wt","sh5o32","591izp","ulejzu","j8lyt5","fzzo52","txqepv","bqgabj","uedfnc","4axon3","w0dpwq","3btuy0","qbn8x2","w1vb4i","lajpgs","tr3542","0of6qq","ybxsmg","4q9l40","x9dv95","ja55rt","jbz0uy","79a2um","d6vj30","@ta/features","t05m6z","wr50cf","teh9fa","ifbjcg","5hcrwr","ex1xu3","ku7suo","lq6xsf","94v69w","w2pv0e","80hn7v","egodks","z6c0ez","y52xss","kqywgi","zzfm0c","lfeddg","u3wokd","i3sz5h","227h6c","nylcph","q18gbm","obdupk","556vjb","aa8hvr","0ad67e","w5k17a","rfo7hc","j56vim","dvdzap","cbdk2b","ntn269","ljqkwp","s1ymgp","0khkbz","9ygz84","55gplo","5jr1ur","1b5l5d","68fm7o","eq3hjy","hwdnu5","7l5hpv","nc3gmf","zb2uaz","l75rcq","pwoff0","34bu7w","zq967r","xm2jzo","j8mzb2","eozxiw","oz3g7e","sw5ax0","conwso","fa3gob","uc42ar","c5q3iu","o3mm96","qx89h8","j1i9fl","flcs8h","w1yg77","7gmtsf","a6i9w3","gppdva","7nq86i","bp96i9","43er8k","b1cljk","af72y8","a2qxj9","b3ve7j","7a7jm3","6qmqhw","rdeq8t","poggee","k7dpqn","t5lgqc","ag9b0s","iyqcwg","r6ayw2","3309mt","o5y7tg","dlu2yg","8m6oju","cnyhjq","6g4avl","665v5s","yug3zc","igyuz7","losr6p","1uaudg","dl4tf4","wsk8ra","cjerkd","cyrz7y","eqoaya","76j3t0","5c85y0","0hkn24","kqf4x0","do522n","2l7tdf","c5kzk2","b1qg3y","p4adue","jnxuv9","gbsde2","xnjg71","vnfaws","qhneqr","uovzt8","jk772q","y591su","00m0uy","sbz3c6","bkeq24","e3vm87","m5f61p","wxz5a4","x4scmz","u59av4","gx3qoj","lsgvo8","4wi38e","asj0sy","1gwwxv","dpzonz","iwbyl5","7yaz66","00mpxl","zj3q0t","x55bmb","gudzb7","ay1l3c","iq7kpa","5witma","jgmezl","frb1r3","5xqg72","us1vwl","fm6nx5","q6iser","lyah0x","49c7br","96enn3","ql7kzy","jkvskb","g6hkol","2j5if1","7oyc3j","9m9122","p6ynyy","n48gd3","ibebqy","3z23w8","n6iz1t","qk22ay","sa2a6q","2gg3s2","wq4l6o","vbytol","9irlvm","kgvmhy","2xmlss","tm42hr","gagan6","livpad","wgun1f","7s4pzp","y0uq31","aqiall","qu1mdn","48k7uc","acx4g3","2wld0u","mxujx7","bhr54q","6mugfq","57efgr","ifcufe","2jooyn","zsadmq","axz19q","q76prz","9qbdxh","ghg8co","gtcmoc","yr8sh8","55nvbk","2mm5ve","df03dz","rmu6wn","ecgxx4","wp1i76","hjfzd7","vwspdx","mim557","z9k2tj","u9ykn9","0c1i8x","yy6083","dk1ohz","0adx0g","cbyjc7","1417aa","1k892k","iwv3t7","8slqg9","h9r6r6","5zxkkr","2t8e04","xv8zsa","56m2z6","q6pt2j","2heyv0","yk7it8","74j83y","iwue3h","vfymw1","9rb8bq","u5pild","0506zk","ih0468","uw9rn6","mgk0ro","juddza","nunr2w","mc5s4b","irfizf","dpmjfu","p9ucm8","joj99y","cdp6m7","a7906a","izffpf","46822j","ttyi9i","cb79np","m7w66t","l7164z","943fsy","o8gqrw","9btuwa","ezmx4w","fmnymu","bw5mmp","3mqm4w","2q3kwo","mhkl02","ahn2ts","covaqn","8ggxuf","2ve3zv","qmiz3l","b4296f","5i37eo","7j6z14","vgfso9","yc8qq2","yjij17","9enknt","jz56j2","iw69pc","nev0g8","r5tkzy","4nzso8","5n3iuq","lyyh8d","lt9m20","633gr8","bckiht","epp8eq","lmi3nj","wvntj1","g5mqn8","ueacbr","tefbkk","8ec5k9","pn8thk","gcjubj","q7jm9a","inugb1","crdfjq","bttvi0","t9pxn7","l82a96","8gzfcs","bqhoek","6ac2ea","r5wn4z","8ny8va","rodcqa","tochuq","e1vyie","eki1kt","0xaw8s","ctn2v9","9l9n46","amsjo9","rko5gs","d0lmv3","mvpl5y","ynqy3n","u3aiot","s9vc2i","tj4q1a","dvcr7s","an500m","my7i5t","rbmelg","wt5b21","it954g","k9d0qe","qhdojo","k64pus","51qnrz","y2yzxt","c24k6s","bxtwp3","i4iifm","otn3pf","7sf9ju","ibnuox","j0casb","bddcdc","adx92b","shk8zi","7qvnt6","1vxup5","nv22hj","y0u43e","vmdfg2","kwwpub","lm2mdj","4f7bla","wzx6xx","k3tmpy","4s11lg","nj5fmi","itms4k","ura2hp","mhdyoo","t73tmt","3w1vrt","4ecb70","k5n2qt","gmgko3","2z6i3l","89zkcy","ipqm0v","ptdiqu","j9pg61","tsg6fc","3ky3cf","8vod40","0l1dx6","axzhv5","uredq7","hmckhk","ilfmgg","3aiijo","0tr9w6","sqipqa","ko0hl1","nv3m6p","hmc04z","v5ce81","38pxm6","uu0jru","xba3jb","5z319n","5ntslg","z2nh2s","lw6u8y","sevubl","zuzegh","fbj18l","tl3yll","arzycm","azylvk","7f44s6","4z4yyg","yldu11","6u6l0s","e2vvg2","d8i7gt","69zgye","c2bvyd","b478w0","bor2pt","2kokoi","u67rh6","pl54pb","d0nzl4","2wh22i","93tgdv","b7to7i","ek9axc","pafhay","47l9qb","d5rizv","ogfpsz","p3y1zq","v6moqe","kgn6ua","a349lq","0v7vxf","008v8e","ue3yko","it6k5j","5azdze","2tx7su","75vfyw","6hf0eg","bj0rkj","5hne4v","c96qj3","z2i5er"],"lazyLoadedModules":["n6iz1t","kgn6ua","5hcrwr","y2yzxt","6u6l0s","e2vvg2","ogfpsz","pafhay","r5tkzy","a349lq","mhkl02","poggee","4z4yyg","2j5if1","51qnrz","8ggxuf","633gr8","5n3iuq","lmi3nj","otn3pf","zuzegh","yldu11","qmiz3l","rbmelg","b4296f","i4iifm","y591su","k9d0qe","c24k6s","bt3bv2","yug3zc","ttyi9i","943fsy","bw5mmp","5i37eo","lw6u8y","v6moqe","jk772q"],"renders":[{"id":"component_4","props":{},"package":"yug3zc"}],"hydrations":[{"id":"component_5","props":{"showNewSecondaryNavLinks":"false"},"package":"5hcrwr"},{"id":"component_1","props":{},"package":"bt3bv2"},{"id":"component_3","props":{},"package":"poggee"},{"id":"component_6","props":{"initialQuery":""},"package":"jk772q"},{"id":"component_7","props":{},"package":"y591su"},{"id":"component_8","props":{},"package":"ttyi9i"},{"id":"component_9","props":null,"package":"943fsy"},{"id":"component_10","props":{"locationId":1315559},"package":"bw5mmp"},{"id":"component_11","props":{"itemType":"RESTAURANT_REVIEW","hasContainer":"true","limit":"4"},"package":"mhkl02"},{"id":"component_12","props":{},"package":"8ggxuf"},{"id":"component_13","props":{"locationScoped":"true","pid":"40513"},"package":"qmiz3l"},{"id":"component_14","props":728x90","package":"b4296f"},{"id":"component_15","props":{},"package":"5i37eo"},{"id":"component_16","props":{},"package":"2j5if1"},{"id":"component_17","props":HIGH","package":"r5tkzy"},{"id":"component_18","props":{"locationId":41650},"package":"5n3iuq"},{"id":"component_19","props":{"marginTop":"spacing-02"},"package":"633gr8"},{"id":"component_20","props":{},"package":"lmi3nj"},{"id":"component_21","props":{"withTopMargin":"true","position":"RailNova"},"package":"n6iz1t"},{"id":"component_22","props":{},"package":"rbmelg"},{"id":"component_23","props":300x600","position":"rail2","isSticky":"true","package":"k9d0qe"},{"id":"@ta/trips.save-to-trip:location:2621737_component_24","props":{"object":{"__typename":"LocationInformation","locationId":2621737},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:897643_component_25","props":{"object":{"__typename":"LocationInformation","locationId":897643},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:10672836_component_26","props":{"object":{"__typename":"LocationInformation","locationId":10672836},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:18892336_component_27","props":{"object":{"__typename":"LocationInformation","locationId":18892336},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:6952720_component_28","props":{"object":{"__typename":"LocationInformation","locationId":6952720},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:11657993_component_29","props":{"object":{"__typename":"LocationInformation","locationId":11657993},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:601912_component_30","props":{"object":{"__typename":"LocationInformation","locationId":601912},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:13354565_component_31","props":{"object":{"__typename":"LocationInformation","locationId":13354565},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"component_32","props":{},"package":"y2yzxt"},{"id":"@ta/trips.save-to-trip:location:2621737_component_33","props":{"object":{"__typename":"LocationInformation","locationId":2621737},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:897643_component_34","props":{"object":{"__typename":"LocationInformation","locationId":897643},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:7002196_component_35","props":{"object":{"__typename":"LocationInformation","locationId":7002196},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:6751253_component_36","props":{"object":{"__typename":"LocationInformation","locationId":6751253},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:10672836_component_37","props":{"object":{"__typename":"LocationInformation","locationId":10672836},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:18892336_component_38","props":{"object":{"__typename":"LocationInformation","locationId":18892336},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"component_39","props":{"placement":"detail_xsell"},"package":"c24k6s"},{"id":"component_40","props":{"popoverPosition":"below","displayMode":"compact"},"package":"i4iifm"},{"id":"component_41","props":{},"package":"otn3pf"},{"id":"component_42","props":{},"package":"lw6u8y"},{"id":"component_43","props":{},"package":"zuzegh"},{"id":"component_44","props":{},"package":"4z4yyg"},{"id":"component_45","props":{"useButton":"true","showOwner":"false","expectedOwnerLikelihoods":"MEDIUM"},"package":"r5tkzy"},{"id":"component_46","props":{},"package":"yldu11"},{"id":"component_47","props":{},"package":"6u6l0s"},{"id":"component_48","props":{},"package":"pafhay"},{"id":"component_49","props":{},"package":"ogfpsz"},{"id":"component_50","props":{},"package":"e2vvg2"},{"id":"component_51","props":300x600","position":"rail1","isSticky":"true","package":"k9d0qe"},{"id":"component_52","props":{},"package":"v6moqe"},{"id":"@ta/trips.save-to-trip:location:244104_component_53","props":{"object":{"__typename":"LocationInformation","locationId":244104},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:6703245_component_54","props":{"object":{"__typename":"LocationInformation","locationId":6703245},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:518290_component_55","props":{"object":{"__typename":"LocationInformation","locationId":518290},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"@ta/trips.save-to-trip:location:2152314_component_56","props":{"object":{"__typename":"LocationInformation","locationId":2152314},"widgetStyle":"listing","tooltipCopy":null,"toastCopy":null,"toastCopySubhead":null,"allowPopStatModal":false},"package":"51qnrz"},{"id":"component_2","props":{},"package":"kgn6ua"}]}};(this.$WP=this.$WP||[]).push(['@ta/features',function(e){return [function(){e('default',__WEB_CONTEXT__.pageManifest.features);},[]]},[]]);window['__STATIC_SERVICE_OVERRIDES__']={};window['__TIME_ORIGIN__']=1718130283532;window['__APP_VERSION__']=2505921922;]]> 0) { taCookie.setPIDCookie(pid); } var userLoggedInAppendString = (ta.userLoggedIn === true) ? '|LoggedIn' : ''; var servlet = (device === 'mobile') ? '/UserReview' : '/UserReviewEdit'; var eventLabel = (poiTrackingCategory === 'Activity') ? ('Product|Location' + userLoggedInAppendString) : 'POI|Location'; taRecord.setEvtCookie('contextual_cta_button_review', 'click', eventLabel, 0, servlet); } function _warOnClickForOwner(locationId, href, pid) { if (pid && pid > 0) { taCookie.setPIDCookie(pid); } taRecord.setEvtCookie('owner_cta', 'owner_visit_mc_middle', locationId, 0, href); } return { warOnClick: _warOnClick, warOnClickForOwner: _warOnClickForOwner }; });});if (require) {require(['ta/rollupAmdShim'], function(rollupAmdShim) { rollupAmdShim.install([], ["page-model"]); }); } else {if (window.ta&&ta.rollupAmdShim) {ta.rollupAmdShim.install([],["page-model"]);} }require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'common_tag_questions','handlers',['handlers']); define(["widget","lib/jquery-amd","ta/Core/TA.LocalStorage"], function(widget,$,ls) { function _init() { var questionsElem = $(widget.element).find(".questions"); if (!questionsElem) { ta.util.error.record("Tag Questions init error"); return; } var locationId = questionsElem.attr("data-location-id"); var answeredQuestions = []; if (ls.enabled) { var _answeredQuestions = ls.getObject(_getLocalStorageKey(locationId)); if (_answeredQuestions && _answeredQuestions.length) { answeredQuestions = JSON.parse(_answeredQuestions); } else { ls.set(_getLocalStorageKey(locationId),JSON.stringify([])); } } var questionsElems = $(widget.element).find(".question"); var questionShown = false; questionsElems.each(function (index, elem){ if (_isQuestionNew(elem, answeredQuestions)) { $(elem).show(); questionShown = true; // return false is equivalent to a 'break' statement for $.each() return false; } }); if (!questionShown) { questionsElem.find(".finalMessage").show(); } } function _getLocalStorageKey(locationId) { return "TAG_QUESTION_"+locationId; } $(widget.element).find('.answer').click(function(evt){ var answerElem = $(evt.target); if (!answerElem.hasClass("answer")) { answerElem = $(answerElem.closest(".answer")); } if (!answerElem) { ta.util.error.record("TagQuestions could not get answerElem"); } var questionElem = $(answerElem.closest(".question")); var questionsElem = $(widget.element).find(".questions"); if (!(questionElem && questionsElem)) { ta.util.error.record(!questionElem ? "TagQuestions could not get questionElem" : "TagQuestions could not get questionsElem"); } if (questionElem.find(".checkbox-checked").length > 0) { // The user has already selected an answer and it's probably animating out return; } answerElem.find(".ui_icon").removeClass("checkbox-border"); answerElem.find(".ui_icon").addClass("checkbox-checked"); var val = answerElem.attr("data-value"); var id = questionElem.attr("data-id"); var locationId = questionsElem.attr("data-location-id"); var securityToken = questionsElem.attr("data-security-token"); if (!(val && id && locationId && securityToken)) { var missingVals = []; if (!val) { missingVals.push("val"); } if (!id) { missingVals.push("id"); } if (!locationId) { missingVals.push("locationId"); } if (!securityToken) { missingVals.push("securityToken"); } ta.util.error.record("Tag Questions missing values: ["+ missingVals.join(",") +"]"); } // NOTE: Use $.param rather than Object.toQueryString to generate url, since it seems that Object.toQueryString // currently gets defined in site/js3/mootools/core/Types/Object.js, which should not be present on newer responsive pages new ta.util.ajax({ data: { locationId: locationId, id: id, value: val, token: securityToken }, method: 'POST', url: "/ListingQuestionsAjax?" + $.param({format:'json', a:'TAG_VOTE'}), onSuccess: function (e) { nextQuestion(questionElem,locationId); }, onFailure: function (e) { ta.util.error.record(e); } }); }); function _isQuestionNew(questionElem,answeredQuestions) { questionElem = $(questionElem); var id = questionElem.attr("data-id"); if (!id || !answeredQuestions) { return true; } return answeredQuestions.indexOf(id) 0) { var answeredQuestions = JSON.parse(ls.getObject(_getLocalStorageKey(locationId))); answeredQuestions.push(id); ls.set(_getLocalStorageKey(locationId),JSON.stringify(answeredQuestions)); } } var questionsElems = $(widget.element).find(".question"); if (!(questionElem && questionsElems)) { ta.util.error.record("TagQuestions could not show next question"); } var index = questionsElems.index(questionElem) + 1; var nextQuestionElem = null; if (index > 0) { while (questionsElems.length > index) { var _nextQuestionElem = $(questionsElems[index]); if (_isQuestionNew(_nextQuestionElem,answeredQuestions)) { nextQuestionElem = _nextQuestionElem; break; } index += 1; } } if (!nextQuestionElem) { var finalMessage = $(widget.element).find(".finalMessage"); if (finalMessage) { questionElem.fadeOut(400,function(){ finalMessage.fadeIn(); }); } } else { questionElem.fadeOut(400, function () { nextQuestionElem.fadeIn(); }); } } ta.queueForLoad( function() { _init(); }, 'initialize '+widget.container_id); }); });require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'common_responsive_static_map_image','handlers',['handlers']); define(["babel/babel-helpers", "widget", "utils/throttle", 'page-model'], function (babelHelpers, widget, throttle, pageModel) { var container = widget.element; var contentChoice = container.getElementsByClassName("contentChoice")[0].getAttribute("data-contentChoice"); var mapWidth = void 0; var requesting = false; function _imgLoaded(img) { if (!img.complete) { return false; } return img.naturalWidth !== 0; } /** * Makes an ajax call to get a new static map of the right size */ var reloadMap = throttle(function () { if (!document.body.contains(container)) { window.removeEventListener('resize', reloadMap); return; } // Reload the map if its width has changed. A width of 0 indicates the element is not visible. var newWidth = container.offsetWidth; if (newWidth && newWidth !== mapWidth) { if (requesting) { // A request is already pending. Don't send another. return; } requesting = true; widget.require(["trhtml!" + contentChoice + "?thumbWidth=" + newWidth + "&thumbHeight=" + container.offsetHeight + "&locationId=" + pageModel.LOC_ID], function (contentDiv) { mapWidth = newWidth; requesting = false; if (newWidth !== container.offsetWidth) { // This request is already stale. We don't need its content. reloadMap(); return; } var newContainer = contentDiv.querySelector("[data-prwidget-name="" + widget.name + ""]"); var img = contentDiv.querySelector('.mapImg'); if (!newContainer || !img) { return; } mapWidth = newWidth; // Don't replace the content until the new map has loaded, preventing flickering if (_imgLoaded(img)) { container.innerHTML = newContainer.innerHTML; } else { img.addEventListener('load', function () { return newWidth === container.offsetWidth && (container.innerHTML = newContainer.innerHTML); }); } }); } }, 200); reloadMap(); window.addEventListener('resize', reloadMap); });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'common_btf_nearby_poi_grid','handlers',['handlers']); define(['babel/babel-helpers', 'widget', 'common/trackingStreams'], function (babelHelpers, widget, tracking) { 'use strict'; function trackSeeAll(label) { tracking.trackEvent('seeAllNearby', 'click', label); } return { trackSeeAll: trackSeeAll }; });});define('ta/util/openNewTab', ['utils/browserutils', 'ta/Browser', 'ta/util/Cookie'], function(Browser, taBrowser, taCookie) { return function(url) { var win; if (!taBrowser.isIE10Metro()) { if (Browser.ie && !taBrowser.isIE9orHigher()) { win = window.open(url, '_blank', 'location=yes,resizable=yes,menubar=yes,scrollbars=yes,toolbar=yes,width=' + document.documentElement.clientWidth + ',height=' + document.documentElement.clientHeight); } else { win = window.open(url, '_blank'); } } if (!win || win.closed || typeof win.closed==='undefined') { taCookie.setPIDCookie(38821); window.location = url; return false; } return win; } }); require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'common_btf_nearby_poi_entry','handlers',['handlers']); // Private javascript for btf_nearby_poi_entry define(['widget', 'vanillajs', 'ta/util/openNewTab', 'common/trackingStreams'], function(widget, vanilla, openNewTab, tracking) { return { click: function(url, trackingString) { trackingString && tracking.trackEvent('nearby', 'click', trackingString); openNewTab(url); } }; }); });define('ta/common/behavior/Ads-pagemoniker', ['vanillajs', 'ns-exporter', 'common/trackingStreams', 'ta/Core/TA.Store', 'common/pixels-loader','ta/util/Element','ta/Core/TA.FireEvent'], function(vanilla, nsExporter, tracks, taStore, Pixels, element, taFireEvent) { var exports = {}; exports.remarketingOptions = Pixels.remarketingOptions() || {}; var awaitConsentResponse = function () { return new Promise(function (resolve) { window.require(["@ta/platform.runtime"], function (runtime) { runtime.importBundle("@ta/platform.consent").then(function (consentBundle) { consentBundle.enqueue(resolve); }); }); }); } var retrieve = function(key) { if (exports.remarketingOptions['pixelsEnabled'] === undefined) { exports.remarketingOptions = Pixels.remarketingOptions() || {}; } return exports.remarketingOptions[key]; }; var pixelTypeToIframeName = { OFFER_VIEW: 'Monikers_OV', HAC_PRICES_LOADED: 'Monikers_HPL', RESTAURANTS_OFFLINE_ATTRIBUTION: 'Monikers_ROA', RESTAURANTS_PRODUCT_SELECTION: 'Monikers_RPS', RESTAURANTS_PRODUCT_PAYMENT: 'Monikers_RPP', RESTAURANTS_PRODUCT_CONVERSION: 'Monikers_RPC', RESTAURANTS_NEW_REG_OWNER_FORM: 'Monikers_NRO', RESTAURANTS_CONF_REG_OWNER: 'Monikers_CRO', MEMBER_REGISTRATION_FORM: 'Monikers_MRF', HOTEL_CLAIM_FORM_SUBMISSION: 'Monikers_HCFS', STARTER_PACKAGES_PAGE_VIEW: 'Monikers_SPPV', STARTER_PACKAGES_PROPERTY_SELECTION: 'Monikers_SPPS', HOTELS_PRODUCT_CART_INITIATE_CHECKOUT: 'Monikers_HPCIC', HOTELS_PRODUCT_CART_ADD_PAYMENT_INFO: 'Monikers_HPCAP', HOTELS_PRODUCT_CART_PURCHASE: 'Monikers_HPCPP', UPP_HOTELS_PRODUCT_CART_INITIATE_CHECKOUT: 'Monikers_UPP_HPCIC', UPP_HOTELS_PRODUCT_CART_ADD_PAYMENT_INFO: 'Monikers_UPP_HPCAP', UPP_HOTELS_PRODUCT_CART_PURCHASE: 'Monikers_UPP_HPCPP', FACEBOOK_MC_RETARGETING: 'Monikers_FMCR', PAID_FUNNEL_LEAD_CONVERSION: 'Monikers_PFLC', MEMBER_CREATE: 'Monikers_MC', SAVE_TO_TRIP: 'Monikers_STT', SAVE_TO_TRIP_INTENT: 'Monikers_STTI', PLUS_CONFIRM: 'Monikers_PLUS_Confirm', PLUS_CHECKOUT: 'Monikers_PLUS_Checkout', HOTELS_RECOVERY_PACKAGE_AD_LANDER: 'Monikers_HRPAL', LINKEDIN_INSIGHT_TAG: 'Monikers_LII_T', RESTAURANT_PRODUCT_SELECT_LISTING: 'Monikers_RPSL', RESTAURANT_PRODUCT_SELECT_PRODUCT: 'Monikers_RPSP', RESTAURANT_PRODUCT_PURCHASE: 'Monikers_RP_PURCHASE', MENU_CONNECT_SELECT_LISTING: 'Monikers_MCSL', MENU_CONNECT_SELECT_PRODUCT: 'Monikers_MCSP', MENU_CONNECT_ORDER_CONFIRMATION: 'Monikers_MCOC', LINKEDIN_CALL_WITH_CONVERSION_ID: 'Monikers_LICWCI', YOUTUBE_CLAIM_LISTING_HOTEL: 'Monikers_YCLH', YOUTUBE_SELECT_PRODUCT: 'Monikers_YSP', YOUTUBE_ORDER_CONFIRMATION: 'Monikers_YOC' }; var _getIframeIdByPixelType = function(pixelType) { if (pixelType === 'RESTAURANTS_OFFLINE_ATTRIBUTION') { return pixelTypeToIframeName[pixelType] + '_' + Math.floor(Math.random() * Math.floor(1000000)); } else { return pixelTypeToIframeName[pixelType]; } }; var firedForEnteringDatesKey = 'dates.enter.moniker.fired'; var firedForHotelPricesKey = 'hotel.prices.moniker.fired'; var firedForIBClick = false; var MAX_PRICE_LOCS = 30; var jsReplacementTargetVar = 'loc1'; var jsReplacementSearchStr = '@@@loc1@@@'; var jsReplacementSourceVar = 'locId'; var setTimeoutRetryThreshold = 10; var timeoutMilliseconds = 1000; var _addHotelPricesToPixelContext = function() { var completed = false; if (retrieve('hotelPricesEnabled')) { var pixelContext = retrieve('pixelContext'); if (pixelContext) { var servlet = pixelContext.servlet; var results = []; var locIds; if (servlet === 'Hotel_Review') else ''; locIds = locIds.split(',').slice(0, MAX_PRICE_LOCS); var plusOfferCount = 0; for (var i=0; i < locIds.length; i++) { if (!locIds[i]) { continue; } var setTimeoutCounter = 0; function waitUntilElementExists() { var result = ''; var qs = "[data-pernight][data-locationid='" + locIds[i] + "']"; var plusQs = "[data-index][data-locationid='" + locIds[i] + "']"; var priceElement = document.body.querySelector(qs); var plusElement = document.body.querySelector(plusQs); if (setTimeoutCounter < setTimeoutRetryThreshold && !priceElement) { setTimeoutCounter++; window.setTimeout(waitUntilElementExists, timeoutMilliseconds); } else { if (setTimeoutCounter < setTimeoutRetryThreshold) if (plusElement && plusElement.getAttribute('data-automation') && plusElement.getAttribute('data-automation').startsWith('plus-hotel-offer')) { plusOfferCount++; } results.push(result); completed = true; } } waitUntilElementExists(); } pixelContext.locPrices = results.join(','); pixelContext.plusCount = (servlet === 'Hotel_Review' || servlet === 'HotelHighlight') ? (document.body.querySelector("#OPTIMUS_OFFER") ? 1 : 0) : plusOfferCount; } } else { completed = true; } return completed; } var _tryAddHotelPrices = function() { if (_addHotelPricesToPixelContext()) { _loadMonikerForHotelPrices(); return true; } return false; } var startTime; var pixelTracing = false; if (window.performance && window.performance.timing && window.performance.timing.navigationStart) { startTime = window.performance.timing.navigationStart; } else { startTime = Date.now(); } function _elapsed() { return (Date.now() - startTime); } function _trace(msg) { console.log('ads-pagemoniker: ' + _elapsed() + ' ' + msg); } var _loadHotelPricesPixels = function() { if (pixelTracing) { _trace('_loadHotelPricesPixels starting'); } if(retrieve('hotelPricesEnabled')) { var retries = 3; var _addHotelPricesWithRetry = function () { if (!_tryAddHotelPrices() && retries--) { setTimeout(_addHotelPricesWithRetry, 1000); } }; _addHotelPricesWithRetry(); } }; exports.loadMonikerForHotelPrices = function(options) { var hotelsPixelLoadingStrategyEnabled = false; if (options) { pixelTracing = options.pixelLoadingTracing; hotelsPixelLoadingStrategyEnabled = options.hotelsPixelLoadingStrategyEnabled; } if (pixelTracing) { _trace('loadMonikerForHotelPrices starting'); } if (!hotelsPixelLoadingStrategyEnabled) { _loadHotelPricesPixels(); return; } setTimeout(_loadHotelPricesPixels, 0); }; exports.loadMonikers = function(context) { try { if (!retrieve('pixelsEnabled')) { return null; } context = context || {}; context.pixelType = 'PAGEVIEW'; var pixelContext = retrieve('pixelContext'); if (pixelContext && (pixelContext.servlet == 'HotelBookingRoomSelectionHtml' || pixelContext.servlet == 'MobileHotelBookingRoomSelection')) { context.pixelType = 'IB_CLICK'; exports._addIBPageViewContext(context); } var monikerFrame = exports._loadMonikers(context); if (retrieve('cacheMobileClickoutResponse')) { context.pixelType = 'CLICKOUT'; exports._cacheClickoutMonikers(context); } return monikerFrame; } catch (e) { tracks.error(e, 'ads.loadMonikers', null, {context: context}); } return null; }; exports.loadMonikerForEnterDates = function(context) { try { if (!retrieve('pixelsEnabled')) { return null; } if (!taStore.retrieve(firedForEnteringDatesKey)) { taStore.store(firedForEnteringDatesKey, true); _addHotelPricesToPixelContext(); context = context || {}; context.pixelType = 'ENTER_DATES'; setTimeout(exports._loadMonikers.bind(null, context), 2000); } } catch(e) { } }; var _loadMonikerForHotelPrices = function(context) { try { if (!retrieve('hotelPricesEnabled')) { return null; } if (!taStore.retrieve(firedForHotelPricesKey)) { taStore.store(firedForHotelPricesKey, true); exports._loadMonikersForPixelType(context, 'HAC_PRICES_LOADED') } } catch(e) { } }; exports.loadClickoutMonikers = function(context) { try { if (!(retrieve('pixelsEnabled') && retrieve('clickoutPixelsEnabled'))) { return null; } if (exports._cachedClickoutMonikerTextArr) context = context || {}; context.pixelType = 'CLICKOUT'; return exports._loadMonikers(context); } catch (e) { tracks.error(e, 'ads.loadClickoutMonikers', null, {context: context}); } return null; }; exports.loadLightboxMonikers = function(context, extraContext) { try { if (!retrieve('pixelsEnabled')) { return null; } context = context || {}; context.pixelType = 'LIGHTBOX_CLICK'; var mergedContext = exports._mergeContexts(context, extraContext); var monikerFrame = exports._loadMonikers(mergedContext); return monikerFrame; } catch (e) { tracks.error(e, 'ads.loadLightboxMonikers', null, {context: context}); } return null; }; exports.loadLightboxClickoutMonikers = function(context) { try { if (!(retrieve('pixelsEnabled') && retrieve('clickoutPixelsEnabled'))) { return null; } context = context || {}; context.pixelType = 'LIGHTBOX_CLICKOUT'; return exports._loadMonikers(context); } catch (e) { tracks.error(e, 'ads.loadLightboxClickoutMonikers', null, {context: context}); } return null; }; exports.loadIBClickMonikers = function(context) { if (firedForIBClick) { return null; } var result = exports._loadMonikersForPixelType(context, 'IB_CLICK'); firedForIBClick = true; return result; }; exports.loadIBRoomSelectMonikers = function(context) { return exports._loadMonikersForPixelType(context, 'IB_ROOM_SELECT'); }; exports.loadIBConfirmMonikers = function(context) { return exports._loadMonikersForPixelType(context, 'IB_CONFIRM'); }; exports.loadVRConfirmMonikers = function(context) { return exports._loadMonikersForPixelType(context, 'VR_CONFIRM'); }; exports.loadFlightsMetaMonikers = function(context) { if (exports._loadMonikersForPixelType(context, 'FLIGHTS_META') != null) { return exports._loadMonikersForPixelType(context, 'LIGHTBOX_CLICKOUT'); }; return null; } exports.loadMonikerForCarsMeta = function(context) { return exports._loadMonikersForPixelType(context, 'CARS_META'); }; exports.loadMonikerForCarsSearchResults = function(context) { return exports._loadMonikersForPixelType(context, 'CARS_SEARCH_RESULTS'); }; exports.loadVacationPackageMetaMonikers = function(context) { return exports._loadMonikersForPixelType(context, 'PACKAGE_META'); } exports.loadMonikerForLCBPop = function(context) { return exports._loadMonikersForPixelType(context, 'LCB_POP'); }; exports.loadMonikerForFlightsMetaLightbox = function(context) { return exports._loadMonikersForPixelType(context, 'LIGHTBOX_CLICK'); }; exports.loadMonikerForFlightSearch = function(context) { return exports._loadMonikersForPixelType(context, 'SEARCH'); }; exports.loadMonikerForCruiseMeta = function(context) { return exports._loadMonikersForPixelType(context, 'CRUISE_META'); }; exports.loadMonikerForRestaurantsOfflineAttribution = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANTS_OFFLINE_ATTRIBUTION'); }; exports.loadMonikerForRestaurantsProductSelection = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANTS_PRODUCT_SELECTION'); }; exports.loadMonikerForRestaurantsProductPayment = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANTS_PRODUCT_PAYMENT'); }; exports.loadMonikerForRestaurantsProductConversion = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANTS_PRODUCT_CONVERSION'); }; exports.loadMonikerForRestaurantsNewRegOwnerForm = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANTS_NEW_REG_OWNER_FORM'); }; exports.loadMonikerForRestaurantsConfirmedRegOwner = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANTS_CONF_REG_OWNER'); }; exports.loadMonikerForHotelClaimFormSubmission = function(context) { return exports._loadMonikersForPixelType(context, 'HOTEL_CLAIM_FORM_SUBMISSION'); }; exports.loadMonikerForMcRetargeting = function(context) { return exports._loadMonikersForPixelType(context, 'FACEBOOK_MC_RETARGETING'); }; exports.loadMonikerForPaidFunnelConversion = function(context) { return exports._loadMonikersForPixelType(context, 'PAID_FUNNEL_LEAD_CONVERSION'); }; exports.loadMonikerForStarterPackagesPageView = function(context) { return exports._loadMonikersForPixelType(context, 'STARTER_PACKAGES_PAGE_VIEW'); }; exports.loadMonikerForStarterPackagesPropertySelection = function(context) { return exports._loadMonikersForPixelType(context, 'STARTER_PACKAGES_PROPERTY_SELECTION'); }; exports.loadMonikerForHotelsProductCartCheckout = function(context) { return exports._loadMonikersForPixelType(context, 'HOTELS_PRODUCT_CART_INITIATE_CHECKOUT'); }; exports.loadMonikerForHotelsProductCartAddPaymentInfo = function(context) { return exports._loadMonikersForPixelType(context, 'HOTELS_PRODUCT_CART_ADD_PAYMENT_INFO'); }; exports.loadMonikerForHotelsProductCartPurchase = function(context) { return exports._loadMonikersForPixelType(context, 'HOTELS_PRODUCT_CART_PURCHASE'); }; exports.loadMonikerForHotelsRecoveryPackageAdLander = function(context) { return exports._loadMonikersForPixelType(context, 'HOTELS_RECOVERY_PACKAGE_AD_LANDER'); }; exports.loadMonikerForLinkedInInsightTag = function(context) { return exports._loadMonikersForPixelType(context, 'LINKEDIN_INSIGHT_TAG'); }; exports.loadMonikerForUPPHotelsProductCartCheckout = function(context) { return exports._loadMonikersForPixelType(context, 'UPP_HOTELS_PRODUCT_CART_INITIATE_CHECKOUT'); }; exports.loadMonikerForUPPHotelsProductCartAddPaymentInfo = function(context) { return exports._loadMonikersForPixelType(context, 'UPP_HOTELS_PRODUCT_CART_ADD_PAYMENT_INFO'); }; exports.loadMonikerForUPPHotelsProductCartPurchase = function(context) { return exports._loadMonikersForPixelType(context, 'UPP_HOTELS_PRODUCT_CART_PURCHASE'); }; exports.loadMonikerForMemberRegistrationForm = function(context) { return exports._loadMonikersForPixelType(context, 'MEMBER_REGISTRATION_FORM'); }; exports.loadMonikerForCreateMemberSuccessful = function(context) { return exports._loadMonikersForPixelType(context, 'MEMBER_CREATE'); }; exports.loadMonikerForSaveToTripIntent = function(context) { return exports._loadMonikersForPixelType(context, 'SAVE_TO_TRIP_INTENT'); }; exports.loadMonikerForSaveToTrip = function(context) { return exports._loadMonikersForPixelType(context, 'SAVE_TO_TRIP'); }; exports.loadMonikerForRegistration = function(context, extraContext) { var mergedContext = exports._mergeContexts(context, extraContext); return exports._loadMonikersForPixelType(mergedContext, 'REGISTRATION_SUCCESS'); }; exports.loadMonikerForPlusConfirm = function(context) { return exports._loadMonikersForPixelType(context, 'PLUS_CONFIRM'); }; exports.loadMonikerForPlusCheckout = function(context) { return exports._loadMonikersForPixelType(context, 'PLUS_CHECKOUT'); }; exports.loadMonikerForPlusBookingCheckout = function(context) { return exports._loadMonikersForPixelType(context, 'PLUS_BOOKING_CHECKOUT'); }; exports.loadMonikerForPlusBookingConfirmation = function(context) { return exports._loadMonikersForPixelType(context, 'PLUS_BOOKING_CONFIRMATION'); }; exports.loadMonikerForRestaurantProductSelectListing = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANT_PRODUCT_SELECT_LISTING'); }; exports.loadMonikerForRestaurantProductSelectProduct = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANT_PRODUCT_SELECT_PRODUCT'); }; exports.loadMonikerForRestaurantProductPurchase = function(context) { return exports._loadMonikersForPixelType(context, 'RESTAURANT_PRODUCT_PURCHASE'); }; exports.loadMonikerForMenuConnectSelectListing = function(context) { return exports._loadMonikersForPixelType(context, 'MENU_CONNECT_SELECT_LISTING'); }; exports.loadMonikerForMenuConnectSelectProduct = function(context) { return exports._loadMonikersForPixelType(context, 'MENU_CONNECT_SELECT_PRODUCT'); }; exports.loadMonikerForMenuConnectOrderConfirmation = function(context) { return exports._loadMonikersForPixelType(context, 'MENU_CONNECT_ORDER_CONFIRMATION'); }; exports.loadMonikerForLinkedinCallWithConversionId = function(context) { return exports._loadMonikersForPixelType(context, 'LINKEDIN_CALL_WITH_CONVERSION_ID'); }; exports.loadMonikerForYoutubeClaimListingHotel = function(context) { return exports._loadMonikersForPixelType(context, 'YOUTUBE_CLAIM_LISTING_HOTEL'); }; exports.loadMonikerForYoutubeSelectProduct = function(context) { return exports._loadMonikersForPixelType(context, 'YOUTUBE_SELECT_PRODUCT'); }; exports.loadMonikerForYoutubeOrderConfirmation = function(context) { return exports._loadMonikersForPixelType(context, 'YOUTUBE_ORDER_CONFIRMATION'); }; exports._loadMonikersForPixelType = function (context, pixelType) { try { context = context || {}; context.pixelType = pixelType; if (!(retrieve('pixelsEnabled') && retrieve('ibPixelsEnabled')) && !context['pixelEnableOverride']) { return null; } return exports._loadMonikers(context); } catch (e) { tracks.error(e, 'loadMonikers for pixelType, ', null, {context: context}); } return null; }; exports._cacheClickoutMonikers = function(extraContext) { var pixelContext = retrieve('pixelContext'); var mergedContext = exports._mergeContexts(pixelContext, extraContext); var url = exports._buildPixelUrl(mergedContext); if (!url) { return; } url += '&reportOnly=true&jsReplace='+jsReplacementTargetVar; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onreadystatechange = function() { if (this.readyState == 4) { exports._cachedClickoutMonikerTextArr = this.response.split(jsReplacementSearchStr); } }; xhr.send(); }; exports._addIBPageViewContext = function(context) { if (document.getElementById('roomList')) { context.lowestPrice = document.getElementById('roomList').dataset.lowestPrice; } if (document.getElementById('roomInfoContainer')) { context.lowestPrice = document.getElementById('roomInfoContainer').dataset.lowestPrice; } }; exports._buildPixelUrl = function(context) { var pixelServlet = retrieve('pixelServlet') ? retrieve('pixelServlet') : context.pixelServlet; if (!pixelServlet) { tracks.error(null, 'ads._buildPixelUrl: remarketing.pixelServlet not set'); return null; } var url = '/' + pixelServlet + '?'; var pixelsByType = retrieve('pixelsByType'); if (pixelsByType) { var pixelListForPixelType = pixelsByType[context.pixelType]; if (pixelListForPixelType) { var pixelList = pixelListForPixelType.join(','); if (pixelList) { url = url + 'pixelList=' + pixelList; } } } for (var key in context) { if (context.hasOwnProperty(key)) { url += '&' + key + '=' + context[key]; } } if (ta.uid) { url += '&puid=' + ta.uid; } return url; }; exports._appendMonikersIFrame = function (url, id) { return awaitConsentResponse().then(function () ); }; exports._appendMonikersIFrameText = function(textArr, insertText) { return awaitConsentResponse().then(function () { var frame = document.createElement('iframe'); frame.setAttribute('id', 'Monikers'); frame.setAttribute('style', 'border:none; position:absolute; bottom:0; right:0'); frame.setAttribute('width', '1'); frame.setAttribute('height', '1'); document.body.appendChild(frame); var iframeDoc = frame.contentDocument || frame.contentWindow.document; iframeDoc.open().write(textArr[0]); for (var i = 1; i < textArr.length; i++) { iframeDoc.write(insertText); iframeDoc.write(textArr[i]); } iframeDoc.close(); return frame; }); }; exports._mergeContexts = function(c1, c2) { if (!c1) { return c2; } else if (!c2) { return c1; } var key; var merged = {}; for (key in c1) { if (c1.hasOwnProperty(key)) { merged[key] = c1[key]; } } for (key in c2) { if (c2.hasOwnProperty(key)) { merged[key] = c2[key]; } } return merged; }; exports._loadMonikers = function(extraContext) { var pixelContext, mergedContext; try { pixelContext = retrieve('pixelContext'); var pbjs_identityLink = JSON.parse(localStorage.getItem("pbjs_identitylink")); if (pixelContext && pbjs_identityLink && pbjs_identityLink.value && pbjs_identityLink.value.envelope) { pixelContext.liveRampEnvelope = pbjs_identityLink.value.envelope.envelope; } mergedContext = exports._mergeContexts(pixelContext, extraContext); var url = exports._buildPixelUrl(mergedContext); if (!url) { return null; } return exports._appendMonikersIFrame(url, _getIframeIdByPixelType(mergedContext.pixelType)); } catch (e) { tracks.error(e, 'ads._loadMonikers', null, {pixelContext: pixelContext, extraContext: extraContext}); } return null; }; nsExporter.exportTo(exports, 'ta.common.ads'); return exports; }); define('sponsoredlisting/RestaurantsSponsoredListing', ['vanillajs', 'common/trackingStreams', 'ajax-request', 'page-model', 'sponsoredlisting/utils', 'ta/Core/TA.LocalStorage', 'ta/common/behavior/Ads-pagemoniker'], function(vanillajs, tracking, Ajax, pageModel, slUtils, localStorage, monikers) { "use strict"; var SPONSORED_LISTING_ID_CLICKED_KEY = 'sponsoredListingIdClicked'; var SPONSORED_LISTING_ID_CLICKED_EXPIRATION = 1000 * 60 * 5; var SPONSORED_LISTING_LOCATIONS_KEY = 'sponsoredListingsLocations'; var _fireLiverampAttributionPixel = function(locationId, eventName) { return monikers.loadMonikerForRestaurantsOfflineAttribution({ rsAttributionlocationId: locationId, rsAttributionEvent: eventName, servlet: pageModel.session.pageServlet, pixelServlet: 'PageMoniker', pixelEnableOverride: true }); }; var _setSPLocationInfoInSessionStorage=function(locationId) { if (window.sessionStorage) { var locations=JSON.parse(window.sessionStorage.getItem(SPONSORED_LISTING_LOCATIONS_KEY)); if(locations) { locations[locationId]=Date.now(); window.sessionStorage.setItem(SPONSORED_LISTING_LOCATIONS_KEY,JSON.stringify(locations)); } else { var locations={}; locations[locationId]= Date.now(); window.sessionStorage.setItem(SPONSORED_LISTING_LOCATIONS_KEY,JSON.stringify(locations)); } } }; var _fireSpTrackingClick = function(locationId, spTrackingKey, opensNewTab, destUrl, shouldUngateSponsoredClicks) { _setSPLocationInfoInSessionStorage(locationId); var tab = null; if (opensNewTab) { tab = window.open(destUrl, '_blank'); if (tab) { tab.focus(); } } var _redirectCallback = function() { if (!tab) { window.location = destUrl; } }; if (shouldUngateSponsoredClicks && localStorage.enabled) { localStorage.set(SPONSORED_LISTING_ID_CLICKED_KEY, locationId, SPONSORED_LISTING_ID_CLICKED_EXPIRATION); } Ajax({ method: 'POST', url: '/SpTracking/1.0/recordInteractions', 'content-type': 'application/json', 'x-requested-by': pageModel.JS_SECURITY_TOKEN, data: JSON.stringify({ interactions: [{ trackingKey: spTrackingKey, pageName: pageModel.session.pageServlet, pageUid: pageModel.session.uid, surfaceType: 'UNKNOWN', }] }) }).then(_redirectCallback, _redirectCallback); }; var initTripAdsListing = function(adWrapper, locationId, shouldFireClickAttributionPixel, shouldFireImpressionAttributionPixel, spTrackingKey) { var elem = adWrapper; var urlNodes = elem.querySelectorAll('[data-url]'); for(var i = 0; i < urlNodes.length; i++) { var urlNode = urlNodes[i]; var opensInNewTab = urlNode.hasAttribute("data-url-newtab"); var destUrl = urlNode.getAttribute("data-url"); var shouldUngateSponsoredClicks = urlNode.hasAttribute("data-ungateSponsoredClicks"); urlNode.addEventListener('click', _fireSpTrackingClick.bind(null, locationId, spTrackingKey, opensInNewTab, destUrl, shouldUngateSponsoredClicks)); } window.addEventListener("scroll", function(e) { var pageScrollEvent; if (typeof window.CustomEvent === "function") { pageScrollEvent = new CustomEvent("pageScroll"); } else { pageScrollEvent = document.createEvent("CustomEvent"); pageScrollEvent.initCustomEvent("pageScroll", true, true, null); } elem.dispatchEvent(pageScrollEvent); }); function _trackAdElemShownToUser() { Ajax({ method: 'POST', url: '/SpTracking/1.0/recordImpressions', 'content-type': 'application/json', 'x-requested-by': pageModel.JS_SECURITY_TOKEN, data: JSON.stringify({ impressions: [{ trackingKey: spTrackingKey, pageName: pageModel.session.pageServlet, pageUid: pageModel.session.uid, surfaceType: 'UNKNOWN', }] }) }); if (shouldFireImpressionAttributionPixel === true) { _fireLiverampAttributionPixel(locationId, 'SPONSORED_IMPRESSION'); } } function trackAdElemShownToUser(e) { var adElem = e.adTarget || this; if (slUtils.isInViewport(adElem)) { adElem.removeEventListener("pageScroll", trackAdElemShownToUser); adElem.removeEventListener("adLoadComplete", trackAdElemShownToUser); _trackAdElemShownToUser(); } } window.setTimeout(function() { elem.addEventListener("pageScroll", trackAdElemShownToUser); elem.addEventListener("adLoadComplete", trackAdElemShownToUser); var adLoadCompleteEvent; if (typeof window.CustomEvent === "function") { adLoadCompleteEvent = new CustomEvent("adLoadComplete"); } else { adLoadCompleteEvent = document.createEvent("CustomEvent"); adLoadCompleteEvent.initCustomEvent("adLoadComplete", true, true, null); } elem.dispatchEvent(adLoadCompleteEvent); }, 0); }; var initSampleTripAdsListing = function(adWrapper) { var urlNodes = adWrapper.querySelectorAll('[data-url]'); for(var i = 0; i mobile size ResponsiveEvents.onOver('tablet', function () { $('.node-preserve', widget.element).removeClass('collapsed inRHR'); }); return { /** * Updates page filters, triggering a list update. */ updateFilter: updateFilter, /** * Toggles the filter choices visibility. */ toggleCollapse: toggleCollapse, /** * Shows hover text for info tooltip. */ hoverTooltip: hoverTooltip }; });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'filters_detail_language','handlers',['handlers']); define(['babel/babel-helpers', 'widget', 'ta/page', 'lib/jquery-amd', 'common/page-filters', 'common/detail-filter-tracking', 'common/trackingStreams', 'overlays/Overlay', 'overlays/styles/modal', 'overlays/position', 'overlays/styles/windowshade', 'overlays/options/autoReposition', 'overlays/options/closeOnEscape', 'overlays/options/closeOnDocClick', 'common/Radio', 'utils/ResponsiveEvents'], function (babelHelpers, widget, taPage, $, Filters, track, trackingStreams, Overlay, Modal, Position, WindowShade, AutoReposition, CloseOnEscape, CloseOnDocClick, radio, ResponsiveEvents) { var $choices = $('.choices', widget.element); var paramName = $choices.attr("data-param"); // Actual name used in request var filterName = $choices.attr('data-name'); // For tracking var $allOptions = $('.more-options', widget.element); var allOptionsContent = $allOptions[0]; var lightbox = void 0; function _initLightbox() { return new Overlay(null, Modal(null, 'center', widget.element.className, $('.name', widget.element).html(), null, allOptionsContent, 'div'), Position.center(), CloseOnDocClick, CloseOnEscape, AutoReposition, WindowShade()); } function updateFilter(e, element) { lightbox && lightbox.hide(); // Close lightbox if it's open track('Controls', 'click_' + filterName, element.parentElement.getAttribute('data-tracker'), 0); Filters.set(paramName, element.value); } function sync(settings) { var newVal = settings[paramName]; if (typeof newVal === 'undefined') { return; } if (newVal.to === '') { Filters.set(paramName, "ALL"); return; } $('input', widget.element).each(function (i, e) { return e.checked = e.value == newVal.to; }); } function toggleCollapse() { if ($('.collapse_mark', widget.element).is(":visible")) { $('.node-preserve', widget.element).toggleClass('collapsed'); } } function moreClick(elmt) { lightbox = _initLightbox(); $allOptions.removeClass("is-hidden-tablet"); widget.markMine(allOptionsContent); // Need this so that widgetEvCall still works lightbox.on('hide', function () { $allOptions.addClass("is-hidden-tablet"); $allOptions.append(allOptionsContent); }); lightbox.show(); } Filters.on('change', sync); // Show as collapsed in the sidebar radio('collapsible-layout').on('show-collapsed', function () { $('.node-preserve', widget.element).addClass('collapsed inRHR'); }); // Make sure we're not collapsed when changing > mobile size ResponsiveEvents.onOver('tablet', function () { $('.node-preserve', widget.element).removeClass('collapsed inRHR'); }); return { /** * Updates page filters, triggering a list update. */ updateFilter: updateFilter, /** * Collapse widget to title **/ toggleCollapse: toggleCollapse, /** * Show a lightbox with all options */ moreClick: moreClick }; });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'filters_query_resp','handlers',['handlers']); define(['babel/babel-helpers', 'widget', 'lib/jquery-amd', 'common/page-filters', 'common/detail-filter-tracking', 'ta/util/Deferred', 'lib/TypeAhead'], function (babelHelpers, widget, $, Filters, track, Deferred, TypeAhead) { 'use strict'; var paramName = $('[data-param]', widget.element).attr('data-param'); var queryElem = $('.query_elem', widget.element); var tags = $('.tagdata', widget.element).data('tags').split(','); var sortElem = $('#sort-by', widget.element); var sortParam = 'sortType'; var typeahead = void 0; function sync(settings) { var newVal = settings[paramName]; if (typeof newVal === 'undefined') { return; } queryElem.val(newVal.to); } function createTypeAhead(evnt, elmt) { evnt && evnt.stopPropagation(); if (typeahead) { return typeahead; } var typeaheadParams = { name: 'Review-Keyword-Search', minChars: 1, startEventOn: 'focus', autopopulateHighlighted: false, defaultValue: '', clearDefaultTextOnFocus: false, selectOnBlur: false, assumeOnBlur: false, restoreOnFocus: false, cycleInput: false, containerClass: 'typeahead-container keywords_typeahead', containerParent: $(".query_form", widget.element)[0], positionRelative: true, offsetX: 0, offsetY: 2, width: null, cacheResults: true, shouldSubmit: function shouldSubmit() { updateFilter(true); return false; }, search: function search(query) { var result = []; for (var t = 0; t = 20) { // Max 20 suggestions break; } } } return Deferred().resolve({ results: result, query: query }); }, // this is not called with a consistent argument list onSelect: function onSelect() { var query = queryElem.val() || ''; updateFilter(false); // force the typeahead to search for options starting with the full query, not whatever we // typed to get to this point typeahead.sync({ query: query, result: {} }); }, onRender: function onRender() { var numChoices = $('.typeahead-choices *', widget.element).length; $('.typeahead-container', widget.element).css('visibility', numChoices === 0 ? 'hidden' : 'visible'); } }; typeahead = new TypeAhead(elmt, $.extend({}, typeaheadParams)); return typeahead; } function updateFilter(isManual) ''; if (isManual) _)+/g, '_'), 0); else _)+/g, '_'), 0); queryElem.blur(); Filters.clear('t'); // Clear tags Filters.set(paramName, query); function updateSortType(event, elem) sortElem.val() $(".query_form", widget.element).submit(updateFilter); Filters.on('change', sync); return { createTypeAhead: createTypeAhead, updateFilter: updateFilter, updateSortType: updateSortType }; });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_hero_nav','handlers',['handlers']); define(["babel/babel-helpers", "widget", "lib/jquery-amd", "ta/util/I18N", 'common/Radio', 'photoviewer/radioHelper', 'photoviewer/models/eventTypes', 'photoviewer/tracking', 'utils/responsive', 'ta/Core/TA.Event'], function (babelHelpers, widget, $, i18n, radio, radioHelper, eventTypes, tracking, responsive, taEvent) { var m_helper = radioHelper(widget.element, _init, true); var isRtl = i18n.isRtl(); //this might be called multiple times - please consider any code added here accordingly function _init(pvId) { _initKeyboardListener(); _initNavigationItems(); _disableButtons(pvId); } function _initNavigationItems() { var photoViewerRadio = m_helper.getRadio(); photoViewerRadio.off(eventTypes.HERO_CLICKED, _onHeroRhrClicked).on(eventTypes.HERO_CLICKED, _onHeroRhrClicked); photoViewerRadio.off(eventTypes.RHR_CLICKED, _onHeroRhrClicked).on(eventTypes.RHR_CLICKED, _onHeroRhrClicked); } function _initKeyboardListener() { var photoViewerRadio = m_helper.getRadio(); photoViewerRadio.off(eventTypes.NAV_KEY_PRESSED, _keyHandler).on(eventTypes.NAV_KEY_PRESSED, _keyHandler); } function _disableButtons(pvId) { var current = $("#" + pvId + " .tinyThumb.current"); $('.heroNav.left', widget.element).toggleClass('disabled', parseInt(current.attr('data-offset')) === 0); $('.heroNav.right', widget.element).toggleClass('disabled', current.next('.tinyThumb').length === 0); } function _onHeroRhrClicked() { var navItems = $(".navigationItem", widget.element); navItems.toggleClass("anchor"); if (!responsive.desktop()) { tracking.recordNavArrowVisibilityChange(navItems.hasClass("anchor")); } } function _keyHandler(evnt) { // handle keyboard navigation evnt = evnt || window.event; switch (evnt.keyCode) { case 37: // left arrow _advanceHero(null, null, isRtl ? 1 : -1); break; case 39: // right arrow _advanceHero(null, null, isRtl ? -1 : 1); break; } } function _advanceHero(evnt, elmt, dir) { m_helper.getRadio().emit(eventTypes.ADVANCE_HERO_CLICKED, dir); m_helper.getRadio().trigger('check-ad-refresh'); // trigger ad refresh threshold count by both clicks and arrow key presses // if from a click if (evnt) { tracking.recordArrowClick(); } else { // if not from a click, we still let the sponsored video system know that // we're advancing taEvent.fireEvent('galNavClick'); } } return { advanceHero: _advanceHero }; });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_back_to_gallery','handlers',['handlers']); define(["babel/babel-helpers", "widget", "lib/jquery-amd", 'photoviewer/models/eventTypes', 'photoviewer/radioHelper', 'photoviewer/tracking'], function (babelHelpers, widget, $, eventTypes, radioHelper, tracking) { var m_helper = radioHelper(widget.element, _init, true); //this might be called multiple times - please consider any code added here accordingly function _init() { _initClickHoverToggle(); } function _onHeroRhrClicked() { $(".galleryButton", widget.element).toggleClass("anchor"); } function _initClickHoverToggle() { var radio = m_helper.getRadio(); radio.off(eventTypes.HERO_CLICKED, _onHeroRhrClicked).on(eventTypes.HERO_CLICKED, _onHeroRhrClicked); radio.off(eventTypes.RHR_CLICKED, _onHeroRhrClicked).on(eventTypes.RHR_CLICKED, _onHeroRhrClicked); } function _backToGallery() { var $paramsElement = $("[data-aggregationId]", widget.element); var params = { albumViewMode: "images", aggregationId: $paramsElement.attr("data-aggregationId"), albumid: $paramsElement.attr("data-albumId"), offset: $paramsElement.attr("data-offset"), filter: $paramsElement.attr("data-filter") }; tracking.recordBackToGalleryClick(); m_helper.getRadio().trigger(eventTypes.BACK_TO_GALLERY, params); } return { backToGallery: _backToGallery }; });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_auto_play_overlay','handlers',['handlers']); /** * @author jwatton * @since Dec 11 2017 */ define(['widget', 'lib/jquery-amd', 'photoviewer/models/eventTypes', 'photoviewer/tracking', 'photoviewer/radioHelper'], function(widget, $, eventTypes, tracking, radioHelper) { 'use strict'; var AUTOPLAY_DELAY = 10 * 1000; // 10 seconds var autoPlayWidgetContainer = widget.element; var m_helper = radioHelper(widget.element, _init, true); var m_isVisible = false; function _playUpNext() { if (m_isVisible) { m_isVisible = false; $(autoPlayWidgetContainer).toggle(m_isVisible); m_helper.getRadio().trigger("autoPlayNext"); } } function _cancel() { m_isVisible = false; $(autoPlayWidgetContainer).toggle(m_isVisible); m_helper.getRadio().trigger("cancelAutoPlay"); } function _showOverlay() { if (!m_isVisible) { m_isVisible = true; _setOverlayContent(); $(autoPlayWidgetContainer).toggle(m_isVisible); } } function _setOverlayContent() { var nextVideoTitle = m_helper.getRadio().request("nextVideoTitle"); var $title = $(".autoPlayOverlayTitle"); $title.text(nextVideoTitle); var $timer = $('.progressIndicator'); var pathLength = $timer.attr('r') * 2.0 * Math.PI; $timer.stop(); $timer.css('stroke-dasharray', pathLength); $timer.css('stroke-dashoffset', pathLength); $timer.animate({ 'stroke-dashoffset': 0 }, AUTOPLAY_DELAY, 'linear', _playUpNext); } //this might be called multiple times - please consider any code added here accordingly function _init() { m_helper.getRadio().off("showAutoPlayOverlay", _showOverlay).on("showAutoPlayOverlay", _showOverlay); } return { playUpNext: _playUpNext, cancel: _cancel }; } ); });require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_report_problem','handlers',['handlers']); define(["babel/babel-helpers", "widget", "lib/jquery-amd", 'photoviewer/models/eventTypes', 'photoviewer/radioHelper', 'pages/inappropriate_vote_stub', 'photoviewer/tracking', 'page-model'], function (babelHelpers, widget, $, eventTypes, radioHelper, IAP, pvTracking, pageModel) { var m_helper = radioHelper(widget.element, _init, true); var m_mediaId = void 0; //this might be called multiple times - please consider any code added here accordingly function _init() { m_helper.getRadio().off(eventTypes.HERO_UPDATED, _load).on(eventTypes.HERO_UPDATED, _load); m_helper.getRadio().off(eventTypes.HERO_CLICKED, _toggleAnchor).on(eventTypes.HERO_CLICKED, _toggleAnchor); m_helper.getRadio().off(eventTypes.RHR_CLICKED, _toggleAnchor).on(eventTypes.RHR_CLICKED, _toggleAnchor); } function _load(data) { if (!(data instanceof Object)) { return; } var mediaid = data.mediaid, isPano = data.isPano, mediaAttributionUrl = data.mediaAttributionUrl; var button = $('.ui_button', widget.element); if (isPano || mediaAttributionUrl) { if (!button.hasClass('hidden')) { // We should only hide the button if it's visible button.toggleClass('hidden'); } } else { // Make sure that the button is visible button.removeClass('hidden'); } m_mediaId = mediaid; } function _toggleAnchor() { $('.ui_button', widget.element).toggleClass('anchor'); } function click(evt) { IAP.open(evt, widget.element, { voteContentType: 'MEDIA', contentId: m_mediaId, locationId: pageModel.LOC_ID }); } return { click: click }; });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_helpful','handlers',['handlers']); define(["babel/babel-helpers", "widget", "lib/jquery-amd", 'photoviewer/models/eventTypes', 'photoviewer/radioHelper', 'utils/ajax', 'photoviewer/tracking', 'page-model'], function (babelHelpers, widget, $, eventTypes, radioHelper, ajax, pvTracking, pageModel) { var m_helper = radioHelper(widget.element, _init, true); var m_curHeroInfo = void 0; var m_mediaVoted = {}; //this might be called multiple times - please consider any code added here accordingly function _init() { m_helper.getRadio().off(eventTypes.HERO_UPDATED, _load).on(eventTypes.HERO_UPDATED, _load); m_helper.getRadio().off(eventTypes.HERO_CLICKED, _toggleAnchor).on(eventTypes.HERO_CLICKED, _toggleAnchor); m_helper.getRadio().off(eventTypes.RHR_CLICKED, _toggleAnchor).on(eventTypes.RHR_CLICKED, _toggleAnchor); } function _load(data) { if (!(data instanceof Object)) { return; } var helpfulvotes = data.helpfulvotes, mediaid = data.mediaid, albumid = data.albumid, mediaType = data.mediaType, mediaFilter = data.mediaFilter, isPano = data.isPano; m_curHeroInfo = { helpfulvotes: helpfulvotes, mediaid: mediaid, albumid: albumid, mediaType: mediaType, mediaFilter: mediaFilter }; $('.ui_button', widget.element).toggleClass('hidden', isPano); _updateVotes(helpfulvotes); } function _toggleAnchor() { $('.ui_button', widget.element).toggleClass('anchor'); } function _updateVotes(votes) { if (typeof votes !== 'number' || isNaN(votes)) { votes = 0; } if (m_mediaVoted[m_curHeroInfo.mediaid]) { votes++; } $('.count', widget.element).text(votes).toggleClass('hidden', votes 0) { // when primary media is saved, web component will emit 'saved' event. // we should listen this event to update messaging on the button. radio('set-primary-button').off('saved', _saved).on('saved', _saved); radio('set-primary-button').off('copied', _copied).on('copied', _copied); var button = $('.ui_button', widget.element); button.removeClass('unauthorized'); } } function _saved() { var label = $('.cta .label', widget.element); if (!label.hasClass('hidden')) { label.toggleClass('hidden'); } var success = $('.cta .success', widget.element); success.removeClass('hidden'); } function _copied() { var label = $('.copyCta .label', widget.element); if (!label.hasClass('hidden')) { label.toggleClass('hidden'); } var success = $('.copyCta .success', widget.element); success.removeClass('hidden'); } function _load(data) { if (!(data instanceof Object)) { return; } var mediaid = data.mediaid, mediaType = data.mediaType; var button = $('.ui_button', widget.element); // only photos can be set as primary if (mediaType !== '2') { if (!button.hasClass('hidden')) { button.toggleClass('hidden'); } } else { // Make sure that the button is visible button.removeClass('hidden'); } m_mediaId = mediaid; } function click() { // when user click 'Set primary' button, we emit a 'click' event, which is listened by the web component on the page // this component will call primary-photo api and save the primary photo. radio('set-primary-button').emit('click', { mediaId: m_mediaId }); } function copyClick() { // when user clicks 'Copy media ID' button, we emit a 'copyClick' event, which is listened by the web component on the page // this component will copy the info to the clipboard. radio('set-primary-button').emit('copyClick', { mediaId: m_mediaId }); } return { click: click, copyClick: copyClick }; });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_caption','handlers',['handlers']); define(['babel/babel-helpers', 'widget', 'lib/jquery-amd', 'photoviewer/models/eventTypes', 'utils/ResponsiveEvents', 'utils/responsive', 'photoviewer/radioHelper', 'photoviewer/tracking'], function (babelHelpers, widget, $, eventTypes, responsiveEvents, responsive, radioHelper, tracking) { // values from MediaAlbumEntry.java var MASK_MEDIA_MANAGEMENT = 1; var MASK_MEDIA_TRAVELER = 2; var MASK_MEDIA_STAFF = 4; var $widget = void 0; var $container = void 0; var m_helper = radioHelper(widget.element, _init, true); //this might be called multiple times - please consider any code added here accordingly function _init() { $widget = $(widget.element); $container = $widget.find('.captionBox'); _handleResponsive(); m_helper.getRadio().off(eventTypes.HERO_UPDATED, _load).on(eventTypes.HERO_UPDATED, _load); } function _load(data) { if (!(data instanceof Object)) { return; } var isPano = data.isPano, avatarUrl = data.avatarUrl, captionText = data.captionText, captionProvider = data.captionProvider, mediaFilter = data.mediaFilter, rating = data.rating, reviewUrl = data.reviewUrl, mediaAttributionUrl = data.mediaAttributionUrl; $container.find('.iconCircle').removeClass('active'); switch (mediaFilter) { case MASK_MEDIA_MANAGEMENT: { $container.find('.management').addClass('active'); break; } case MASK_MEDIA_STAFF: { $container.find('.tripadvisor').addClass('active'); break; } case MASK_MEDIA_TRAVELER: { $container.find('.avatar').attr('src', avatarUrl); $container.find('.user_no_avatar').toggleClass('active', !avatarUrl); $container.find('.member').toggleClass('active', !!avatarUrl); break; } default: { break; } } var captionTitleHtml = captionText; $container.find('.ui_bubble_rating').attr('class', 'ui_bubble_rating member bubble_' + rating).toggle(rating > 0); var captionProviderContainer = $(""); if (mediaAttributionUrl) { var attributionLink = $("").html(captionProvider); attributionLink.attr("href", mediaAttributionUrl).attr("target", '_blank').attr("rel", "nofollow"); attributionLink.click(function (event) { event.stopPropagation(); tracking.recordCaptionAttributionUrlClick(); }); captionProviderContainer.append(attributionLink); } else { captionProviderContainer.text(captionProvider); } $container.find('.captionBody').toggle(!!captionProvider).html(captionProviderContainer); $widget.off('click'); if (reviewUrl && reviewUrl.length !== 0 && !isPano && captionText && captionText.length !== 0) { captionTitleHtml = $("").html(captionText); captionTitleHtml.attr("href", reviewUrl).attr('target', '_blank').click(function (event) { event.stopPropagation(); tracking.recordCaptionReviewClick(); }); } var $captionTitle = $container.find('.captionTitle'); $captionTitle.toggle(!!captionText).html(captionTitleHtml); } function _handleResponsive() { if (responsive.mobile()) { _adjustForMobile(); } else { _adjustForDesktop(); } responsiveEvents.onUnder('tablet', _adjustForMobile); responsiveEvents.onOver('tablet', _adjustForDesktop); } function _adjustForDesktop() { $container.removeClass('is-mobile'); } function _adjustForMobile() { //placement should handle vertical positioning depending on the photo size $container.addClass('is-mobile'); } });});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_media_filter','handlers',['handlers']); /** * * @author kankori * @since Nov 2017 */ define(['widget', 'lib/jquery-amd', 'photoviewer/models/eventTypes', 'photoviewer/tracking', 'photoviewer/radioHelper', 'utils/urlutils'], function(widget, $, eventTypes, tracking, radioHelper, urlUtils) { 'use strict'; var m_helper = radioHelper(widget.element, null, true); var $widget = $(widget.element); function handleTypeClick(event, elm, loadDataQueryParams) { var args = urlUtils.getUrlQueryArgs(loadDataQueryParams); m_helper.getRadio().trigger(eventTypes.TYPE_CHANGE, args); tracking.recordFilterItemClick(args.filter, elm, 'type'); } function handleCategoryClick(event, elm, loadDataQueryParams) { var args = urlUtils.getUrlQueryArgs(loadDataQueryParams); m_helper.getRadio().trigger(eventTypes.CATEGORY_CHANGE, args); tracking.recordFilterItemClick(args.albumid, elm, 'category'); } function toggleCategoryExpanded(event, elm, numKeepInView) { $widget.find('.albumFilterTag').slice(numKeepInView).toggleClass('hidden'); $widget.find('.expandFilters').toggleClass('hidden'); $widget.find('.hideFilters').toggleClass('hidden'); } return { handleTypeClick: handleTypeClick, handleCategoryClick: handleCategoryClick, toggleCategoryExpanded: toggleCategoryExpanded }; } ); });require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_auto_play','handlers',['handlers']); /** * @author jwatton * @since Dec 11 2017 */ define(['widget', 'lib/jquery-amd', 'photoviewer/models/eventTypes', 'photoviewer/tracking', 'photoviewer/radioHelper', 'utils/responsive', 'overlays/uiOverlay'], function(widget, $, eventTypes, tracking, radioHelper, responsive, uiOverlay) { 'use strict'; var autoPlayEvent = eventTypes.AUTOPLAY_TOGGLE; var $autoplayCheckbox = $(widget.element).find("#AUTOPLAY-SWITCH"); var m_helper = radioHelper(widget.element, _init, true); var m_autoplayEnabled = false; /** * Set autoplay on or off * */ function _toggleAutoplayEnabled() { if (m_autoplayEnabled !== $autoplayCheckbox.is(":checked")) { m_autoplayEnabled = $autoplayCheckbox.is(":checked"); if ($autoplayCheckbox.is(":checked")) { tracking.trackSimpleAction("autoplay_toggle_on_click"); } else { tracking.trackSimpleAction("autoplay_toggle_off_click"); } } } /** * cancel autoplay from button on overlay * */ function _cancelAutoPlayEnabled(){ m_autoplayEnabled = false; $autoplayCheckbox.prop("checked", false); } /** * Check if autoplay is on or off * * @returns {Boolean} */ function _isAutoplayEnabled() { return m_autoplayEnabled; } /** * Opens Overlay info message when hovering over auto play */ function _tooltipHover(event, elmt){ uiOverlay(event, elmt); } //this might be called multiple times - please consider any code added here accordingly function _init() { $autoplayCheckbox.prop('checked', _isAutoplayEnabled() && responsive.tablet()).change(function() { m_helper.getRadio().trigger(autoPlayEvent); }); m_helper.getRadio().off(autoPlayEvent, _toggleAutoplayEnabled).on(autoPlayEvent, _toggleAutoplayEnabled).reply("isAutoPlayEnabled", _isAutoplayEnabled) .on("cancelAutoPlay", _cancelAutoPlayEnabled); } return { toolTipHover: _tooltipHover }; } );});require(['ta/prwidgets'], function(widgets) { var define = widgets.define.bind(widgets,'photoviewer_media_filter_toolbar','handlers',['handlers']); /** * @author kankori * @since Nov 2017 */ define(['widget', 'lib/jquery-amd', 'photoviewer/models/eventTypes', 'photoviewer/tracking', 'photoviewer/radioHelper', 'utils/urlutils', 'ta/prwidgets'], function(widget, $, eventTypes, tracking, radioHelper, urlutils, prwidgets) { 'use strict'; var events = [eventTypes.TYPE_CHANGE, eventTypes.CATEGORY_CHANGE].join(' '); var dropdownItemSelected = false; var overlays = {}; var $widget = $(widget.element); var m_helper = radioHelper(widget.element, _init, true); function _showOverlay(overlayName, contentSelector) { if(!overlays[overlayName]) { require(['overlays/Overlay', 'overlays/position/fullside', 'overlays/styles/windowshade', 'overlays/options/keepInDom', 'overlays/styles/modal', 'overlays/options/closeOnWindowshadeClick', 'overlays/options/slideInOut' ], function (Overlay, fullside, windowShade, keepInDom, Modal, closeOnWindowshadeClick, slide) { var content = $widget.find(contentSelector); overlays[overlayName] = new Overlay(widget.element, fullside.right(), new Modal(null, null, 'second-layer', null, null, content.get(0)), windowShade('dark second-layer'), slide('from_right'), closeOnWindowshadeClick); prwidgets.initWidgets(overlays[overlayName].contentElement); overlays[overlayName].show(); // HOT-21959 - ru-Ru: MW: Can't scroll the filter category of photos $(overlays[overlayName].container).addClass('layered_overlay'); overlays[overlayName].on('hide', function() { if (!dropdownItemSelected) { var pageAction = overlayName === "typeOverlay" ? "grid_view_type_click" : "grid_view_category_click"; tracking.recordGridDropdownAbandonment(pageAction); } dropdownItemSelected = false; }); }); } else { overlays[overlayName].show(); } } function _showTypeOverlay() { _showOverlay('typeOverlay', '.type_flyout'); } function _showCategoryOverlay() { _showOverlay('categoryOverlay', '.category_flyout'); } function _clearOverlays() { for (var ol in overlays) { if (overlays.hasOwnProperty(ol)) { overlays[ol].destroy(); delete overlays[ol]; //will need to re-create after reload } } dropdownItemSelected = true; } function _typeClicked(event, target, data) { var args = urlutils.getUrlQueryArgs(data); m_helper.getRadio().trigger(eventTypes.TYPE_CHANGE, args); tracking.recordFilterItemClick(args.filter, target, 'type'); } function _categoryClicked(event, target, data) { var args = urlutils.getUrlQueryArgs(data); m_helper.getRadio().trigger(eventTypes.CATEGORY_CHANGE, args); tracking.recordFilterItemClick(args.albumid, target, 'category'); } //this might be called multiple times - please consider any code added here accordingly function _init() { m_helper.getRadio().off(events, _clearOverlays).on(events, _clearOverlays); } return { showTypeOverlay: _showTypeOverlay, showCategoryOverlay: _showCategoryOverlay, typeClicked: _typeClicked, categoryClicked: _categoryClicked }; }); }); define("cpm/AdBlockDetect", ["lib/jquery-amd","utils/browserutils","ta/Core/TA.Event","ta/Core/TA.Record","ta/util/Error"], function( $, Browser, taEvent, taRecord, taError) { 'use strict'; var exports = {}; var _testImg; var DEFAULT_LABEL = "ab_chk"; var _isPixelLoadError; var _logged = false; var _cdn = window.CDNHOST || ""; var _pixelUrl = "/img2/x.gif?&ads=1&adsize=2&adslot=3&rnd="; var _generatePixel = function() { var rnd = Math.floor(Math.random() * 100000); return $(''); }; var _getAdCount = function() { var count = document.querySelectorAll(".gptAd:not(.inactive)").length; if (screen.width < 768) { count += document.querySelectorAll(".inline_ad_wrapper").length; } return count; }; var _log = function(blocked, trackingLabel, trackUnblocked){ if ((!_logged && trackingLabel === DEFAULT_LABEL) || (trackingLabel && trackingLabel !== DEFAULT_LABEL)){ if (blocked || trackUnblocked) { taRecord.trackEventOnPage(trackingLabel, Browser.name, blocked, _getAdCount(), false); } _logged = true; } }; var _detect = function(onDetectedHandler, trackingLabel, trackUnblocked, isLoadError){ if (typeof isLoadError != undefined) { _isPixelLoadError = isLoadError; } if (_testImg){ var blocked = _isPixelLoadError ? true : !_testImg[0].offsetParent; _log(blocked, trackingLabel, trackUnblocked); if (blocked) { onDetectedHandler(); } } }; exports.runIfDetected = function(onDetectedHandler, trackingLabel, trackUnblocked) { if ( typeof onDetectedHandler != "function") { taError.record(null, "runIfDetected requires a function"); return; } taEvent.queueForLoad( function() { _logged = false; if (_testImg) { _detect(onDetectedHandler, trackingLabel, trackUnblocked); } else { _testImg = _generatePixel(); _testImg.on("load", function(){ _detect(onDetectedHandler, trackingLabel, trackUnblocked, false); }); _testImg.on("error", function(){ _detect(onDetectedHandler, trackingLabel, trackUnblocked, true); }); $("body").append(_testImg); } }, "AdBlockDetect"); }; return exports; }); require(['ta/p13n/placements'], function(placements) { var define = placements.define.bind(placements,'ab_chk','handlers',['handlers']); /* * ADS-3472: ad blocker detection running permanently on sales drs 99 * Works in Chrome, Firefox, Safari & IE. */ define(["placement","cpm/AdBlockDetect"], function(placement,abDetect) { // a fn is required, abDetect.runIfDetected(function(){}, "ab_chk", true); }); });require(['ta/p13n/placements','ta/page','$prp/ab_chk/handlers'], function(placements, impl) { window.ta.plc_ab_chk_handlers = placements.load('ab_chk','handlers.js', { 'name': 'ab_chk', 'id': 'taplc_ab_chk', 'location_id': 1315559, 'servletClass': 'com.TripResearch.servlet.eatery.responsive.RestaurantReviewServlet', 'servletName': 'Restaurant_Review', 'params': {}, 'data': {}});}); if (require) {require(['ta/rollupAmdShim'], function(rollupAmdShim) { rollupAmdShim.install([], ["ta"]); }); } else {if (window.ta&&ta.rollupAmdShim) {ta.rollupAmdShim.install([],["ta"]);} }if (require) {require(['ta/rollupAmdShim'], function(rollupAmdShim) { rollupAmdShim.install([], ["ta/util/RecordInterruption"]); }); } else {if (window.ta&&ta.rollupAmdShim) {ta.rollupAmdShim.install([],["ta/util/RecordInterruption"]);} } window.ta || (window.ta = {}); define('ta/util/RecordInterruption', ['vanillajs', 'ta/Core/TA.Record', 'ta/util/Error'], function(vanilla, track, error) { 'use strict'; var GA_REC_MODULE = 'interruption_record'; var VALID_TYPES = [ 'popup', 'popunder', 'gate', 'other' ]; var _err = function(msg, eobj) { error.record(eobj, msg, null, null); }; var _isValidType = function(type) { for (var i = 0; i SCROLL_BUFFER) { $(surveyContainerClassName).hide(); } }; $(window).on('scroll', throttle(hide, 100)); } var surveyRadio = Radio("QualtricsSurvey"); // use radio so this functionality can be added to WC footer easily window.addEventListener("qsi_js_loaded", function() { // this event is fired when the Qualtrics external JS has finished loading if (surveyRadio.requestAny("shouldSuppress", true)) { $(surveyContainerClassName).hide(); } }); surveyRadio.on("hide", function() {$(surveyContainerClassName).hide();}); surveyRadio.on("show", function() {$(surveyContainerClassName).show();}); } } }); return { }; }); });require(['ta/p13n/placements'], function(placements) { var define = placements.define.bind(placements,'dual_search_dust','handlers',['deferred/lateHandlers','handlers']); /** * Private javascript for dual_search placement */ define(["placement", "lib/jquery-amd", "ta/Core/TA.Store", 'ta/Core/TA.Event', "typeahead/TypeAhead.views" /*this needs to be here when the placement is, even though we don't use it here */ ], function (placement, $, taStore, taEvent, typeAheadViews) { if (placement.params && 'typeahead_to_store' in placement.params) { var propertiesToStore = placement.params['typeahead_to_store']; if (propertiesToStore) { for (var property in propertiesToStore) { if (propertiesToStore.hasOwnProperty(property)) { taStore.store(property, propertiesToStore[property]); } } } } focusOnWrapperClick('GEO_SCOPE_CONTAINER', 'GEO_SCOPED_SEARCH_INPUT'); focusOnWrapperClick('MAIN_SEARCH_CONTAINER', 'mainSearch'); /** * allows to focus the corresponding input when its wrapper is clicked (wrapper is wider and taller than the input) */ function focusOnWrapperClick(wrapperId, inputId) { $('#' + wrapperId).on('click', function(e) { // If the click target is the input element, let the browser handle it, so we don't trigger focus twice. if ($(e.target).closest('#' + inputId).length == 0) { $('#' + inputId).focus(); } }); } var options = taStore.retrieve("typeahead_dual_search_options"); function _popAutoTooltip() { if (!options.autoTooltip || !taStore.retrieve("isFirstSessionPageView") || !window.require) { return; } var reqs = ['trjs!overlays/Overlay', 'trjs!overlays/position', 'trjs!overlays/styles/popover', 'trjs!overlays/options/maxWidth', 'trjs!overlays/options/repositionOnEvent' ]; require(reqs, function (Overlay, Position, Style, MaxWidth, Reposition) { var searchButton = document.getElementById("SEARCH_BUTTON"); var mixins = [ Position && Position['below'] && Position['below']([], false), Style && Style(searchButton, 'below', "dark small", " ", options.autoTooltip), MaxWidth && MaxWidth(220), ]; var overlay = new Overlay(searchButton, mixins); if (overlay) { // pop tooltip immediately overlay.show() } }); } if (document.activeElement === $("#GEO_SCOPED_SEARCH_INPUT")[0]) { placement.require(["trjs!deferred/lateHandlers"], function (lh) { lh.whereFocused({type: "dummy"}, document.activeElement); }); } else if (document.activeElement === $("#mainSearch")[0]) { placement.require(["trjs!deferred/lateHandlers"], function (lh) { lh.whatFocused({type: "dummy"}, document.activeElement); }); } else if (options && options.autoTooltip) { taEvent.queueForLoad(_popAutoTooltip, "dual_search auto tooltip"); } return { getOptions: function () { return options; } }; }); });define('mixins/page-dates/picker-autoadvance-utils', [], function() { var exports = {}; exports.keepOverlayOpenOnSelection = function(target) { var overlayElmts = document.querySelectorAll(".ui_overlay"); for (var i = 0; i
Source
Food
Service
Value
Atmosphere
Details
This property has identified as Asian-owned and Women-owned.Special Diets
Vegetarian Friendly, Vegan Options, Gluten Free Options
Is this a Thai restaurant? Yes No Unsure
Is this restaurant a hidden gem or off-the-beaten path?Yes No Unsure
Does this restaurant offer table service?Yes No Unsure
Does this restaurant accept reservations?Yes No Unsure
Is this restaurant good for business meetings?Yes No Unsure
Does this restaurant have parking?Yes No Unsure
Does this place accept credit cards?Yes No Unsure
Does this restaurant offer outdoor seating?Yes No Unsure
Can a gluten free person get a good meal at this restaurant?Yes No Unsure
Is this restaurant good for special occasions?Yes No Unsure
See what travelers are saying:
Sort by: Most recentDetailed Reviews
Detailed Reviews: Reviews order informed by descriptiveness of user-identified themes such as cleanliness, atmosphere, general tips and location information.Sort and selected filters
Sort Detailed Reviews: Reviews order informed by descriptiveness of user-identified themes such as cleanliness, atmosphere, general tips and location information.FilterEnglish Reviewed April 12, 2024Been to Bangkok Hill many times thru a number of different owners. The Thai food has always been good and reasonably priced. Went recently for lunch and got the Pad Thai anf Fried Rice luncheons with Scallion Pancakes. Both entrees were made with chicken and...shrimp. All were quite tasty and good and a greatvalue. We like and will be returning again!More
Date of visit: April 2024
Helpful?This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed October 20, 2023This is a great place for delicious Thai food. Although it is unassuming from the outside, the restaurant is very comfortable, and the staff is always friendly. The food is really great. I usually get Chicken with Cashew Nuts or Thai Fried Rice and have...never been disappointed. They also have a sliced mango with sweet rice dessert which is Great. 5 Stars!More
Date of visit: October 2023
Helpful?This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed June 18, 2023 via mobileWe stopped in for a quick dinner and had an excellent meal. Drunken noodles were perfect - lots of flavor and perfectly cooked tofu. Hubby’s garlic shrimp stir fry was full of shrimp with crisp fresh vegetables. Staff was very friendly and service was fast....We are looking forward to going back to try their other dishes.More
Date of visit: June 2023
Helpful?1 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed November 27, 2021 via mobileMy husband and I shared a take out order of Crispy Chicken Pad Thai. It was so disgusting that we threw half of it out. The small pieces of chicken were hidden in a huge amount of batter and appeared to be left overs refried...until they were rubbery. The noodles were cooked OK but the sauce was dull and unappetizing. Worse still, there was only one peanut in the whole order. Unless you are at death’s door and must eat immediately, I strongly suggest you pass this restaurant by.More
Date of visit: November 2021
Helpful?1 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed July 21, 2021 via mobileDidn’t expect this. We were passing through and feeling for Thai cuisine we ordered here. Not exactly a Wow, but MUCH better than we anticipated. Really good Thai food at very reasonable prices.
Date of visit: July 2021
Helpful?This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed April 23, 2021 via mobileThis is a “hole in the wall” place with very tasty, fresh food! We had the crab Rangoon (with crab meat in it!), Macadamia Beef and Cashew Chicken. The food was freshly made with nice cut vegetables. The chicken had a little heat, but not...overpowering and the beef was flavorful and tender. Both came with a side of brown rice. We ordered this to go and the food was ready (and hot) when we arrived. This place is a gem!More
Date of visit: April 2021
Helpful?This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed January 3, 2020This is a cute little restaurant with nice owners and great food. Don’t expect a lot of frills but what you will get are friendly folks who know how to please their guest with good service and better than average Thai food. A hidden gem.
Date of visit: December 2019
Helpful?1 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed August 24, 2019seems a very popular spot and certainly filled up for lunch, am not a big time asian food eater but thought the food was flavorful and good, with a nice presentation, beer and wine (limited), service was pleasant, the place looks like an old house...which i am sure it is and could use some fixing up..More
Date of visit: August 2019
Helpful?2 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed August 18, 2019The food was so amazing. The duck choo chee was expensive but was very good. The pineapple fried rice was incredible and the chicken we had was pretty awesome too.
Date of visit: August 2019
Helpful?1 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed October 2, 2018I recently stopped working in the city and have been on the hunt for decent Pad Thai and I think I have found my go to! The atmosphere creates a home cooked meal feeling and the staff were very friendly. My husband and I sat...on the front farmer's porch. The pad thai and spring rolls were great, large portions which means leftovers which is always a plus. Also was a good sign that several people picked up take out throughout our stay.More
Date of visit: September 2018
Helpful?This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed August 18, 2018I had a quick lunch here mid-week in August and was pleasant surprised by the experience. Bangkok Hill is probably the only Thai restaurant in the area, and yet the feeling was totally authentic inside and out. I mention out, because that’s where I sat:...on the quaint and quite comfortable farmer’s porch, overlooking traffic on the main street but far enough away not to be overwhelmed. Service was very prompt by both the male and female employees. I received ice water almost immediately and was able to order a standard red curry dish for lunch with no delay, opting not to spend the extra $2 for a ‘yellow’ or ‘green’ curry for the special which came with spring rolls. Even this non-special included a cup (wish they had filled it completely) of carrot soup, a nice change from the salty chicken noodle that’s served regularly at a place closer to my home. The actual curry dish was pretty good, accompanied by brown (my choice) rice and a slice of orange. Everything was hot, fresh, el dente, and with the right amount of spice. My bill came swiftly upon request, and I was able to get back to work after having consumed a perfectly good mid-day meal. On a side note, right before walking away I noticed a lot of hornet traffic on the porch, and I was able to detect the location of the nest -- about eight feet above but just a few feet behind where I was sitting. When I alerted the waiter, he admitted knowing about the nest but claimed to have tried several times unsuccessfully to eliminate it. I had trouble understanding or even believing this, because one good dousing of hornet’s nest foam insecticide spray in the evening has always completely eliminated any problems that I have had on my own property. Given that this was a public restaurant with the potential for unpleasant incident during meals, I was surprised that the matter wasn’t being taken more seriously.More
>Date of visit: August 2018
Helpful?3 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed July 22, 2018 via mobileIf there is a NO STAR option I wouldn’t even give 1 Star. I called for a reservation of 12. The receptionist was so rude due to the restaurant sittings are limited (small), he claimed. I understand the restaurant is small but I know it’s...doable. I was there many times with my family’s get together years ago and always had wonderful experiences as it was owned then by a Vietnamese couple. Came back to town and wanted to visit a familiar childhood place ....The receptionist was obnoxiously insisted that I have to take 2 separate tables and sounded like he didn’t need our business. He wasn’t trying to accomodate our parties to put the tables side by side. Terrible customers service. Not a good impression over the phone so I wouldn’t want to be there and have him ruin our dinner. Not recommendedMore
Date of visit: July 2018
Helpful?1 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed April 29, 2018Several years ago I and a dear man who passed away early last year had eaten at Bangkok on the Hill. Now a mutual friend and I decided on super at Bangkok on the Hill before theater on a warm night that was ushering in...spring. The décor is still as eclectic as before with a cozy atmosphere as if you’re having dinner at a friend’s house.I ordered my favorite dish, Pad Thai which was as delicious as the first time I had eaten the same dish at this restaurant. Their food spice is graded from a one star and up. The service is fast and friendly. There's seating on the porch for those who don't mind the traffic noise below. This is a definite stop on your list of "must try" restaurants.More
Date of visit: April 2018
Helpful?This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed March 20, 2018I only go with a friend and each time I have been pleased. Food is great and fast service is wonderful and very reasonably priced.
Date of visit: February 2018
Helpful?1 This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more. Reviewed October 21, 2017I've eaten here twice - once for lunch and once for dinner. My litmus test for Thai is how well they make chicken larb. I ordered that the first time, and it was as good as I hoped it would be! So I went back...a few weeks later with my husband for dinner. The Thai spring rolls are excellent. I also lilked the scallion pancakes. They have a ton of excellent sounding main dishes. This time I had the crisphy pad Thai. I didn't enjoy the crispy noodles, so won't order that again. But based on this dish, I know I will love the traditional pad Thai. Will definitely go back.More
Date of visit: September 2017
Helpful?This review is the subjective opinion of a Tripadvisor member and not of Tripadvisor LLC. Tripadvisor performs checks on reviews as part of our industry-leading trust & safety standards. Read our transparency report to learn more.View more reviews
Is This Your Listing?
Own or manage this property? Claim your listing for free to respond to reviews, update your profile and much more.
Claim Your Free ListingFrequently Asked Questions about Bangkok Hill Thai Restaurant
Yes, Bangkok Hill Thai Restaurant offers takeout services.
Bangkok Hill Thai Restaurant is rated accordingly in the following categories by Tripadvisor travelers:- Food: 4.5
- Service: 4.5
- Value: 4
- Atmosphere: 4
Source
Share this post
Related
Posts
Food
population, maps, real estate, averages, homes, statistics, relocation, travel, jobs, hospitals, schools, crime, moving, houses, news, sex offenders
]]]]>]]> ]]]]>]]> ]]]]>]]> ]]]]>]]> ]]]]]]>]]]]>]]> ]]]]>]]> Wilton, Maine (ME 04294) profile: population, maps, real estate, averages, homes, statistics, relocation, travel,...
Food
population, maps, real estate, averages, homes, statistics, relocation, travel, jobs, hospitals, schools, crime, moving, houses, news, sex offenders
]]]]>]]> ]]]]>]]> ]]]]>]]> ]]]]>]]> ]]]]]]>]]]]>]]> ]]]]>]]> Salmon Creek, Washington (WA 98685) profile: population, maps, real estate, averages, homes, statistics, relocation,...
Food
population, maps, real estate, averages, homes, statistics, relocation, travel, jobs, hospitals, schools, crime, moving, houses, news, sex offenders
]]]]>]]> ]]]]>]]> ]]]]>]]> ]]]]>]]> ]]]]]]>]]]]>]]> ]]]]>]]> Dover-Foxcroft, Maine (ME 04426) profile: population, maps, real estate, averages, homes, statistics, relocation, travel,...
Food
Pizza Grocery
Since 2006,Pizza Grocery has been "the crossroads for great food and friendly service." Located in historic downtown Corinth, the restaurant...