$(document).ready(function() {
    Loader.async = true;
	Loader.load(null, {poi:true}, function(){
		$(".mapycz-canvasx",$('body')).each(function(index, element) {
            mvc_module_mapyczx($(this));
        });
	});
});

function mvc_module_mapyczx(element){

	var method = {};
	method.frame = $('#playContent');
	method.autocenter = true;
	method.routepoints = false;
	method.routepointscontent = false;
	method.routepointsmodal = false;
	
	var vars = element.data();
	vars.setup = JSON.parse(Base64.decode(vars.setup));
	
	var map = false;
	var mapFrom = false;
	
	vars.lat = parseFloat(vars.lat);
	vars.lng = parseFloat(vars.lng);
	
	vars.stred = false;
	
	var mapOptions = {
	  center: { lat: vars.lat, lng: vars.lng },
	  zoom: vars.zoom,
	  draggable: vars.setup.draggable,
	  scrollwheel:vars.setup.mousezoom
	};

	var proms = {
		address_street : 'address_street',
		address_city : 'address_city',
		address_postcode : 'address_postcode',
		address_country : 'address_country',
		admin_area_1 : 'admin_area_1',
		admin_area_2 : 'admin_area_2'
	}
	
	var recproms = {
		address_street : 'address_street',
		address_city : 'address_city',
		address_postcode : 'address_postcode',
		address_country : 'address_country',
		admin_area_1 : 'admin_area_1',
		admin_area_2 : 'admin_area_2'
	}
	
	var scriptPath = "/play/json.php";
	var markers = {
		singleMarker : false
	};
	
	// INICIALIZACE MAPY ===========================================================
	method.initMap = function(){
		
		vars.stred = SMap.Coords.fromWGS84(vars.lng, vars.lat);
		map = new SMap(JAK.gel($(".mapycz",element).attr('id')), vars.stred, vars.setup.zoom);
		map.addDefaultLayer(SMap.DEF_TURIST).enable();
		//map.addDefaultControls();
		
		var layer = new SMap.Layer.Marker(undefined, {
			poiTooltip: true
		});
		map.addLayer(layer).enable();

		/* dataProvider zastiti komunikaci se servery */
		var dataProvider = map.createDefaultDataProvider();
		dataProvider.setOwner(map);
		dataProvider.addLayer(layer);
		dataProvider.setMapSet(SMap.MAPSET_BASE);
		dataProvider.enable();

		if(vars.setup.showCompass==1){
			var c = new SMap.Control.Compass({title:"Posun mapy"});
			map.addControl(c, {right:"8px", top:"9px"});
		}
		
		if(vars.setup.showOrientation==1){
			var c = new SMap.Control.Orientation({title:"Orientace"});
			map.addControl(c, {left:"8px", top:"9px"});
		}
		
		if(vars.setup.showZoom==1){
			var labels = {
				0: "Svět", 3: "Státy", 6: "Kraje", 9: "Města",
				12: "Obce", 15: "Ulice", 18: "Domy", 19: "Ptačí pohled"
			};

			var c = new SMap.Control.Zoom(labels, {title: 'Změna přiblížení',showZoomMenu:false,titles : ['Přiblížit','Oddálit']});
			map.addControl(c, {right:"8px", top:"90px"});
		}
		
		var mouse = new SMap.Control.Mouse((vars.setup.draggable?SMap.MOUSE_PAN:false) | (vars.setup.mousezoom?SMap.MOUSE_WHEEL:false) | (vars.setup.mousezoom?SMap.MOUSE_ZOOM:false)); /* Ovládání myší */
		map.addControl(mouse); 
		
		var sync = new SMap.Control.Sync({bottomSpace:0});
		map.addControl(sync);
		
		method.position = method.getMyPosition();
		method.position.coords = false;
		method.position.getLatLon();
		
		method.worker();
		method.positionInterval = setInterval(function(){
			method.worker();
		},500);
		
		setTimeout(method.worker2,300);
		method.positionInterval2 = setInterval(function(){
			method.worker2();
		},3000);

		var signals = map.getSignals();
		signals.addListener(window, "map-unlock", function(e){		
			var distance = 0.05;
			var km = method.distance(markers['singleMarker'].getCoords().x,markers['singleMarker'].getCoords().y,map.getCenter().x,map.getCenter().y);

			if(Math.abs(km) < distance){
				method.autocenter = true;
			} else {
				method.autocenter = false;
			}
		});
		signals.addListener(window, "marker-click", function(e){
			/*route.totalPoints--;
			route.removeMarker(e);
			route.toData();*/
		});
		$('.autocenter').on('click',function(){
			if(method.position.coords) map.setCenter(method.position.coords,true);
		});
	}
	
	method.worker = function(){
		
		if(method.position.coords){
			if(method.autocenter) $('.autocenter').hide(); else $('.autocenter').show(); 
			//console.log(method.position.coords);
		} else {
			
		}
	}
	
	method.worker2 = function(){
		if(!("geolocation" in navigator)){
			alert('err');
			$('span',method.position.gpsIcon).text("Zapni si v telefonu GPS!");
		}
		if(method.position.coords){
			method.getRoutePointsInfo();
			
			//console.log(method.position.coords);
		} else {
			
		}
	}
	
	method.getMyPosition = function(){
		
		var position = {};
		position.watch = null;
		position.timeout = false;
		
		position.gpsIcon = $('<div/>').addClass('gpsSensor').html('<i class="fa fa-location-circle"></i> <span></span>').appendTo(method.frame);
		
		position.worker = function(){
			var geolocOK = ("geolocation" in navigator);
			if(!geolocOK){
				navigator.geolocation.clearWatch(position.watch);
				position.getLatLon();
				position.coords = false;
			} else {
				setTimeout(function(){
					position.worker();
				},3000);
			}
		}
		
		position.success = function(pos){

			position.pos = pos;
			
			if(position.timeout) clearTimeout(position.timeout);
			
			/*position.timeout = setTimeout(function(){
				
			},10000);*/
			
			if(pos.coords.latitude && pos.coords.latitude){
				position.coords = SMap.Coords.fromWGS84(pos.coords.longitude,pos.coords.latitude);
				if(vars.setup.singleMarker==1) markers['singleMarker'].setCoords(position.coords);
				if(method.autocenter) map.setCenter(position.coords,true);
				
				position.gpsIcon.css({color:'green'});
				$('span',position.gpsIcon).text(Math.round(pos.coords.accuracy)+" m");
				
			} else {
				$('span',position.gpsIcon).text("Hledám GPS!");
			}
		   
		}
		
		position.getLatLon = function(){
			
			var geolocOK = ("geolocation" in navigator);
			if ( geolocOK )	{
				position.watch =  navigator.geolocation.watchPosition(position.success, position.fails,{enableHighAccuracy:true, maximumAge:600000,timeout:0});
				//position.worker();
			} else {
				position.gpsIcon.css({color:'red'});
				$('span',position.gpsIcon).text("Turn on the GPS!");
				position.coords = false;
				setTimeout(position.getLatLon,5000);
			}
		}
		
		position.fails = function (error){
			if(error.code == 1){
				position.gpsIcon.css({color:'red'});
				$('span',position.gpsIcon).text("Zapni si GPS");
				navigator.geolocation.clearWatch(position.watch);
				setTimeout(position.getLatLon,5000);
				position.coords = false;
			} else if(error.code == 3){
				position.gpsIcon.css({color:'blue'});
				$('span',position.gpsIcon).text("Hledám GPS souřadnice ...");
			} else {
				position.gpsIcon.css({color:'red'});
				$('span',position.gpsIcon).text("Error #" + error.code + ": "  + error.message );
			}
		}

		return position;
		
	}
	
/*	// INICIALIZACE MAPY OD ===========================================================
	method.initMapFrom = function(){
		mapFrom = new google.maps.Map(document.getElementById($(".google-map-from",element).attr('id')),mapOptions);
		$( target ).on( "tabsactivate", function( event, ui ) {
			google.maps.event.trigger(mapFrom,'resize');
		});		
	}	
	*/
	
	// SingleMarker Layer ===========================================================
	method.singleMarker = function(option){
		
		method.markersLayout = new SMap.Layer.Marker();
		map.addLayer(method.markersLayout).enable();

		var marker = method.addMarker();

			if(vars.setup.singleMarkerDraggable) marker.decorate(SMap.Marker.Feature.Draggable);

			method.startDrag = function(e) { /* Začátek tažení */
				var node = e.target.getContainer();
				node[SMap.LAYER_MARKER].style.cursor = "help";
			}

			method.stopDrag = function(e) {
				var node = e.target.getContainer();
				node[SMap.LAYER_MARKER].style.cursor = "";
				var coords = e.target.getCoords();
				$("#lat",element).val(coords.y);
				$("#lng",element).val(coords.x);
				vars.stred = SMap.Coords.fromWGS84(coords.x, coords.y);
				
			}
			
			method.setSingleMarker = function(e, elm) {
				
				var coords = SMap.Coords.fromEvent(e.data.event, map);
				marker.setCoords(coords);
				$("#lat",element).val(coords.y);
				$("#lng",element).val(coords.x);
				vars.stred = coords;
				method.pos2address(coords);
			}
			
			if(vars.setup.showtype=='edit'){
				var signals = map.getSignals();
				signals.addListener(window, "marker-drag-stop", method.stopDrag);
				signals.addListener(window, "marker-drag-start", method.startDrag);  
				signals.addListener(window, "map-click", method.setSingleMarker);
			}
		

		
		method.markersLayout.addMarker(marker);
		
		markers['singleMarker'] = marker;
		
	}
	
	// ADD Marker ===========================================================
	method.addMarker = function(){
		var znacka = JAK.mel("div", {}, {textAlign:"center", fontSize:"50px", color:"#ddd", fontWeight:"normal",width:0,zIndex:99,textShadow:"0 0 5px rgba(0,0,0,0.5)"});
		znacka.innerHTML = "<i class='fa fa-circle'></i>";

		var popisek = JAK.mel("div", {}, {position:"absolute", left:"15px", top:"15px", textAlign:"center", width:"100%", color:"#ff0000", fontWeight:"bold", fontSize:"20px",cursor:'pointer'});
		popisek.innerHTML = "<i class='fa fa-location-arrow'></i>";
		znacka.appendChild(popisek);
		var marker = new SMap.Marker(vars.stred, null, {url:znacka,anchor: {left:10, bottom:0},title:"item.name"});
		return marker;		
	}
	
	// POSITION 2 ADDRESS ===================================================
	method.pos2address = function(coords){
		return new SMap.Geocoder.Reverse(coords, method.geocodeRevResult);
	}
	
	method.geocodeRevResult = function(geocoder){
		
		var results = geocoder.getResults();
		var data = [];
		while (results.items.length) { /* Zobrazit všechny výsledky hledání */
			var item = results.items.shift();
			data[item.type] = item.name;
		}
		
		$('#'+proms.address_street,element).val(data.addr||data.stre);
		$('#'+proms.address_city,element).val(data.muni);
		$('#'+proms.admin_area_1,element).val(data.dist);
		$('#'+proms.admin_area_2,element).val(data.regi);
		$('#'+proms.address_country,element).val(data.coun);
		
	}
	
	// ADDRESS 2 POSITION ==========================================================
	method.address2pos = function(address,updateAddress){
		var geocode = new SMap.Geocoder(address, method.geocodeResult, {
    		// parametry pro omezeni mista - bounding box ceske republiky dle https://wiki.openstreetmap.org/wiki/WikiProject_Czech_Republic
  			bbox: [SMap.Coords.fromWGS84(12.09, 51.06), SMap.Coords.fromWGS84(18.87, 48.55)]
  		});
	};

	method.geocodeResult = function(geocoder){

		if (!geocoder.getResults()[0].results.length) {
			alert("Tohle neznáme.");
			return;
		}
		
		var vysledky = geocoder.getResults()[0].results;
		var adresa = method.pos2address(vysledky[0].coords);

		if(vars.setup.singleMarker==1) markers['singleMarker'].setCoords(vysledky[0].coords);
		$("#lat",element).val(vysledky[0].coords.y);
		$("#lng",element).val(vysledky[0].coords.x);
		map.setCenter(vysledky[0].coords,true);
		method.pos2address(vysledky[0].coords);

	}
	
	// INIT SEARCH ================================================================
	method.initSearch = function(){
		$('.myPosition',element).on('click',function(){
			if (navigator.geolocation) {
				navigator.geolocation.getCurrentPosition(function(data){
					var coords = SMap.Coords.fromWGS84(data.coords.longitude,data.coords.latitude);
					if(vars.setup.singleMarker==1) markers['singleMarker'].setCoords(coords);
					$("#lat",element).val(coords.y);
					$("#lng",element).val(coords.x);
					map.setCenter(coords,true);
					method.pos2address(coords);
				});
		    } else {
				$.vmsInfoBox({type:"error",icon:"exclamation-triangle",content:"Geolocation is not supported by this browser."});
		    }
		});
		$('.fromPointAddress',element).on('click',function(){
                method.pos2address(vars.stred);
		});
		$('.geocodeAddress',element).on('click',function(){
			var address = $('#geocodeAddress',element).val();
			method.address2pos(address,true);
		});
		$("#geocodeAddress",element).keypress(function(e) {
			if (e.which == 13) {
				var address = $('#geocodeAddress',element).val();
				method.address2pos(address,true);
			} 
		});	
	};
	
	//  JSON DATA ================================================================
	method.getRoutePointsInfo = function(){
		
		method.showPhotoButton = true;
		
		$.ajax({
			type:"post",
			url:"json.php",
			dataType: "json",
			data : {fce:"getPointInfo",x:method.position.coords.x,y:method.position.coords.y,mid:vars.setup.module_id,rid:vars.setup.record_id},
			success:function(result){
                    
                if(!result.logged) reloadPage();
				
				method.routepoints = result.points;
				method.routepointscontent = result.pointinfohtml;
				method.showPhotoButton = false;
				method.actualPoint = false;
				
				var pointsFrame = $('.myRoutePointsFrame').html(method.routepointscontent);
				$('.takepicture',pointsFrame).each(function(i,e){
					$(e).on('click',function(){method.photoPoint($(e));});
				});

				if(method.routepoints){
					$.each(method.routepoints,function(i,point){
						if(point.distance < 30){
							method.showPhotoButton = true;
							method.actualPoint = point.id;
						}
					});
				}

				if(method.routepointsmodal) method.routepointsmodal.resize();
				
				if(method.showPhotoButton) {
					$('.newPhoto').show();
				} else {
					$('.newPhoto').hide();
				}
				
			},
			error:function(jqXHR, status, thrownError) {
				console.log(jqXHR.responseText);				
			}
		});	
		
	};
	
	//  JSON DATA ================================================================
	method.recJsonData = function(id,mid){
		
		var url = "/?detail="+id+"&modid="+mid+"&view=json";

		$.ajax({
			
			type:"get",
			url:url,
			dataType: "json",

			success:function(data){
				
				var r = data.records[id].rVars;
				$('#'+proms.address_street,element).val(r[recproms.address_street]);
				$('#'+proms.address_city,element).val(r[recproms.address_city]);
				$('#'+proms.address_postcode,element).val(r[recproms.address_postcode]);
				$('#'+proms.admin_area_1,element).val(r[recproms.admin_area_1]);
				$('#'+proms.admin_area_2,element).val(r[recproms.admin_area_2]);
				$('#'+proms.address_country,element).val(r[recproms.address_country]);
				$('#lat',element).val(r.lat);
				$('#lng',element).val(r.lng);
				$('#lokalita',element).val(r.lokalita);
				$('#lokalita',element).trigger("chosen:updated");
				vars.lat = r.lat;
				vars.lng = r.lng;
				var latlng = new google.maps.LatLng(vars.lat, vars.lng);
				markers['singleMarker'].setPosition(latlng);
				map.setCenter(latlng);
			},
			
			error:function(jqXHR, status, thrownError) {
				console.log(jqXHR.responseText);				
			}
		});					
	};
	
	method.relativeItems = function(){
		
		relative = {};
		relative.markersLayout = new SMap.Layer.Marker();
		map.addLayer(relative.markersLayout).enable();
		
		relative.loadData = function(){
			
			var hash = new Date().getTime();
			var lID = "loader"+hash;

			var data ={
				fce : "geoData",mid:vars.setup.dataMod,idk:vars.setup.dataCat,ido:vars.setup.dataLoc,eid:vars.setup.eid,onlyowner:vars.setup.onlyowner,relmod:vars.setup.module_id,rid:vars.setup.record_id
			};

			$.ajax({

				type:"post",
				url:scriptPath,
				data:data,
				dataType: "json",

				beforeSend:function(){
					ajaxLoader(element,"ajaxLoader",lID,lang.texts.loading,true); 
				},

				complete:function(){
					method.hideLoader(lID);
				},
				success:function(result){
					relative.data = result;
					relative.markersLayout.removeAll();
					method.hideLoader(lID);	
					if(typeof data.error === 'undefined'){
						$.each(result.items,function(i,item){
							relative.addMarker(SMap.Coords.fromWGS84(item.lng, item.lat),item);
						});
						$('.pointsToggle').show();
					} else {
						console.log('ERRORS: ' + data.error);
						console.log(data);
					}
				},

				error:function(jqXHR, status, thrownError) {
					console.log(jqXHR.responseText);
					method.hideLoader(lID);						
				}

			});	
		};
		
		relative.modalCallback = function(result){
			//alert(data);
			if(result.type=="saveRecord" && result.data.post.mid == vars.setup.dataMod){
				relative.loadData();
			}
		}
		
		relative.addMarker = function(coords,item){

			if(!item.icon) item.icon = "circle";
			
			var znacka = JAK.mel("div", {}, {textAlign:"center", fontSize:"30px", color:"#333", fontWeight:"bold",width:0});
			znacka.innerHTML = "<i class='fa fa-map-marker'></i>";

			var popisek = JAK.mel("div", {}, {position:"absolute", left:"5px", top:"6px", textAlign:"center", width:"100%", color:"white", fontWeight:"bold", fontSize:"13px",cursor:'pointer'});
			popisek.innerHTML = "<i class='fa fa-"+item.icon+"'></i>";
			znacka.appendChild(popisek);
			
			/*var card = new SMap.Card();
			card.getHeader().innerHTML = "<strong>"+item.name+"</strong>";
			card.getBody().innerHTML = item.infoWindowContent;*/

			var marker = new SMap.Marker(coords, null, {url:znacka,anchor: {left:10, bottom:0},title:item.name});
			marker.href = item.href;
			//marker.decorate(SMap.Marker.Feature.Card, card);
			relative.markersLayout.addMarker(marker);
			
		}
		
		relative.addFromMapClick = function(e,elm){
			
			var action = $("#clickMapAction",element).val();
			var id = $("#id",element.closest('form')).val();
			var mid = $("#mid",element.closest('form')).val();
			
			if(action=='poi'){
				var coords = SMap.Coords.fromEvent(e.data.event, map);
				if(vars.setup.record_id){
					var poiModal = $.vmsModal({loadUrl:"/?modul="+vars.setup.dataModAlias+"&new&lat="+coords.y+"&lng="+coords.x+"&rtm["+mid+"]=3&relTo="+id+"&relToCat="+mid+"",caller:relative});
				} else {
					var poiModal = $.vmsModal({content:"Před přidáváním souvisejících záznamů je potřeba nejdříve tento záznam uložit.",titleText:"Chyba akce",titleIco:"exclamation-triangle",caller:method});
				}
			}
			
		}
		
		var signals = map.getSignals();

		signals.addListener(window, "marker-click", function(e){
			if(e.target.href) {
				$.vmsModal({loadUrl:e.target.href});
			} else {
				console.log(e);
			}
		});
		
		$('.pointsToggle').on("click",function(){
			
			var routePointInfo = {};
			
			routePointInfo.modalCallback = function(result){
				if(result=='closing'){
					method.routepointsmodal = false;
				}
			}
			
			routePointInfo.createHtml = function(){
				var pointsFrame = $('<div>').addClass('myRoutePointsFrame').html(method.routepointscontent);
				$('.takepicture',pointsFrame).each(function(i,e){
					$(e).on('click',function(){method.photoPoint($(e));});
				});
				return pointsFrame;
			}
					
			routePointInfo.openModal = function(){
				var content = routePointInfo.createHtml();
				method.routepointsmodal = $.vmsModal({content:content,titleText:"Záchytné body trasy",titleIco:"route",caller:routePointInfo,draggable:false});
				
				$(window).on('resize', function(){
					setTimeout(function(){
						method.routepointsmodal.settings.posX = false;
						method.routepointsmodal.settings.posY = false;
						method.routepointsmodal.resizeCenter();
					},100);
				});
				
			}
			
			if(method.routepoints) routePointInfo.openModal();
			
		});
		
		
		
		relative.loadData();
		
		return relative;
		
	}
	
	method.hideLoader = function(lID){
		$("#"+lID).fadeOut('fast', function() { $(this).remove(); });
		$("#"+lID+"-fader").fadeOut('fast', function() { $(this).remove(); });	
	}
	
	method.distance = function(lat1, lon1, lat2, lon2, unit) {
		if ((lat1 == lat2) && (lon1 == lon2)) {
			return 0;
		}
		else {
			var radlat1 = Math.PI * lat1/180;
			var radlat2 = Math.PI * lat2/180;
			var theta = lon1-lon2;
			var radtheta = Math.PI * theta/180;
			var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
			if (dist > 1) {
				dist = 1;
			}
			dist = Math.acos(dist);
			dist = dist * 180/Math.PI;
			dist = dist * 60 * 1.1515;
			if (unit=="K") { dist = dist * 1.609344 }
			if (unit=="N") { dist = dist * 0.8684 }
			return dist;
		}
	}
	
	method.routePlanner = function(){
		
		var route = {};
		route.container = $('.routeContainter',element);
		route.datainput = $('#specText-routeData',element);
		
		route.markersLayout = new SMap.Layer.Marker();
		map.addLayer(route.markersLayout).enable();
		
		route.totalPoints = 0;
		route.firstload = true;
		
		route.layer = new SMap.Layer.Geometry();
		map.addLayer(route.layer).enable();
		
		route.points = [];

		route.startDrag = function(e) { /* Začátek tažení */ 	
			var node = e.target.getContainer();
			node[SMap.LAYER_MARKER].style.cursor = "help";
		}

		route.stopDrag = function(e) {
			var node = e.target.getContainer();
			node[SMap.LAYER_MARKER].style.cursor = "";
			var coords = e.target.getCoords();
			route.toData();
		}
		
		route.addFromMapClick = function(e,elm){
			
			var action = $("#clickMapAction",element).val();
			var id = $("#id",element.closest('form')).val();
			var mid = $("#mid",element.closest('form')).val();

			if(action=='marker'){
				route.totalPoints++;
				route.addMarker(SMap.Coords.fromEvent(e.data.event, map),0);
				route.toData();
			}
		}
		
		route.addMarker = function(coords,index,znacka,title){
			
			if(!znacka){
				if(vars.setup.showtype=='edit'){

					var znacka = JAK.mel("div", {}, {textAlign:"center", fontSize:"30px", color:"red", fontWeight:"bold",width:0});
					znacka.innerHTML = "<i class='fa fa-map-marker'></i>";

					var popisek = JAK.mel("div", {}, {position:"absolute", left:"6px", top:"3px", textAlign:"center", width:"100%", color:"white", fontWeight:"bold", fontSize:"17px",cursor:'pointer'});
					popisek.innerHTML = route.totalPoints;
					znacka.appendChild(popisek);

				} else {
					var znacka = JAK.mel("div", {}, {textAlign:"center", fontSize:"10px", color:"red", fontWeight:"bold",position:"absolute",width:'0px'});
					znacka.innerHTML = "";
				}
			}
			
			var marker = new SMap.Marker(coords, null, {url:znacka,anchor: {left:10, bottom:0},title:title});
			if(vars.setup.showtype=='edit') marker.decorate(SMap.Marker.Feature.Draggable);
			//marker.decorate(SMap.Marker.Feature.Shadow);
			route.markersLayout.addMarker(marker);
			
		}
		
		route.removeMarker = function(e){
			route.markersLayout.removeMarker(e.target);
		}
		
		route.toData = function(){
		
			route.container.html('');
			var routePoints = [];
			var first = false;
			$.each(route.markersLayout._markers,function(id,routePoint){

				//if(!route.markersLayout._markers[id].marker._options.title) route.markersLayout._markers[id].marker._options.title = "RoutePoint";
				
				var point = {};
				point.coords = routePoint.marker._coords;
				point.name = route.markersLayout._markers[id].marker._options.title;

				routePoints.push(point);
				
				if(!first){
					first = true;
					$('input[name="lat"]',element).val(point.coords.y);
					$('input[name="lng"]',element).val(point.coords.x);
				}
				
				var frame = $('<div>').html('').appendTo(route.container);
				var removeButt = $('<i>').addClass('fa fa-times-square routePointDelete').appendTo(frame);
				var zoomButt = $('<i>').addClass('fa fa-search-plus routePointZoom').appendTo(frame);
				
				var routePointName = $('<input>').addClass('routePointName').val(route.markersLayout._markers[id].marker._options.title).appendTo(frame);
				
				routePointName.on('change',function(){
					point.name = routePointName.val();
					route.markersLayout._markers[id].marker._options.title = routePointName.val();
					route.markersLayout.redraw();
					route.toData();
				});
				
				removeButt.on('click',function(){
					route.totalPoints = 0;
					route.markersLayout.removeMarker(routePoint.marker);
					route.toData();
					route.markersLayout.removeAll();
					route.loadPoints(JSON.parse(route.datainput.val()));
				});
				
				zoomButt.on('click',function(){
					map.setCenter(point.coords);
					map.setZoom(16);
				});
				
			});
			
			
			
			route.datainput.val(JSON.stringify(routePoints));
			route.findRoute();
			
		}
		
		route.findRoute = function(){
			var coords = [];
			route.layer.removeAll();
			$('input[name="min"]',element).val(0);
			$('input[name="length"]',element).val(0);
			$('input[name="ascent"]',element).val(0);
			$('input[name="descent"]',element).val(0);
			$('input[name="minAltitude"]',element).val(0);
			$('input[name="maxAltitude"]',element).val(0);
			if(route.markersLayout){
				var count = 0;
				$.each(route.markersLayout._markers,function(i,routePoint){
					coords.push(routePoint.marker._coords);
					count++;
				});
				
				if(vars.setup.showtype=='edit'){
					if($('#specText-routeCircle',element).is(":checked")) coords.push(coords[0]);
				} else {
					if(vars.setup.routeCircle==1) coords.push(coords[0]);
				}

				if(count>1) new SMap.Route(coords, route.drawRoute,{criterion:'turist1'});
			}
		}
		
		route.drawRoute = function(routeResult){
			
			var results = routeResult.getResults();
			var article = element.closest('article');
			if($('.routeUrl',article).length > 0){
				$('.routeUrl',article).html("<a href='"+results.url+"' class='icoButt icoButtRed' target='_blank'><i class='fa fa-map'></i> Zobrazit na mapy.cz</a>");
			}
			var coords = results.geometry;
			var cz = map.computeCenterZoom(coords);
			if(route.firstload) map.setCenterZoom(cz[0], cz[1]);
			
			if(vars.setup.showtype=='edit'){
				var lineOptions = {color:(vars.setup.routeColor?vars.setup.routeColor:"red"),opacity:0.4,width:(vars.setup.routeWidth?vars.setup.routeWidth:10),outlineWidth:0};
			} else {
				var lineOptions = {color:(vars.setup.routeColor?vars.setup.routeColor:"red"),opacity:0.7,width:(vars.setup.routeWidth?vars.setup.routeWidth:5),outlineWidth:0};
			}
			var g = new SMap.Geometry(SMap.GEOMETRY_POLYLINE, null, coords, lineOptions);
			route.layer.addGeometry(g);
			
			$('#specText-routeColor,#colorSelector',element).on("change",function(i,e){
				g.setOptions({color:$(this).val()});
			})
			
			$('#specText-routeWidth',element).on("change",function(i,e){
				g.setOptions({width:$(this).val()});
			})
			
			var maxAltitude = false;
			var minAltitude = false;
			
			var elevationChartData = {};
			elevationChartData['alt'] = [];
			elevationChartData['coords'] = [];
			elevationChartData['vzdalenost'] = [];
			
			var lengthStep = results.length/results.altitude.length;
			var geometryStep = results.geometry.length/results.altitude.length;
			
			$.each(results.altitude,function(i,alt){
				if(!maxAltitude || alt > maxAltitude) maxAltitude = alt;
				if(!minAltitude || alt < minAltitude) minAltitude = alt;
				elevationChartData['alt'].push(alt); 
				elevationChartData['coords'].push(results.geometry[Math.round(i*geometryStep)]);
				elevationChartData['vzdalenost'].push(Math.round(i*lengthStep/100)/10);
			});
			
			$('input[name="min"]',element).val(results.time);
			$('input[name="length"]',element).val(results.length);
			$('input[name="ascent"]',element).val(results.ascent);
			$('input[name="descent"]',element).val(results.descent);
			$('input[name="minAltitude"]',element).val(minAltitude);
			$('input[name="maxAltitude"]',element).val(maxAltitude);
			
			var elevation = {};
			
			elevation.showModal = function(){
				
				elevation.modal = $.vmsModal({content:"<canvas id='elevationChart' height='50px' ></canvas>",titleText:"Výškový profil trasy",titleIco:"chart-area",overlay:false,caller:elevation,draggable:false});
				
				route.drawElevation(elevationChartData,$('#elevationChart',elevation.modal.content));
				elevation.modal.resize();
				elevation.modal.settings.posX = 1;
				elevation.modal.settings.posY = element.height()-$("#"+elevation.modal.getid).outerHeight();
				
				elevation.modal.setPositionX();
				
				$(window).on('resize', function(){
					setTimeout(function(){
						elevation.modal.resize();
						elevation.modal.settings.posX = 1;
						elevation.modal.settings.posY = element.height()-$("#"+elevation.modal.getid).outerHeight();
						elevation.modal.setPositionX();
					},300);
				});
				
			}
			
			elevation.modalCallback = function(result){
				if(result=='closing') elevation.modal = false;
			}
			
			$('.elevationToggle').on("click",function(){
				if(!elevation.modal) elevation.showModal();
			});
			
			$('.elevationToggle').show();
			
			route.firstload = false;
		}
		
		route.elevationMarker = function(coords){
			route.altitudeLayer.removeAll();
			var znacka = JAK.mel("div", {}, {textAlign:"center", fontSize:"30px", color:(vars.setup.routeColor?vars.setup.routeColor:"#bb0000"), fontWeight:"bold",width:'10px'});
			znacka.innerHTML = "<i class='fa fa-map-marker' style='text-shadow:0 0 2px black;'></i>";
			var marker = new SMap.Marker(coords, null, {url:znacka,anchor: {right:0, bottom:0}});
			route.altitudeLayer.addMarker(marker);
			map.setCenter(coords,true);
		}
		
		route.drawElevation = function(elevationChartData,element){

			if( element.length > 0){
				
				route.altitudeLayer = new SMap.Layer.Marker();
				map.addLayer(route.altitudeLayer).enable();
				
				Chart.defaults.LineWithLine = Chart.defaults.line;
				Chart.controllers.LineWithLine = Chart.controllers.line.extend({
					draw: function(ease) {
						Chart.controllers.line.prototype.draw.call(this, ease);

						if (this.chart.tooltip._active && this.chart.tooltip._active.length) {
							var activePoint = this.chart.tooltip._active[0],
								ctx = this.chart.ctx,
								x = activePoint.tooltipPosition().x,
								topY = this.chart.scales['y-axis-0'].top,
								bottomY = this.chart.scales['y-axis-0'].bottom;

							// draw line
							ctx.save();
							ctx.beginPath();
							ctx.moveTo(x, topY);
							ctx.lineTo(x, bottomY);
							ctx.lineWidth = 1;
							ctx.strokeStyle = 'rgba(0,0,0,0.3)';
							ctx.stroke();
							ctx.restore();
						}
					}
				});
				
				var chartID = element.prop('id');
				var ctx = document.getElementById(chartID).getContext('2d');
				var myChart = new Chart(ctx, {
					type: 'LineWithLine',
					data: {
						labels: elevationChartData['vzdalenost'],
						datasets: [{
							label: 'Nadmořská výška',
							data: elevationChartData['alt'],
							backgroundColor:'rgba(0, 0, 0, 0.2)',
							hoverBackgroundColor	:'rgba(0, 0, 0, 0.5)',
							borderColor:'rgba(0, 0, 0, 0.7)',
							borderWidth: 1,
							barPercentage:1,
							fill: 'start',
							pointRadius: 0,
							pointHoverRadius : 5
						}]
					},
					options: {
						responsive: true,
						title: {
							display: false,
							text: 'Graf'
						},
						tooltips: {
							mode: 'index',
							intersect: false,
							callbacks: {
								label: function(tooltipItem) {
									route.elevationMarker(elevationChartData['coords'][tooltipItem.index]);
									return tooltipItem.yLabel + " m.n.m., " + tooltipItem.xLabel + " km";
								}
							}
						},
						hover: {
							mode: 'nearest',
							intersect: true
						},
						legend: {
							display:false
						},
						scales: {
							xAxes: [{
								display: true,
								scaleLabel: {
									display: false,
									labelString: 'Km'
								},
								ticks: {
									min:0,
									stepSize: 10,
									maxTicksLimit : 8,
									callback: function(value, index, values) {
										return value + ' km';
									}
								}
							}],
							yAxes: [{
								display: true,
								scaleLabel: {
									display: true,
									labelString: 'm.n.m.'
								},
								ticks: {
									min:0,
									stepSize: 250
								}
							}]
						}
					}
				});
			}
			
		}
		
		route.loadPoints = function(routePoints){
			if(routePoints){
				$.each(routePoints,function(i,routePoint){
					route.totalPoints++;
					route.addMarker(SMap.Coords.fromWGS84(routePoint.coords.x, routePoint.coords.y),i+1,false,routePoint.name);
				});
				route.toData();
			}
		}

		if(vars.setup.routeData!=""){
			route.loadPoints(JSON.parse(vars.setup.routeData));
		}
		
		return route;
	}
	
	method.modalCallback = function(result){
		//alert(data);
		if(result.type=="saveRecord" && result.data.post.mid == vars.setup.dataMod){
			
		}
		
	}
		
	// INICIALIZACE ================================================================
	
	method.init = function(){
		
		method.initMap();
		
		if(vars.setup.showRoute==1) method.initMapFrom();
		if(vars.setup.singleMarker==1) method.singleMarker();
		if(vars.setup.showSearch==1) method.initSearch();		
		if(vars.setup.routePlanner==1) method.routePlanner();
		if(vars.setup.dataMod) method.relatives = method.relativeItems();
		
		$('.newPhoto').on('click',function(){
			var takepicture = $('.newPhoto');
			takepicture.data("pointid",method.actualPoint);
			method.photoPoint(takepicture);
		});
		return false;
		
		$('.address2map',element).on('click',function(){
			var address = $('#'+proms.address_street,element).val()+" ";
			address+= $('#'+proms.address_city,element).val()+" ";
			address+= $('#'+proms.address_postcode,element).val()+" ";
			address+= $('#'+proms.address_country,element).val();
			method.address2pos(address,false);
		});
		
		$('.route2map',element).on('click',function(){
			method.getRoute();
		});
		
		$('.loadRelativeAddress',element).on('click',function(){
			
			var form = element.closest('form');
			
			if($(this).data('relmod')){
				var relMod = $(this).data('relmod');
				var relId = $('.relTo'+relMod).data('relto');
			} else {
				var relMod = $('#relTo',form).data('reltocat');
				var relId = $('#relTo',form).val();
			}

			
			if(!relId){
				console.log('Id relativního záznamu nenalezeno!');
			} else {
				method.recJsonData(relId,relMod);
			}
		});
        
		if(vars.setup.relAutoload==1 && vars.setup.newrecord==1) $('.loadRelativeAddress',element).click();
		
	};
	
	method.photoPoint = function(butt){

		/*method.modalPoint = $.vmsModal({titleText:"Další akce k poloze", titleIco:"map-marker", overlay:true, overlayClose:false, escClose: false, caller:false, draggable:false,width:450,class:"photoModalx"});*/
		
		'use strict';
		
		var pointPhoto = {};
		var resolutions = [[1920,1080],[1600,900],[1280,720],[1366,768],[1024,768],[800,600],[640,480],[320,240]];
		resolutions = [[800,600],[640,480],[320,240]];
		
		//pointPhoto.orientation = screen.orientation.type;
			
		var width = 420;
		var options = false;
		
		pointPhoto.resolution = 0;
		pointPhoto.facingmode = "user";
		
		pointPhoto.frame = $("<div>").addClass('photoFrame');
		pointPhoto.stream = $("<div>").addClass('photoFrameStream').prop('id','photoFrameStream').html('<video id="gum-local" autoplay playsinline></video>').appendTo(pointPhoto.frame);
		pointPhoto.capture = $("<div>").addClass('photoFrameCapture').html('<canvas></canvas>').appendTo(pointPhoto.frame);
		pointPhoto.control = $("<div>").addClass('photoFrameControl').html('<div class="frontBackButton"><i class="fa fa-repeat"></i></div><div class="cancelButton"><i class="fa fa-times"></i></div><div class="saveButton"><i class="fa fa-check"></i></div><div class="shootButton"><i class="fa fa-camera"></i></div>').appendTo(pointPhoto.frame);
		pointPhoto.info = $("<div>").addClass('photoFrameInfo').prependTo(pointPhoto.frame);
		
		pointPhoto.modalCallback = function(result){
			if(result=='closing'){
				pointPhoto.modal = false;
				if(pointPhoto.videostream){
					pointPhoto.videostream.getTracks().forEach( (track) => {
						track.stop();
					});
				}
			}
		}

		// Put variables in global scope to make them available to the browser console.
		pointPhoto.constraints = window.constraints = {
		  audio: false,
		  video: {
			  width: {ideal:640}, 
			  height: {ideal:480},
			  facingMode: pointPhoto.facingmode
		  }
		};
		
		pointPhoto.frontBack = function(){
			
			clearInterval(pointPhoto.sizeInterval);
			
			if(pointPhoto.videostream){
				pointPhoto.videostream.getTracks().forEach( (track) => {
					track.stop();
				});
			}
			pointPhoto.facingmode = (pointPhoto.facingmode=="user"?"environment":"user");

			pointPhoto.constraints = window.constraints = {
			  audio: false,
			  video: {
				  width: {ideal:640}, 
				  height: {ideal:480},
				  facingMode: pointPhoto.facingmode
			  }
			};
			
			pointPhoto.init();
			
		}

		pointPhoto.success = function(stream){
			pointPhoto.videostream = stream;
			pointPhoto.video = $('video',pointPhoto.stream)[0];
			pointPhoto.videoTracks = stream.getVideoTracks();
			console.log('Got stream with constraints:', pointPhoto.constraints);
			console.log(`Using video device: ${pointPhoto.videoTracks[0].label}`);
			console.log(pointPhoto.videoTracks);
			window.stream = stream; // make variable available to browser console
			pointPhoto.video.srcObject = stream;
			
		}
		
		pointPhoto.initButtons = function(){

			$('.shootButton').on('click',function(){
				pointPhoto.shoot();
			});
			
			$('.frontBackButton').on('click',function(){
				pointPhoto.frontBack();
			});

			
			$('.cancelButton').on('click',function(){
				$('canvas',pointPhoto.capture).hide();
				$('.shootButton',pointPhoto.control).css('display','inline-block');
				$('.frontBackButton',pointPhoto.control).css('display','inline-block');
				$('.cancelButton',pointPhoto.control).css('display','none');
				$('.saveButton',pointPhoto.control).css('display','none');
			});

			$('.saveButton').on('click',function(){
				
				var lID = "loader"+new Date().getTime();	
				var container = "body";
				
				$.ajax({
					type:"post",
					url:scriptPath,
					dataType: "json",
					data : {fce:"savePoint",imgdata: $('canvas',pointPhoto.capture)[0].toDataURL("image/png"),fce:'savePoint',recid:vars.setup.record_id,mid:vars.setup.module_id,point_id:butt.data('pointid'),lat:method.position.coords.x,lng:method.position.coords.y},
					beforeSend:function(){
						ajaxLoader($(container),"ajaxLoaderPage",lID,'Ukládám fotografii',true,'center center','center center');
					},
					success:function(result){
						ajaxLoaderRemove(lID);
						pointPhoto.modal.closeModal();
					},
					error:function(jqXHR, status, thrownError) {
						console.log(jqXHR.responseText);		
						ajaxLoaderRemove(lID);
					}
				});	

			});

		}
		
		pointPhoto.shoot = function(){
			$('canvas',pointPhoto.capture).show();
			var ww = $(window).width()*0.7;
			var scale =  ww / $('video',pointPhoto.stream).width();
			pointPhoto.capture.css('transform','scale('+scale+')');
			pointPhoto.capture.show();
			var canvas = $('canvas',pointPhoto.capture)[0];
			var video = $('video',pointPhoto.stream)[0];
			canvas.width = video.videoWidth;
			canvas.height = video.videoHeight;
			canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
			$('.shootButton',pointPhoto.control).css('display','none');
			$('.frontBackButton',pointPhoto.control).css('display','none');
			$('.cancelButton',pointPhoto.control).css('display','inline-block');
			$('.saveButton',pointPhoto.control).css('display','inline-block');
			
		}
		
		pointPhoto.changeSize = function(){
			if(pointPhoto.modal){
				$("#"+pointPhoto.modal.getid).show();
				var ww = $(window).width()*0.7;
				var video = $('video',pointPhoto.stream);
				pointPhoto.info.html();
				video.show();
				video.w = video.width();
				video.h = video.height();
				var scale =  ww / video.width();
				pointPhoto.stream.css('width',video.w);
				pointPhoto.stream.css('height',video.h);
				pointPhoto.frame.css('height',video.h*scale);
				pointPhoto.stream.css('transform','scale('+scale+')');
				pointPhoto.modal.settings.width = ww;
				pointPhoto.modal.resizeCenter();
			}
		}
		
		pointPhoto.handleError = function(error) {
			
			if (error.name === 'ConstraintNotSatisfiedError') {
				const v = constraints.video;
				pointPhoto.errorMsg(`The resolution ${v.width.exact}x${v.height.exact} px is not supported by your device.`);
			} else if (error.name === 'PermissionDeniedError') {
				pointPhoto.errorMsg('Permissions have not been granted to use your camera and microphone, you need to allow the page access to your devices in order for the demo to work.');
			}
			
			//$('.photoResultVms',method.modalPoint.content).html("Fotografii nebylo možné zachytit. Chyba zařízení.");
			pointPhoto.errorMsg("Fotografii nebylo možné zachytit. Chyba zařízení.", error);
			console.log(`getUserMedia error: ${error.name}`);
			pointPhoto.modal.closeModal();
		}
		
		pointPhoto.errorMsg = function(msg, error) {
			pointPhoto.info.html('<p>${msg}</p>');
			if (typeof error !== 'undefined') {
				$.vmsInfoBox({content:msg,icon:"times-square",type:"error"});
				console.error(error);
			}
		}
		
		pointPhoto.showModal = function(){
			pointPhoto.modal = $.vmsModal({content:pointPhoto.frame,titleText:"Zachyť k bodu fotografii", titleIco:"camera", overlay:true, caller:pointPhoto, draggable:false,width:width+40,class:"photoModal"});
			$("#"+pointPhoto.modal.getid).hide();
			pointPhoto.getCameraSelection();
			pointPhoto.init();
			pointPhoto.initButtons();
			
		}
		
		pointPhoto.getCameraSelection = async () => {
		  const devices = await navigator.mediaDevices.enumerateDevices();
		  const videoDevices = devices.filter(device => device.kind === 'videoinput');
		  const options = videoDevices.map(videoDevice => {
			return `<option value="${videoDevice.deviceId}">${videoDevice.label}</option>`;
		  });
		  //cameraOptions.innerHTML = options.join('');
		};
		
		pointPhoto.init = async function(e) {
		  try {
			const stream = await navigator.mediaDevices.getUserMedia(pointPhoto.constraints);
			pointPhoto.success(stream);
			pointPhoto.sizeInterval = setInterval(pointPhoto.changeSize,100);
		  } catch (e) {
			pointPhoto.handleError(e);
		  }
		}

		pointPhoto.showModal();
	
		
		
	}

	method.init();

}