L.OpenStreetBugs = L.FeatureGroup.extend({
options : {
serverURL : "http://openstreetbugs.schokokeks.org/api/0.1/",
readonly : false,
setCookie : true,
username : "NoName",
cookieLifetime : 1000,
cookiePath : null,
permalinkZoom : 14,
permalinkUrl: null,
opacity : 0.7,
showOpen: true,
showClosed: true,
iconOpen: "http://openstreetbugs.schokokeks.org/client/open_bug_marker.png",
iconClosed:"http://openstreetbugs.schokokeks.org/client/closed_bug_marker.png",
iconActive: undefined,
editArea: 0.01,
popupOptions: {autoPan: false},
dblClick: true
},
initialize : function(options)
{
var tmp = L.Util.extend({}, this.options.popupOptions, (options || {}).popupOptions)
L.Util.setOptions(this, options)
this.options.popupOptions = tmp;
putAJAXMarker.layers.push(this);
this.bugs = {};
this._layers = {};
var username = this.get_cookie("osbUsername");
if (username)
this.options.username = username;
L.OpenStreetBugs.setCSS();
},
onAdd : function(map)
{
L.FeatureGroup.prototype.onAdd.apply(this, [map]);
this._map.on("moveend", this.loadBugs, this);
this.loadBugs();
if (!this.options.readonly) {
if (this.options.dblClick) {
map.doubleClickZoom.disable();
map.on('dblclick', this.addBug, this);
}
else {
map.on('click', this.addBug, this);
}
}
this.fire('add');
},
onRemove : function(map)
{
this._map.off("moveend", this.loadBugs, this);
this._iterateLayers(map.removeLayer, map);
delete this._map;
if (!this.options.readonly) {
if (this.options.dblClick) {
map.doubleClickZoom.enable();
map.off('dblclick', this.addBug, this);
}
else {
map.off('click', this.addBug, this);
}
}
this.fire('remove');
},
set_cookie : function(name, value)
{
var expires = (new Date((new Date()).getTime() + 604800000)).toGMTString(); // one week from now
document.cookie = name+"="+escape(value)+";";
},
get_cookie : function(name)
{
var cookies = (document.cookie || '').split(/;\s*/);
for(var i=0; i';
content += '';
content += '';
content += '
'+L.i18n('Nickname')+':
';
content += ''+L.i18n('Comment')+':
';
content += '';
form.innerHTML = content;
form.ok.value = L.i18n('OK');
form.cancel.value = L.i18n('Cancel');
form.osbnickname.value = this.options.username;
return form;
},
addBug: function(e) {
var newContent = L.DomUtil.create('div', 'osb-popup');
newContent.innerHTML += ''+L.i18n("New bug")+'
';
newContent.innerHTML += ''+L.i18n("Find your bug?")+'
'+L.i18n("Contact details and someone will fix it.")+'
';
var popup = new L.Popup();
var _this = this;
var form = this.createCommentForm(newContent);
form.osblat.value = e.latlng.lat;
form.osblon.value = e.latlng.lng;
form.ok.value = L.i18n("Add comment");
form.onsubmit = function(e) {
_this._map.closePopup(popup);
_this.createBug(form);
return false;
};
form.cancel.onclick = function(e) { _this._map.closePopup(popup); }
popup.setLatLng(e.latlng);
popup.setContent(newContent);
popup.options.maxWidth=410;
popup.options.minWidth=410;
popup.options.className += ' osb osbCreate'
this._map.openPopup(popup);
},
createBug: function(form) {
if (!form.osbcomment.value) return;
var nickname = form.osbnickname.value || this.options.username;
this.apiRequest("addPOIexec"
+ "?lat="+encodeURIComponent(form.osblat.value)
+ "&lon="+encodeURIComponent(form.osblon.value)
+ "&text="+encodeURIComponent(form.osbcomment.value + " [" + nickname + "]")
+ "&format=js", true
);
this.set_cookie("osbUsername",nickname);
this.options.username=nickname;
},
remoteEdit: function(x) {
var ydelta = this.options.editArea || 0.01;
var xdelta = ydelta * 2;
var p = [ 'left=' + (x.lng - xdelta), 'bottom=' + (x.lat - ydelta)
, 'right=' + (x.lng + xdelta), 'top=' + (x.lat + ydelta)];
var url = 'http://localhost:8111/load_and_zoom?' + p.join('&');
var frame = L.DomUtil.create('iframe', null);
frame.style.display = 'none';
frame.src = url;
document.body.appendChild(frame);
frame.onload = function(e) { document.body.removeChild(frame); };
return false;
}
})
L.OpenStreetBugs.setCSS = function() {
if(L.OpenStreetBugs.setCSS.done)
return;
else
L.OpenStreetBugs.setCSS.done = true;
// See http://www.hunlock.com/blogs/Totally_Pwn_CSS_with_Javascript
var idx = 0;
var addRule = function(selector, rules) {
var s = document.styleSheets[0];
var rule;
if(s.addRule) // M$IE
rule = s.addRule(selector, rules, idx);
else
rule = s.insertRule(selector + " { " + rules + " }", idx);
s.style = L.Util.extend(s.style || {}, rules);
idx++;
};
addRule(".osb-popup dl", 'margin:0; padding:0;');
addRule(".osb-popup dt", 'margin:0; padding:0; font-weight:bold; float:left; clear:left;');
addRule(".osb-popup dt:after", 'content: ": ";');
addRule("* html .osb-popup dt", 'margin-right:1ex;');
addRule(".osb-popup dd", 'margin:0; padding:0;');
addRule(".osb-popup ul.buttons", 'list-style-type:none; padding:0; margin:0;');
addRule(".osb-popup ul.buttons li", 'display:inline; margin:0; padding:0;');
addRule(".osb-popup h3", 'font-size:1.2em; margin:.2em 0 .7em 0;');
};
function putAJAXMarker(id, lon, lat, text, closed)
{
var comments = text.split(/
/);
var comments_only = []
var nickname = [];
var datetime = [];
var info = null;
var isplit = 0;
for(var i=0; i").replace(/&/g, "&");
isplit = comments[i].lastIndexOf("[");
if (isplit > 0) {
comments_only[i] = comments[i].substr(0,isplit-1);
info = comments[i].substr(isplit+1);
nickname[i] = info.substr(0,info.lastIndexOf(","));
datetime[i] = info.substr(info.lastIndexOf(",")+2);
datetime[i] = datetime[i].substr(0,datetime[i].lastIndexOf("]"));
}
else {
comments_only[i] = comments[i];
}
}
var old = putAJAXMarker.bugs[id];
putAJAXMarker.bugs[id] = [
new L.LatLng(lat, lon),
comments,
closed,
text,
comments_only,
nickname,
datetime
];
var force = (old && old[3]) != text;
for(var i=0; i