adding customer sidebar + posts over map + add validity interval (histo)
This commit is contained in:
@@ -22,4 +22,4 @@
|
||||
<footer></footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
@@ -2,15 +2,16 @@
|
||||
<div id="map">
|
||||
<div class="loader fa fa-map"></div>
|
||||
</div>
|
||||
<div id="legend"></div>
|
||||
<div id="legend">
|
||||
<div class="line green">Te Araroa</div>
|
||||
<div class="line blue">Routeburn Track</div>
|
||||
<div class="line red">Hors rando</div>
|
||||
</div>
|
||||
<div id="feed">
|
||||
<div id="poster">
|
||||
<input id="post" name="post" type="text" />
|
||||
<input id="name" name="name" type="text" /><button id="submit" name="submit" type="button" class="">+</button>
|
||||
</div>
|
||||
<div id="posts">
|
||||
<div id="poster"></div>
|
||||
<div id="posts_list"></div>
|
||||
<div id="next_posts"><button id="add_posts" name="add_posts" type="button">Messages plus anciens</button>
|
||||
<div id="next_posts"><button id="add_posts" name="add_posts" type="button" class="post">Messages plus anciens</button></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -18,6 +19,7 @@
|
||||
<script type="text/javascript">
|
||||
oSpot.pageInit = function(asHash)
|
||||
{
|
||||
self.tmp('$Map', $('#map'));
|
||||
$('#add_posts').click(updateFeed);
|
||||
self.get('messages', function(oMessages){
|
||||
|
||||
@@ -25,11 +27,12 @@ oSpot.pageInit = function(asHash)
|
||||
updateFeed(true);
|
||||
//setInterval(updateFeed, 60 * 1000); //refresh every minute
|
||||
|
||||
//Centering map on last message
|
||||
//Centering map
|
||||
var agCenter = {lat:0, lng:0};
|
||||
var iZoom = 0;
|
||||
if(self.vars('mode')=='blog')
|
||||
{
|
||||
//on last message
|
||||
var oLastMsg = oMessages[oMessages.length-1];
|
||||
agCenter.lat = oLastMsg.latitude;
|
||||
agCenter.lng = oLastMsg.longitude;
|
||||
@@ -37,16 +40,50 @@ oSpot.pageInit = function(asHash)
|
||||
}
|
||||
else
|
||||
{
|
||||
agCenter.lat = -43.75;
|
||||
agCenter.lng = 171;
|
||||
iZoom = 7;
|
||||
var iMapRatio = 0.7;
|
||||
var iMinLat, iMaxLat, iMinLng, iMaxLng;
|
||||
iMinLat = iMinLng = 180;
|
||||
iMaxLat = iMaxLng = -180;
|
||||
$.each(oMessages, function(iKey, oMsg){
|
||||
iMinLat = Math.min(iMinLat, oMsg.latitude);
|
||||
iMaxLat = Math.max(iMaxLat, oMsg.latitude);
|
||||
iMinLng = Math.min(iMinLng, oMsg.longitude);
|
||||
iMaxLng = Math.max(iMaxLng, oMsg.longitude);
|
||||
});
|
||||
|
||||
//Get Marker bounds
|
||||
var oSouthWest = {lat:iMinLat, lng:iMinLng};
|
||||
var oNorthEast = {lat:iMaxLat, lng:iMaxLng};
|
||||
oMarkerBounds = new google.maps.LatLngBounds(oSouthWest, oNorthEast);
|
||||
agCenter = oMarkerBounds.getCenter();
|
||||
|
||||
//Calculate adequate zoom (map.fitBounds is dezooming too much)
|
||||
var oMapDim = {height: self.tmp('$Map').height()*0.95, width: self.tmp('$Map').width()*(iMapRatio - 0.05)};
|
||||
iZoom = getBoundsZoomLevel(oMarkerBounds, oMapDim);
|
||||
}
|
||||
|
||||
var oMap = new google.maps.Map(document.getElementById('map'), {
|
||||
var oMap = new google.maps.Map(self.tmp('$Map')[0], {
|
||||
center: agCenter,
|
||||
zoom: iZoom,
|
||||
mapTypeId: google.maps.MapTypeId.SATELLITE,
|
||||
scaleControl: true
|
||||
scaleControl: true,
|
||||
scaleControlOptions: {
|
||||
position: google.maps.ControlPosition.TOP_LEFT
|
||||
},
|
||||
mapTypeControl: true,
|
||||
mapTypeControlOptions: {
|
||||
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
|
||||
position: google.maps.ControlPosition.TOP_LEFT
|
||||
},
|
||||
zoomControl: true,
|
||||
zoomControlOptions: {
|
||||
position: google.maps.ControlPosition.LEFT_TOP
|
||||
},
|
||||
fullscreenControl: true,
|
||||
fullscreenControlOptions: {
|
||||
position: google.maps.ControlPosition.LEFT_BOTTOM
|
||||
},
|
||||
streetViewControl: false
|
||||
});
|
||||
|
||||
var oKmlLayer = new google.maps.KmlLayer({
|
||||
@@ -59,10 +96,10 @@ oSpot.pageInit = function(asHash)
|
||||
$.each(oMessages, function(iKey, oMsg){
|
||||
var oMarker = new google.maps.Marker({
|
||||
id: oMsg.id_message,
|
||||
position: {lat:Number(oMsg.latitude), lng:Number(oMsg.longitude)},
|
||||
position: {lat:oMsg.latitude, lng:oMsg.longitude},
|
||||
//animation: google.maps.Animation.DROP,
|
||||
icon: (iKey%2==0)?'images/footprint_alt.png':'images/footprint.png',
|
||||
map: oMap,
|
||||
map: oMap,
|
||||
draggable: false
|
||||
});
|
||||
|
||||
@@ -83,46 +120,91 @@ oSpot.pageInit = function(asHash)
|
||||
});
|
||||
});
|
||||
|
||||
//Legend
|
||||
var oLegend = document.getElementById('legend');
|
||||
var asRoutes = {
|
||||
teararoa: {'class': 'green', title: 'Te Araroa'},
|
||||
routeburn: {'class': 'blue', title: 'Routeburn Track'},
|
||||
offtrack: {'class': 'red', title: 'Hors rando'}
|
||||
};
|
||||
for(var sKey in asRoutes) {
|
||||
var oDiv = document.createElement('div');
|
||||
oDiv.className = 'line '+asRoutes[sKey]['class'];
|
||||
oDiv.innerHTML = asRoutes[sKey].title;
|
||||
oLegend.appendChild(oDiv);
|
||||
//Recenter map once loaded to be at the center of 70% (iMapRatio) of the page
|
||||
if(self.vars('mode')!='blog')
|
||||
{
|
||||
oProjListener = oMap.addListener('projection_changed', function() {
|
||||
|
||||
var iZoom = self.tmp('map').getZoom();
|
||||
|
||||
var oCenterLatLng = self.tmp('map').getCenter();
|
||||
var oCenterPoint = self.tmp('map').getProjection().fromLatLngToPoint(oCenterLatLng);
|
||||
|
||||
var iOffsetX = self.tmp('$Map').width()*(iMapRatio - 1)/2;
|
||||
var iOffsetPointX = new google.maps.Point(iOffsetX / Math.pow(2, iZoom), 0).x;
|
||||
|
||||
var oNewCenterPoint = new google.maps.Point(oCenterPoint.x - iOffsetPointX, oCenterPoint.y);
|
||||
var oNewCenterLatLng = self.tmp('map').getProjection().fromPointToLatLng(oNewCenterPoint);
|
||||
self.tmp('map').setCenter(oNewCenterLatLng);
|
||||
|
||||
oProjListener.remove();
|
||||
});
|
||||
}
|
||||
oMap.controls[google.maps.ControlPosition.TOP_CENTER].push(oLegend);
|
||||
|
||||
//Legend
|
||||
oMap.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push($('#legend')[0]);
|
||||
|
||||
self.tmp('map', oMap);
|
||||
});
|
||||
|
||||
//Post
|
||||
if(self.vars('mode')=='histo') $('#poster').hide();
|
||||
else $('#posts').css('top', $('#poster').outerHeight());
|
||||
$('#name').defaultVal('Nom...');
|
||||
$('#post').defaultVal('Ton message...');
|
||||
$('#submit').click(function(){
|
||||
if($('#poster').checkForm())
|
||||
{
|
||||
self.get(
|
||||
'add_post',
|
||||
function()
|
||||
{
|
||||
$('#name').val('');
|
||||
$('#post').val('');
|
||||
updateFeed(true);
|
||||
},
|
||||
{name:$('#name').val(), content:$('#post').val()}
|
||||
);
|
||||
}
|
||||
});
|
||||
else {
|
||||
var asPoster = {
|
||||
type: 'poster',
|
||||
formatted_time: '',
|
||||
relative_time: 'Nouveau message'
|
||||
};
|
||||
getPost(asPoster).appendTo($('#poster'));
|
||||
|
||||
$('#name').defaultVal('Nom...');
|
||||
$('#post').defaultVal('Ton message...');
|
||||
$('#submit').click(function(){
|
||||
if($('#poster').checkForm())
|
||||
{
|
||||
self.get(
|
||||
'add_post',
|
||||
function()
|
||||
{
|
||||
$('#name').val('');
|
||||
$('#post').val('');
|
||||
updateFeed(true);
|
||||
},
|
||||
{name:$('#name').val(), content:$('#post').val()}
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
function getBoundsZoomLevel(bounds, mapDim) {
|
||||
var WORLD_DIM = { height: 256, width: 256 };
|
||||
var ZOOM_MAX = 21;
|
||||
|
||||
function latRad(lat) {
|
||||
var sin = Math.sin(lat * Math.PI / 180);
|
||||
var radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
|
||||
return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
|
||||
}
|
||||
|
||||
function zoom(mapPx, worldPx, fraction) {
|
||||
return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);
|
||||
}
|
||||
|
||||
var ne = bounds.getNorthEast();
|
||||
var sw = bounds.getSouthWest();
|
||||
|
||||
var latFraction = (latRad(ne.lat()) - latRad(sw.lat())) / Math.PI;
|
||||
|
||||
var lngDiff = ne.lng() - sw.lng();
|
||||
var lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;
|
||||
|
||||
var latZoom = zoom(mapDim.height, WORLD_DIM.height, latFraction);
|
||||
var lngZoom = zoom(mapDim.width, WORLD_DIM.width, lngFraction);
|
||||
|
||||
return Math.min(latZoom, lngZoom, ZOOM_MAX);
|
||||
}
|
||||
|
||||
function updateFeed(bFirstChunk)
|
||||
{
|
||||
bFirstChunk = bFirstChunk || false;
|
||||
@@ -137,53 +219,69 @@ function updateFeed(bFirstChunk)
|
||||
self.get('feed', function(asData){
|
||||
|
||||
$.each(asData, function(iKey, asPost){
|
||||
var $Post = $('<div>', {'class':'post '+asPost.type});
|
||||
var sRelTime = (self.vars('mode')=='histo')?asPost.formatted_time.substr(0, 10):asPost.relative_time;
|
||||
var sAbsTime = asPost.formatted_time;
|
||||
var $Body = {};
|
||||
switch(asPost.type)
|
||||
{
|
||||
case 'message':
|
||||
$Body = $('<div>')
|
||||
.append($('<p>').addIcon('fa-compass', true).append(asPost.latitude+' | '+asPost.longitude))
|
||||
.append($('<p>').addIcon('fa-clock-o', true).append(sAbsTime))
|
||||
.append(
|
||||
$('<img>', {'class':'staticmap', src:'https://maps.googleapis.com/maps/api/staticmap?center='+asPost.latitude+','+asPost.longitude+'&zoom=13&size=400x300&maptype=satellite&markers=color:green|label:|'+asPost.latitude+','+asPost.longitude+'&key='+self.vars('google_api')})
|
||||
.data('lat', asPost.latitude)
|
||||
.data('lng', asPost.longitude)
|
||||
.click(function(){
|
||||
var $This = $(this);
|
||||
self.tmp('map').panTo({lat: parseFloat($This.data('lat')), lng: parseFloat($This.data('lng'))});
|
||||
self.tmp('map').setZoom(13);
|
||||
})
|
||||
);
|
||||
sClass = 'compass';
|
||||
break;
|
||||
case 'picture':
|
||||
var $Image = $('<img>', {'src':asPost.path/*, 'style':'transform:rotate('+asPost.rotate+'deg);'*/});
|
||||
$Body = $('<a>', {href:asPost.path, 'data-lightbox':self.consts.title, 'data-title':sAbsTime}).append($Image);
|
||||
sClass = 'image';
|
||||
break;
|
||||
case 'post':
|
||||
$Body = $('<div>')
|
||||
.append($('<p>', {'class':'message'}).text(asPost.post))
|
||||
.append($('<p>', {'class':'signature'}).text('-- '+asPost.name));
|
||||
sClass = 'comment';
|
||||
break;
|
||||
}
|
||||
$Post
|
||||
.append($('<div>', {'class':'header'})
|
||||
.append($('<span>', {'class':'index'}).addIcon('fa-'+sClass))
|
||||
.append($('<span>', {'class':'time', 'title':sAbsTime}).text(sRelTime)))
|
||||
.append($('<div>', {'class':'body'}).append($Body))
|
||||
.appendTo($Posts);
|
||||
|
||||
if(asPost.id) $Post.find('.index').append(' '+asPost.id);
|
||||
|
||||
//if(asPost.type=='picture' && asPost.rotate!='0') $Body.height($Image.height());
|
||||
getPost(asPost).appendTo($Posts);
|
||||
});
|
||||
|
||||
if(bFirstChunk===true) oSimpleBar = new SimpleBar($('#posts')[0]);
|
||||
//else oSimpleBar.recalculate();
|
||||
|
||||
self.tmp('news_chunk', self.tmp('news_chunk') + 1);
|
||||
$('#next_posts').toggle(Object.keys(asData).length == self.vars('chunk_size'));
|
||||
}, {'chunk':self.tmp('news_chunk')});
|
||||
}
|
||||
|
||||
function getPost(asPost) {
|
||||
var $Post = $('<div>', {'class':'post '+asPost.type});
|
||||
var sRelTime = (self.vars('mode')=='histo')?asPost.formatted_time.substr(0, 10):asPost.relative_time;
|
||||
var sAbsTime = asPost.formatted_time;
|
||||
var $Body = {};
|
||||
switch(asPost.type)
|
||||
{
|
||||
case 'message':
|
||||
$Body = $('<div>')
|
||||
.append($('<p>').addIcon('fa-compass', true).append(asPost.latitude+' | '+asPost.longitude))
|
||||
.append($('<p>').addIcon('fa-clock-o', true).append(sAbsTime))
|
||||
.append(
|
||||
$('<img>', {'class':'staticmap', src:'https://maps.googleapis.com/maps/api/staticmap?center='+asPost.latitude+','+asPost.longitude+'&zoom=13&size=400x300&maptype=satellite&markers=color:green|label:|'+asPost.latitude+','+asPost.longitude+'&key='+self.vars('google_api')})
|
||||
.data('lat', asPost.latitude)
|
||||
.data('lng', asPost.longitude)
|
||||
.click(function(){
|
||||
var $This = $(this);
|
||||
self.tmp('map').panTo({lat: parseFloat($This.data('lat')), lng: parseFloat($This.data('lng'))});
|
||||
self.tmp('map').setZoom(13);
|
||||
})
|
||||
);
|
||||
sClass = 'compass';
|
||||
break;
|
||||
case 'picture':
|
||||
var $Image = $('<img>', {'src':asPost.path/*, 'style':'transform:rotate('+asPost.rotate+'deg);'*/});
|
||||
$Body = $('<a>', {href:asPost.path, 'data-lightbox':self.consts.title, 'data-title':sAbsTime}).append($Image);
|
||||
sClass = 'image';
|
||||
break;
|
||||
case 'post':
|
||||
$Body = $('<div>')
|
||||
.append($('<p>', {'class':'message'}).text(asPost.post))
|
||||
.append($('<p>', {'class':'signature'}).text('-- '+asPost.name));
|
||||
sClass = 'comment';
|
||||
break;
|
||||
case 'poster':
|
||||
$Body = $('<p>', {'class':'message'})
|
||||
.append($('<input>', {type:'text', id:'post', name:'post'}))
|
||||
.append($('<input>', {type:'text', id:'name', name:'name'}))
|
||||
.append($('<button>', {type:'button', id:'submit', name:'submit'}).addIcon('fa-send'));
|
||||
sClass = 'comment';
|
||||
break;
|
||||
}
|
||||
$Post
|
||||
.append($('<div>', {'class':'header'})
|
||||
.append($('<span>', {'class':'index'}).addIcon('fa-'+sClass))
|
||||
.append($('<span>', {'class':'time', 'title':sAbsTime}).text(sRelTime)))
|
||||
.append($('<div>', {'class':'body'}).append($Body));
|
||||
|
||||
if(asPost.id) $Post.find('.index').append(' '+asPost.id);
|
||||
|
||||
//if(asPost.type=='picture' && asPost.rotate!='0') $Body.height($Image.height());
|
||||
|
||||
return $Post;
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user