Map - CalMac Ferries (2024)

Hide map options

  • Clear All

View timetables

Exit full screenEnter full screen

For the best experience, please view in landscape

';var infoWindow = new google.maps.InfoWindow({content: defaultInfoWindowContent,maxWidth: 230});google.maps.event.addListener(infoWindow, 'domready', function(){$('.gm-style-iw + div').empty().append("

");});function initMap() {let mapOptions = {center: { lat: 57.1451807, lng: -4.4494629},zoom: 7,mapTypeControl: false,fullscreenControl: false,// Move controls to the rightzoomControlOptions: { position: google.maps.ControlPosition.RIGHT_CENTER },panControlOptions: { position: google.maps.ControlPosition.RIGHT_CENTER }};window.map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);window.map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(document.getElementById('legend'));setZoom();plotMarkers(jsonResults, true);}function setZoom(bounds) {//now fit the map to the newly inclusive bounds unless a specific zoom level is provided let zoom = 0;let lat = undefined;let lng = undefined;let change = false;if (zoom > 0) {window.map.setZoom(zoom);change = true;}if (lat !== undefined && lng !== undefined) {window.map.setCenter(new google.maps.LatLng(lat, lng));change = true;}return change;}function submitFacets(e) {return false;}function toggleTextFilter() {// If any of the facets are selectedlet toggle = false;$('.facetlistform__checkbox').each(function() {if ($(this).prop("checked") === true) {toggle = true;}});if (toggle) {// Show the text filter$(".mapsearchwrapper").show();} else {// Hide and clear the input$(".mapsearchwrapper").hide();$("input#mapsearch").val('');}}toggleTextFilter();var requestCount = 0;function groupUpdateMap(facetid) {let $group = $('#' + facetid);if ($group) {// Prevent clicking until async has finished$group.prop("disabled", true);// Parse all facets from the child facet listlet facetIds = [];// Ensure all the group items get ticked/unticked immediately as per parent$group.parent().children("ul.subfacets").find(".facetlistform__checkbox").each(function () {facetIds.push($(this).attr('id').replace('f', ''));$(this).prop("disabled", true);});// Update URLs for all facets to include the group$('.facetlistform__checkbox').each(function() {for (let i = 0; i < facetIds.length; i++) {// Add back in if it doesn't already exist (once)$(this).attr('data-newurl', removeParam($(this).attr('data-newurl'), 'f', facetIds[i]));if ($group.prop("checked") && ("f" + facetIds[i]) !== $(this).attr('id')) {$(this).attr('data-newurl', addParam($(this).attr('data-newurl'), 'f', facetIds[i]));} else if (!$group.prop("checked") && ("f" + facetIds[i]) === $(this).attr('id')) {// Add back in if we're unchecking the group, and this is the current facet, effectively reversing first line$(this).attr('data-newurl', addParam($(this).attr('data-newurl'), 'f', facetIds[i]));}}});// Update the current URLwindow.history.replaceState('', 'Filtering by ' + $group.text(), $group.attr('data-newurl'));// Make request for updated contentlet url = addParam($group.attr('data-newurl'), 'ajax', 'json');requestCount++;let thisRequest = requestCount;$.ajax(url, {success: function (data) {jsonResults = data;// filter data if search field has a valuelet $mapSearch = $("#mapsearch");var data = ($mapSearch.val() !== '')? filter(jsonResults, $mapSearch.val()) : data;if (thisRequest >= requestCount) {// Plot new dataplotMarkers(data, false);$group.prop("checked", !$group.prop("checked"));$group.parent().children("ul.subfacets").find(".facetlistform__checkbox").each(function () {$(this).prop("checked", $group.prop("checked"));});}},error: function () {if (thisRequest >= requestCount) {// Reverse attempt to load these facets$('.facetlistform__checkbox').each(function () {for (let i = 0; i < facetIds.length; i++) {// Add back in if it doesn't already exist (once)$(this).attr('data-newurl', removeParam($(this).attr('data-newurl'), 'f', facetIds[i]));if ($group.prop("checked") && ("f" + facetIds[i]) !== $(this).attr('id')) {$(this).attr('data-newurl', addParam($(this).attr('data-newurl'), 'f', facetIds[i]));} else if (!$group.prop("checked") && ("f" + facetIds[i]) === $(this).attr('id')) {// Add back in if we're unchecking the group, and this is the current facet, effectively reversing first line$(this).attr('data-newurl', addParam($(this).attr('data-newurl'), 'f', facetIds[i]));}}});}},complete: function () {if (thisRequest >= requestCount) {// Always re-enable checkboxes on final load of async requests$('.facetlistform__checkbox').prop("disabled", false);// Final check?updateGroupChecks();toggleTextFilter();}}});}}function updateMap(facetid) {var $facet = $('#' + facetid);if ($facet) {// Disable individual facet while it loads$facet.prop("disabled", true);// Increment tracking of requests/save the current state for laterrequestCount++;let thisRequest = requestCount;let thisFacets = getParamValues($facet.attr('data-newurl'), "f");// Update the current URLwindow.history.replaceState('', 'Filtering by ' + $facet.text(), $facet.attr('data-newurl'));// Make request for updated contentlet url = addParam($facet.attr('data-newurl'), 'ajax', 'json');$.ajax(url, {success: function (data) {jsonResults = data;// filter data if search field has a valuelet $mapSearch = $("#mapsearch");var data = ($mapSearch.val() !== '')? filter(jsonResults, $mapSearch.val()) : data;if (thisRequest >= requestCount) {// Plot (latest) new dataplotMarkers(data, false);// Check/uncheck accordingly$('.facetlistform__checkbox').prop("checked", false);for (let facet of thisFacets) {$("#f" + facet).prop("checked", true);}}},error: function () {if (thisRequest >= requestCount) {// Reverse attempt to load these facetsupdateFacetUrls(facetid, $facet.prop("checked"));}},complete: function () {if (thisRequest >= requestCount) {// Always re-enable checkboxes on final load of async requests$('.facetlistform__checkbox').prop("disabled", false);updateGroupChecks();toggleTextFilter();}}});// Update all other URLs in meantime, so the user can continue faceting:updateFacetUrls(facetid, $facet.prop("checked"));}}function updateFacetUrls(facetid, addFacet) {$('.facetlistform__checkbox').each(function() {let oldHref = $(this).attr('data-newurl');// If it's the current facetif ($(this).attr('id') === facetid) {// If it's checkedif (addFacet) {$(this).attr('data-newurl', removeParam(oldHref, 'f', facetid.replace('f', '')));} else {$(this).attr('data-newurl', addParam(oldHref, 'f', facetid.replace('f', '')));}}// If it's a different facetelse {// Add the current facet to the href if it was checkedif (addFacet) {$(this).attr('data-newurl', addParam(oldHref, 'f', facetid.replace('f', '')));}// Otherwise remove it from the hrefelse {$(this).attr('data-newurl', removeParam(oldHref, 'f', facetid.replace('f', '')));}}});$('.facetlistform__checkbox--group').each(function() {let $parent = $(this);let facetIsMemberOfgroup = false;let allGroupFacetsSelected = true;let facetIds = [];// Loop over any children, adding the IDs to the list and detect whether they are all selected too$(this).parent().children("ul.subfacets").find(".facetlistform__checkbox").each(function() {facetIds.push($(this).attr('id').replace('f', ''));if(!$(this).prop("checked")) {allGroupFacetsSelected = false;}if ($(this).attr('id') === facetid) {facetIsMemberOfgroup = true;}});// If the current facet is not a member of this group, update the group URL accordinglyif (!facetIsMemberOfgroup) {// Add the current facet to the href if it was checkedif (addFacet) {$parent.attr('data-newurl', addParam($parent.attr('data-newurl'), 'f', facetid.replace('f', '')));}// Otherwise remove it from the hrefelse {$parent.attr('data-newurl', removeParam($parent.attr('data-newurl'), 'f', facetid.replace('f', '')));}} else {// Choose whether to remove or add all group IDs from URLfor (let i = 0; i < facetIds.length; i++) {if (allGroupFacetsSelected) {$parent.attr('data-newurl', removeParam($parent.attr('data-newurl'), 'f', facetIds[i]));} else {// Add back in if it doesn't already exist (once)$parent.attr('data-newurl', addParam($parent.attr('data-newurl'), 'f', facetIds[i]));}}}});}function updateGroupChecks() {$('.facetlistform__checkbox--group').each(function() {let $parent = $(this);let allGroupFacetsSelected = true;$(this).parent().children("ul.subfacets").find(".facetlistform__checkbox").each(function () {if (!$(this).prop("checked")) {allGroupFacetsSelected = false;}});$parent.prop("checked", allGroupFacetsSelected);});}function addParam(url, paramName, paramValue) {// Prevent duplications by removing any existing matches first:let newUrl = removeParam(url, paramName, paramValue);return newUrl + (newUrl.indexOf('?') === -1 ? '?' : '&') + paramName + '=' + paramValue;}function removeParam(url, paramName, paramValue) {let newUrl = url.replace(new RegExp('&?' + paramName + '=' + paramValue), '');// Remove the trailing '?' if it's all that's leftif (newUrl.match(/\?$/i)) {newUrl = newUrl.substring(0, newUrl.indexOf('?'));}return newUrl;}function getParamValues(url, paramName) {let facetIds = [];let facetMatches = url.matchAll('[?&]' + paramName + '=([^]*)');for (const match of facetMatches) {facetIds.push(match[1]);}return facetIds;}function plotMarkers(items, reset) {// Remove existing markers from the mapfor (let i=0; i

