You are here
Home > Uncategorized > Marin Transit, Golden Gate Work to Improve Frequency on Major Corridors (Part 1)

Marin Transit, Golden Gate Work to Improve Frequency on Major Corridors (Part 1)

With Marin Transit and Golden Gate Transit about to implement major route shakeups at the same time this coming June, what will passengers expect to see in terms of frequency along Marin County’s arterial roads and US-101? I give you the rundown of the upcoming frequency adjustments, as well as my commentary and potential suggestions for future improvements.

US-101 Corridor to Get More Frequent Local Service

First, we have to focus on the county’s backbone, Highway 101, which spans Marin from Sausalito to Novato. Golden Gate Transit currently operates three Basic Routes that operate from San Francisco using this freeway, namely:

  • Route 10 (San Francisco – Strawberry via Sausalito, Marin City)
  • Route 70 (San Francisco – Novato via US-101 bus pads, Marin City)
  • Route 101 (San Francisco – Santa Rosa via San Rafael, limited stops)

A majority of Golden Gate Transit’s services, in fact, use US-101 to some extent to link communities throughout Marin and Sonoma Counties to San Francisco. However, our focus is on those two lines because those carry the bulk of daily commuter traffic, not just crossing the Bay, but also for local and intercounty travels.

​In addition, Marin Transit operates several routes along US-101 to similar extent as Golden Gate Transit. In fact,  I will list down all services that use that freeway within Marin County, along with their sections served:

Notes: 

  • Destinations highlighted in bold are major transfer points located next or close to US-101.
  • Not all routes are listed, especially those that operate rush hours only or infrequently (e.g. West Marin Stagecoach, school runs).
  • + – Operates nighttime only; all other times, route uses Spencer Avenue and Monte Mar bus pads.

