Created
May 5, 2015 05:13
-
-
Save shaobos/fe4df4a64fabadad3fe3 to your computer and use it in GitHub Desktop.
off the grid script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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