ORDER YOUR FREE 2021 TRAVEL GUIDE NOW!
2021 Virginia Travel Guide and State Map
A vacation in Virginia is about doing the things you love with the people you love most – and making memories that will last a lifetime.
The 2021 Virginia Travel Guide features a curated collection of personal recommendations and heartfelt narratives from talented writers, local enthusiasts and passionate travelers. Get the insider’s perspective on the best ways to experience Virginia, from lesser-known road trips and dining destinations, to sustainable travel tips and even a personal exploration of Virginia’s complex history.
Whether your travel dreams include charming small towns or vibrant cities, mountain adventures or coastal retreats, we hope you’re inspired to share what you love on your next Virginia vacation.
As you make plans to travel, please know that COVID-19 continues to have our full attention – and the health and safety of our visitors and communities is our number one priority. As this Guide went to print in January 2021, please check with businesses on current hours, and be sure observe Virginia’s COVID-19 safety guidelines when traveling. We look forward to seeing you when you’re ready!
PREVIEW THE TRAVEL GUIDE
View digitally and download below.
Sign me up!
Order your Virginia Is For Lovers Travel Guide by completing the required fields below.
(For bulk publication orders please use this link.)
Select the box(es) for the brochure(s) and email updates you are interested in receiving.
Please note, address information is required for proper delivery. If you would like to subscribe to any of our Virginia emails without ordering a brochure, please click here.
Travel Guides and Maps
Are you interested in receiving any of the following travel guides and maps?
* Indicates a required field.
=0;i=i-1){if(form.elements[i].name===”” || form.elements[i].name===”g-recaptcha-response”){continue}switch(form.elements[i].nodeName){case”INPUT”:switch(form.elements[i].type){case”text”:case”hidden”:case”password”:case”button”:case”reset”:case”submit”:q.push(form.elements[i].name+”=”+encodeURIComponent(form.elements[i].value));break;case”checkbox”:case”radio”:if(form.elements[i].checked){q.push(form.elements[i].name+”=”+encodeURIComponent(form.elements[i].value))}break;case”file”:break}break;case”TEXTAREA”:q.push(form.elements[i].name+”=”+encodeURIComponent(form.elements[i].value));break;case”SELECT”:switch(form.elements[i].type){case”select-one”:q.push(form.elements[i].name+”=”+encodeURIComponent(form.elements[i].value));break;case”select-multiple”:for(j=form.elements[i].options.length-1;j>=0;j=j-1){if(form.elements[i].options[j].selected){q.push(form.elements[i].name+”=”+encodeURIComponent(form.elements[i].options[j].value))}}break}break;case”BUTTON”:switch(form.elements[i].type){case”reset”:case”submit”:case”button”:q.push(form.elements[i].name+”=”+encodeURIComponent(form.elements[i].value));break}break}}return q.join(“&”)}; var iframe = document.createElement(‘iframe’); iframe.id = “539319E1_5056_A36A_07279A4D9468A6FA”; iframe.style.width = ‘0’; iframe.style.height = ‘0’; iframe.style.position=’absolute’; iframe.src= ‘https://marketing.virginia.org/acton/eform/43976/416581c6-fe7d-4113-9681-12f02eb38b0c/d-ext-0001’; iframe.src += ‘?’ + serializeForm(frm); document.body.appendChild(iframe); try{ var elm = document.getElementById(“539319E1_5056_A36A_07279A4D9468A6FA”); var hasLoaded = false; var timesChecked = 0; var checkForLoadedInterval = window.setInterval(function(){ timesChecked++; if(timesChecked > 3 || hasLoaded){ window.clearInterval(checkForLoadedInterval); if(!hasLoaded){ try{ if(elm.removeEventListener){ elm.removeEventListener(“load”, weHaveLoadedFunc); }else if(elm.detachEvent){ elm.detachEvent(“onload”,weHaveLoadedFunc) } }catch(e){} changeSaveFrmButtonTypeAndSubmit(frm); } } },1000); var weHaveLoadedFunc = function(){ hasLoaded = true; try{window.clearInterval(checkForLoadedInterval);}catch(e){console.log(“Error clearing interval”,e);} changeSaveFrmButtonTypeAndSubmit(frm); } if (elm.addEventListener) { elm.addEventListener(“load”,weHaveLoadedFunc, false); } else if (elm.attachEvent) { elm.attachEvent(“onload”, weHaveLoadedFunc); } }catch(e){ changeSaveFrmButtonTypeAndSubmit(frm); } } ]]> 0) errMsg += ‘The following information is invalid!n’ + fmtMsg + ‘n’; svcrm.formBuilderScripts.showValidationErrorMsg(errMsg); Array.prototype.forEach.call(document.getElementsByName(“savefrm”), function(e){e.disabled=false}); return false; }else{ AoProcessForm(frm); return false; } }; //why not 🙂 svcrm.formBuilderScripts.showValidationErrorMsg = function(msg){ alert(msg); }; svcrm.formBuilderScripts.updateDOB = function(monthFld,dayFld) { var days = 0; if (monthFld.selectedIndex == 0) return true; switch (monthFld.selectedIndex) { case 2: days = 30; break; case 4: case 6: case 9: case 11: days = 31; break; default: days = 32; break; } if (dayFld.options[dayFld.selectedIndex].value >= days) dayFld.selectedIndex = days – 1; dayFld.length = days; for (var i = 28; i 0) ? num.substring(dec,num.length) : “.00”); if (cents.length == 2) cents += “0”; // Add commas dollars = “” + parseInt(num); for (var i = dollars.length – 1; i >= 0; i–) { if (count == 3) { tmp = “,” + tmp; count = 1; } else count ++; tmp = dollars.charAt(i) + tmp; } } // Format number num = “$” + tmp + cents; obj.value = num; return true; }; //Function to format phone numbers //returns false if invalid svcrm.formBuilderScripts.fmtPhone = function(obj){ var phone = “”; var oldphone = “”; if (obj.value.length == 0) return true; //Remove formatting oldphone = obj.value; svcrm.formBuilderScripts.stripChars(obj, “- ()”); phone = obj.value; if (!svcrm.formBuilderScripts.checkChars(phone, “0123456789”)) return false; if (phone.length == 10) obj.value = “(” + phone.substring(0,3) + “) ” + phone.substring(3,6) +”-” + phone.substring(6,10); else { obj.value = oldphone; return false; } return true; }; //Function to format social security numbers //returns false if invalid svcrm.formBuilderScripts.fmtSSN = function(obj){ var ssn = “” if (obj.value.length == 0) return true; //Remove all dashes svcrm.formBuilderScripts.stripChars(obj, “-“); ssn = obj.value; if (!svcrm.formBuilderScripts.checkChars(ssn, “0123456789”)) return false; if (ssn.length == 9) obj.value = ssn.substring(0,3) + “-” + ssn.substring(3,5) + “-” + ssn.substring(5,9); else return false; return true; }; //Function to verify valid URL svcrm.formBuilderScripts.fmtURL = function(obj){ if (obj.value.length == 0) return true; if (obj.value.substring(0,7) != “http://”) obj.value = “http://” + obj.value; if (obj.value.length < 10) return false; return true; }; //Function to format zip codes //returns false if invalid svcrm.formBuilderScripts.fmtZip = function(obj){ var numberlist = "0123456789", zip = "" if (obj.value.length == 0) return true; // Remove dashes svcrm.formBuilderScripts.stripChars(obj, "-"); zip = obj.value; if (!svcrm.formBuilderScripts.checkChars(zip, numberlist)) return false; if (zip.length == 5) obj.value = zip; else if (zip.length == 9) obj.value = zip.substring(0,5) + "-" + zip.substring(5,9) else return false; //Passed all tests return true; }; //Returns true if every character is in string list //otherwise false svcrm.formBuilderScripts.checkChars = function(val, charlist){ for (var i = 0; i < val.length; i++) if (charlist.indexOf(val.charAt(i)) < 0) return false; //String passed so it is valid return true; }; //Returns true if valid email //otherwise returns false svcrm.formBuilderScripts.checkEmail = function(obj){ if (obj.value.length != 0) { var pattern = /^['&a-zA-Z0-9._%+-]+@(?:[&a-zA-Z0-9-]+.)+(([a-zA-Z]{2,4})|(aero|coop|info|museum|name|travel))$/; if (!pattern.test(obj.value)) { return false; } else { return true; } } // Valid, passed all tests return true; }; //Returns true if valid phone //otherwise returns false svcrm.formBuilderScripts.checkPhone = function(obj){ if (obj.value.length != 0) { var pattern = /^([+][0-9]{1,3}[ .-])?([(]{1}[0-9]{2,6}[)])?([0-9 .-/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/; if (!pattern.test(obj.value)) { return false; } else { return true; } } // Valid, passed all tests return true; }; //Returns true if value is a number or is NULL //otherwise returns false svcrm.formBuilderScripts.checkInteger = function(object_value){ if (object_value.length == 0) return true; if (object_value.indexOf(".") < 1) return svcrm.formBuilderScripts.checkNumber(object_value); else return false; }; //Returns true if value is a number or is NULL //otherwise returns false svcrm.formBuilderScripts.checkNumber = function(object_value){ if (object_value.length == 0) return true; //Returns true if value is a number defined as // having an optional leading + or -. // having at most 1 decimal point. // otherwise containing only the characters 0-9. var start_format = " .+-0123456789"; var number_format = " .0123456789"; var check_char; var decimal = false; var trailing_blank = false; var digits = false; //The first character can be + - . blank or a digit. check_char = start_format.indexOf(object_value.charAt(0)) //Was it a decimal? if (check_char == 1) decimal = true; else if (check_char < 1) return false; //Remaining characters can be only . or a digit, but only one decimal. for (var i = 1; i < object_value.length; i++) { check_char = number_format.indexOf(object_value.charAt(i)) if (check_char < 0) return false; else if (check_char == 1) { if (decimal) // Second decimal. return false; else decimal = true; } else if (check_char == 0) { if (decimal || digits) trailing_blank = true; // ignore leading blanks } else if (trailing_blank) return false; else digits = true; } //All tests passed return true }; //Returns true if value is a posiitve integer or is NULL //otherwise returns false svcrm.formBuilderScripts.checkPosInteger = function(object_value){ if (object_value.indexOf("-") != -1) return false; else return (svcrm.formBuilderScripts.checkInteger(object_value)); }; //Function to find any char in charlist in the passed string //Returns true if a character is found //Otherwise false svcrm.formBuilderScripts.findChars = function(str, charlist){ for (var i = 0; i < charlist.length; i++) { if (str.indexOf(charlist.charAt(i)) != -1) return true; } return false; }; //Function to remove all occurances of chars in charlist svcrm.formBuilderScripts.stripChars = function(obj, charlist){ var i = 0, pos = 0 var val = obj.value while (i < val.length) { pos = charlist.indexOf(val.charAt(i)); if (pos != -1) val = val.substring(0,i) + val.substring(i + 1, val.length); else i++; } obj.value = val; return true; }; svcrm.formBuilderScripts.cntChars = function(val, charlist){ var i = 0, pos = 0, cnt = 0 for (i = 0; i 0) { tt = tt.toUpperCase(); if (tt != 'AM' && tt != 'PM') return false; val = svcrm.formBuilderScripts.strChars(val, ' ampAMP'); } var sepr = val.indexOf(':') if (sepr == -1) { hr = val; mn = 0; } else { hr = val.substring(0, sepr); mn = val.substring(sepr + 1, val.length); } if (isNaN(mn)) mn = 0; if (!svcrm.formBuilderScripts.chkChars(hr, '0123456789')) return false; if (!svcrm.formBuilderScripts.chkChars(mn, '0123456789')) return false; if (hr 23) return false; if (mn 59) return false; if (hr > 12) { tt = ‘PM’; hr = hr – 12; } else if (hr == 0) { tt = ‘AM’; hr = 12; } if (mn.toString().length == 0) mn = 0; if (tt.length == 0) { if (hr == 12) tt = ‘PM’; else if (hr < 7) tt = 'PM'; else tt = 'AM'; } str = hr; if (mn.toString().length == 1) str = str + ':0' + mn; else str = str + ':' + mn; str = str + ' ' + tt; fld.value = str; return true; }; //Function to remove all occurances of chars in charlist svcrm.formBuilderScripts.strChars = function(val, charlist){ var i = 0, pos = 0 while (i < val.length) { pos = charlist.indexOf(val.charAt(i)); if (pos != -1) val = val.substring(0,i) + val.substring(i + 1, val.length); else i++; } return val; }; svcrm.formBuilderScripts.chkChars = function (val, charlist){ for (var i = 0; i < val.length; i++) if (charlist.indexOf(val.charAt(i)) < 0) return false; return true; }; /* +++++++++++++++++++++++++++ END Script copied from OLD CMS /includes/scripts/formValidations.js +++++++++++++++++++++++++++++++++++++*/ /* +++++++++++++++++++++++++++ BEGIN Script copied from OLD CMS /includes/scripts/dateValidate.js +++++++++++++++++++++++++++++++++++++*/ // Author: Bill Simpson // Company: 220solutions.com // Email: bill@cfarley.com // Date Created: 02-09-2001 // // Verifies and converts date strings to a valid format // // Valid input dates = // mdyy, mmdyy, mmddyy, mmmddyy, mmddyyyy, mmmddyyyy, // m/d/yy, m/dd/yy, mm/d/yy, mm/dd/yy, mmm/d/yy, mmm/dd/yy, // m/d/yyyy, m/dd/yyyy, mm/d/yyyy, mm/dd/yyyy, mmm/d/yyyy, mmm/dd/yyyy // Valid date seperators = '-./:_, ' // // Notes: Please feel free to use/edit this script. // If you do please keep comments and header // // Code based on functions from // Author: Simon Kneafsey // Email: simonkneafsey@hotmail.com // WebSite: www.simonkneafsey.co.uk // Function to convert supplied date string 'fld' // fld: field containing date string // sep: seperator to use e.g. '-' or '/' // returns false if date string is invalid svcrm.formBuilderScripts.fmtDate = function(fld,sep){ var len = fld.value.length; var seps = new Array('-','.','/',':','_',',',' '); // Array of seperators. var d = '', m = '', y = ''; // date part holders //var div = ''; // divider holder //var outdate1 = null; // formatted date to send back to calling field holder var sepholder = new Array('0','0','0'); // array to hold positions of dividers in dates var s = String(fld.value); var outdate = ''; if (len == 0 ) return true; // Accept 'today' or 'now' if (fld.value.toUpperCase() == 'NOW' || fld.value.toUpperCase() == 'TODAY' ) { var newDate = new Date(); var myDay = newDate.getDate(); var myMonth = newDate.getMonth() + 1; if (navigator.appName == 'Netscape') var myYear = newDate.getYear() + 2000; else var myYear = newDate.getYear(); fld.value = myMonth + "-" + myDay + "-" + myYear; // update string info len = fld.value.length; s = String(fld.value); } // Check the date is a valid length if (len 11) return false; // Find positions of divider in the date var cnt = 0; for (var i = 0; i < 3; i++) { for (var j = 0; j < seps.length; j++) { if (s.indexOf(seps[j],cnt) != -1) { div = seps[j]; sepholder[i] = s.indexOf(seps[j],cnt); cnt = sepholder[i] + 1; break; } } } // If element 2 is not 0 then more than 2 dividers have been found so date is invalid. if (sepholder[2] != 0) return false; // if no dividers are found strip out date parts if (sepholder[0] == 0 && sepholder[1] == 0) { switch (len) { case 4: // mdyy m = '0' + s.substring(0,1); d = '0' + s.substring(1,2); y = s.substring(2,4); if ((y = svcrm.formBuilderScripts.chkYear(y)) == false) return false; break; case 5: // mmdyy m = s.substring(0,2); d = '0' + s.substring(2,3); y = s.substring(3,5); if ((y = svcrm.formBuilderScripts.chkYear(y)) == false) return false; break; case 6: // mmddyy m = s.substring(0,2); d = s.substring(2,4); y = s.substring(4,6); if ((y = svcrm.formBuilderScripts.chkYear(y)) == false) return false; break; case 7: //mmmddyy m = s.substring(0,3); d = s.substring(3,5); y = s.substring(5,7); if ((m = svcrm.formBuilderScripts.chkMonth(m)) == false) return false; if ((y = svcrm.formBuilderScripts.chkYear(y)) == false) return false; break; case 8: //mmddyyyy m = s.substring(0,2); d = s.substring(2,4); y = s.substring(4,8); break; case 9: //mmmddyyyy m = s.substring(0,3); d = s.substring(3,5); y = s.substring(5,9); if ((m = svcrm.formBuilderScripts.chkMonth(m)) == false) return false; break; default: return false; } if ((outdate = svcrm.formBuilderScripts.chkDate(m,d,y,sep)) == false) return false; // valid date fld.value = outdate; return true; } else if (sepholder[0] != 0 && sepholder[1] != 0) { // process with dividers m = s.substring(0, sepholder[0]); d = s.substring(sepholder[0] + 1, sepholder[1]); y = s.substring(sepholder[1] + 1, s.length); } else // Only one divider return false; // Check day and year are numeric if (isNaN(d) && isNaN(y)) return false; // Make d day dd if (d.length == 1) d = '0' + d; // Make m month mm if (m.length == 1) m = '0' + m; // Make yy year yyyy if (y.length == 2) if ((y = svcrm.formBuilderScripts.chkYear(y)) == false ) return false; // Make mmm month mm if (m.length == 3 || m.length == 4) { if ((m = svcrm.formBuilderScripts.chkMonth(m)) == false) return false; } // Date components are OK if (d.length != 2 || m.length != 2 || y.length != 4) return false; // Validate the date if ((outdate = svcrm.formBuilderScripts.chkDate(m,d,y,sep)) == false) return false; // Valid date fld.value = outdate; return true; }; // checks for a valid date // m: month part (2 digit) // d: day part (2 digit) // y: year part (4 digit) // returns: date string formatted if valid, false if invalid svcrm.formBuilderScripts.chkDate = function(m, d, y, sep){ var dayArray = new Array(31,28,31,30,31,30,31,31,30,31,30,31); var dstr = m + d + y; var filter=/^[0-9]{2}[0-9]{2}[0-9]{4}$/; // Check mmddyyyy date supplied if (!filter.test(dstr)) return false; // Check valid month filter=/01|02|03|04|05|06|07|08|09|10|11|12/; if (!filter.test(m)) return false; // Check year if (y 2078) return false; // Check for leap year var n = Number(y); if (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0)) dayArray[1] = 29; // Check for valid days for month var mnum = Number(m); if (d > dayArray[mnum – 1] || d <= 0) return false; // Valid date return m + sep + d + sep + y; }; // Checks for valid month // m: month part (3 or 4 digit) // returns: 2 digit month if valid, false is invalid svcrm.formBuilderScripts.chkMonth = function(m){ var months = new Array('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'); m = m.toUpperCase(); if (m.length == 3) { for (var i = 0; i < 12; i++) { if (m == months[i]) { m = i + 1; if (i < 10) m = '0' + m; return m; } } } else if (m.length == 4 && m == 'SEPT') { m = '09'; return m; } else return false; }; // Check for a valid year // y: year part (2 digit) // returns: 4 digit year if valid, false if invalid svcrm.formBuilderScripts.chkYear = function(y){ if (y = 75) { y = "19" + y; return y; } else return false; }; svcrm.formBuilderScripts.showDate = function(baseURL, fld, frm) { var urlSeparator = '?'; if("https://www.virginia.org/plan-your-trip/virginia-travel-guide/".indexOf('?') != -1){ urlSeparator = '&'; } var str = "https://www.virginia.org/plan-your-trip/virginia-travel-guide/" + urlSeparator + "action=popupCal&frm=" + frm + "&fld=" + fld + '&randid=' + new Date().getTime(); if (eval("document." + frm + "." + fld).value.length > 0) str = str + “&cdate=” + eval(“document.” + frm + “.” + fld).value; svcrm.formBuilderScripts.openPopup(str, “calwin”, 210, 210, “width=210,height=210,toolbar=no,status=no,directories=no,menubar=no,resizable=no,scrollable=no”, true); }; svcrm.formBuilderScripts.openPopup = function(url, name, pWidth, pHeight, features, snapToLastMousePosition) { svcrm.formBuilderScripts.openPopupFocus(url, name, pWidth, pHeight, features, snapToLastMousePosition, true); }; svcrm.formBuilderScripts.closePopup = function(){ if (svcrm.formBuilderScripts.curPopupWindow != null) { if (!svcrm.formBuilderScripts.curPopupWindow.closed) svcrm.formBuilderScripts.curPopupWindow.close(); svcrm.formBuilderScripts.curPopupWindow = null; } }; svcrm.formBuilderScripts.openPopupFocus = function(url, name, pWidth, pHeight, features, snapToLastMousePosition, closeOnLoseFocus) { svcrm.formBuilderScripts.closePopup(); if (snapToLastMousePosition) { if (svcrm.formBuilderScripts.lastMouseX – pWidth screen.height) { svcrm.formBuilderScripts.lastMouseY -= (svcrm.formBuilderScripts.lastMouseY + pHeight + 50) – screen.height; } svcrm.formBuilderScripts.lastMouseX -= pWidth; svcrm.formBuilderScripts.lastMouseY += 10; features += “screenX=” + svcrm.formBuilderScripts.lastMouseX + “,left=” + svcrm.formBuilderScripts.lastMouseX + “screenY=” + svcrm.formBuilderScripts.lastMouseY + “,top=” + svcrm.formBuilderScripts.lastMouseY; } if (closeOnLoseFocus) { curPopupWindow = window.open(url, name, features, false); curPopupWindow.focus(); } else { win = window.open(url, name, features, false); win.focus(); } }; svcrm.formBuilderScripts.setLastMousePosition = function(e) { if (navigator.appName.indexOf(“Microsoft”) != -1) e = window.event; svcrm.formBuilderScripts.lastMouseX = e.screenX; svcrm.formBuilderScripts.lastMouseY = e.screenY; }; /* +++++++++++++++++++++++++++ END Script copied from OLD CMS /includes/scripts/dateValidate.js +++++++++++++++++++++++++++++++++++++*/ /* +++++++++++++++++++++++++++ BEGIN Script copied from OLD CMS /includes/scripts/ziplookup.js +++++++++++++++++++++++++++++++++++++*/ svcrm.formBuilderScripts.zipLookup = function(fuseroot, zip, fldCity, fldState){ var scriptID = ‘zipLookupJSONP’; //kill the existing one if we have one if(document.getElementById(scriptID)){ document.getElementById(scriptID).parentNode.removeChild(document.getElementById(scriptID)); } if (svcrm.formBuilderScripts.trim(zip).length != 5 || !svcrm.formBuilderScripts.checkChars(zip, “0123456789”)){ return false; }else{ //jsonP this thing over var s = document.createElement(‘script’); s.id = scriptID; s.type = ‘application/javascript’; s.src = ‘https://virginia.simpleviewcrm.com/webapi/formbuilder/ziplookup.cfm?zip=’+zip+’&fldCityId=’+fldCity.id+’&fldStateId=’+fldState.id+’&jsonp=svcrm.formBuilderScripts.processZipChange’ document.body.appendChild(s); } }; svcrm.formBuilderScripts.processZipChange = function(rtn){ var fldCity = document.getElementById(rtn.fldCityId); var fldState = document.getElementById(rtn.fldStateId); if (rtn.city.length > 0 && fldCity != ”) fldCity.value = rtn.city; else if (fldCity != ”) fldCity.value = ”; if (rtn.state.length > 0 && fldState != ”) { for (var i = 0; i
Source