0) && reset) {if (!setZoom()) {if (plotted.length > 1) {map.fitBounds(bounds);}}}}function filter(json, key) {return $.grep(json, function (element, index) {return element.title.toLowerCase().indexOf(key.toLowerCase()) > -1;});}google.maps.event.addDomListener(window, 'load', initMap);// Fullscreenif (document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled) {// Show fullscreen button$('a.fullscreen.enter').removeClass("hidden");// Variableslet el = $('#interactivemap .template')[0],enter = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen,exit = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;// Toggle fullscreen$('a.fullscreen').on('click', function(e) {//Add event listeners for fullscreendocument.addEventListener('webkitfullscreenchange', toggleFullscreen, false);document.addEventListener('mozfullscreenchange', toggleFullscreen, false);document.addEventListener('fullscreenchange', toggleFullscreen, false);document.addEventListener('MSFullscreenChange', toggleFullscreen, false);e.preventDefault();if ($(this).hasClass('enter')) enter.call(el);else if ($(this).hasClass('exit')) exit.call(document);});//Function to toggle fullscreen stylesfunction toggleFullscreen() {if (document.webkitIsFullScreen || document.mozFullScreen || (typeof document.msFullscreenElement != 'undefined' && document.msFullscreenElement !== null)) {//Toggle classes/styles$('.template').addClass('fullscreen-open');} else {$('.template').removeClass('fullscreen-open');}$('a.fullscreen').toggleClass('hidden');google.maps.event.trigger(map, "resize");}}// Show/Hide facets$('a.facetstoggle').bind('click', function(e) {e.preventDefault();$(this).closest('.facets').toggleClass('hide');// Refresh the map previewgoogle.maps.event.trigger(map, 'resize');});// Set up search box$(".search button").on("click", function() {let key = $("#mapsearch").val();if (key !== '') {plotMarkers(filter(jsonResults, key), true);}});// Set up search box$("#mapsearch").val("").focus().on("input", function() {plotMarkers(filter(jsonResults, $("#mapsearch").val()), true);});/* ]]> */
Map - CalMac Ferries (2024)

