var ExperienceController = Backbone.Model.extend({ options: { trackInfoContainer: 'abs-map-infos', cacheExperience: true, url: { track: { load: application.options.baseUrlApi + 'experience/get/baseinfos/false/asso/:asso/id/:id', save: application.options.baseUrl + 'editor/tour/save-trackpoints/id/:id', srtm: application.options.baseUrlApi + 'track/srtm-align', snapToRoad: application.options.baseUrlApi + 'track/snap-to-road', getOsmUnderground: application.options.baseUrlApi + 'track/get-osm-underground', versions: application.options.baseUrl + 'editor/tour/get-trackpoint-versions/id/:id', loadtrackversion: application.options.baseUrl + 'editor/tour/get-trackpoint-version/id/:id/rev/:rev', }, position: { create: application.options.baseUrl + 'editor/position/create-to-object/id/:id/type/:type/lat/:lat/lon/:lon', save: application.options.baseUrl + 'editor/position/save-of-object/id/:id/type/:type/lat/:lat/lon/:lon' }, net: { get: application.options.baseUrlApi + 'net/get-trackpoints/id/:id' }, pois: { add: application.options.baseUrl + 'editor/poi/add', inBounds: application.options.baseUrlApi + 'poi/get-by-bounds/baseinfos/false/asso/type,position,mainType,user/bounds/:bounds', }, routing: { save: application.options.baseUrl + 'editor/routing/save/id/:id/crossover/:crossover/crossoverType/:crossoverType/type/:type/lat/:lat/lon/:lon/angleIn/:angleIn', remove: application.options.baseUrl + 'editor/routing/remove-crossover/id/:id', reverse: application.options.baseUrl + 'editor/routing/reverse/id/:id', getRoadbook: application.options.baseUrl + 'editor/routing/get-roadbook/id/:id', saveSelection: application.options.baseUrl + 'editor/routing/save-selection/id/:id/ids/:ids', }, userData: { get: application.options.baseUrl + 'editor/experience/get-user-data', save: application.options.baseUrl + 'editor/experience/save-user-data' }, character: { save: application.options.baseUrl + 'editor/experience/save-character' } } }, isSaving: false, hasChanges: false, cache: {}, events: { on: {}, }, initialize: function(options) { var that = this; $.extend(true, that.options, options); }, showExperience: function(expId) { var that = this; that.loadExperiences(expId, 'type,trackpoints,position', function(experiences) { application.controller.map.layers.tracks.clearLayers(); application.controller.map.drawExperience(experiences[0], 'full'); var bounds = application.controller.map.layers.tracks.getBounds(); application.controller.map.fitBounds(bounds); application.controller.map.scrollToMap(); }); }, loadUserExperiences: function(type, asso, callback) { var that = this; that.loadExperiences('*', asso, callback, {url: application.options.baseUrl + 'api/' + type + '/get/baseinfos/false/asso/:asso/id/:id' + '/checkuser/true'}); }, loadExperiences: function(expId, asso, callback, options) { var that = this; var defaults = {url: that.options.url.track.load}; var options = $.extend({}, defaults, options); expId = expId + ''; if (asso == null) { asso = 'type,mainType,position,tourData,difficulty'; } //resetBounds(); var mText = 'Erlebnis wird geladen.'; if (expId.split(',').length > 1 || expId == '*') { mText = 'Erlebnisse werden geladen.'; } var m = application.controller.message.addMessage('map', mText, 'loading'); var onSuccess = function(data) { var experiences = data.experience; if (data.experience.length == 1) { application.controller.message.changeMessage(m, experiences[0].name + ' wurde geladen.', 'info', 3000); } else { application.controller.message.changeMessage(m, data.experience.length + ' Erlebnisse wurden geladen.', 'info', 3000); } $.each(experiences, function(i, experience) { if ((experience.class == 'AbsTour' || experience.class == 'AbsNetTour') && typeof experience.trackpoints !== 'undefined') { var trackpoints = experience.trackpoints; var track = new AbsGpsTrack(trackpoints); track.experience = experience; if (experience.routingpoints) { var routingpoints = experience.routingpoints; } experience.track = track; if (data.experience.length == 1) { that.updateTrackInfos([experiences[0]]); } } experiences[i] = experience; }); callback(experiences); }; if (that.options.cacheExperience && typeof that.cache[expId] !== 'undefined' && typeof that.cache[expId][asso] !== 'undefined') { onSuccess(that.cache[expId][asso]); } else { return $.ajax({ url: options.url.replace(':id', expId).replace(':asso', asso), dataType: 'json', success: function(data) { if (typeof that.cache[expId] == 'undefined') { that.cache[expId] = {}; } that.cache[expId][asso] = data; onSuccess(data); }, error: function(e) { console.log(e) } }); } return null; }, loadPoisInBounds: function(bounds, extend, callback) { var that = this; if (extend == true) { var f = 1.1; var extNS = bounds.north - bounds.south; var extWE = bounds.east - bounds.west; var north = bounds.south + extNS * f; var south = bounds.north - extNS * f; var west = bounds.east - extWE * f; var east = bounds.west + extWE * f; bounds.north = north; bounds.south = south; bounds.west = west; bounds.east = east; } $.ajax({ url: that.options.url.pois.inBounds.replace(':bounds', JSON.stringify(bounds)), dataType: 'json', success: function(data) { var experiences = data.experiences; callback(experiences); } }); }, loadTrackVersion: function(rev, experience) { var that = this; var mText = 'Version wird geladen.'; var m = application.controller.message.addMessage('map', mText, 'loading'); $.ajax({ url: that.options.url.track.loadtrackversion.replace(':id', experience.id).replace(':rev', rev), dataType: 'json', success: function(data) { application.controller.message.changeMessage(m, 'Version wurde geladen.', 'info', 3000); that.setTrackpointsToExperience(experience, data.trackpoints); } }); }, setTrackpointsToExperience: function(experience, trackpoints) { var that = this; experience.track.readTrackpoints(trackpoints); application.controller.map.drawExperiences([experience]); if (experience.track.profile !== null) { experience.track.profile.draw(); } that.updateTrackInfos([experience]); }, updateTrackInfos: function(experiences) { var that = this; var length = 0; var distance = 0; var hm = 0; var maxEle = 0; if (experiences[0].hasNetTour) { var track = experiences[0].netTour.track; length += track.getTrackpoints().length; distance += track.distance; hm += track.hm; maxEle = Math.max(maxEle, track.getMaxEle()); } else { $.each(experiences, function(i, experience) { var track = experience.track; length += track.getTrackpoints().length; distance += track.distance; hm += track.hm; maxEle = Math.max(maxEle, track.getMaxEle()); }); } //Trackpoints $('#' + that.options.trackInfoContainer + ' .js-info-tpcount').text(length.toLocaleFormat()); //Distanz distance = Math.round(distance * 10) / 10; if (Math.round(distance) == distance) { distance = distance + ',' + 0; } else { distance = distance.toString().replace('.', ','); } $('#' + that.options.trackInfoContainer + ' .js-info-distance').text(distance + ' km'); //Höhenmeter hm = Math.round(hm).toLocaleFormat(); $('#' + that.options.trackInfoContainer + ' .js-info-hm').text(hm + ' Hm'); //Höchster Punkt maxEle = Math.round(maxEle).toLocaleFormat(); $('#' + that.options.trackInfoContainer + ' .js-info-maxEle').text(maxEle + ' Hm'); //Anzeigen $('#' + that.options.trackInfoContainer).show().removeClass('hidden'); }, addProfile: function(track, container, mapController) { var profile = application.controller.profile.initProfile(track, container, mapController); track.profile = profile; return profile; }, setUgInBoundsOfExperiences: function(elements, ug, bounds, allAfter) { var that = this; var experiences = []; var redraw = {}; $.each(elements, function(eee, element) { var experience = element.experience; experiences.push(experience); var trackpoints = experience.track.getTrackpoints(); var newPoints = []; var found = false; var foundUg = null; var isChanged = false; $.each(trackpoints, function(i, tp) { if (i == trackpoints.length - 1) { trackpoints[i].ug == trackpoints[i-1].ug; return; } var tpNext = trackpoints[i+1]; if (tp.ug == tpNext.ug && tp.ug == ug) { return; } var latlng = new L.LatLng(tp.lat, tp.lon); var latlngNext = new L.LatLng(tpNext.lat, tpNext.lon); var p1 = new L.Point(latlng.lng, latlng.lat); var p2 = new L.Point(latlngNext.lng, latlngNext.lat); var pbounds = new L.Bounds([bounds.getNorthEast().lng, bounds.getNorthEast().lat], [bounds.getSouthWest().lng, bounds.getSouthWest().lat]); var clip = L.LineUtil.clipSegment(p1, p2, pbounds); if (found && allAfter == true) { if (tp.ug == foundUg) { tp.ug = ug; } else { found = false; } } if (clip) { if (!found) { found = true; foundUg = tp.ug; } isChanged = true; curUg = tp.ug; redraw[eee] = true; if (allAfter == true) { curUg = ug; } var clip1 = new L.LatLng(clip[0].y, clip[0].x); var clip2 = new L.LatLng(clip[1].y, clip[1].x); var d1 = latlng.distanceTo(clip1); var d2 = latlng.distanceTo(clip2); var lbounds = L.polyline([latlng, latlngNext]).getBounds(); var bNorth = bounds.getNorthEast().lat; var bSouth = bounds.getSouthEast().lat; var bWest = bounds.getNorthWest().lng; var bEast = bounds.getNorthEast().lng; var lNorth = lbounds.getNorthEast().lat; var lSouth = lbounds.getSouthEast().lat; var lWest = lbounds.getNorthWest().lng; var lEast = lbounds.getNorthEast().lng; // Zwischen 2 Punkten if ((lNorth > bNorth && lSouth < bSouth) || (lWest < bWest && lEast > bEast)) { if (d1 < d2) { newPoints.push([{latlng: clip1, ug:ug, index:i}, {latlng: clip2, ug:curUg, index:i}]); } else { newPoints.push([{latlng: clip2, ug:ug, index:i}, {latlng: clip1, ug:curUg, index:i}]); } } else if ((lNorth > bNorth && lSouth > bSouth) || (lNorth < bNorth && lSouth < bSouth) || (lWest < bWest && lEast < bEast) || (lWest > bWest && lEast > bEast)) { if (latlngNext.equals(clip1)) { newPoints.push([{latlng: clip2, ug:ug, index:i}]); } else if (latlngNext.equals(clip2)) { newPoints.push([{latlng: clip1, ug:ug, index:i}]); } else if (latlng.equals(clip1)) { newPoints.push([{latlng: clip2, ug:curUg, index:i}]); tp.ug = ug; } else if (latlng.equals(clip2)) { tp.ug = ug; newPoints.push([{latlng: clip1, ug:curUg, index:i}]); } } else if (bounds.contains(latlng) && bounds.contains(latlngNext)) { tp.ug = ug; } } }); newPoints.reverse(); $.each(newPoints, function(i, nps) { var insert = 1; $.each(nps, function(ii, np) { var tpBefore = trackpoints[parseInt(np.index) + insert]; var tp = new AbsGpsTrackpoint(np.latlng.lat, np.latlng.lng, tpBefore.ele, np.ug); trackpoints.splice((parseInt(np.index) + insert), 0, tp); insert++; }); }); experience.track.readTrackpoints(trackpoints); if (isChanged) { that.setExperienceChanged(experience, true); } if (experience.track.profile !== null) { experience.track.profile.draw(); } }); var ids = []; $.each(redraw, function(i, ii) { ids.push(i); var element = elements[i]; $.each(element.polyIn, function() { application.controller.map.map.removeLayer(this); }) application.controller.map.map.removeLayer(element); var experience = element.experience; application.controller.map.edit.element[i] = application.controller.map.drawExperience(experience); }) ids.reverse(); $.each(ids, function(i, id) { application.controller.map.edit.element.splice(id, 1); }); application.controller.map.nextFitBounds = false; that.updateTrackInfos(experiences); }, setCharacterInBoundsOfExperiences: function(elements, id, bounds) { var that = this; var experiences = []; var redraw = {}; $.each(elements, function(eee, element) { var experience = element.experience; experiences.push(experience); var trackpoints = experience.track.getTrackpoints(); var newPoints = []; var isChanged = false; $.each(trackpoints, function(i, tp) { if (i == trackpoints.length - 1) { return; } var tpNext = trackpoints[i+1]; if (tp.char !== undefined && tpNext.char !== undefined && tp.char.indexOf(id) !== -1 && tpNext.char.indexOf(id) !== -1) { return; } var latlng = new L.LatLng(tp.lat, tp.lon); var latlngNext = new L.LatLng(tpNext.lat, tpNext.lon); var p1 = new L.Point(latlng.lng, latlng.lat); var p2 = new L.Point(latlngNext.lng, latlngNext.lat); var pbounds = new L.Bounds([bounds.getNorthEast().lng, bounds.getNorthEast().lat], [bounds.getSouthWest().lng, bounds.getSouthWest().lat]); var clip = L.LineUtil.clipSegment(p1, p2, pbounds); if (clip) { isChanged = true; curUg = tp.ug; redraw[eee] = true; var clip1 = new L.LatLng(clip[0].y, clip[0].x); var clip2 = new L.LatLng(clip[1].y, clip[1].x); var d1 = latlng.distanceTo(clip1); var d2 = latlng.distanceTo(clip2); var lbounds = L.polyline([latlng, latlngNext]).getBounds(); var bNorth = bounds.getNorthEast().lat; var bSouth = bounds.getSouthEast().lat; var bWest = bounds.getNorthWest().lng; var bEast = bounds.getNorthEast().lng; var lNorth = lbounds.getNorthEast().lat; var lSouth = lbounds.getSouthEast().lat; var lWest = lbounds.getNorthWest().lng; var lEast = lbounds.getNorthEast().lng; // Zwischen 2 Punkten if ((lNorth > bNorth && lSouth < bSouth) || (lWest < bWest && lEast > bEast)) { if (d1 < d2) { newPoints.push([{latlng: clip1, ug:curUg, index:i, char:true}, {latlng: clip2, ug:curUg, index:i, char:true}]); } else { newPoints.push([{latlng: clip2, ug:curUg, index:i, char:true}, {latlng: clip1, ug:curUg, index:i, char:true}]); } } else if ((lNorth > bNorth && lSouth > bSouth) || (lNorth < bNorth && lSouth < bSouth) || (lWest < bWest && lEast < bEast) || (lWest > bWest && lEast > bEast)) { if (latlngNext.equals(clip1)) { newPoints.push([{latlng: clip2, ug:curUg, index:i, char:true}]); } else if (latlngNext.equals(clip2)) { newPoints.push([{latlng: clip1, ug:curUg, index:i, char:true}]); } else if (latlng.equals(clip1)) { newPoints.push([{latlng: clip2, ug:curUg, index:i, char:true}]); if (tp.char == undefined) { tp.char = [id]; } else { if (tp.char.indexOf(id) == -1) { tp.char.push(id); } } } else if (latlng.equals(clip2)) { if (tp.char == undefined) { tp.char = [id]; } else { if (tp.char.indexOf(id) == -1) { tp.char.push(id); } } newPoints.push([{latlng: clip1, ug:curUg, index:i, char:true}]); } } else if (bounds.contains(latlng) && bounds.contains(latlngNext)) { if (tp.char == undefined) { tp.char = [id]; } else { if (tp.char.indexOf(id) == -1) { tp.char.push(id); } } } } }); newPoints.reverse(); $.each(newPoints, function(i, nps) { var insert = 1; $.each(nps, function(ii, np) { var tpBefore = trackpoints[parseInt(np.index) + insert]; var tp = new AbsGpsTrackpoint(np.latlng.lat, np.latlng.lng, tpBefore.ele, np.ug); if (np.char !== undefined) { tp.char = [id]; } trackpoints.splice((parseInt(np.index) + insert), 0, tp); insert++; }); }); experience.track.readTrackpoints(trackpoints); if (isChanged) { that.setExperienceChanged(experience, true); } if (experience.track.profile !== null) { experience.track.profile.draw(); } }); var ids = []; $.each(redraw, function(i, ii) { ids.push(i); var element = elements[i]; $.each(element.polyIn, function() { application.controller.map.map.removeLayer(this); }) application.controller.map.map.removeLayer(element); var experience = element.experience; application.controller.map.edit.element[i] = application.controller.map.drawExperience(experience); }) ids.reverse(); $.each(ids, function(i, id) { application.controller.map.edit.element.splice(id, 1); }); application.controller.map.nextFitBounds = false; that.updateTrackInfos(experiences); }, simplify: function(elements, value) { var that = this; var experiences = []; $.each(elements, function(e, element) { var experience = element.experience; experiences.push(experience); var track = experience.track; var trackpoints = track.getTrackpoints(); var points = []; var parts = []; var lastUg = null; $.each(trackpoints, function(i, tp) { var p = new L.Point(tp.lon, tp.lat); p.tp = tp; if (lastUg !== tp.ug && lastUg !== null) { parts.push(points); points = []; } lastUg = tp.ug; points.push(p); }); parts.push(points); trackpoints = []; $.each(parts, function(i, part) { var reducedPoints = L.LineUtil.simplify(part, value); $.each(reducedPoints, function(i, p) { trackpoints.push(p.tp); }); }); track.readTrackpoints(trackpoints); experience.track = track; that.setExperienceChanged(experience, true); if (experience.track.profile !== null) { experience.track.profile.draw(); } }); that.updateTrackInfos(experiences); experiences = null; application.controller.map.nextFitBounds = false; application.controller.map.drawExperiences(); application.controller.message.addMessage('map', 'Trackpunkte wurden optimiert.', 'info', 3000); }, getTrackpointsFromSourceNet: function(id, experience) { var that = this; var m = application.controller.message.addMessage('map', 'Streckennetz wird geladen.', 'loading'); $.ajax({ url: that.options.url.net.get.replace(':id', id), method: 'get', dataType: 'json', success: function(data) { var trackpoints = data.data; experience.track.readTrackpoints(trackpoints); if (experience.track.profile !== null) { experience.track.profile.draw(); } application.controller.map.drawExperiences([experience]); that.updateTrackInfos([experience]); application.controller.message.changeMessage(m, 'Streckennetz wurde erfolgreich geladen.', 'info', 3000); } }); }, getTrackVersions: function(id, callback) { var that = this; var m = application.controller.message.addMessage('map', 'Versionen werden geladen.', 'loading'); $.ajax({ url: that.options.url.track.versions.replace(':id', id), method: 'get', dataType: 'html', success: function(data) { application.controller.message.changeMessage(m, 'Versionen wurden geladen.', 'info', 1); callback(data); } }); }, saveExperiencesToApi: function(experiences) { var that = this; var saved = 0; if (that.isSaving) { return; } if (experiences.length > 1) { var changedExperiences = []; $.each(experiences, function(i, experience) { if (experience.isChanged == true){ changedExperiences.push(experience); } }); experiences = changedExperiences; } $.each(experiences, function(i, experience) { if (experience.class == 'AbsTour') { var id = experience.id; var trackpoints = experience.track.trackpoints; var m = application.controller.message.addMessage('map', 'Tour wird gespeichert.', 'loading'); that.isSaving = true; $.ajax({ url: that.options.url.track.save.replace(':id', id), method: 'post', data: {trackpoints: JSON.stringify(trackpoints)}, success: function(data) { saved++; if (data == 'success') { that.setExperienceChanged(experience, false); application.controller.message.changeMessage(m, 'Tour wurde erfolgreich gespeichert.', 'info', 3000); } else { application.controller.message.changeMessage(m, 'FEHLER! Tour wurde nicht gespeichert.', 'warning', 3000); } if (saved == experiences.length) { that.isSaving = false; } }, error: function(data) { saved++; application.controller.message.changeMessage(m, 'FEHLER! Tour wurde nicht gespeichert.', 'warning', 3000); if (saved == experiences.length) { that.isSaving = false; } }, }); } }); }, setExperienceChanged: function(experience, value) { var that = this; experience.isChanged = value; that.hasChanges = value; if (value && experience.hasNetTour) { that.setTrackpointsToNetTour(experience.netTour); if (experience.netTour.track.profile !== null) { experience.netTour.track.profile.draw(); } } }, savePolygonToTrack: function(polygon) { var that = this; experience = polygon.experience; var trackpoints = []; $.each(polygon.polyIn, function(i, poly) { $.each(poly.getLatLngs(), function(ii, latlng) { var tp = { lat: latlng.lat, lon: latlng.lng, ele: latlng.ele, ug : latlng.ug }; trackpoints.push(tp); }); }); polygon.experience.track.readTrackpoints(trackpoints); that.setExperienceChanged(experience, true); if (experience.track.startMarker) { experience.track.startMarker.setLatLng(polygon.getLatLngs()[0]); } if (experience.track.endMarker) { experience.track.endMarker.setLatLng(polygon.getLatLngs()[polygon.getLatLngs().length - 1]); } if (experience.track.profile !== null) { experience.track.profile.draw(); } that.updateTrackInfos([experience]); }, srtmAlign: function(experience) { var that = this; var track = experience.track; var trackpoints = track.getTrackpoints(); var m = application.controller.message.addMessage('map', 'Höheninformationen werden optimiert.', 'loading'); $.ajax({ url: that.options.url.track.srtm, method: 'POST', dataType: 'json', data: { trackpoints: JSON.stringify(trackpoints) }, success: function(data) { var trackpoints = data.trackpoints; experience.track.readTrackpoints(trackpoints); that.setExperienceChanged(experience, true); if (experience.track.profile !== null) { experience.track.profile.draw(); } that.updateTrackInfos([experience]); application.controller.message.changeMessage(m, 'Höheninformationen wurden erfolgreich optimiert.', 'info', 3000); } }); }, snapToRoad: function(experience) { var that = this; var track = experience.track; var trackpoints = track.getTrackpoints(); var m = application.controller.message.addMessage('map', 'Tourverlauf wird angeglichen.', 'loading'); $.ajax({ url: that.options.url.track.snapToRoad, method: 'POST', dataType: 'json', data: { trackpoints: JSON.stringify(trackpoints) }, success: function(data) { var trackpoints = data.trackpoints; experience.track.readTrackpoints(trackpoints); that.setExperienceChanged(experience, true); if (experience.track.profile !== null) { experience.track.profile.draw(); } that.updateTrackInfos([experience]); application.controller.map.nextFitBounds = false; application.controller.map.drawExperiences(); application.controller.message.changeMessage(m, 'Tourverlauf wurde erfolgreich angeglichen.', 'info', 3000); } }); }, getOsmUnderground: function(experience) { var that = this; var track = experience.track; var trackpoints = track.getTrackpoints(); var m = application.controller.message.addMessage('map', 'Undergrund wird geladen.', 'loading'); var start = 0; var steps = 100; var doAjax = function(trackpoints) { $.ajax({ url: that.options.url.track.getOsmUnderground + '/start/' + start + '/steps/' + steps , method: 'POST', dataType: 'json', data: { trackpoints: JSON.stringify(trackpoints) }, success: function(data) { var newTrackpoints = data.trackpoints; experience.track.readTrackpoints(newTrackpoints); that.setExperienceChanged(experience, true); if (experience.track.profile !== null) { experience.track.profile.draw(); } that.updateTrackInfos([experience]); application.controller.map.nextFitBounds = false; application.controller.map.drawExperiences(); if (newTrackpoints.length > start + steps) { start += steps; doAjax(newTrackpoints); } else { application.controller.message.changeMessage(m, 'Untergrund wurde erfolgreich geladen.', 'info', 3000); } } }); }; doAjax(trackpoints); }, savePositionOfObject: function(obj, latLng, type, callback) { var that = this; var lat = latLng.lat; var lon = latLng.lng; if (obj.position !== null && false) { var id = obj.position.id; $.ajax({ url: that.options.url.position.save.replace(':id', id).replace(':type', type).replace(':lat', lat).replace(':lon', lon), method: 'POST', dataType: 'json', success: function(data) { obj.position = data.position; if (callback) { callback(obj); } } }); } else { var id = obj.id; $.ajax({ url: that.options.url.position.create.replace(':id', id).replace(':type', type).replace(':lat', lat).replace(':lon', lon), method: 'POST', dataType: 'json', success: function(data) { obj.position = data.position; if (callback) { callback(obj); } } }); } }, saveRoutingpoint: function(rp, co, callback) { var that = this; if (co == null) { co = {id: null, type: null}; } $.ajax({ url: that.options.url.routing.save.replace(':id', rp.id).replace(':crossover', co.id).replace(':crossoverType', co.type).replace(':type', rp.type).replace(':angleIn', rp.angleIn).replace(':lat', rp.lat).replace(':lon', rp.lon), dataType: 'json', method: 'POST', data: { desc: JSON.stringify(rp.description), }, success: function(data) { if (callback) { rp.id = data.routing.id; callback(data); } } }); }, saveRoutingSelection: function(experience, ids) { var that = this; var m = application.controller.message.addMessage('map', 'Routingpunktauswahl wird gespeichert', 'loading'); $.ajax({ url: that.options.url.routing.saveSelection.replace(':id', experience.id).replace(':ids', ids.join(',')), success: function(data) { application.controller.message.changeMessage(m, 'Routingpunktauswahl wurde erfolgreich gespeichert.', 'info', 3000); } }); }, removeCrossover: function(co, callback) { var that = this; $.ajax({ url: that.options.url.routing.remove.replace(':id', co.id), success: function(data) { if (callback) { callback(); } } }); }, getRoadbook: function(experience, callback) { var that = this; $.ajax({ url: that.options.url.routing.getRoadbook.replace(':id', experience.id), success: function(data) { if (callback) { callback(data); } } }); }, saveUserData: function(key, data, callback) { var that = this; $.ajax({ url: that.options.url.userData.save, method: 'post', data: {data: JSON.stringify(data), key: key}, success: function(data) { if (callback) { callback(data); } } }); }, saveCharacter: function(id, name, description, type, experience, callback) { var that = this; $.ajax({ url: that.options.url.character.save, method: 'post', dataType: 'html', data: {id: id, name: name, description: description, experience: experience, type: type}, success: function(html) { if (callback) { callback(html); } } }); }, getUserData: function(key, callback) { var that = this; $.ajax({ url: that.options.url.userData.get, method: 'post', dataType: 'json', data: {key: key}, success: function(data) { if (callback) { callback(data.data); } } }); }, reverseRoutingOfExperience: function(experience, callback) { var that = this; $.ajax({ url: that.options.url.routing.reverse.replace(':id', experience.id), dataType: 'json', success: function(data) { experience.routingpoints = data.routing; experience.track if (callback) { callback(experience); } } }); }, formatCoord: function(coord) { return parseFloat(coord).toFixed(5); }, getExperienceOfExperiences: function(id, experiences) { var found = null; $.each(experiences, function(i, experience) { if (found !== null) { return true; } if (parseInt(id) == parseInt(experience.id)) { found = experience; } }); return found; }, getTrackpointsOfNetTourExperiences: function(currentExperience, nextExperience, last) { var currentStart = currentExperience.track.getTPat(0); var currentEnd = currentExperience.track.getTPat(currentExperience.track.getTrackpoints().length - 1); var nextStart = nextExperience.track.getTPat(0); var nextEnd = nextExperience.track.getTPat(nextExperience.track.getTrackpoints().length - 1); var disSE = getDistance(currentStart.lat, currentStart.lon, nextEnd.lat, nextEnd.lon); var disSS = getDistance(currentStart.lat, currentStart.lon, nextStart.lat, nextStart.lon); var disEE = getDistance(currentEnd.lat, currentEnd.lon, nextEnd.lat, nextEnd.lon); var disES = getDistance(currentEnd.lat, currentEnd.lon, nextStart.lat, nextStart.lon); var minDis = Math.min(disSE, disSS, disEE, disES); var trackpoints = []; var trackpointsNext = []; if (minDis*1000 < 2) { $.each(currentExperience.track.getTrackpoints(), function(i, tp) { trackpoints.push($.extend({}, tp)); }); if (last == true) { $.each(nextExperience.track.getTrackpoints(), function(i, tp) { trackpointsNext.push($.extend({}, tp)); }); } if (currentExperience.id == nextExperience.id) { if (currentExperience.lastConnection == 'start') { } else { trackpoints.reverse(); } } else { if (minDis == disSE || minDis == disSS) { trackpoints.reverse(); } if (minDis == disSE || minDis == disEE) { nextExperience.lastConnection = 'end'; trackpointsNext.reverse(); } else { nextExperience.lastConnection = 'start'; } } } else { } return [trackpoints, trackpointsNext]; }, setTrackpointsToNetTour: function(experience) { var that = this; var data = experience.data; var trackpoints = []; var trackpointsArr = []; $.each(data.tracks, function(i, t) { if (i < data.tracks.length - 1) { var currentExperience = that.getExperienceOfExperiences(t, experience.experiences); var nextExperience = that.getExperienceOfExperiences(data.tracks[i+1], experience.experiences); var last = (i == data.tracks.length - 2) ? true: false; trackpointsArr = that.getTrackpointsOfNetTourExperiences(currentExperience, nextExperience, last); if (i !== 0) { trackpointsArr[0].splice(0, 1); trackpointsArr[1].splice(0, 1); } trackpoints = trackpoints.concat(trackpointsArr[0]); } else { trackpoints = trackpoints.concat(trackpointsArr[1]); } }); var track; if (experience.track) { track = experience.track; track.readTrackpoints(trackpoints); } else { track = new AbsGpsTrack(trackpoints); } track.experience = experience; experience.track = track; }, });