Laughlin Shopping | Explore Malls, Outlets & Boutiques (2024)

Our website uses cookies.

Some of the cookies used are essential for parts of the site to operate.

Plan Your Adventure

');var header = $('[data-guid="6883dfb7-c821-4cf9-9509-86643f9589b6"]');var menuOverlay = header.find('[data-menu-overlay]');var mobileToggle = header.find('[data-mobile-toggle]');var mobileLabel = header.find('[data-mobile-label]');var menuItems = $('[data-id].has-dropdown');var body = $('body');var boldFirst = function(parts) {var first = parts.shift();var label = first + '
' + parts.join(' ') + '';return label;};var boldLast = function(parts) {var last = parts.pop();var label = parts.join(' ') + '
' + last + '';return label;};// update all main nav links with selective bold styling (top-level parents only)var styleNav = function() {header.find('nav.nav-main > ul > li > a').each(function(i,v) {var link = $(v);var label = link.text().trim();var parts = label.split(' ');if (parts.length > 1) {label = (label.toLowerCase() === 'things to do') ? boldFirst(parts) : boldLast(parts);}link.html(label);});header.find('nav.nav-main').addClass('loaded');// prepend a map icon to the map link// t559032 mapexplorer deprecation// header.find('nav.nav-secondary ul li[data-slug="mapexplorer"] a').prepend('');};styleNav();mobileToggle.on('click', function(e) {body.toggleClass('menu-open');menuOverlay.toggleClass('hidden');if (!body.hasClass('menu-open')) {menuItems.removeClass('open');}e.preventDefault();});mobileLabel.on('click', function(e) {mobileToggle.trigger('click');e.preventDefault();});menuOverlay.on('click', function(e) {mobileToggle.trigger('click');e.preventDefault();});$(window).on('resize', function() {if (window.innerWidth > 1024 && header.hasClass('open')) {mobileToggle.trigger('click');}});});

{{:link}}{{:link_text}}{{link_text}}{{?}}Learn More{{/}}{{/}}{{:isVideo()}}Play Video {{/}}

Laughlin Shopping | Explore Malls, Outlets & Boutiques (1)

Everything Within Reach

When you’re in need of a change of pace, find an activity to enjoy with the family or pick up a last-minute gift or souvenir nearby.

';var crmacctids = [];var parentIds = [];var bookingDates;/*** Begin: Set default dates ***/if (isHotel) {bookingDates = getBookingDates(1);// if any dates were passed in the url params, use those insteadvar params = urlLib.parse(window.location.toString()).get;bookingDates.startdate = (params.sDate !== undefined) ? params.sDate : bookingDates.startdate;bookingDates.enddate = (params.eDate !== undefined) ? params.eDate : bookingDates.enddate;}/*** End: Set default dates ***/if (widget.detail_type !== undefined) {defaultHooks.push({ name : "afterFind_custom_detail_type", args : { detail_type : widget.detail_type } });}if (widget.dtnlimit) {// if a limit is specified in the widget, override that passed in configdtnargs.limit = Number(widget.dtnlimit);}if (hasDtn) {// we want the smaller of the limit and dtnargs.limitdtnargs.limit = Math.min(dtnargs.limit, limit);}var allFilterTagItems = subcats.map(function(val) { return { site : site.site, subcatid : Number(val.value) } });// the base filter is the minimum filter applied to all queries. This is *not* the same as a "default" query, or the initial query.// this is the base. Any filter components that can be done in the UI are added to this objectvar baseFilter = {$and : []}if (hasPrimaryCat) {baseFilter.$and.push({filter_tags : {$in : crmLib.getListingFilterTags({ items : allFilterTagItems })}});} else {baseFilter.$and.push({filter_tags : {$in : ['site_' + site.site]}});}if (regionsChosen) {baseFilter.regionid = {$in : regions.map(function(val) { return Number(val.value) })}}/*** begin: Rates ***/var addRateInfo = function(data,crmacctids,startdate,enddate) {var detailroot = $(".bookingArea");var rateTmpl = '

Average Rate / Night

${{dollar}}{{cents}}*