References

Top Articles
Debris Removal Service in Orange Beach, AL ~ Instant Online Pricing | LoadUp
12 delicious Amarula recipes | Getaway Magazine
Australian Gold zonbescherming review - Verdraaid Mooi
Lynaritaa Boobs
North Station To Lowell Schedule
Everything You Might Want to Know About Tantric Massage - We've Asked a Pro
Craigsist Houston
Local Dog Boarding Kennels Near Me
Black Adam Showtimes Near Kerasotes Showplace 14
Guide:Guide to WvW Rewards
Walgreens Boots Alliance, Inc.: Konsensus der Analysten und Kursziel | A12HJF | US9314271084 | MarketScreener
Hessaire Mini Split Remote Control Manual
Is Robert Manse Leaving Hsn
Myjohnshopkins Mychart
1800Comcast
Us151 San Jose
Onderdelen | Onderdelen en services
Carly Carrigan Family Feud Instagram - Carly Carrigan Home Facebook : The best gifs for carly family feud.
Linus Tech Tips Forums
First Lady Nails Patchogue
Kup telewizor LG OLED lub QNED i zgarnij do... 3000 zł zwrotu na konto! Fantastyczna promocja
Kira Kener 2022
Female Same Size Vore Thread
Natasha Tillotson
Logisticare Transportation Provider Login
Webcentral Cuny
Mireya Arboleda Net Worth 2024| Rachelparris.com
Marissa.munoz17
Papamurphys Near Me
Slim Thug’s Wealth and Wellness: A Journey Beyond Music
Switchback Travel | Best Camping Chairs of 2024
How To Delete Jackd Account
Riverwood Family Services
Why Larry the cat of 10 Downing Street wishes Starmer hadn’t won the election
8 Best Bubble Braid Hairstyles For All Hair Types
Boise Craigslist Cars And Trucks - By Owner
15 Best Things to Do in Tulare, CA - Travel Lens
Marie Anne Thiebaud 2019
Tcc Northeast Library
World History Kazwire
Supercopbot Keywords
Cashtapp Atm Near Me
2Nd Chance Apartments In Richmond Va
10 Teacher Tips to Encourage Self-Awareness in Teens | EVERFI
Chloe Dicarlo
Pinellas Fire Active Calls
Einschlafen in nur wenigen Minuten: Was bringt die 4-7-8-Methode?
Publix Coral Way And 147
Gatlinburg SkyBridge: Is It Worth the Trip? An In-Depth Review - Travel To Gatlinburg
Saryn Prime Build 2023
8 Internet Celebrities who fell prey to Leaked Video Scandals
Usps Passport Appointment Confirmation
Latest Posts
Article information

Author: Gov. Deandrea McKenzie

Last Updated:

Views: 6560

Rating: 4.6 / 5 (66 voted)

Reviews: 81% of readers found this page helpful

Author information

Name: Gov. Deandrea McKenzie

Birthday: 2001-01-17

Address: Suite 769 2454 Marsha Coves, Debbieton, MS 95002

Phone: +813077629322

Job: Real-Estate Executive

Hobby: Archery, Metal detecting, Kitesurfing, Genealogy, Kitesurfing, Calligraphy, Roller skating

Introduction: My name is Gov. Deandrea McKenzie, I am a spotless, clean, glamorous, sparkling, adventurous, nice, brainy person who loves writing and wants to share my knowledge and understanding with you.