Files
Bicyclesim/client/edit.js
Juho Teperi 922492edf2 After adding a new point, only compute the distance and the heading between the new and the previous point (instead of all points).
Add route save button. Routes should be saved after adding (or removing) points.
Saving route will:
- Update distance and heading between every point
- Compute total length of route
- Update encoded path used by static map images at frontpage
2012-10-23 19:13:25 +03:00

201 lines
5.2 KiB
JavaScript

Session.set('points-autoadd', false);
var full_clear_required = true;
function add_point(latlng, num, trigger) {
maps.lines.route.add(latlng);
maps.markers.add(latlng, {type: 'icon', text: num});
}
var num = 1;
function new_point(latlng) {
Meteor.call('insert_point', latlng, Session.get('route'), function () {
add_point(latlng, num, true);
++num;
$('.sidebar').animate({scrollTop: $('.sidebar-inner').height()}, 'fast');
Session.set('saved', false);
});
}
// --- Route management ---
Template.frontpage.editing_route_name = function () {
return Session.equals('editing_route_name', this._id);
};
Template.frontpage.can_edit = function () {
var route = Routes.findOne({_id: this._id});
return (route && Meteor.user() && route.owner === Meteor.user()._id);
};
Template.frontpage.logged_in = function () {
return Meteor.user();
};
Template.frontpage.events({
'click div.thumbnail img': function (event, template) {
Router.navigate('/edit/' + this._id, {trigger: true});
},
'click a.remove': function () {
Points.remove({route: this._id});
Routes.remove({_id: this._id});
},
'dblclick div.thumbnail span': function (event, template) {
if (Meteor.user() && this.owner === Meteor.user()._id) {
Session.set('editing_route_name', this._id);
Meteor.flush();
activateInput(template.find('#route-name'));
}
}
});
Template.frontpage.events(
okCancelEvents('#new-route', {
ok: function (text, event) {
Routes.insert({owner: Meteor.user()._id, name: text, first: null});
event.target.value = "";
}
})
);
Template.frontpage.events(
okCancelEvents('#route-name', {
ok: function (text) {
Routes.update({_id: this._id}, {$set: {name: text}});
Session.set('editing_route_name', null);
},
cancel: function () {
Session.set('editing_route_name', null);
}
})
);
// --- Points ---
Template.points.points = function () {
var points = [];
var route = Routes.findOne({_id: Session.get('route')});
if (route) {
var point = Points.findOne({_id: route.first});
while (point !== undefined) {
points.push(point);
point = Points.findOne({_id: point.next});
}
}
return points;
};
Template.points.autoadd = function () {
return Session.get('points-autoadd');
};
Template.points.can_edit = function () {
var route = Routes.findOne({_id: Session.get('route')});
return (route && Meteor.user() && route.owner === Meteor.user()._id);
};
Template.points.saved = function () {
return Session.get('saved');
};
Template.points.helpers(helpers);
Template.points.events({
'click li.point': function () {
maps.travel(this._id, {center: true});
},
'click a.remove': function () {
Meteor.call('remove_point', this._id, function () {
full_clear_required = true;
Session.set('saved', false);
});
},
'click .new-point': function () {
new_point(maps.getLatLng());
},
'click .save': function () {
Meteor.call('update_route', Session.get('route'), function () {
Session.set('saved', true);
});
},
'change #points-autoadd': function (event) {
Session.set('points-autoadd', event.currentTarget.checked);
}
});
Template.editing.owner = function () {
var route = Routes.findOne({_id: Session.get('route')});
var user = Meteor.users.findOne({_id: route.owner});
if (!user) return;
return user.profile.name;
};
function init_edit() {
Meteor.autorun(function () {
if (Session.equals('page', 'edit') && Session.get('route')) {
debug('sivu tai route vaihtui, route: ' + Session.get('route'));
full_clear_required = true;
Session.set('saved', true);
Meteor.deps.isolate(function () {
var route = Routes.findOne({_id: Session.get('route')});
if (route) {
maps.travel(route.first, {route: true});
} else {
maps.default_pos();
}
});
}
});
Meteor.autosubscribe(function () {
Session.set('points-autoadd', false);
if (Session.equals('page', 'edit') && Session.get('route')) {
if (full_clear_required) {
Meteor.deps.isolate(function () {
debug('full clear');
maps.lines.route.clear();
maps.markers.clear();
num = 1;
var route = Routes.findOne({_id: Session.get('route')});
if (route) {
var point = Points.findOne({_id: route.first});
while (point !== undefined) {
add_point(point.latlng, num, false);
point = Points.findOne({_id: point.next});
++num;
}
full_clear_required = false;
}
});
}
}
});
function autoadd_listener() {
var route = Routes.findOne({_id: Session.get('route')});
if (Session.get('points-autoadd') && route && Meteor.user() && Meteor.user()._id === route.owner) {
var latlng = maps.getLatLng();
// Do not add duplicate points.
if (Points.findOne({route: route._id, latlng: latlng}) !== undefined) return;
new_point(latlng);
}
}
window.autoadd_listener = null;
Meteor.autosubscribe(function () {
if (Session.get('points-autoadd')) {
maps.listeners.add('points-autoadd', 'street', 'position_changed', autoadd_listener);
} else {
maps.listeners.remove('points-autoadd');
}
});
}