';var linkTmpl = 'Book Direct';rates.populateSummary({node: detailroot, rateTmpl: rateTmpl, linkTmpl: linkTmpl, cleanup: false, ids: crmacctids, startdate: startdate, enddate: enddate });showRates();};/*** end: Rates ***/var masterFlow = new asyncLib.Flow();masterFlow.series({init: function(cb) {var vue = layoutjs.getVue({rootNode : $("#layoutjs_9d401a12-be9c-45d2-8d38-c5a8f4d85e0b"),type : "listings",view : defaultView,defaultView : defaultView,limit : limit,sort : "qualityScore",// if there is a defaultImageUrl defined in client config, use it. Else it will utilize the default declared in custom_layoutjs.jsfallbackImageUrl : "https://assets.simpleviewcms.com/simpleview/image/upload/v1/clients/lasvegas/LVCVA_Laughlin_Final_PREVIEW-6560_73957191-8789-420a-a461-d898ead253ec.jpg",hasTripbuilder : site.siteConfig.plugins.tripbuilder.active,showFilter : widget.custom_showListingFilters == "true",showPaging : widget.custom_showListingPaging == "true",showBar : widget.custom_showFilterBar == "true",baseFilter : baseFilter,filters : [{name : "keyword",label : "Start New Search",type : "keyword",toFilter : function(value, filter, context) {filter.solrOptions = {keyword : value}return filter;}},{name : "subcats",label : "Categories",// since we implicitly filter on available subcats, we hide the checkboxes if there is one or less optionsshow : subcats.length > 1,type : "checkbox",typeExtra : {options : subcats,countArgs : {watchFilters : ["amenities", "regions"],unsupportedFilters : ["keyword"],field : "categories.subcatid",unwind : "categories",model : "plugins_listings_listings",sort : true}},toFilter : function(value, filter, context) {filter.$and.push({filter_tags : {$in : crmLib.getListingFilterTags({ items : this.custom_selectedSubcatItems })}});return filter;}},{name : "regions",label : "Regions",// we implicitly filter on regions if they have been selected in the widget, so no reason to display a region option with 1 choice// if no regions were selected, then a region option with 1 choice is valid and therefore we pass the whole arrayshow : regionsChosen ? regions.length > 1 : regions.length > 0,type : "checkbox",typeExtra : {options : regions,countArgs : {watchFilters : ["subcats", "amenities"],unsupportedFilters : ["keyword"],field : "regionid",model : "plugins_listings_listings",sort : true}},toFilter : function(value, filter, context) {filter.$and.push({regionid : { $in : value.map(function(val) { return Number(val) }) }});return filter;}},{name : "amenities",label : "Amenities",// we do not implicitly filter on amenities so if there is only one available option we still want to show the checkboxshow : amenities.length > 0,type : "checkbox",typeExtra : {options : amenities,countArgs : {watchFilters : ["subcats", "regions", "amenities"],unsupportedFilters : ["keyword"],field : "amenities_array.uniquename",unwind : "amenities_array",model : "plugins_listings_listings",sort : true}},toFilter : function(value, filter) {value.forEach(function(val) {filter["amenities." + val + ".value_raw"] = true;});return filter;}}],sortOptions : [{ value : "qualityScore", label : "All" },{ value : "distance", label : "Near Me" }],maxRangeMiles : 100,latitude : 36.1699,longitude : -115.1398,data : {custom_catid : (widget.listingcats !== undefined) ? Number(widget.listingcats) : undefined,custom_dtnids : []},// computed allows the passing of computed and method properties, in cases where they may need to be unique to the templatecomputed : {custom_selectedSubcatItems : function() {return this.filter_subcats_numberArray.map(function(val) { return { site : site.site, subcatid : val } });},custom_dtnFilterTagItems : function() {// if we have not chosen subcats in the widget, then we need to load via the category id// if we have chosen subcats then we utilize whatever the state of the if (this.custom_selectedSubcatItems.length > 0) {// if we have items selected in the UI, use themreturn this.custom_selectedSubcatItems;} else if (subcatsChosen) {// if we have items chosen in the widget, use thosereturn allFilterTagItems;} else {// otherwise fall back to the chosen catidreturn [{ site : site.site, catid : this.custom_catid }];}}},methods : {},watch : {docs: function() {// place logic in here that needs to happen after render of itemsthis.$nextTick(function() {if (hasDtn) {gamClient.renderAds();}// populate rate infoif (isHotel) {if (!clientMoment(bookingDates.startdate,'MM/DD/YYYY').isValid()) {bookingDates.startdate = clientMoment().format("L");}if (!clientMoment(bookingDates.enddate,'MM/DD/YYYY').isValid()) {bookingDates.enddate = clientMoment().add(6, 'days').format("L");}var rateIds = []addRateInfo(root,crmacctids,bookingDates.startdate,bookingDates.enddate);// addButtonInfo(root,ids,bookingDates.startdate,bookingDates.enddate);}// get the parent data for each idparentIds.forEach(function(element, index, array) {getParentInfo(element);});$("[data-sv-updateRates]").click(function(e) {var detailroot = $('.rates_calendar');e.preventDefault();var t = $(this);var c = t.closest('.ratesContainer');var recid = $(c).data('svrates-container');var calendar = $('[data-svrates-calendar="' + recid + '"]');rates.populateCalendar({node: detailroot, rateTmpl: rateTmpl, linkTmpl: linkTmpl, cleanup: false, ids:[recid], startdate: bookingDates.startdate, enddate: bookingDates.enddate});$.magnificPopup.open({items: {src: calendar},type: 'inline'});});});lazyload.lazy($(this.$el).find('.content .item '));}},query : function(cb) {var self = this;var filter = self.getFilter("query");var options = {limit : self.args.limit,skip : self.skip,count : true,castDocs : false,fields : {address1 : 1,altphone : 1,"amenities.general_hours" : 1, "amenities.golf_holes" : 1,"amenities.golf_par" : 1,"amenities.golf_rating" : 1,"amenities.golf_slope" : 1,"amenities.golf_yardage" : 1,"amenities.dining_mealsserved" : 1,"amenities.dining_price" : 1,"amenities.hotels_petsallowed" : 1,categories : 1,company : 1,url :1,city : 1,region : 1,crmtracking : 1,description : 1,dtn : 1,isDTN : 1,loc : 1,latitude : 1,longitude : 1,media : 1,parentid : 1,phone : 1,primary_category: 1,primary_image : 1,primary_image_url : 1,rankid : 1,rankorder : 1,rankname : 1,recid : 1,regionid : 1,state : 1,social: 1,title : 1,tollfree : 1,weburl: 1,zip : 1,meetingfacility : 1,acctid : 1},hooks : defaultHooks};if (self.sort === "qualityScore") {options.sort = { qualityScore : -1, sortcompany : 1 };} else if (self.sort === "distance") {filter.solrOptions = filter.solrOptions || {};filter.solrOptions.sort = "distance";filter.solrOptions.point = [self.georesult.latitude, self.georesult.longitude].join(",");filter.solrOptions.radius = self.args.maxRangeMiles.toString();}if (options.skip === 0) {// whenever the skip is 0, we reset the custom_dtnids back to scratchself.custom_dtnids = [];}var flow = new asyncLib.Flow();flow.series({dtn : function(cb) {if (hasDtn === false || options.skip > 0 || self.sort === "distance" || self.custom_catid === undefined) {return cb(null, []);}var dtnFilter = self.getFilter("query");dtnFilter.$and.push({filter_tags : {$in : crmLib.getListingFilterTags({ items : self.custom_dtnFilterTagItems, dtn : true })}});// using 0000 and 2359 for caching purposes, otherwise we could just use Date().toISOString()var today0000 = clientMoment().startOf("day"); // send date as 00:00:00 in the client timezone in UTCvar today2359 = clientMoment().endOf("day"); // send date as 23:59:59 in the client timezone in UTCdtnFilter.$and.push({$or : [{ "dtn.sdate" : { $lte : { $date : today0000.toISOString() } } },{ "dtn.sdate" : { $exists : false } }]},{$or : [{ "dtn.edate" : { $gte : { $date : today2359.toISOString() } } },{ "dtn.edate" : { $exists : false } }]});var dtnOptions = $.extend({}, options, {// we allow DTN to oversell the first page by a factor of 2// we will pull from this set a max of the limitlimit : self.limit * 2,count : false,hooks : defaultHooks.concat("afterFind_dtn")});if (xhr) { xhr.abort(); }xhr = $.get("/includes/rest_v2/plugins_listings_listings/find/", { json : JSON.stringify({ filter : dtnFilter, options : dtnOptions }), token : core.simpleToken });xhr.done(function(res) {// randomize the result set, then trim it down to our desired limitres.docs = arrayLib.randomize(res.docs);res.docs = res.docs.splice(0, dtnargs.limit);res.docs.forEach(function(val) {self.custom_dtnids.push(val.recid);val.dtnAuid = dtnargs.auid;val.isDTN = true;});return cb(null, res.docs);}).fail(function(err, type, message) {if (type === "abort") { return flow.halt({ total : 0, docs : [] }); } // another request has aborted this one, so halt this flowreturn cb(new Error(message));});},data : function(cb) {if (flow.data.dtn.length > 0) {// has DTN listings, need to adjust page 1 limit and store dtnids for exclusion from main query on all pagesoptions.limit -= self.custom_dtnids.length;} else {options.skip = (options.skip - self.custom_dtnids.length);}if (self.custom_dtnids.length > 0) {filter.recid = { $nin : self.custom_dtnids }}if (xhr) { xhr.abort(); }if (self.custom_dtnids.length === self.limit) {options.limit = 1;}defaultView = defaultView;xhr = $.get("/includes/rest_v2/plugins_listings_listings/find/", { json : JSON.stringify({ filter : filter, options : options }), token : core.simpleToken });xhr.done(function(res) {res.docs.docs.forEach(function(val) {crmacctids.push(val.acctid);// assign listing typesfor (let i = 0; i < val.categories.length; i++) {if (val.categories[i].catid === 293) { // restaurantsval.restaurant = true;// get cusinetypes for restaurantsval.cuisineTypes = [];for (var j = 0; j < val.categories.length; j++) {if (val.categories[j].catid == 293) {val.cuisineTypes.push(val.categories[j].subcatname);}}} else if (val.categories[i].catid == 292 || val.categories[i].catid == 296) { // accomodationsval.accomodation = true;} else if (val.categories[i].subcatid == 1368) { // golfval.golf = true;}}if (widget.listingcats == 302) {val.meetingSpace = true;if (val.recid !== undefined && parentIds.indexOf(val.recid) == -1) {parentIds.push(val.recid);}}if (val.parentid !== undefined && parentIds.indexOf(val.parentid) == -1) {parentIds.push(val.parentid);}});var returnData = {total : res.docs.count + self.custom_dtnids.length,docs : flow.data.dtn.concat(res.docs.docs).slice(0, self.limit)};returnData.docs = returnData.docs.map(function(val, index) {return {recid : val.recid,acctid : val.acctid,crmc : val.primary_category.catname,crmsc : val.primary_category.subcatname,category : val.primary_category.catname + ' | ' + val.primary_category.subcatname,itemName : val.title,itemType : 'listings',title : val.title,image_url : (val.primary_image_url === undefined) ? self.args.fallbackImageUrl : val.primary_image_url,url : val.url,city: val.city,region : val.region,rankname : val.rankname,index: (index + (options.skip || 0)) ?? undefined,zip: val.zip,phone: val.altphone,description: stringLib.stripHtml(val.description),location: val.location,restaurant: val.restaurant,cuisineTypes: val.cuisineTypes,amenities: val.amenities,meetingfacility : val.meetingfacility !== undefined ? {numrooms : val.meetingfacility.numrooms,banquet : val.meetingfacility.banquet,reception : val.meetingfacility.reception,sleepingrooms : val.meetingfacility.sleepingrooms,largestroom : val.meetingfacility.largestroom,totalsqft : val.meetingfacility.totalsqft,theatre : val.meetingfacility.theatre,classroom : val.meetingfacility.classroom} : undefined,parentid: val.parentid,isHotel: isHotel,primary_category: val.primary_category,ttd: ttd,meeting: meeting,golf: golf,dtn : val.isDTN ? {auid : dtnargs.auid,rank : val.dtn.rank} : undefined,locations: [{title : val.address1,city: val.city,state: val.state,zip: val.zip,phone: val.phone}], // sets listing locationlatitude : val.latitude,longitude : val.longitude,qualityScore : val.qualityScore,button : {title : "View Website",url : val.weburl} // call to action button}});returnData.itemType = 'listings';returnData.itemListName = 'Listings Layout List';// 450853 Randomized Hotel Listingsif (isHotel) {returnData.docs = arrayLib.randomize(returnData.docs);}addSEMTracking(res.docs.docs);return cb(null, returnData);}).fail(function(err, type, message) {if (type === "abort") { return flow.halt({ total : 0, docs : [] }); } // another request has aborted this one, so halt this flowreturn cb(new Error(message));});}}, flow.cbLast(cb));}});/* register available UI events */var watcher = new UIWatcher(vue, $, document);var uid = clientLib.uuid().toString();var widgetEvents = ["change-page", "view-change", "value-change", "sort-change", "toggle-show-more","scroll-into-view", "item-click", "phone-click", "title-click", "map-pin-click", "tripbuilder"];for (var i=0; i 9) {clearInterval(checkExists);}$('[data-svrates-container]').each(function() {var t = $(this);if (t.find('.book .detailButton').length) {t.parent().find('.ratesNotFound').hide();t.show();}});}, 1000); }// end show rate infovar getParentInfo = function(parentid) {var filter = { recid: parentid };var options = { };if (parentid === undefined) { return; }var missingSqft = $('[data-sv-recid="' + parentid + '"] ');var missingLink = $('[data-sv-parentid="' + parentid + '"]');if ( missingLink.length == 0 && missingSqft.length == 0 ) { return; }// missingSqft.length == 0 && $.ajax({method : "get",url : "/includes/rest/plugins_listings_listings/find/",data : {filter : filter,options : options,token : core.simpleToken},success : function(data) {if (data.docs.length > 0) {var docdata = data.docs.map(function(val) {return {company : val.company,url : val.detailURL,totalsqft : (val.meetingfacility && val.meetingfacility.totalsqft) ? val.meetingfacility.totalsqft : 0,banquet : (val.meetingfacility && val.meetingfacility.banquet) ? val.meetingfacility.banquet : 0,largestroom : (val.meetingfacility && val.meetingfacility.largestroom) ? val.meetingfacility.largestroom : 0}});// links on listings like restaurants, spas, weddingsif (missingLink && docdata[0].url !== null && docdata[0].company !== null) {missingLink.find('.loc').attr('href',docdata[0].url);missingLink.find('.loc').text(docdata[0].company);}// square footage on meeting spacesif (missingSqft.length && docdata[0].totalsqft !== null) {missingSqft.find('.sqft .spaceInfo').text(docdata[0].totalsqft);missingSqft.find('.banquet .spaceInfo').text(docdata[0].banquet);missingSqft.find('.largestroom .spaceInfo').text(docdata[0].largestroom);}}return true;}});}// handle resizing from mobile to desktop when using grid at desktop$(window).on('resize', function() {if (window.innerWidth > 780) {var url = new URL(window.location.href);var view = url.searchParams.get("view");if (view && view === "list") {window.history.pushState({path:window.location.protocol + "//" + window.location.host + window.location.pathname},'',window.location.protocol + "//" + window.location.host + window.location.pathname);window.location.reload();}}});/*** SEO tracking ***/function addSEMTracking(data) {window.sem = window.sem || {};window.sem.semData = [];window.sem.getListingData = function(id) {return $.grep(sem.semData, function(e){ return e.listingId === id; });};window.sem.setListingData = function(id) {results = $.grep(sem.semData, function(e){ return e.listingId === id; });window.gtmDataLayer.push(results[0]);window.sem.setListingCategoryData(id);return id;};window.sem.setListingCategoryData = function(id) {results = $.grep(window.sem.getListingData(id)[0].categories, function(e){ return e.primary === true; });if (results.length > 0) {window.gtmDataLayer.push(results[0]);return true;} else {return false;}};for (var i = 0; i < data.length; i++) {var obj = {'listingId':data[i].recid,'acctId':data[i].acctid,'categories':data[i].categories,'title':data[i].title,'region':data[i].region,'parentId':data[i].parentid};window.sem.semData.push(obj);};};});

