"use strict";
var $ = jQuery.noConflict();
var mapStyles = [ {"featureType":"road","elementType":"labels","stylers":[{"visibility":"simplified"},{"lightness":20}]},{"featureType":"administrative.land_parcel","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"landscape.man_made","elementType":"all","stylers":[{"visibility":"on"}]},{"featureType":"transit","elementType":"all","stylers":[{"saturation":-100},{"visibility":"on"},{"lightness":10}]},{"featureType":"road.local","elementType":"all","stylers":[{"visibility":"on"}]},{"featureType":"road.local","elementType":"all","stylers":[{"visibility":"on"}]},{"featureType":"road.highway","elementType":"labels","stylers":[{"visibility":"simplified"}]},{"featureType":"poi","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"road.arterial","elementType":"labels","stylers":[{"visibility":"on"},{"lightness":50}]},{"featureType":"water","elementType":"all","stylers":[{"hue":"#a1cdfc"},{"saturation":30},{"lightness":49}]},{"featureType":"road.highway","elementType":"geometry","stylers":[{"hue":"#f49935"}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"hue":"#fad959"}]}, {featureType:'road.highway',elementType:'all',stylers:[{hue:'#dddbd7'},{saturation:-92},{lightness:60},{visibility:'on'}]}, {featureType:'landscape.natural',elementType:'all',stylers:[{hue:'#c8c6c3'},{saturation:-71},{lightness:-18},{visibility:'on'}]}, {featureType:'poi',elementType:'all',stylers:[{hue:'#d9d5cd'},{saturation:-70},{lightness:20},{visibility:'on'}]} ];
// Set map height to 100% ----------------------------------------------------------------------------------------------
var $body = $('body');
if( $body.hasClass('map-fullscreen') ) {
if( $(window).width() > 768 ) {
$('.map-canvas').height( $(window).height() - $('.header').height() );
}
else {
$('.map-canvas #map').height( $(window).height() - $('.header').height() );
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Homepage map - Google
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function createHomepageGoogleMap(_latitude,_longitude,json){
$.get("/assets/external/_infobox.js", function() {
gMap();
});
function gMap(){
var mapCenter = new google.maps.LatLng(_latitude,_longitude);
var mapOptions = {
zoom: 14,
center: mapCenter,
disableDefaultUI: false,
scrollwheel: false,
styles: mapStyles,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.BOTTOM_CENTER
},
panControl: false,
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.LARGE,
position: google.maps.ControlPosition.RIGHT_TOP
}
};
var mapElement = document.getElementById('map');
var map = new google.maps.Map(mapElement, mapOptions);
var newMarkers = [];
var markerClicked = 0;
var activeMarker = false;
var lastClicked = false;
for (var i = 0; i < json.data.length; i++) {
// Google map marker content -----------------------------------------------------------------------------------
if( json.data[i].color ) var color = json.data[i].color;
else color = '';
var markerContent = document.createElement('DIV');
if( json.data[i].featured == 1 ) {
markerContent.innerHTML =
'
' +
'
' +
'

' +
'
' +
'
';
}
else {
markerContent.innerHTML =
'' +
'
' +
'

' +
'
' +
'
';
}
// Create marker on the map ------------------------------------------------------------------------------------
var marker = new RichMarker({
position: new google.maps.LatLng( json.data[i].latitude, json.data[i].longitude ),
map: map,
draggable: false,
content: markerContent,
flat: true
});
newMarkers.push(marker);
// Create infobox for marker -----------------------------------------------------------------------------------
var infoboxContent = document.createElement("div");
var infoboxOptions = {
content: infoboxContent,
disableAutoPan: false,
pixelOffset: new google.maps.Size(-18, -42),
zIndex: null,
alignBottom: true,
boxClass: "infobox",
enableEventPropagation: true,
closeBoxMargin: "0px 0px -30px 0px",
closeBoxURL: "/assets/img/close.png",
infoBoxClearance: new google.maps.Size(1, 1)
};
// Infobox HTML element ----------------------------------------------------------------------------------------
var category = json.data[i].category;
infoboxContent.innerHTML = drawInfobox(category, infoboxContent, json, i);
// Create new markers ------------------------------------------------------------------------------------------
newMarkers[i].infobox = new InfoBox(infoboxOptions);
// Show infobox after click ------------------------------------------------------------------------------------
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
google.maps.event.addListener(map, 'click', function(event) {
lastClicked = newMarkers[i];
});
activeMarker = newMarkers[i];
if( activeMarker != lastClicked ){
for (var h = 0; h < newMarkers.length; h++) {
newMarkers[h].content.className = 'marker-loaded';
newMarkers[h].infobox.close();
}
newMarkers[i].infobox.open(map, this);
newMarkers[i].infobox.setOptions({ boxClass:'fade-in-marker'});
newMarkers[i].content.className = 'marker-active marker-loaded';
markerClicked = 1;
}
}
})(marker, i));
// Fade infobox after close is clicked -------------------------------------------------------------------------
google.maps.event.addListener(newMarkers[i].infobox, 'closeclick', (function(marker, i) {
return function() {
activeMarker = 0;
newMarkers[i].content.className = 'marker-loaded';
newMarkers[i].infobox.setOptions({ boxClass:'fade-out-marker' });
}
})(marker, i));
}
// Close infobox after click on map --------------------------------------------------------------------------------
google.maps.event.addListener(map, 'click', function(event) {
if( activeMarker != false && lastClicked != false ){
if( markerClicked == 1 ){
activeMarker.infobox.open(map);
activeMarker.infobox.setOptions({ boxClass:'fade-in-marker'});
activeMarker.content.className = 'marker-active marker-loaded';
}
else {
markerClicked = 0;
activeMarker.infobox.setOptions({ boxClass:'fade-out-marker' });
activeMarker.content.className = 'marker-loaded';
setTimeout(function() {
activeMarker.infobox.close();
}, 350);
}
markerClicked = 0;
}
if( activeMarker != false ){
google.maps.event.addListener(activeMarker, 'click', function(event) {
markerClicked = 1;
});
}
markerClicked = 0;
});
// Create marker clusterer -----------------------------------------------------------------------------------------
var clusterStyles = [
{
url: '/assets/img/cluster.png',
height: 34,
width: 34
}
];
var markerCluster = new MarkerClusterer(map, newMarkers, { styles: clusterStyles, maxZoom: 19 });
markerCluster.onClick = function(clickedClusterIcon, sameLatitude, sameLongitude) {
return multiChoice(sameLatitude, sameLongitude, json);
};
// Dynamic loading markers and data from JSON ----------------------------------------------------------------------
google.maps.event.addListener(map, 'idle', function() {
var visibleArray = [];
for (var i = 0; i < json.data.length; i++) {
if ( map.getBounds().contains(newMarkers[i].getPosition()) ){
visibleArray.push(newMarkers[i]);
$.each( visibleArray, function (i) {
setTimeout(function(){
if ( map.getBounds().contains(visibleArray[i].getPosition()) ){
if( !visibleArray[i].content.className ){
visibleArray[i].setMap(map);
visibleArray[i].content.className += 'bounce-animation marker-loaded';
markerCluster.repaint();
}
}
}, i * 50);
});
} else {
newMarkers[i].content.className = '';
newMarkers[i].setMap(null);
}
}
var visibleItemsArray = [];
$.each(json.data, function(a) {
if( map.getBounds().contains( new google.maps.LatLng( json.data[a].latitude, json.data[a].longitude ) ) ) {
var category = json.data[a].category;
pushItemsToArray(json, a, category, visibleItemsArray);
}
});
// Create list of items in Results sidebar ---------------------------------------------------------------------
$('.items-list .results').html( visibleItemsArray );
// Check if images are cached, so will not be loaded again
$.each(json.data, function(a) {
if( map.getBounds().contains( new google.maps.LatLng( json.data[a].latitude, json.data[a].longitude ) ) ) {
is_cached(json.data[a].gallery[0], a);
}
});
// Call Rating function ----------------------------------------------------------------------------------------
rating('.results .item');
var $singleItem = $('.results .item');
$singleItem.hover(
function(){
newMarkers[ $(this).attr('id') - 1 ].content.className = 'marker-active marker-loaded';
},
function() {
newMarkers[ $(this).attr('id') - 1 ].content.className = 'marker-loaded';
}
);
});
redrawMap('google', map);
function is_cached(src, a) {
var image = new Image();
var loadedImage = $('.results li #' + json.data[a].id + ' .image');
image.src = src;
if( image.complete ){
$(".results").each(function() {
loadedImage.removeClass('loading');
loadedImage.addClass('loaded');
});
}
else {
$(".results").each(function() {
$('.results li #' + json.data[a].id + ' .image').addClass('loading');
});
$(image).load(function(){
loadedImage.removeClass('loading');
loadedImage.addClass('loaded');
});
}
}
// Geolocation of user -----------------------------------------------------------------------------------------
$('.geolocation').on("click", function() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(success);
} else {
console.log('Geo Location is not supported');
}
});
function success(position) {
var locationCenter = new google.maps.LatLng( position.coords.latitude, position.coords.longitude);
map.setCenter( locationCenter );
map.setZoom(14);
var markerContent = document.createElement('DIV');
markerContent.innerHTML =
'';
// Create marker on the map ------------------------------------------------------------------------------------
var marker = new RichMarker({
position: locationCenter,
map: map,
draggable: false,
content: markerContent,
flat: true
});
marker.content.className = 'marker-loaded';
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
"latLng": locationCenter
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var lat = results[0].geometry.location.lat(),
lng = results[0].geometry.location.lng(),
placeName = results[0].address_components[0].long_name,
latlng = new google.maps.LatLng(lat, lng);
$("#location").val(results[0].formatted_address);
}
});
}
// Autocomplete address ----------------------------------------------------------------------------------------
var input = document.getElementById('location') ;
var autocomplete = new google.maps.places.Autocomplete(input, {
types: ["geocode"]
});
autocomplete.bindTo('bounds', map);
google.maps.event.addListener(autocomplete, 'place_changed', function() {
var place = autocomplete.getPlace();
if (!place.geometry) {
return;
}
if (place.geometry.viewport) {
map.fitBounds(place.geometry.viewport);
map.setZoom(14);
} else {
map.setCenter(place.geometry.location);
map.setZoom(14);
}
//marker.setPosition(place.geometry.location);
//marker.setVisible(true);
var address = '';
if (place.address_components) {
address = [
(place.address_components[0] && place.address_components[0].short_name || ''),
(place.address_components[1] && place.address_components[1].short_name || ''),
(place.address_components[2] && place.address_components[2].short_name || '')
].join(' ');
}
});
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// OpenStreetMap - Homepage
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function createHomepageOSM(_latitude,_longitude,json,mapProvider){
$.get("/assets/external/_infobox.js", function() {
osmMap();
});
function osmMap(){
var map = L.map('map', {
center: [_latitude,_longitude],
zoom: 14,
scrollWheelZoom: false
});
L.tileLayer.provider(mapProvider).addTo(map);
var markers = L.markerClusterGroup({
showCoverageOnHover: false,
zoomToBoundsOnClick: false
});
var loadedMarkers = [];
// Create markers on the map -----------------------------------------------------------------------------------
for (var i = 0; i < json.data.length; i++) {
// Set icon for marker -------------------------------------------------------------------------------------
if( json.data[i].type_icon ) var icon = '
';
else icon = '';
if( json.data[i].color ) var color = json.data[i].color;
else color = '';
var markerContent =
'';
var _icon = L.divIcon({
html: markerContent,
iconSize: [36, 46],
iconAnchor: [18, 32],
popupAnchor: [130, -28],
className: ''
});
var title = json.data[i].title;
var marker = L.marker(new L.LatLng( json.data[i].latitude, json.data[i].longitude ), {
title: title,
icon: _icon
});
loadedMarkers.push(marker);
// Infobox HTML element ------------------------------------------------------------------------------------
var category = json.data[i].category;
var infoboxContent = document.createElement("div");
marker.bindPopup(
drawInfobox(category, infoboxContent, json, i)
);
markers.addLayer(marker);
// Set hover states for marker -----------------------------------------------------------------------------
marker.on('popupopen', function () {
this._icon.className += ' marker-active';
});
marker.on('popupclose', function () {
this._icon.className = 'leaflet-marker-icon leaflet-zoom-animated leaflet-clickable marker-loaded';
});
}
map.addLayer(markers);
// Animate already created markers -----------------------------------------------------------------------------
animateOSMMarkers(map, loadedMarkers, json);
map.on('moveend', function() {
animateOSMMarkers(map, loadedMarkers, json);
});
markers.on('clusterclick', function (a) {
var markersInCLuster = a.layer.getAllChildMarkers();
var latitudeArray = [];
var longitudeArray = [];
for (var b=0; b < markersInCLuster.length; b++)
{
var formattedLatitude = parseFloat( markersInCLuster[b]._latlng.lat ).toFixed(6);
var formattedLongitude = parseFloat( markersInCLuster[b]._latlng.lng ).toFixed(6);
latitudeArray.push( formattedLatitude );
longitudeArray.push( formattedLongitude );
}
Array.prototype.allValuesSame = function() {
for(var i = 1; i < this.length; i++)
{
if(this[i] !== this[0])
return false;
}
return true;
};
if( latitudeArray.allValuesSame() && longitudeArray.allValuesSame() ){
multiChoice(latitudeArray[0], longitudeArray[0], json);
}
else {
a.layer.zoomToBounds();
}
});
$('.results .item').hover(
function(){
loadedMarkers[ $(this).attr('id') - 1 ]._icon.className = 'leaflet-marker-icon leaflet-zoom-animated leaflet-clickable marker-loaded marker-active';
},
function() {
loadedMarkers[ $(this).attr('id') - 1 ]._icon.className = 'leaflet-marker-icon leaflet-zoom-animated leaflet-clickable marker-loaded';
}
);
$('.geolocation').on("click", function() {
map.locate({setView : true})
});
$('body').addClass('loaded');
setTimeout(function() {
$('body').removeClass('has-fullscreen-map');
}, 1000);
$('#map').removeClass('fade-map');
redrawMap('osm', map);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Item Detail Map - Google
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function itemDetailMap(json){
var mapCenter = new google.maps.LatLng(json.latitude,json.longitude);
var mapOptions = {
zoom: 12,
center: mapCenter,
disableDefaultUI: true,
scrollwheel: true,
styles: mapStyles,
panControl: true,
zoomControl: true,
draggable: true
};
var mapElement = document.getElementById('map-detail');
var map = new google.maps.Map(mapElement, mapOptions);
if( json.type_icon ) var icon = '
';
else icon = '';
// Google map marker content -----------------------------------------------------------------------------------
var markerContent = document.createElement('DIV');
markerContent.innerHTML =
'';
// Create marker on the map ------------------------------------------------------------------------------------
var marker = new RichMarker({
position: new google.maps.LatLng( json.latitude, json.longitude ),
map: map,
draggable: false,
content: markerContent,
flat: true
});
marker.content.className = 'marker-loaded';
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Simple Google Map (contat, submit...)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function simpleMap(_latitude, _longitude, draggableMarker){
//console.log(_latitude,_longitude,draggableMarker );
var mapCenter = new google.maps.LatLng(_latitude, _longitude);
var mapOptions = {
zoom: 14,
center: mapCenter,
disableDefaultUI: true,
scrollwheel: false,
styles: mapStyles,
panControl: false,
zoomControl: false,
draggable: true
};
var mapElement = document.getElementById('map-simple');
var map = new google.maps.Map(mapElement, mapOptions);
// Google map marker content -----------------------------------------------------------------------------------
var markerContent = document.createElement('DIV');
markerContent.innerHTML =
'';
// Create marker on the map ------------------------------------------------------------------------------------
var marker = new RichMarker({
//position: mapCenter,
position: new google.maps.LatLng( _latitude, _longitude ),
map: map,
draggable: draggableMarker,
content: markerContent,
flat: true
});
marker.content.className = 'marker-loaded';
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Functions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Push items to array and create element in Results sidebar ------------------------------------------------------
function pushItemsToArray(json, a, category, visibleItemsArray){
var itemPrice;
visibleItemsArray.push(
'' +
'' +
''
);
function drawPrice(price){
if( price ){
itemPrice = '' + price + '
';
return itemPrice;
}
else {
return '';
}
}
}
// Center map to marker position if function is called (disabled) ------------------------------------------------------
function centerMapToMarker(){
$.each(json.data, function(a) {
if( json.data[a].id == id ) {
var _latitude = json.data[a].latitude;
var _longitude = json.data[a].longitude;
var mapCenter = new google.maps.LatLng(_latitude,_longitude);
map.setCenter(mapCenter);
}
});
}
// Create modal if more items are on the same location (example: one building with floors) -----------------------------
function multiChoice(sameLatitude, sameLongitude, json) {
//if (clickedCluster.getMarkers().length > 1){
var multipleItems = [];
$.each(json.data, function(a) {
if( json.data[a].latitude == sameLatitude && json.data[a].longitude == sameLongitude ) {
pushItemsToArray(json, a, json.data[a].category, multipleItems);
}
});
$('body').append('');
$('.modal-window').load( '/assets/external/_modal-multichoice.html', function() {
$('.modal-window .modal-wrapper .items').html( multipleItems );
rating('.modal-window');
});
$('.modal-window .modal-background, .modal-close').live('click', function(e){
$('.modal-window').addClass('fade_out');
setTimeout(function() {
$('.modal-window').remove();
}, 300);
});
//}
}
// Animate OSM marker --------------------------------------------------------------------------------------------------
function animateOSMMarkers(map, loadedMarkers, json){
var bounds = map.getBounds();
var visibleItemsArray = [];
var multipleItems = [];
$.each( loadedMarkers, function (i) {
if ( bounds.contains( loadedMarkers[i].getLatLng() ) ) {
var category = json.data[i].category;
pushItemsToArray(json, i, category, visibleItemsArray);
setTimeout(function(){
if( loadedMarkers[i]._icon != null ){
loadedMarkers[i]._icon.className = 'leaflet-marker-icon leaflet-zoom-animated leaflet-clickable marker-loaded';
}
}, i* 50);
}
else {
if( loadedMarkers[i]._icon != null ){
loadedMarkers[i]._icon.className = 'leaflet-marker-icon leaflet-zoom-animated leaflet-clickable';
}
}
});
// Create list of items in Results sidebar -------------------------------------------------------------------------
$('.items-list .results').html( visibleItemsArray );
rating('.results .item');
$('.results .item').hover(
function(){
if( loadedMarkers[ $(this).attr('id') - 1 ]._icon ){
loadedMarkers[ $(this).attr('id') - 1 ]._icon.className = 'leaflet-marker-icon leaflet-zoom-animated leaflet-clickable marker-loaded marker-active';
}
},
function() {
if( loadedMarkers[ $(this).attr('id') - 1 ]._icon ){
loadedMarkers[ $(this).attr('id') - 1 ]._icon.className = 'leaflet-marker-icon leaflet-zoom-animated leaflet-clickable marker-loaded';
}
}
);
}
// Redraw map after item list is closed --------------------------------------------------------------------------------
function redrawMap(mapProvider, map){
$('.map .toggle-navigation').click(function() {
$('.map-canvas').toggleClass('results-collapsed');
$('.map-canvas .map').one("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){
if( mapProvider == 'osm' ){
map.invalidateSize();
}
else if( mapProvider == 'google' ){
google.maps.event.trigger(map, 'resize');
}
});
});
}