#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .border-box {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box {
position: relative;
margin: 20px 0;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-tab-group {
font-size: 0;
margin: 0;
padding: 0;
float: left;
list-style: none;
height: 60px;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
white-space: nowrap;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-tab {
margin: 0;
cursor: pointer;
height: 60px;
display: inline-block;
min-width: 19%;
position: relative;
background-color: #F7F7F7;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-content-group {
clear: both;
float: left;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-content {
padding: 40px 20px 40px 20px;
display: none;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .scrollArrow {
width: 25px;
background-color: white;
text-align: center;
position: absolute;
z-index: 3;
top: 0;
display: none;
cursor: pointer;
height: 60px;
line-height: 60px;
font-weight: bold;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .scrollArrow.scrollArrow-left {
left: 0;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .scrollArrow.scrollArrow-right {
right: 0;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box.scrollable .tabbed-box-tab-group {
border-bottom: none;
overflow-x: hidden;
overflow-y: hidden;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box.scrollable .tabbed-box-bar:hover .scrollArrow.active {
display: block;
}
@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3),only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2),only screen and (max-width: 499px) {
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-tab-group {
overflow-x: scroll !important;
}
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard .tabbed-box-tab-group {
border-left: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard .tabbed-box-tab {
border: 1px solid #CCCCCC;
border-left: none;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard .tabbed-box-tab .paragraph {
color: #A8ABAC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard .tabbed-box-content-group {
border: 1px solid #CCCCCC;
border-top: none;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard.scrollable .tabbed-box-tab-group {
border-right: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard.scrollable .tabbed-box-tab-group .tabbed-box-tab:last-child {
border-right: none;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard.scrollable .scrollArrow-left {
border: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .standard.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line .tabbed-box-tab-group {
border: 1px solid #CCCCCC;
border-bottom: none;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line .tabbed-box-content-group {
border: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line.scrollable .tabbed-box-tab-group {
height: 61px;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line.scrollable .tabbed-box-content-group {
border-top: none;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line.scrollable .scrollArrow-left,
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .line.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
border-bottom: none;
border-top: none;
height: 61px;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .simple .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
height: 61px;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .simple .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .simple .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .simple .tabbed-box-content-group {
border-top: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .simple .tabbed-box-content {
padding: 20px 0px 20px 0px;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .simple .scrollArrow-left {
border-right: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .simple .scrollArrow-right {
border-left: 1px solid #CCCCCC;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .s3d-shadow {
-webkit-box-shadow: #f5f5f5;
-moz-box-shadow: #f5f5f5;
box-shadow: #f5f5f5;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .s3d-content-shadow {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .s3d .tabbed-box-tab .paragraph {
color: #A8ABAC;
background-color: #F7F7F7;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .s3d .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
-webkit-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
-moz-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .s3d .tabbed-box-tab.active .paragraph {
background-color: white;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .s3d .tabbed-box-content-group {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-tab .paragraph {
padding: 0px;
line-height: 60px !important;
text-align: center !important;
font-weight: bold;
font-size: 16px !important;
margin: 0 20px;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-content .paragraph {
padding: 0;
line-height: 30px;
}
#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc .tabbed-box-tab:last-child .w-delete-outer {
display: none;
position: relative;
float: right;
}

  • Routes Summary
  • Current Setup
  • Future Setup
<
>

Golden Gate Transit Commuter Routes:

  • 4: San Francisco – Mill Valley (select trips continue to Strawberry)
  • 27: San Francisco – San Rafael (peak trips continue to San Anselmo, Sleepy Hollow)
Golden Gate Transit Basic Routes:

  • 10: San Francisco – Strawberry via Sausalito*
  • 30: San Francisco – San Rafael via Sausalito^
  • 40: San Rafael – Del Norte BART via Point Richmond
  • 70: San Francisco – Novato
  • 101: San Francisco – Santa Rosa (limited stops)
Marin Transit Trunkline Routes:

  • 35: 

    • Current: San Rafael TC – Canal District
    • ​Future: Novato – Canal District via Northgate Mall, San Rafael TC^
  • 36: Canal District – Marin City via US-101 bus pads
  • 45/45K: San Rafael TC – Northgate via Civic Center (45K continues to Kaiser Hospital)*
  • 71: 

    • Current: Novato – Marin City via US-101 bus pads
    • Future: Novato – Sausalito via US-101 bus pads (limited stops)^
Marin Transit Local Bus Routes:

  • 17: San Rafael – Sausalito via Mill Valley
  • 22: San Rafael – Marin City via College of Marin
  • 23: 

    • Current: Fairfax Manor – Shoreline Parkway (Canal) via San Anselmo, San Rafael TC
    • Future: Downtown Fairfax – Shoreline Parkway (Canal) via San Anselmo, San Rafael TC^
  • 23X: Fairfax Manor – Canal District via San Anselmo, San Rafael TC (limited stop)
  • 29: 

    • Current: Fairfax Manor – San Rafael TC via Sir Francis Drake, Marin General Hospital, Canal District
    • Future: College of Marin – Canal District via Marin General Hospital, Larkspur Landing, San Rafael TC^
  • 49: San Rafael – Novato via Northgate, Hamilton​
Marin Transit Community Shuttle Routes:

  • 228: Fairfax Manor – San Rafael via Sir Francis Drake, Marin General, Larkspur Landing
  • 233: San Rafael – Santa Venetia via Civic Center
  • 245: San Rafael – Smith Ranch Road via Kaiser, Las Gallinas^
  • 251: San Marin – Hamilton via Vintage Oaks, Indian Valley College
  • 257:

    • ​Current: San Rafael – Indian Valley College (Novato) via Dominican University, Smith Ranch Road
    • Future: San Rafael – Indian Valley College (Novato) via Dominican University, Marinwood^
  • 259:​ San Rafael – Novato via Northgate, Marinwood, Hamilton*
Notes:
* – Route to be eliminated
^ – Revised routing or new route from 12 and 13 June 2016

#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table-wrapper {
padding: 20px 0;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table {
width: 100%;
border: 1px solid #C9CDCF;
border-spacing: 0;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table td.cell {
border-right: 1px solid #C9CDCF;
border-bottom: 1px solid #C9CDCF;
word-break: break-word;
background-color: #FFFFFF;
width: 50%;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table td.cell .paragraph {
width: 90%;
margin: 0 5%;
padding-bottom: 10px;
padding-top: 10px;
text-align: center;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table.style-top tr:first-child td,
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table.style-side td:first-of-type {
background-color: #F8F8F8;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table.style-top tr:first-child td .paragraph,
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table.style-side td:first-of-type .paragraph {
font-weight: 700;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table tr:last-child td {
border-bottom: none;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table td:last-of-type {
border-right: none;
}
#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37 .simple-table .empty-content-area-element {
padding-left: 0px !important;
}

Bus Pad Stop or Major Stop
Bus Lines Served
​Sausalito Ferry
10, 17, 70+
Spencer Ave (Monte Mar NB only)
4, 70, 101
Marin City (Donahue & Terners)
10, 17, 22, 36, 70, 71
Seminary Drive
10, 36, 70, 71
Tiburon Wye (E Blithedale Ave)
17, 22, 36, 70, 71
Corte Madera (Tamalpais Drive)
17, 22, 27, 36, 70, 71
Lucky Drive (Larkspur Ferry)
17, 27, 36, 70, 71
​San Rafael Transit Center
17, 22, 23, 27, 35, 36, 40, 45, 45K,  49, 70, 71, 101, 228, 233, 257, 259
N San Pedro Road
70, 71
Terra Linda (Freitas Parkway)
70, 71
Lucas Valley Rd (Smith Ranch Rd)
49, 70, 71
Marinwood (St Vincent Dr)
49, 70, 71, 257
Alameda del Prado (Nave Dr)
70, 71
Ignacio (Enfrente & Salvatore)
49, 70, 71, 259
Rowland Blvd
70, 71
De Long Avenue
70, 71, 101
​Novato (Redwood & Grant)
49, 70, 71, 251, 259

function setupElement882974827803254745() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “702688850553606843-1.4.1”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var SimpleTable = PlatformElement.extend({
initialize: function() {
this.setSizes();
},
setSizes: function() {
var sizes = this.settings.get(‘tableSizes’);
// if the # of columns isn’t the size of the array of lengths, ignore it.
if (sizes && sizes != “default” && this.settings.get(‘columns’) == sizes.length) {
var columns = this.$(‘tr’).each(function(index, value) {
var cells = $(value).find(‘td’).each(function(index2, value2) {
$(value2).css(‘width’, sizes[index2] + ‘%’);
});
});
}
}
});
return SimpleTable;
})();;
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“columns_each”:[{“columns_index”:0},{“columns_index”:1}],”rows_each”:[{“rows_index”:0},{“rows_index”:1},{“rows_index”:2},{“rows_index”:3},{“rows_index”:4},{“rows_index”:5},{“rows_index”:6},{“rows_index”:7},{“rows_index”:8},{“rows_index”:9},{“rows_index”:10},{“rows_index”:11},{“rows_index”:12},{“rows_index”:13},{“rows_index”:14},{“rows_index”:15},{“rows_index”:16},{“rows_index”:17}],”columns”:2,”rows”:18,”style”:”top”,”alignment”:”center”,”titleColor”:”#F8F8F8″,”backgroundColor”:”#FFFFFF”,”borderColor”:”#C9CDCF”,”tableSizes”:[38,61]});
_Element.prototype.settings.page_element_id = “882974827803254745”;
_Element.prototype.element_id = “ad68ec80-77c4-4a40-a1e8-1a10126ecb37”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/702688850553606843-1.4.1/assets/”;
new _Element({
el: ‘#element-ad68ec80-77c4-4a40-a1e8-1a10126ecb37’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement882974827803254745();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement882974827803254745, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement882974827803254745();
}
});
}

#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table-wrapper {
padding: 20px 0;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table {
width: 100%;
border: 1px solid #C9CDCF;
border-spacing: 0;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table td.cell {
border-right: 1px solid #C9CDCF;
border-bottom: 1px solid #C9CDCF;
word-break: break-word;
background-color: #FFFFFF;
width: 50%;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table td.cell .paragraph {
width: 90%;
margin: 0 5%;
padding-bottom: 10px;
padding-top: 10px;
text-align: center;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table.style-top tr:first-child td,
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table.style-side td:first-of-type {
background-color: #F8F8F8;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table.style-top tr:first-child td .paragraph,
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table.style-side td:first-of-type .paragraph {
font-weight: 700;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table tr:last-child td {
border-bottom: none;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table td:last-of-type {
border-right: none;
}
#element-c57aa529-d280-4954-a9b2-4a663fce2e56 .simple-table .empty-content-area-element {
padding-left: 0px !important;
}

Bus Pad Stop or Major Stop
Bus Lines to Serve This Stop
​Sausalito Ferry
17, 30, 71
Spencer Ave (Monte Mar NB only)
4, 70, 101
Marin City (Donahue & Terners)
17, 22, 30, 36, 70, 71
Seminary Drive
30, 36, 70, 71
Tiburon Wye (E Blithedale Ave)
17, 22, 30, 36, 70, 71
Corte Madera (Tamalpais Drive)
17, 22, 27, 30, 36, 70
Lucky Drive
17, 27, 30, 36, 70
​San Rafael Transit Center
17, 22, 23, 23X, 29, 30, 35, 36, 40, 49, 70, 71, 101, 228, 233, 245
N San Pedro Road
70, 245
Terra Linda (Freitas Parkway)
70
Lucas Valley Rd (Smith Ranch Rd)
35, 49, 70
Marinwood (St Vincent Dr)
35, 49, 70
Alameda del Prado (Nave Dr)
35, 70
Ignacio (Enfrente & Salvatore)
35, 49, 70, 71
Rowland Blvd
35, 70, 71
De Long Avenue
35, 70, 71, 101
​Novato (Redwood & Grant)
35, 49, 70, 71, 101, 251

function setupElement154947191388771721() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “702688850553606843-1.4.1”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var SimpleTable = PlatformElement.extend({
initialize: function() {
this.setSizes();
},
setSizes: function() {
var sizes = this.settings.get(‘tableSizes’);
// if the # of columns isn’t the size of the array of lengths, ignore it.
if (sizes && sizes != “default” && this.settings.get(‘columns’) == sizes.length) {
var columns = this.$(‘tr’).each(function(index, value) {
var cells = $(value).find(‘td’).each(function(index2, value2) {
$(value2).css(‘width’, sizes[index2] + ‘%’);
});
});
}
}
});
return SimpleTable;
})();;
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“columns_each”:[{“columns_index”:0},{“columns_index”:1}],”rows_each”:[{“rows_index”:0},{“rows_index”:1},{“rows_index”:2},{“rows_index”:3},{“rows_index”:4},{“rows_index”:5},{“rows_index”:6},{“rows_index”:7},{“rows_index”:8},{“rows_index”:9},{“rows_index”:10},{“rows_index”:11},{“rows_index”:12},{“rows_index”:13},{“rows_index”:14},{“rows_index”:15},{“rows_index”:16},{“rows_index”:17}],”columns”:2,”rows”:18,”style”:”top”,”alignment”:”center”,”titleColor”:”#F8F8F8″,”backgroundColor”:”#FFFFFF”,”borderColor”:”#C9CDCF”,”tableSizes”:[38,61]});
_Element.prototype.settings.page_element_id = “154947191388771721”;
_Element.prototype.element_id = “c57aa529-d280-4954-a9b2-4a663fce2e56”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/702688850553606843-1.4.1/assets/”;
new _Element({
el: ‘#element-c57aa529-d280-4954-a9b2-4a663fce2e56’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement154947191388771721();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement154947191388771721, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement154947191388771721();
}
});
}

function setupElement812197402936259286() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “135397292802228534-1.3.2”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var TabbedBox = PlatformElement.extend({
events: {
‘click .tabbed-box-tab’: ‘clickTab’,
// in case they type and that causes an overflow, we should determine scrollability here
‘keyup .tabbed-box-tab .paragraph’: ‘determineScrollability’,
‘mousedown .scrollArrow-left’: ‘scrollLeft’,
‘mousedown .scrollArrow-right’: ‘scrollRight’,
‘touchstart .scrollArrow-left’: ‘scrollLeft’,
‘touchstart .scrollArrow-right’: ‘scrollRight’
},
initialize: function() {
var view = this;
var tabs = this.$(‘.tabbed-box-tab’);
var content = this.$(‘.tabbed-box-content’);
// optimization
this.scrollArrowLeft = this.$(‘.scrollArrow-left’);
this.scrollArrowRight = this.$(‘.scrollArrow-right’);
this.scrollTabsBar = this.$(‘.tabbed-box-tab-group’);
// resize handler and mouseup handler
// since we want to be able to handle mouseup wherever the user releases (not just over the element)
// we set it here as a property of the window.
$(window).resize(function() {
this.determineScrollability();
}.bind(this)).on(‘mouseup touchend’, function() {
this.stopScrolling();
}.bind(this));
// since scroll events don’t propagate up, we have to bind it here as opposed to in the events object
this.$(‘.tabbed-box-tab-group’).scroll(function() {
this.determineHandlers();
}.bind(this));
// determine whether or not we should show the scroll handlers
this.determineScrollability();
// load the first tab.
$(document).ready(function() {
this.scrollTabsBar.children().first().click();
}.bind(this));
},
/*
Handle click event on a tab.
Uses ‘rel’ attribute of each tab as an index to access
the class of the corresponding content area.
*/
clickTab: function(e) {
var active = $(e.currentTarget); // Clicked tab
var content_wrapper = this.$(‘.tabbed-box-content-group’); // wrapper for all content divs
this.stopScrolling();
this.determineClickScroll(active);
// Set new active tab
active.siblings().removeClass(‘active’);
active.addClass(‘active’);
// mark the new active tab
this.settings.set(‘activeTabIndexInternal’, this.scrollTabsBar.children().index(active));
this.settings.save();
// Set new active content
content_wrapper.children().hide();
content_wrapper.find(‘.’ + active.attr(‘rel’)).fadeIn();
this.determineHandlers();
// Stop propagation in case this is a nested tab app
e.stopPropagation();
},
// determines whether or not the two arrows (left and right scroll handlers) should be visible or not.
determineScrollability: function() {
var group = this.scrollTabsBar[0];
if (group.scrollWidth > group.clientWidth) {
this.$el.children().addClass(‘scrollable’);
this.determineHandlers();
} else {
this.$el.children().removeClass(‘scrollable’);
}
},
// determines whether or not the two arrows (left and right scroll handlers) should be active or not.
determineHandlers: function() {
var target = this.scrollTabsBar[0];
// left handler
if (target.scrollLeft != 0) {
this.scrollArrowLeft.addClass(‘active’);
} else {
this.scrollArrowLeft.removeClass(‘active’);
}
// right handler
if (target.scrollLeft + target.clientWidth < target.scrollWidth – 1) {
this.scrollArrowRight.addClass('active');
} else {
this.scrollArrowRight.removeClass('active');
}
},
// scrolls the tabs bar to the left.
scrollLeft: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowRight.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft -= Math.floor(factor);
factor *= 1.05;
if (scrollEl.scrollLeft == 0) {
view.stopScrolling();
}
}, 10);
},
// scrolls the tabs bar to the right.
scrollRight: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowLeft.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft += Math.floor(factor);
factor *= 1.05;
// forcefully stop the interval if it's not doing anything anymore
if (scrollEl.scrollLeft + scrollEl.clientWidth == scrollEl.scrollWidth) {
view.stopScrolling();
}
}, 10);
},
stopScrolling: function() {
clearInterval(this.scrollInterval);
this.determineHandlers();
},
determineClickScroll: function(active) {
// figure out where the element is, and if we need to change our view to show it
var scroll;
// determine where the element we're going to is in respect to the tabs bar
// 25px is the size of the scroll arrows
var leftSidePosition = active.position().left – 50;
var rightSidePosition = active.position().left + active.width() + 50;
// the gap is how much space we want there to be between the selected element
// when it's out of view, and we go to it.
var gap = 25;
if (this.scrollTabsBar.children().index(active) == 0) {
// this the first element, so define the scroll to be 0.
scroll = 0;
} else if (this.scrollTabsBar.children().index(active) == this.scrollTabsBar.children().length – 1) {
// this the last element, so define the scroll to be all the way to the right.
scroll = this.scrollTabsBar[0].scrollWidth – this.scrollTabsBar[0].clientWidth;
} else if (leftSidePosition this.scrollTabsBar.width()) {
// the right corner is out of view.
scroll = this.scrollTabsBar[0].scrollLeft + (rightSidePosition – this.scrollTabsBar.width()) + gap;
} else {
scroll = this.scrollTabsBar[0].scrollLeft;
}
// start scrolling
scroll = Math.floor(scroll);
var delta = scroll – this.scrollTabsBar[0].scrollLeft;
var startedDown = false;
if (delta != 0) {
clearInterval(this.scrollInterval);
var distance = 0;
var direction = (delta > 0 ? 1 : -1);
var speed = 1;
var factor = 1.25; // for parabolic acceleration
this.scrollInterval = setInterval(function() {
if (distance >= Math.abs(delta)) {
this.stopScrolling();
}
this.scrollTabsBar[0].scrollLeft += (Math.max(1, Math.floor(speed)) * direction);
distance += Math.max(1, Math.floor(speed));
if (distance * 2 >= Math.abs(delta)) { // if we’ve traversed more than half
if (factor == 1.25) { // 5/4
factor = 1; // 4/4
} else {
factor = 0.8; // 4/5
}
}
speed *= factor;
}.bind(this), 20);
}
}
});
return TabbedBox;
})();
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“tabs_each”:[{“tabs_index”:0},{“tabs_index”:1},{“tabs_index”:2}],”activeTabIndexInternal_each”:[{“activeTabIndexInternal_index”:0},{“activeTabIndexInternal_index”:1}],”theme”:”standard”,”tabs”:3,”active_tab”:”white”,”inactive_tab”:”#F7F7F7″,”border_color”:”#CCCCCC”,”activeTabIndexInternal”:2});
_Element.prototype.settings.page_element_id = “812197402936259286”;
_Element.prototype.element_id = “05861144-d5cf-4857-8d6c-d19c0b3dfcdc”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/135397292802228534-1.3.2/assets/”;
new _Element({
el: ‘#element-05861144-d5cf-4857-8d6c-d19c0b3dfcdc’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement812197402936259286();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement812197402936259286, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement812197402936259286();
}
});
}


We will then have to address the basic issue of departure times as it is crucial to understand how existing routes interact with one another.
Symbol Notes:
* – operates weekday peak periods
+ – weekday departures only
^ – weekend and holiday departures only

#element-54388d52-374d-4c57-b91e-53432591bdd4 .border-box {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box {
position: relative;
margin: 20px 0;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-tab-group {
font-size: 0;
margin: 0;
padding: 0;
float: left;
list-style: none;
height: 60px;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
white-space: nowrap;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-tab {
margin: 0;
cursor: pointer;
height: 60px;
display: inline-block;
min-width: 19%;
position: relative;
background-color: #F7F7F7;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-content-group {
clear: both;
float: left;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-content {
padding: 40px 20px 40px 20px;
display: none;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .scrollArrow {
width: 25px;
background-color: white;
text-align: center;
position: absolute;
z-index: 3;
top: 0;
display: none;
cursor: pointer;
height: 60px;
line-height: 60px;
font-weight: bold;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .scrollArrow.scrollArrow-left {
left: 0;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .scrollArrow.scrollArrow-right {
right: 0;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box.scrollable .tabbed-box-tab-group {
border-bottom: none;
overflow-x: hidden;
overflow-y: hidden;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box.scrollable .tabbed-box-bar:hover .scrollArrow.active {
display: block;
}
@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3),only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2),only screen and (max-width: 499px) {
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-tab-group {
overflow-x: scroll !important;
}
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard .tabbed-box-tab-group {
border-left: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard .tabbed-box-tab {
border: 1px solid #CCCCCC;
border-left: none;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard .tabbed-box-tab .paragraph {
color: #A8ABAC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard .tabbed-box-content-group {
border: 1px solid #CCCCCC;
border-top: none;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard.scrollable .tabbed-box-tab-group {
border-right: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard.scrollable .tabbed-box-tab-group .tabbed-box-tab:last-child {
border-right: none;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard.scrollable .scrollArrow-left {
border: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .standard.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line .tabbed-box-tab-group {
border: 1px solid #CCCCCC;
border-bottom: none;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line .tabbed-box-content-group {
border: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line.scrollable .tabbed-box-tab-group {
height: 61px;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line.scrollable .tabbed-box-content-group {
border-top: none;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line.scrollable .scrollArrow-left,
#element-54388d52-374d-4c57-b91e-53432591bdd4 .line.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
border-bottom: none;
border-top: none;
height: 61px;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .simple .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
height: 61px;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .simple .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .simple .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .simple .tabbed-box-content-group {
border-top: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .simple .tabbed-box-content {
padding: 20px 0px 20px 0px;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .simple .scrollArrow-left {
border-right: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .simple .scrollArrow-right {
border-left: 1px solid #CCCCCC;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .s3d-shadow {
-webkit-box-shadow: #f5f5f5;
-moz-box-shadow: #f5f5f5;
box-shadow: #f5f5f5;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .s3d-content-shadow {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .s3d .tabbed-box-tab .paragraph {
color: #A8ABAC;
background-color: #F7F7F7;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .s3d .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
-webkit-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
-moz-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .s3d .tabbed-box-tab.active .paragraph {
background-color: white;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .s3d .tabbed-box-content-group {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-tab .paragraph {
padding: 0px;
line-height: 60px !important;
text-align: center !important;
font-weight: bold;
font-size: 16px !important;
margin: 0 20px;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-content .paragraph {
padding: 0;
line-height: 30px;
}
#element-54388d52-374d-4c57-b91e-53432591bdd4 .tabbed-box-tab:last-child .w-delete-outer {
display: none;
position: relative;
float: right;
}

  • Novato
  • San Rafael TC
  • Marin City
<
>

Novato (Redwood & Grant)

#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table-wrapper {
padding: 20px 0;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table {
width: 100%;
border: 1px solid #C9CDCF;
border-spacing: 0;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table td.cell {
border-right: 1px solid #C9CDCF;
border-bottom: 1px solid #C9CDCF;
word-break: break-word;
background-color: #FFFFFF;
width: 50%;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table td.cell .paragraph {
width: 90%;
margin: 0 5%;
padding-bottom: 10px;
padding-top: 10px;
text-align: center;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table.style-top tr:first-child td,
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table.style-side td:first-of-type {
background-color: #F8F8F8;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table.style-top tr:first-child td .paragraph,
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table.style-side td:first-of-type .paragraph {
font-weight: 700;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table tr:last-child td {
border-bottom: none;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table td:last-of-type {
border-right: none;
}
#element-f3d4c3dc-88d1-4d04-a990-00b717634347 .simple-table .empty-content-area-element {
padding-left: 0px !important;
}

Northbound
Southbound
Current:

  • :00 – Route 49+
  • :10 – Route 101*^
  • :25 – Routes 70*, 71
  • :35 – Route 259+
  • :40 – Routes 101, 251
  • :55 – Route 70, 259^
Current:

  • :05 – Route 259^
  • :20 – Routes 101^, 251
  • :25 – Routes 49, 70, 71*
  • :50 – Routes 101, 259+
  • :55 – Routes 70*, 71
Future:

  • :00 – Routes 49, 71
  • :15 – Routes 35, 101*^
  • :30 – Routes 49*, 70
  • :45 – Routes 35, 101, 251
Future:

  • :15 – Routes 35, 71
  • :20 – Routes 49, 101^, 251
  • :45 – Route 35
  • :50 – Routes 49*, 101
  • :55 – Route 70

function setupElement533751293149456705() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “702688850553606843-1.4.1”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var SimpleTable = PlatformElement.extend({
initialize: function() {
this.setSizes();
},
setSizes: function() {
var sizes = this.settings.get(‘tableSizes’);
// if the # of columns isn’t the size of the array of lengths, ignore it.
if (sizes && sizes != “default” && this.settings.get(‘columns’) == sizes.length) {
var columns = this.$(‘tr’).each(function(index, value) {
var cells = $(value).find(‘td’).each(function(index2, value2) {
$(value2).css(‘width’, sizes[index2] + ‘%’);
});
});
}
}
});
return SimpleTable;
})();;
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“columns_each”:[{“columns_index”:0},{“columns_index”:1}],”rows_each”:[{“rows_index”:0},{“rows_index”:1},{“rows_index”:2}],”columns”:2,”rows”:3,”style”:”top”,”alignment”:”center”,”titleColor”:”#F8F8F8″,”backgroundColor”:”#FFFFFF”,”borderColor”:”#C9CDCF”,”tableSizes”:”default”});
_Element.prototype.settings.page_element_id = “533751293149456705”;
_Element.prototype.element_id = “f3d4c3dc-88d1-4d04-a990-00b717634347”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/702688850553606843-1.4.1/assets/”;
new _Element({
el: ‘#element-f3d4c3dc-88d1-4d04-a990-00b717634347’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement533751293149456705();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement533751293149456705, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement533751293149456705();
}
});
}

SMART Train Notice: buses serving Redwood & Olive (including Routes 35, 49, 70, 71, and 101) may also serve the Atherton (North Novato) SMART station when revenue service begins late 2016. I will post updates regarding that service adjustment when the time comes. Also, on a separate post, I will also describe how Novato services could be reorganized to provide circulator transit services to serve the train stations citywide, including Hamilton and Atherton.

San Rafael Transit Center

#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table-wrapper {
padding: 20px 0;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table {
width: 100%;
border: 1px solid #C9CDCF;
border-spacing: 0;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table td.cell {
border-right: 1px solid #C9CDCF;
border-bottom: 1px solid #C9CDCF;
word-break: break-word;
background-color: #FFFFFF;
width: 50%;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table td.cell .paragraph {
width: 90%;
margin: 0 5%;
padding-bottom: 10px;
padding-top: 10px;
text-align: center;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table.style-top tr:first-child td,
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table.style-side td:first-of-type {
background-color: #F8F8F8;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table.style-top tr:first-child td .paragraph,
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table.style-side td:first-of-type .paragraph {
font-weight: 700;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table tr:last-child td {
border-bottom: none;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table td:last-of-type {
border-right: none;
}
#element-253b07de-a961-46de-ae67-7c4e18c2ccb2 .simple-table .empty-content-area-element {
padding-left: 0px !important;
}

Northbound or Eastbound
Southbound or Westbound
Current:

  • :00 – Routes 40, 45+, 70, 71*, 233, 259^
  • :15 – Routes 23, 36*+, 49+, 101
  • :30 – Routes 40*, 45^, 45K+, 70, 71*, 228^, 257+
  • :45 – Routes 36*+, 101*^, 259+ 
Current:

  • :00 – Routes 17*, 22, 29+, 35, 70, 71*
  • :15 – Routes 23, 36*+, 101*+
  • :30 – Routes 17, 22*, 29*+, 35, 228^
  • :45 – Routes 27+, 36*+, 68, 101^
Future:

  • :00 – Routes 35, 40, 70, 233
  • :15 – Routes 23, 36, 49, 101
  • :30 – Routes 23X, 35, 40*, 245, 257
  • :45 – Routes 36, 49*, 71, 101*^
Future:

  • :00 – Routes 17*, 22, 23X, 29, 30, 35
  • :15 – Routes 23, 36, 101*+
  • :30 – Routes 17, 22*, 35, 70, 228
  • :45 – Routes 27+, 36, 68, 71, 101^

function setupElement886014731273059593() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “702688850553606843-1.4.1”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var SimpleTable = PlatformElement.extend({
initialize: function() {
this.setSizes();
},
setSizes: function() {
var sizes = this.settings.get(‘tableSizes’);
// if the # of columns isn’t the size of the array of lengths, ignore it.
if (sizes && sizes != “default” && this.settings.get(‘columns’) == sizes.length) {
var columns = this.$(‘tr’).each(function(index, value) {
var cells = $(value).find(‘td’).each(function(index2, value2) {
$(value2).css(‘width’, sizes[index2] + ‘%’);
});
});
}
}
});
return SimpleTable;
})();;
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“columns_each”:[{“columns_index”:0},{“columns_index”:1}],”rows_each”:[{“rows_index”:0},{“rows_index”:1},{“rows_index”:2}],”columns”:2,”rows”:3,”style”:”top”,”alignment”:”center”,”titleColor”:”#F8F8F8″,”backgroundColor”:”#FFFFFF”,”borderColor”:”#C9CDCF”,”tableSizes”:”default”});
_Element.prototype.settings.page_element_id = “886014731273059593”;
_Element.prototype.element_id = “253b07de-a961-46de-ae67-7c4e18c2ccb2”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/702688850553606843-1.4.1/assets/”;
new _Element({
el: ‘#element-253b07de-a961-46de-ae67-7c4e18c2ccb2’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement886014731273059593();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement886014731273059593, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement886014731273059593();
}
});
}

SMART Train Notice: train departures from San Rafael will be coordinated to onward Golden Gate Transit and Marin Transit departures, with rush hour departures on the hour (:00) and half past the hour (:30), and on the hour (:00) at other times.

Marin City (Donahue & Terners)

#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table-wrapper {
padding: 20px 0;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table {
width: 100%;
border: 1px solid #C9CDCF;
border-spacing: 0;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table td.cell {
border-right: 1px solid #C9CDCF;
border-bottom: 1px solid #C9CDCF;
word-break: break-word;
background-color: #FFFFFF;
width: 50%;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table td.cell .paragraph {
width: 90%;
margin: 0 5%;
padding-bottom: 10px;
padding-top: 10px;
text-align: center;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table.style-top tr:first-child td,
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table.style-side td:first-of-type {
background-color: #F8F8F8;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table.style-top tr:first-child td .paragraph,
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table.style-side td:first-of-type .paragraph {
font-weight: 700;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table tr:last-child td {
border-bottom: none;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table td:last-of-type {
border-right: none;
}
#element-ce417de9-3e95-43f1-95b0-fe464ec4662b .simple-table .empty-content-area-element {
padding-left: 0px !important;
}

Northbound
Southbound
Current:

  • :00 – Routes 70, 71*
  • :10 – Route 17*
  • :15 – Route 36*+
  • :25 – Route 22
  • :35 – Routes 10, 71
  • :40 – Route 17
  • :45 – Route 36*+
  • :55 – Route 22*
Current:

  • :15 – Routes 17, 70
  • :45 – Route 17*
  • ​​:50 – Route 10
Future:

  • :00 – Route 30
  • :10 – Route 17*
  • :15 – Route 36
  • :25 – Route 22
  • :30 – Routes 70, 71
  • :40 – Route 17
  • :45 – Route 36
  • :55 – Route 22*
Future:

  • :00 – Route 71
  • :15 – Routes 17. 30
  • :45 – Routes 17*, 70

function setupElement128425029973685633() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “702688850553606843-1.4.1”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var SimpleTable = PlatformElement.extend({
initialize: function() {
this.setSizes();
},
setSizes: function() {
var sizes = this.settings.get(‘tableSizes’);
// if the # of columns isn’t the size of the array of lengths, ignore it.
if (sizes && sizes != “default” && this.settings.get(‘columns’) == sizes.length) {
var columns = this.$(‘tr’).each(function(index, value) {
var cells = $(value).find(‘td’).each(function(index2, value2) {
$(value2).css(‘width’, sizes[index2] + ‘%’);
});
});
}
}
});
return SimpleTable;
})();;
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“columns_each”:[{“columns_index”:0},{“columns_index”:1}],”rows_each”:[{“rows_index”:0},{“rows_index”:1},{“rows_index”:2}],”columns”:2,”rows”:3,”style”:”top”,”alignment”:”center”,”titleColor”:”#F8F8F8″,”backgroundColor”:”#FFFFFF”,”borderColor”:”#C9CDCF”,”tableSizes”:”default”});
_Element.prototype.settings.page_element_id = “128425029973685633”;
_Element.prototype.element_id = “ce417de9-3e95-43f1-95b0-fe464ec4662b”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/702688850553606843-1.4.1/assets/”;
new _Element({
el: ‘#element-ce417de9-3e95-43f1-95b0-fe464ec4662b’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement128425029973685633();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement128425029973685633, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement128425029973685633();
}
});
}

function setupElement108253887124413561() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “135397292802228534-1.3.2”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var TabbedBox = PlatformElement.extend({
events: {
‘click .tabbed-box-tab’: ‘clickTab’,
// in case they type and that causes an overflow, we should determine scrollability here
‘keyup .tabbed-box-tab .paragraph’: ‘determineScrollability’,
‘mousedown .scrollArrow-left’: ‘scrollLeft’,
‘mousedown .scrollArrow-right’: ‘scrollRight’,
‘touchstart .scrollArrow-left’: ‘scrollLeft’,
‘touchstart .scrollArrow-right’: ‘scrollRight’
},
initialize: function() {
var view = this;
var tabs = this.$(‘.tabbed-box-tab’);
var content = this.$(‘.tabbed-box-content’);
// optimization
this.scrollArrowLeft = this.$(‘.scrollArrow-left’);
this.scrollArrowRight = this.$(‘.scrollArrow-right’);
this.scrollTabsBar = this.$(‘.tabbed-box-tab-group’);
// resize handler and mouseup handler
// since we want to be able to handle mouseup wherever the user releases (not just over the element)
// we set it here as a property of the window.
$(window).resize(function() {
this.determineScrollability();
}.bind(this)).on(‘mouseup touchend’, function() {
this.stopScrolling();
}.bind(this));
// since scroll events don’t propagate up, we have to bind it here as opposed to in the events object
this.$(‘.tabbed-box-tab-group’).scroll(function() {
this.determineHandlers();
}.bind(this));
// determine whether or not we should show the scroll handlers
this.determineScrollability();
// load the first tab.
$(document).ready(function() {
this.scrollTabsBar.children().first().click();
}.bind(this));
},
/*
Handle click event on a tab.
Uses ‘rel’ attribute of each tab as an index to access
the class of the corresponding content area.
*/
clickTab: function(e) {
var active = $(e.currentTarget); // Clicked tab
var content_wrapper = this.$(‘.tabbed-box-content-group’); // wrapper for all content divs
this.stopScrolling();
this.determineClickScroll(active);
// Set new active tab
active.siblings().removeClass(‘active’);
active.addClass(‘active’);
// mark the new active tab
this.settings.set(‘activeTabIndexInternal’, this.scrollTabsBar.children().index(active));
this.settings.save();
// Set new active content
content_wrapper.children().hide();
content_wrapper.find(‘.’ + active.attr(‘rel’)).fadeIn();
this.determineHandlers();
// Stop propagation in case this is a nested tab app
e.stopPropagation();
},
// determines whether or not the two arrows (left and right scroll handlers) should be visible or not.
determineScrollability: function() {
var group = this.scrollTabsBar[0];
if (group.scrollWidth > group.clientWidth) {
this.$el.children().addClass(‘scrollable’);
this.determineHandlers();
} else {
this.$el.children().removeClass(‘scrollable’);
}
},
// determines whether or not the two arrows (left and right scroll handlers) should be active or not.
determineHandlers: function() {
var target = this.scrollTabsBar[0];
// left handler
if (target.scrollLeft != 0) {
this.scrollArrowLeft.addClass(‘active’);
} else {
this.scrollArrowLeft.removeClass(‘active’);
}
// right handler
if (target.scrollLeft + target.clientWidth < target.scrollWidth – 1) {
this.scrollArrowRight.addClass('active');
} else {
this.scrollArrowRight.removeClass('active');
}
},
// scrolls the tabs bar to the left.
scrollLeft: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowRight.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft -= Math.floor(factor);
factor *= 1.05;
if (scrollEl.scrollLeft == 0) {
view.stopScrolling();
}
}, 10);
},
// scrolls the tabs bar to the right.
scrollRight: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowLeft.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft += Math.floor(factor);
factor *= 1.05;
// forcefully stop the interval if it's not doing anything anymore
if (scrollEl.scrollLeft + scrollEl.clientWidth == scrollEl.scrollWidth) {
view.stopScrolling();
}
}, 10);
},
stopScrolling: function() {
clearInterval(this.scrollInterval);
this.determineHandlers();
},
determineClickScroll: function(active) {
// figure out where the element is, and if we need to change our view to show it
var scroll;
// determine where the element we're going to is in respect to the tabs bar
// 25px is the size of the scroll arrows
var leftSidePosition = active.position().left – 50;
var rightSidePosition = active.position().left + active.width() + 50;
// the gap is how much space we want there to be between the selected element
// when it's out of view, and we go to it.
var gap = 25;
if (this.scrollTabsBar.children().index(active) == 0) {
// this the first element, so define the scroll to be 0.
scroll = 0;
} else if (this.scrollTabsBar.children().index(active) == this.scrollTabsBar.children().length – 1) {
// this the last element, so define the scroll to be all the way to the right.
scroll = this.scrollTabsBar[0].scrollWidth – this.scrollTabsBar[0].clientWidth;
} else if (leftSidePosition this.scrollTabsBar.width()) {
// the right corner is out of view.
scroll = this.scrollTabsBar[0].scrollLeft + (rightSidePosition – this.scrollTabsBar.width()) + gap;
} else {
scroll = this.scrollTabsBar[0].scrollLeft;
}
// start scrolling
scroll = Math.floor(scroll);
var delta = scroll – this.scrollTabsBar[0].scrollLeft;
var startedDown = false;
if (delta != 0) {
clearInterval(this.scrollInterval);
var distance = 0;
var direction = (delta > 0 ? 1 : -1);
var speed = 1;
var factor = 1.25; // for parabolic acceleration
this.scrollInterval = setInterval(function() {
if (distance >= Math.abs(delta)) {
this.stopScrolling();
}
this.scrollTabsBar[0].scrollLeft += (Math.max(1, Math.floor(speed)) * direction);
distance += Math.max(1, Math.floor(speed));
if (distance * 2 >= Math.abs(delta)) { // if we’ve traversed more than half
if (factor == 1.25) { // 5/4
factor = 1; // 4/4
} else {
factor = 0.8; // 4/5
}
}
speed *= factor;
}.bind(this), 20);
}
}
});
return TabbedBox;
})();
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“tabs_each”:[{“tabs_index”:0},{“tabs_index”:1},{“tabs_index”:2}],”theme”:”standard”,”tabs”:3,”active_tab”:”white”,”inactive_tab”:”#F7F7F7″,”border_color”:”#CCCCCC”,”activeTabIndexInternal”:0});
_Element.prototype.settings.page_element_id = “108253887124413561”;
_Element.prototype.element_id = “54388d52-374d-4c57-b91e-53432591bdd4”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/135397292802228534-1.3.2/assets/”;
new _Element({
el: ‘#element-54388d52-374d-4c57-b91e-53432591bdd4’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement108253887124413561();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement108253887124413561, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement108253887124413561();
}
});
}


Leave a Reply

Top