Some trophies go nicely with a squeeze of lemon. At least that’s what you’ll find on the Mississippi Gulf Coast, where the fishing opportunities are big and the fish you catch are, well, bigger. Our peaceful, warm waters offer everything from freshwater to brackish water to saltwater fishing, and there are 200 species of fish up for grabs.
Fish inshore. Fish off our piers. Spend your day wade fishing or deep-sea fishing – or both. For more on recreational fishing, visit the Department of Marine Resources.
And if you’re new to these parts, and by “parts” we mean waters, you should know that Mississippi Gulf Coast fishing requires a fishing license; for more on getting a license, see here. Oh, but if you’re chartering a boat for the day, your captain will take care of all licensing, bait and tackle. Check coastal tide charts.
The catch of your life awaits. Just remember to invite us for dinner.
0 && dtnargs.limit > 0 && dtn !== undefined); var limit = 12; var xhr; var defaultHooks = []; var defaultView = widget.custom_defaultView !== undefined ? widget.custom_defaultView : “grid”; 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 config dtnargs.limit = Number(widget.dtnlimit); } if (hasDtn) { // we want the smaller of the limit and dtnargs.limit dtnargs.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 object var 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) }) } } var masterFlow = new asyncLib.Flow(); masterFlow.series({ init: function(cb) { var vue = layoutjs.getVue({ rootNode : $(“#layoutjs_7a70a527-180a-4cc5-a3f4-d26a9e83b60f”), type : “listings”, view : 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.js fallbackImageUrl : site.siteConfig.custom && site.siteConfig.custom[site.site] && site.siteConfig.custom[site.site].defaultImageUrl, showFilter : true, baseFilter : baseFilter, filters : [ { name : “keyword”, label : “Keyword”, 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 options show : 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 : “Communities”, // 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 array show : 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 checkbox show : amenities.length > 0, type : “checkbox”, typeExtra : { options : amenities, countArgs : { watchFilters : [“subcats”, “regions”], 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 : “Recommended” }, { value : “distance”, label : “Near Me” } ], maxRangeMiles : 100, latitude : 30.391293, longitude : -88.9739069, 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 template computed : { 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 them return this.custom_selectedSubcatItems; } else if (subcatsChosen) { // if we have items chosen in the widget, use those return allFilterTagItems; } else { // otherwise fall back to the chosen catid return [{ site : site.site, catid : this.custom_catid }]; } } }, methods : {}, watch : { docs: function() { // place logic in here that needs to happen after render of items this.$nextTick(function() { if (hasDtn) { gamClient.renderAds(); } }); } }, 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 : { recid : 1, aresid: 1, title : 1, address1 : 1, url : 1, city: 1, state: 1, zip: 1, phone: 1, weburl: 1, isDTN : 1, latitude : 1, longitude : 1, primary_image_url : 1, qualityScore : 1, ‘tripadvisor’ : 1, ‘taid’ : 1, ‘taoptin’ : 1, “hasTripAdvisor” : 1, “dtn.rank” : 1, “yelp.rating” : 1, “yelp.url” : 1, “yelp.review_count” : 1, “yelp.price” : 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 scratch self.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 UTC var today2359 = clientMoment().endOf(“day”); // send date as 23:59:59 in the client timezone in UTC dtnFilter.$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 limit limit : 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 limit res.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 flow return 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 pages options.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; } xhr = $.get(“/includes/rest_v2/plugins_listings_listings/find/”, { json : JSON.stringify({ filter : filter, options : options }), token : core.simpleToken }); xhr.done(function(res) { 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) { return { recid : val.recid, title : val.title, aresid : val.aresid, image_url : val.primary_image_url, url : val.url, dtn : val.isDTN ? { auid : dtnargs.auid, rank : val.dtn.rank } : undefined, yelp : val.yelp, taid: val.taid, taoptin: val.taoptin, hasTripAdvisor: val.hasTripAdvisor, tripadvisor : val.tripadvisor !== undefined ? val.tripadvisor : undefined, locations: [{ title : val.address1 }], // sets listing location city: val.city, zip: val.zip, state: val.state, phone: val.phone, latitude : val.latitude, longitude : val.longitude, qualityScore : val.qualityScore, button : { title : “Visit Website”, url : val.weburl } // call to action button } }); 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 flow return cb(new Error(message)); }); } }, flow.cbLast(cb)); } }); /* register available UI events */ var quickviewDetail = $(“#quickview-detail”); var watcher = new UIWatcher(vue, quickviewDetail, document); var uid = clientLib.uuid().toString(); var widgetEvents = [ “change-page”, “view-change”, “value-change”, “sort-change”, “toggle-show-more”, “scroll-into-view”, “item-click”, “title-click”, “map-pin-click”, “tripbuilder”, “quickview” ]; for (var i=0; i {{:isVideo()}}{{>custom_play_button}}{{/}} ]]>
{{title}}
{{:description}}{{plainDescription(145)}}{{/}}
{{:link}} {{~setVar(‘viewMore’, global.templateData.view_more_caption || ‘Read More’)}} {{~var.viewMore}} {{/}}
{{:isVideo()}}{{>custom_play_button}}{{/}} ]]>
{{title}}
{{:description}}{{plainDescription(85)}}{{/}}
{{:link}} {{~setVar(‘viewMore’, global.templateData.view_more_caption || ‘Read More’)}} {{~var.viewMore}} {{/}}
Source