Skip to content

Instantly share code, notes, and snippets.

@shaobos
Created May 5, 2015 05:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shaobos/fe4df4a64fabadad3fe3 to your computer and use it in GitHub Desktop.
Save shaobos/fe4df4a64fabadad3fe3 to your computer and use it in GitHub Desktop.
off the grid script
/**
* Copyright (c) 2007-2013 Ariel Flesler - aflesler<a>gmail<d>com | http://flesler.blogspot.com
* Dual licensed under MIT and GPL.
* @author Ariel Flesler
* @version 1.4.6
*/
;(function($){var h=$.scrollTo=function(a,b,c){$(window).scrollTo(a,b,c)};h.defaults={axis:'xy',duration:parseFloat($.fn.jquery)>=1.3?0:1,limit:true};h.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(e,f,g){if(typeof f=='object'){g=f;f=0}if(typeof g=='function')g={onAfter:g};if(e=='max')e=9e9;g=$.extend({},h.defaults,g);f=f||g.duration;g.queue=g.queue&&g.axis.length>1;if(g.queue)f/=2;g.offset=both(g.offset);g.over=both(g.over);return this._scrollable().each(function(){if(e==null)return;var d=this,$elem=$(d),targ=e,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}$.each(g.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=h.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(g.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=g.offset[pos]||0;if(g.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*g.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(g.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&g.queue){if(old!=attr[key])animate(g.onAfterFirst);delete attr[key]}});animate(g.onAfter);function animate(a){$elem.animate(attr,f,g.easing,a&&function(){a.call(this,targ,g)})}}).end()};h.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
jQuery(document).ready(function($) {
var doScrollStuff = !('ontouchstart' in window);
if('undefined' !== typeof OTGMarketsJson) {
var markets = window.markets = new OTGMarkets($, $.parseJSON(OTGMarketsJson));
var $container = $('.otg-markets'),
$map = $('.otg-markets-map-container'),
$window = $(window),
containerTop = $container.offset().top,
mapHeight = $map.height();
if($container.size() && $map.size() && doScrollStuff) {
$window.scroll(function(event) {
var containerHeight = $container.height();
if(($window.scrollTop() + mapHeight) > (containerTop + containerHeight)) {
$map.css('position', 'absolute');
$map.css('top', (containerHeight - mapHeight));
} else if($window.scrollTop() > containerTop) {
$map.css('position', 'fixed');
$map.css('top', '');
} else {
$map.css('position', 'static');
$map.css('top', '');
}
});
}
markets.initialize();
}
$(document).on('click', '.otg-vendor-book-link', function(event) {
event.preventDefault();
$.fancybox($('#catering-modal').html(), {
padding: 0
});
});
// Set up the vendor filtering page
var $categories = $('.otg-vendor-category').hide();
var $selectors = $('.otg-vendor-selector').click(function(event) {
event.preventDefault();
var $this = $(this);
$selectors.removeClass('active').filter($this).addClass('active');
var $active = $categories.filter('.active');
var $next = $categories.filter($this.attr('href') + '-tab');
$active.hide().removeClass('active');
$next.show().addClass('active');
document.location.hash = $this.attr('href');
});
var $selector = $();
if(document.location.hash) {
$selector = $selectors.filter('[href="' + document.location.hash + '"]');
}
if(0 == $selector.size()) {
$selector = $selectors.first();
}
$selector.click();
});
function OTGMarkets($, markets) {
var self = this;
self.$ = $;
self.markets = markets;
var $events, activeMarket, delta, map, mapBounds, mapMarkers = {}, mapWindows = {}, mapMarkerActive = null, mapWindowOpen = null, marketMarkup = {}, itemClicked = false, shouldTrigger = true;
self.map = map;
this.initialize = function() {
delta = $('.otg-markets-week-delta-current').val();
$events = $('.otg-markets-event');
$(document).on('click touchstart', '.otg-market-data-close-link', function(event) {
event.preventDefault();
if(null !== mapWindowOpen) {
mapWindowOpen.close();
mapWindowOpen = null;
}
if(null !== mapMarkerActive) {
mapMarkerActive.setZIndex(mapMarkerActive.originalZIndex);
mapMarkerActive = null;
}
$events.removeClass('active');
});
$(document).on('click', '.otg-markets-event', function(event) {
event.preventDefault();
var $this = $(this), marketId = $this.attr('data-otg-market-id');
$events.removeClass('active').filter($this).addClass('active');
itemClicked = true;
if(shouldTrigger && mapMarkers[marketId]) {
google.maps.event.trigger(mapMarkers[marketId], 'click');
}
itemClicked = false;
$(window).scrollTo($this.parent().parent());
setTimeout(function() {
$(window).scroll();
}, 100);
});
$(document).on('click', '.otg-markets-sidebar-pagination-link', function(event) {
event.preventDefault();
var $this = $(this);
var $sidebar = $('.otg-markets-sidebar');
$(window).scrollTo($sidebar, 250, {
onAfter: function() {
$.get(
OTGData.eventsListUrl,
{
active: activeMarket,
delta: $this.data('delta')
},
function(html, status) {
var $events_list = $(html);
$sidebar.replaceWith($events_list);
delta = $('.otg-markets-week-delta-current').val();
marketMarkup = {};
$events = $('.otg-markets-event');
$events.filter('.active').first().click();
},
'html'
);
}
});
});
this.initializeMap();
if(document.location.hash) {
var marketName = document.location.hash.substr(1),
marketNameDecoded = decodeURIComponent(marketName),
marketNameParts = marketName.split('-'),
marketNamePartsId = marketNameParts[0];
for(var marketIndex in self.markets) {
if(self.markets.hasOwnProperty(marketIndex) && self.markets[marketIndex] && (self.markets[marketIndex].name == marketName || self.markets[marketIndex].name == marketNameDecoded || self.markets[marketIndex].id == marketNamePartsId)) {
$events.filter('[data-otg-market-id="' + marketIndex + '"]').first().click();
break;
}
}
}
};
this.initializeMap = function() {
map = new google.maps.Map(getMapElement(), getMapOptions());
mapBounds = new google.maps.LatLngBounds();
var zIndex = 0;
var panTheMap = function($dom, map) {
setTimeout(function() {
var panDistance = (340 - 20 - $dom.outerHeight()); // height needed to bump bottom of info window to top of pane - clearance - height (including borders) of the info window
map.panBy(0, panDistance);
}, 250);
};
var marketsArray = [];
$.each(markets, function(marketKey, market) {
marketsArray.push(market);
});
marketsArray.sort(function(a, b) {
return b.latitude - a.latitude;
});
$.each(marketsArray, function(marketKey, market) {
zIndex++;
var ll, mapMarker, mapWindow;
ll = new google.maps.LatLng(market.latitude, market.longitude);
mapMarker = new MarkerWithLabel({
icon: OTGData.marketMarkers[market.market_type][market.status],
map: map,
position: ll,
title: market.name,
zIndex: zIndex,
/* MarketWithLabelOptions */
labelAnchor: new google.maps.Point(21, 50),
labelClass: 'otg-truck-count-label',
labelContent: market.truck_count
});
mapWindow = new InfoBox({
alignBottom: true,
closeBoxURL: '',
content: '<div class="otg-market-data otg-market-data-placeholder"><div class="otg-market-data-inner"><div class="otg-market-data-wait">' + OTGData.pleaseWaitText + '</div></div></div>',
enableEventPropagation: true,
infoBoxClearance: new google.maps.Size(20, 20),
pixelOffset: new google.maps.Size(-175, -60),
});
mapMarker.originalZIndex = mapMarker.getZIndex();
google.maps.event.addListener(mapMarker, 'click', function() {
if(null !== mapWindowOpen) {
mapWindowOpen.close();
mapWindowOpen = null;
}
if(null !== mapMarkerActive) {
mapMarkerActive.setZIndex(mapMarkerActive.originalZIndex);
mapMarkerActive = null;
}
mapMarker.setZIndex(marketsArray.length + 1);
mapMarkerActive = mapMarker;
map.panTo(mapMarker.getPosition());
mapWindow.open(map, mapMarker);
mapWindowOpen = mapWindow;
// Need to get rid of this if we've already clicked an item
if(!itemClicked) {
shouldTrigger = false;
$events.removeClass('active').filter('[data-otg-market-id="' + market.id + '"]:first').click();
shouldTrigger = true;
}
activeMarket = market.id;
document.location.hash = encodeURIComponent(market.hash_key);
if('undefined' === typeof marketMarkup[market.id]) {
$.get(
OTGData.marketDataUrl,
{
delta: delta,
market: market.id
},
function(data, status) {
marketMarkup[market.id] = data;
var $dom = $(marketMarkup[market.id]);
mapWindow.setContent($dom.get(0));
panTheMap($dom, map);
},
'html'
);
} else {
var $dom = $(marketMarkup[market.id]);
mapWindow.setContent($dom.get(0));
panTheMap($dom, map);
}
});
google.maps.event.addListener(mapWindow, 'closeclick', function() {
mapWindowOpen = null;
if(null !== mapMarkerActive) {
mapMarkerActive.setZIndex(mapMarkerActive.originalZIndex);
mapMarkerActive = null;
}
});
mapBounds.extend(ll);
mapMarkers[market.id] = mapMarker;
});
map.fitBounds(mapBounds);
};
function getMapElement() {
return $('#otg-markets-map').get(0);
}
function getMapOptions() {
return {
mapTypeControl: false,
mapTypeId: google.maps.MapTypeId.ROADMAP,
overviewMapControl: false,
panControl: false,
scaleControl: false,
streetViewControl: false,
zoomControl: true,
zoom: 8
};
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment