561 lines
20 KiB
HTML
Executable File
561 lines
20 KiB
HTML
Executable File
<div id="projects">
|
|
<div id="submap">
|
|
<div class="loader fa fa-fw fa-map flicker" id="map_loading"></div>
|
|
</div>
|
|
<div id="map"></div>
|
|
<div id="feed">
|
|
<div id="posts">
|
|
<div id="poster"></div>
|
|
<div id="posts_list"></div>
|
|
<div id="loading"></div>
|
|
</div>
|
|
</div>
|
|
<div id="elems">
|
|
<div id="post-button"><i class="fa fa-fw"></i></div>
|
|
<div id="legend" class="leaflet-control-layers leaflet-control leaflet-control-layers-expanded">
|
|
<div class="track"><span class="line main"></span><span class="desc">[#]lang:track_main[#]</span></div>
|
|
<div class="track"><span class="line off-track"></span><span class="desc">[#]lang:track_offtrack[#]</span></div>
|
|
<div class="track"><span class="line hitchhiking"></span><span class="desc">[#]lang:track_hitchhiking[#]</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="mobile" class="mobile"></div>
|
|
<script type="text/javascript">
|
|
oSpot.onSamePageMove = function(asHash) {
|
|
if(self.tmp('first_exec')) initPage(asHash);
|
|
else {
|
|
self.tmp('map').remove();
|
|
self.tmp('$Map').empty();
|
|
self.tmp('map', null);
|
|
self.tmp('$PostList').empty();
|
|
setFeedUpdateTimer(false);
|
|
initProject(asHash.items[0]);
|
|
}
|
|
return false;
|
|
};
|
|
|
|
oSpot.pageInit = function(asHash) {
|
|
self.tmp('first_exec', true);
|
|
initPage(asHash);
|
|
};
|
|
|
|
self.onResize = function() {
|
|
self.tmp('mobile', $('#mobile').is(':visible'));
|
|
self.tmp('feed_width', self.tmp('with_feed')?$('#feed').outerWidth(true):0);
|
|
self.tmp('map_offset', -1 * self.tmp('feed_width') / $('body').outerWidth(true));
|
|
|
|
if(typeof self.tmp('elev') != 'undefined') {
|
|
self.tmp('elev').remove();
|
|
self.tmp('elev').options.width = getElevWidth();
|
|
self.tmp('elev').addTo(self.tmp('map'));
|
|
}
|
|
};
|
|
|
|
self.onQuitPage = function() {
|
|
setFeedUpdateTimer(false);
|
|
return true;
|
|
}
|
|
|
|
function toggleFeedPanel(bShow) {
|
|
var $Container = $('#projects');
|
|
if(typeof bShow === 'undefined') $Container.toggleClass('with-feed');
|
|
else $Container.toggleClass('with-feed', bShow);
|
|
|
|
oSpot.tmp('with_feed', $Container.hasClass('with-feed'));
|
|
}
|
|
|
|
function isMobile() {
|
|
self.tmp('mobile', $('#mobile').is(':visible'));
|
|
return self.tmp('mobile');
|
|
}
|
|
|
|
function initPage(asHash) {
|
|
if(asHash.items.length==0) self.setHash(asHash.page, [self.vars('default_project_codename')]);
|
|
else {
|
|
self.tmp('$Map', $('#map'));
|
|
self.tmp('$PostList', $('#posts_list'));
|
|
self.tmp('updatable', true);
|
|
self.tmp('out-of-data', false);
|
|
self.tmp('tile_api', getWmtsApiUrl('{id}', '{y}', '{x}', '{z}'));
|
|
self.tmp('markers', 'object');
|
|
self.tmp('marker_size', {width: 32, height: 32});
|
|
|
|
toggleFeedPanel(!isMobile());
|
|
oSpot.onResize();
|
|
|
|
//Lightbox options
|
|
lightbox.option({
|
|
alwaysShowNavOnTouchDevices: true,
|
|
albumLabel: '<i class="fa fa-fw fa-lg fa-media push"></i> %1 / %2',/*oSpot.lang('media_count', ['%1', '%2']),*/
|
|
fadeDuration: 300,
|
|
imageFadeDuration: 400,
|
|
positionFromTop: 0,
|
|
resizeDuration: 600,
|
|
hasVideo: true
|
|
});
|
|
|
|
//Assign Track Type Colors
|
|
self.tmp('track-type-styles', 'object');
|
|
$('#legend').find('.line').each(function(iKey, oLegend){
|
|
var $Legend = $(oLegend);
|
|
var sTrackType = $Legend.attr('class').replace('line', '').trim();
|
|
self.tmp(['track-type-styles', sTrackType], {weight: parseInt($Legend.css('height')), color: $Legend.css('background-color'), opacity: 1});
|
|
});
|
|
|
|
//Scrollbar
|
|
self.tmp('simple-bar', new SimpleBar($('#posts')[0]));
|
|
self.tmp('simple-bar').getScrollElement().addEventListener('scroll', onFeedScroll);
|
|
|
|
//Add "Loading" Post
|
|
getPost({type: 'loading', headerless: true, formatted_time: '', relative_time: ''}).appendTo($('#loading'));
|
|
|
|
//Mobile events
|
|
$("#feed").onSwipe(function(aiDelta){
|
|
if(aiDelta.x > self.tmp('feed_width')/3 && aiDelta.x > Math.abs(aiDelta.y)) toggleFeedPanel(false);
|
|
});
|
|
|
|
//project Bootstrap
|
|
initProject(asHash.items[0]);
|
|
}
|
|
}
|
|
|
|
function initProject(sProjectCodeName){
|
|
self.tmp('first_exec', false);
|
|
self.vars('project', self.vars(['projects', sProjectCodeName]));
|
|
|
|
//Page Title
|
|
self.setPageTitle(oSpot.vars(['project', 'name']));
|
|
|
|
//Timezone difference notice
|
|
var bSameTime = ((new Date()).toLocaleString([], {timeZone: oSpot.consts.timezone}) == (new Date()).toLocaleString([], {timeZone: oSpot.vars(['project', 'timezone'])}));
|
|
self.tmp('site_tz_notice', bSameTime?'':' ('+getTimeZoneDesc(oSpot.consts.timezone)+')');
|
|
self.tmp('proj_tz_notice', bSameTime?'':' ('+getTimeZoneDesc(self.vars(['project', 'timezone']))+')');
|
|
|
|
$.when(
|
|
//Markers: Spot Messages & Medias
|
|
self.get(
|
|
'markers',
|
|
function(){},
|
|
{project_id: self.vars(['project', 'id'])},
|
|
function(e){console.log(e);}
|
|
),
|
|
//Project Geojson: Hike track
|
|
$.ajax({
|
|
dataType: 'json',
|
|
url: self.vars(['project', 'geofile']),
|
|
mimeType: 'application/json'
|
|
})
|
|
).done(function(aoMessages, aoTracks) {
|
|
initSpotMessages(aoMessages[0]['data'], aoTracks[0]);
|
|
});
|
|
|
|
//Posts
|
|
initPosts();
|
|
}
|
|
|
|
function initPosts() {
|
|
var $Poster = $('#poster').empty();
|
|
if(self.vars(['project', 'mode'])==self.consts.modes.histo) $Poster.hide();
|
|
else {
|
|
var asPoster = {
|
|
type: 'poster',
|
|
formatted_time: '',
|
|
relative_time: oSpot.lang('post_new_message')
|
|
};
|
|
getPost(asPoster).appendTo($Poster.show());
|
|
|
|
autosize($('#post'));
|
|
|
|
$('#submit').click(function(){
|
|
if($Poster.checkForm())
|
|
{
|
|
self.get(
|
|
'add_post',
|
|
function()
|
|
{
|
|
$('#name').val('');
|
|
$('#post').val('');
|
|
updateFeed(true);
|
|
},
|
|
{
|
|
project_id: self.vars(['project', 'id']),
|
|
name: $('#name').val(),
|
|
content: $('#post').val()
|
|
}
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
//Feed auto-update
|
|
self.tmp('simple-bar').getScrollElement().scrollTop = 0;
|
|
if(self.vars(['project', 'mode']) != self.consts.modes.histo) onAutoUpdate(true);
|
|
else updateFeed(true);
|
|
}
|
|
|
|
function onAutoUpdate(bFirstExec) {
|
|
bFirstExec = bFirstExec || false;
|
|
if(bFirstExec) updateFeed(true);
|
|
else if(self.tmp('simple-bar').getScrollElement().scrollTop == 0) updateFeed(true, true);
|
|
setFeedUpdateTimer(60, onAutoUpdate);
|
|
}
|
|
|
|
function getElevWidth() {
|
|
return $('#projects').width() - oSpot.tmp('feed_width') - $('.leaflet-bottom.leaflet-left').outerWidth(true) - 6;
|
|
}
|
|
|
|
function initSpotMessages(aoMessages, aoTracks) {
|
|
|
|
//Tile layers
|
|
aoLayers = {};
|
|
aoLayers[oSpot.lang('map_satellite')] = L.tileLayer(self.tmp('tile_api'), {id: 'mapbox.satellite-streets', minZoom: 0, maxZoom: 19});
|
|
aoLayers[oSpot.lang('map_otm')] = L.tileLayer(self.tmp('tile_api'), {id: 'opentopomap', minZoom: 2, maxZoom: 19});
|
|
aoLayers[oSpot.lang('map_ign_france')] = L.tileLayer(self.tmp('tile_api'), {id: 'ign.fr', minZoom: 0, maxZoom: 18, tileSize: 256});
|
|
aoLayers[oSpot.lang('map_ign_spain')] = L.tileLayer(self.tmp('tile_api'), {id: 'ign.es', minZoom: 1, maxZoom: 20});
|
|
aoLayers[oSpot.lang('map_linz')] = L.tileLayer(self.tmp('tile_api'), {id: 'linz', maxZoom: 17, continuousWorld: true, attribution: 'Sourced from LINZ. CC BY 4.0'});
|
|
|
|
//Map
|
|
var oMap = L.map(self.tmp('$Map')[0], {
|
|
layers: [aoLayers[oSpot.lang('map_satellite')]],
|
|
attributionControl: false,
|
|
zoomControl: false
|
|
});
|
|
self.tmp('map', oMap);
|
|
|
|
//Controls: Feed Panel
|
|
var oFeedPanel = L.control({position: 'topright'});
|
|
var $PostButton = $('#post-button').clone();
|
|
$PostButton.click(toggleFeedPanel);
|
|
oFeedPanel.onAdd = function(oMap) {return $PostButton[0];};
|
|
oFeedPanel.addTo(oMap);
|
|
|
|
//Controls: Legend
|
|
var oLegend = L.control({position: 'bottomleft'});
|
|
oLegend.onAdd = function(oMap) {return $('#legend').clone()[0];};
|
|
oLegend.addTo(oMap);
|
|
|
|
//Controls: Projects
|
|
var oProjects = L.control({position: 'bottomleft'});
|
|
oProjects.onAdd = function(oMap) {
|
|
var $Labels = $('<div>', {'class': 'leaflet-control-layers-base'});
|
|
$.each(self.vars('projects'), function(sCodeName, asProject){
|
|
var asRadioAttrs = {'type': 'radio', 'class': 'leaflet-control-layers-selector', 'name':'project', 'value': sCodeName};
|
|
if(asProject.id == self.vars(['project', 'id'])) asRadioAttrs.checked = 'checked';
|
|
var $Radio =$('<input>', asRadioAttrs).change(function(){
|
|
self.setHash(self.vars('page'), [$(this).val()]);
|
|
});
|
|
|
|
var $Label = $('<label>').append($('<div>')
|
|
.append($Radio)
|
|
.append($('<span>').text(' '+asProject.name))
|
|
);
|
|
$Labels.append($Label);
|
|
});
|
|
|
|
return $('<div>', {'class':'leaflet-control-layers leaflet-control leaflet-control-layers-expanded'}).append($('<section>').append($Labels))[0];
|
|
};
|
|
oProjects.addTo(oMap);
|
|
|
|
//Controls: Scale
|
|
oScale = L.control.scale({imperial: false, 'position':'bottomright'}).addTo(oMap);
|
|
|
|
//Controls: Elevation
|
|
var oElev = L.control.elevation({
|
|
collapsed: true,
|
|
position: "bottomright",
|
|
width: getElevWidth(),
|
|
height: 129,
|
|
hoverNumber: {
|
|
decimalsX: 0, //distance (km)
|
|
decimalsY: 0 //elevation (m)
|
|
},
|
|
theme: 'spot-theme',
|
|
onExpand: function(){$('.leaflet-control-scale').hide();},
|
|
onCollapse: function(){$('.leaflet-control-scale').show();}
|
|
}).addTo(oMap);
|
|
self.tmp('elev', oElev);
|
|
|
|
//Controls: Tiles (layers)
|
|
L.control.layers(aoLayers, null, {position: 'topleft'}).addTo(oMap);
|
|
|
|
//Tracks, colors & popup
|
|
var oTracks = L.geoJson(aoTracks, {
|
|
style: function(oTrack) {
|
|
return self.tmp(['track-type-styles', oTrack.properties.type]);
|
|
},
|
|
onEachFeature: function(feature, oLayer) {
|
|
var asProperties = feature.properties;
|
|
var $Tooltip = $('<div>', {'class':'track_tooltip'});
|
|
$('<p>', {'class':'name'}).addIcon('fa-track-'+asProperties.type, true).append(asProperties.name).appendTo($Tooltip);
|
|
if(asProperties.Name != asProperties.description) $('<p>', {'class':'description'}).text(asProperties.description).appendTo($Tooltip);
|
|
|
|
var aiCoords = feature.geometry.coordinates;
|
|
if(aiCoords && asProperties.type != 'hitchhiking') {
|
|
var iDistance = 0;
|
|
var iElevDrop = 0;
|
|
var iElevGain = 0;
|
|
var iTime = 0;
|
|
for (var i = 1; i < aiCoords.length; i++) {
|
|
var oCurrPoint = new L.LatLng(aiCoords[i][1], aiCoords[i][0]);
|
|
var oPrevPoint = new L.LatLng(aiCoords[i - 1][1], aiCoords[i - 1][0]);
|
|
var iElevDelta = aiCoords[i][2] - aiCoords[i - 1][2];
|
|
var iSegDistance = oCurrPoint.distanceTo(oPrevPoint);
|
|
|
|
iDistance += iSegDistance;
|
|
iElevDrop += Math.min(iElevDelta, 0);
|
|
iElevGain += Math.max(iElevDelta, 0);
|
|
|
|
var iSpeedCorrecRatio = 0;
|
|
var iAngle = iElevDelta / iSegDistance;
|
|
if(iAngle < -1) iSpeedCorrecRatio = 0.5;
|
|
else if(iAngle < -0.2) iSpeedCorrecRatio = 1.25;
|
|
else if(iAngle < 0.1) iSpeedCorrecRatio = 1;
|
|
else if(iAngle < 0.25) iSpeedCorrecRatio = 0.85;
|
|
else if(iAngle < 0.5) iSpeedCorrecRatio = 0.6;
|
|
else if(iAngle < 1) iSpeedCorrecRatio = 0.5;
|
|
else iSpeedCorrecRatio = 0.25;
|
|
iTime += iSegDistance / 1000 * iSpeedCorrecRatio / 3.5 ; //default speed: 3.5km/h
|
|
}
|
|
|
|
var iTimeHours = Math.floor(iTime);
|
|
var iTimeMinutes = Math.round((iTime - iTimeHours) * 4) * 15; //Approx 15 minutes
|
|
if(iTimeMinutes == 60) {
|
|
iTimeMinutes = 0;
|
|
iTimeHours += 1;
|
|
}
|
|
if(iTimeMinutes==0) iTimeMinutes = '';
|
|
|
|
$('<p>', {'class':'detail'}).addIcon('fa-distance fa-fw', true).append(Math.round(iDistance/1000)+'km').appendTo($Tooltip);
|
|
$('<p>', {'class':'detail'}).addIcon('fa-time fa-fw', true).append('~ '+iTimeHours+'h'+iTimeMinutes).appendTo($Tooltip);
|
|
$('<p>', {'class':'detail'}).addIcon('fa-elev-gain fa-fw', true).append(iElevGain+'m').appendTo($Tooltip);
|
|
$('<p>', {'class':'detail'}).addIcon('fa-elev-drop fa-fw', true).append(iElevDrop+'m').appendTo($Tooltip);
|
|
|
|
(oElev.addData.bind(oElev))(feature, oLayer);
|
|
}
|
|
|
|
oLayer
|
|
.bindPopup($Tooltip[0])
|
|
.on('mouseover', function(e) {
|
|
var popup = e.target.getPopup();
|
|
popup.setLatLng(e.latlng).openOn(self.tmp('map'));
|
|
})
|
|
.on('mouseout', function(e) {
|
|
e.target.closePopup();
|
|
});
|
|
}
|
|
}).addTo(oMap);
|
|
|
|
//Centering map
|
|
if(self.vars(['project', 'mode'])==self.consts.modes.blog && aoMessages.length > 0)
|
|
{
|
|
//Zoom on last message
|
|
var oLastMsg = aoMessages[aoMessages.length-1];
|
|
oMap.setView(L.latLng(oLastMsg.latitude, oLastMsg.longitude), 15);
|
|
|
|
//Recenter map to be at the center of 70% (map_offset) of the page, 30% being used by posts
|
|
oMap.setOffsetView(self.tmp('map_offset'));
|
|
}
|
|
else oMap.fitBounds(oTracks.getBounds(), {paddingTopLeft: L.point(5, self.tmp('marker_size').height + 5), paddingBottomRight: L.point(self.tmp('feed_width') + 5, 5)});
|
|
|
|
//Spot Messages
|
|
$.each(aoMessages, function(iKey, oMsg){
|
|
|
|
//Marker
|
|
var oMarker = L.marker(L.latLng(oMsg.latitude, oMsg.longitude), {
|
|
id: oMsg.id_message,
|
|
riseOnHover: true,
|
|
icon: L.divIcon({
|
|
className: '',
|
|
html: '<span class="fa-stack"><i class="fa fa-message fa-stack-2x"></i><i class="fa fa-message-in fa-stack-1x fa-rotate-270"></i></span>',
|
|
iconSize: [self.tmp('marker_size').width, self.tmp('marker_size').height],
|
|
iconAnchor: [self.tmp('marker_size').width / 2, self.tmp('marker_size').height] //position from icon's top left corner (iconAnchor = marker's position)
|
|
})
|
|
}).addTo(oMap);
|
|
|
|
//Tooltip
|
|
$Tooltip = $('<div>', {'class':'info-window'})
|
|
.append($('<h1>')
|
|
.addIcon('fa-message fa-fw fa-lg')
|
|
.append('Message '+oMsg.type+' '+oSpot.lang('counter', oMsg.displayed_id)))
|
|
.append($('<p>', {'class':'time'})
|
|
.addIcon('fa-time fa-fw fa-lg')
|
|
.append(oMsg.formatted_time+(self.vars(['project', 'mode'])==self.consts.modes.blog?' ('+oMsg.relative_time+')':'')+self.tmp('site_tz_notice')))
|
|
.append($('<p>', {'class':'coordinates'})
|
|
.addIcon('fa-coords fa-fw fa-lg', false)
|
|
.append('Lat : '+oMsg.latitude+', Lng : '+oMsg.longitude));
|
|
|
|
//Tooltip medias
|
|
if(oMsg.medias) {
|
|
var $Medias = $('<div>', {'class':'medias'});
|
|
$.each(oMsg.medias, function(iKey, asMedia) {
|
|
$Medias.append(getMediaLink(asMedia, 'marker'));
|
|
});
|
|
$Tooltip
|
|
.append($('<p>').addIcon('fa-media fa-fw fa-lg').append(oSpot.lang('pics')))
|
|
.append($Medias);
|
|
}
|
|
|
|
oMarker.bindPopup($Tooltip[0], {
|
|
maxWidth: 1000,
|
|
autoPan: false,
|
|
closeOnClick: true,
|
|
offset: new L.Point(0, -30)
|
|
});
|
|
|
|
//Open tooltip on latest message in mobile mode
|
|
if(iKey === (aoMessages.length - 1) && self.vars(['project', 'mode']) == self.consts.modes.blog && (!oMsg.medias || oMsg.medias.length < 3) && self.tmp('mobile')) oMarker.openPopup();
|
|
|
|
oSpot.tmp(['markers', oMsg.id_message], oMarker);
|
|
});
|
|
}
|
|
|
|
function onFeedScroll() {
|
|
var $Box = $(this);
|
|
var $BoxContent = $Box.find('.simplebar-content');
|
|
if(($Box.scrollTop() + $(window).height()) / $BoxContent.height() >= 0.8) updateFeed();
|
|
}
|
|
|
|
function updateFeed(bFirstChunk, bDiscrete) {
|
|
bFirstChunk = bFirstChunk || false;
|
|
bDiscrete = bDiscrete || false;
|
|
|
|
if(self.tmp('updatable')) {
|
|
if(!self.tmp('out-of-data') || bFirstChunk) {
|
|
self.tmp('updatable', false);
|
|
if(!bDiscrete) $('#loading').show();
|
|
|
|
var $Posts = $('<div>');
|
|
|
|
if(bFirstChunk===true) {
|
|
self.tmp('news_chunk', 0);
|
|
}
|
|
|
|
self.get('feed', function(asData) {
|
|
$('#loading').hide();
|
|
|
|
$.each(asData, function(iKey, asPost){
|
|
$Posts.append(getPost(asPost));
|
|
});
|
|
|
|
self.tmp('news_chunk', self.tmp('news_chunk') + 1);
|
|
self.tmp('out-of-data', Object.keys(asData).length != self.vars('chunk_size'));
|
|
|
|
if(bFirstChunk===true) self.tmp('$PostList').empty();
|
|
self.tmp('$PostList').append($Posts.children());
|
|
|
|
self.tmp('updatable', true);
|
|
}, {
|
|
'project_id': self.vars(['project', 'id']),
|
|
'chunk': self.tmp('news_chunk')
|
|
});
|
|
}
|
|
}
|
|
else if(bFirstChunk) setFeedUpdateTimer(0.2);
|
|
}
|
|
|
|
function setFeedUpdateTimer(iSeconds, fCallback) {
|
|
fCallback = fCallback || function(){updateFeed(true);};
|
|
if(typeof self.tmp('update_timer') != 'undefined') clearTimeout(self.tmp('update_timer'));
|
|
if(iSeconds > 0) self.tmp('update_timer', setTimeout(fCallback, iSeconds * 1000));
|
|
}
|
|
|
|
function getPost(asPost) {
|
|
asPost.headerless = asPost.headerless || false;
|
|
var $Post = $('<div>', {'class':'post '+asPost.type+(asPost.headerless?' headerless':'')});
|
|
var sRelTime = (asPost.relative_time!='')?((self.vars(['project', 'mode'])==self.consts.modes.histo)?asPost.formatted_time.substr(0, 10):asPost.relative_time):'';
|
|
var sAbsTime = asPost.formatted_time;
|
|
var sType = asPost.subtype || asPost.type;
|
|
var $Body = {};
|
|
|
|
switch(asPost.type) {
|
|
case 'message':
|
|
$Body = $('<div>')
|
|
.data('id', asPost.id_message)
|
|
.append($('<p>').addIcon('fa-coords', true).append(asPost.lat_dms+' '+asPost.lon_dms))
|
|
.append($('<p>').addIcon('fa-time', true).append(sAbsTime+self.tmp('site_tz_notice')))
|
|
.append($('<a>', {'class':'drill'})
|
|
.append($('<img>', {'class':'staticmap', title: oSpot.lang('click_zoom'), src: getWmtsApiUrl('static', asPost.latitude, asPost.longitude, 13)}))
|
|
.append($('<span>', {'class': 'drill-icon fa-stack'})
|
|
.addIcon('fa-message-in fa-stack-1x fa-rotate-270')
|
|
.addIcon('fa-message fa-stack-2x')
|
|
)
|
|
.click(function(){
|
|
var oMarker = oSpot.tmp(['markers', $(this).parent().data('id')]);
|
|
self.tmp('map').setOffsetView(self.tmp('map_offset'), oMarker.getLatLng(), 13);
|
|
if(!oMarker.isPopupOpen()) oMarker.openPopup();
|
|
if(self.tmp('mobile')) toggleFeedPanel(false);
|
|
})
|
|
)
|
|
.hover(
|
|
function(){
|
|
var oMarker = oSpot.tmp(['markers', $(this).data('id')]);
|
|
if(oSpot.tmp('map').getBounds().contains(oMarker.getLatLng()) && !oMarker.isPopupOpen()) oMarker.openPopup();
|
|
},
|
|
function(){
|
|
var oMarker = oSpot.tmp(['markers', $(this).data('id')]);
|
|
if(oMarker.isPopupOpen()) oMarker.closePopup();
|
|
}
|
|
);
|
|
break;
|
|
case 'media':
|
|
$Body = getMediaLink(asPost, 'post');
|
|
break;
|
|
case 'post':
|
|
$Body = $('<div>')
|
|
.append($('<p>', {'class':'message'}).text(asPost.content))
|
|
.append($('<p>', {'class':'signature'}).text('-- '+asPost.formatted_name));
|
|
break;
|
|
case 'poster':
|
|
$Body = $('<p>', {'class':'message'})
|
|
.append($('<textarea>', {id:'post', name:'post', placeholder:oSpot.lang('post_message'), 'class':'autoExpand', rows:'1'}))
|
|
.append($('<input>', {type:'text', id:'name', name:'name', placeholder:oSpot.lang('post_name')}))
|
|
.append($('<button>', {type:'button', id:'submit', name:'submit'}).addIcon('fa-send'));
|
|
break;
|
|
case 'loading':
|
|
$Body = $('<p>', {'class':'flicker'}).addIcon('fa-post');
|
|
break;
|
|
}
|
|
|
|
$Post
|
|
.append($('<div>', {'class':'header'})
|
|
.append($('<span>', {'class':'index'}).addIcon('fa-'+sType))
|
|
.append($('<span>', {'class':'time'}).hoverSwap(sRelTime, sAbsTime+self.tmp('site_tz_notice'))))
|
|
.append($('<div>', {'class':'body'}).append($Body));
|
|
|
|
if(asPost.displayed_id) $Post.find('.index').append(' '+oSpot.lang('counter', asPost.displayed_id));
|
|
|
|
return $Post;
|
|
}
|
|
|
|
function getWmtsApiUrl(sMapId, iLat, iLng, iZoom) {
|
|
return self.consts.geo_server+'/?a=tile&id='+sMapId+'&z='+iZoom+'&x='+iLng+'&y='+iLat;
|
|
}
|
|
|
|
function getMediaLink(asData, sType) {
|
|
var bVideo = (asData.subtype == 'video');
|
|
|
|
var $PostedOn =
|
|
$('<span>', {'class': 'lb-caption-posted', title: oSpot.lang(bVideo?'video':'pic')+' '+oSpot.lang('add_on', asData.formatted_time)})
|
|
.addIcon('fa-upload fa-lg fa-fw', true)
|
|
.append(asData.formatted_time);
|
|
|
|
var $TakenOn = (asData.taken_on == '0000-00-00 00:00:00')?'':
|
|
$('<span>', {'class': 'lb-caption-taken', title: oSpot.lang(bVideo?'video':'pic')+' '+oSpot.lang(bVideo?'video_taken':'pic_taken', asData.formatted_time)})
|
|
.addIcon('fa-'+asData.subtype+'-shot fa-lg fa-fw', true)
|
|
.append(asData.taken_on_formatted+self.tmp('site_tz_notice'));
|
|
|
|
var $Link =
|
|
$('<a>', {
|
|
'class': 'drill',
|
|
'href': asData.media_path,
|
|
'data-lightbox': sType+'-medias',
|
|
'data-video': (bVideo?'true':'false'),
|
|
'data-title': $('<div>').append($PostedOn).append($TakenOn).html(),
|
|
'data-orientation': asData.rotate
|
|
})
|
|
.append($('<img>', {'src': asData.thumb_path, title: oSpot.lang(bVideo?'click_watch':'click_zoom')}))
|
|
.append($('<span>', {'class': 'drill-icon'}).addIcon('fa-drill-'+(bVideo?'video':'picture')));
|
|
|
|
return $Link;
|
|
}
|
|
</script> |