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 += '
'+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