Plan Your Trip to Laughlin

Comfortable accommodations, exciting attractions, riveting entertainment and adventurous day trips are just a few reasons Laughlin is a great getaway.

Transportation to Laughlin

Slide to Explore

Laughlin Newsletter Sign-up

Our e-newsletter will keep you informed about all the exciting special events, entertainment and package deals in Laughlin.

Sign Up for Email Updates

If you’d like to learn more about responsible gaming, please consult the Nevada Council orcall 1-800-522-4700

Learn More

If you’d like to learn more about responsible gaming, please consult the Nevada Council orcall 1-800-522-4700

© 2024 Las Vegas Convention and
Visitors Authority

All rights reserved

Laughlin Shopping | Explore Malls, Outlets & Boutiques (2024)
Top Articles
Latest Posts
Article information

Author: Jeremiah Abshire

Last Updated:

Views: 5707

Rating: 4.3 / 5 (74 voted)

Reviews: 81% of readers found this page helpful

Author information

Name: Jeremiah Abshire

Birthday: 1993-09-14

Address: Apt. 425 92748 Jannie Centers, Port Nikitaville, VT 82110

Phone: +8096210939894

Job: Lead Healthcare Manager

Hobby: Watching movies, Watching movies, Knapping, LARPing, Coffee roasting, Lacemaking, Gaming

Introduction: My name is Jeremiah Abshire, I am a outstanding, kind, clever, hilarious, curious, hilarious, outstanding person who loves writing and wants to share my knowledge and understanding with you.