├── README.md ├── backend ├── .htaccess ├── compute-changeset-data.py ├── cron-dl.sh ├── iso8601 │ ├── __init__.py │ └── iso8601.py └── schema └── frontend ├── close-button.gif ├── fetch-changeset-meta.py ├── flags ├── _info.txt ├── ad.png ├── ae.png ├── af.png ├── ag.png ├── ai.png ├── al.png ├── am.png ├── an.png ├── ao.png ├── ar.png ├── as.png ├── at.png ├── au.png ├── aw.png ├── ax.png ├── az.png ├── ba.png ├── bb.png ├── bd.png ├── be.png ├── bf.png ├── bg.png ├── bh.png ├── bi.png ├── bj.png ├── bm.png ├── bn.png ├── bo.png ├── br.png ├── bs.png ├── bt.png ├── bv.png ├── bw.png ├── by.png ├── bz.png ├── ca.png ├── catalonia.png ├── cc.png ├── cd.png ├── cf.png ├── cg.png ├── ch.png ├── ci.png ├── ck.png ├── cl.png ├── cm.png ├── cn.png ├── co.png ├── cr.png ├── cs.png ├── cu.png ├── cv.png ├── cx.png ├── cy.png ├── cz.png ├── de.png ├── dj.png ├── dk.png ├── dm.png ├── do.png ├── dz.png ├── ec.png ├── ee.png ├── eg.png ├── eh.png ├── england.png ├── er.png ├── es.png ├── et.png ├── eu.png ├── fi.png ├── fj.png ├── fk.png ├── fm.png ├── fo.png ├── fr.png ├── ga.png ├── galicia.png ├── gb.png ├── gd.png ├── ge.png ├── gf.png ├── gg.png ├── gh.png ├── gi.png ├── gl.png ├── gm.png ├── gn.png ├── gp.png ├── gq.png ├── gr.png ├── gs.png ├── gt.png ├── gu.png ├── gw.png ├── gy.png ├── hk.png ├── hm.png ├── hn.png ├── hr.png ├── ht.png ├── hu.png ├── id.png ├── ie.png ├── il.png ├── im.png ├── in.png ├── index.html ├── io.png ├── iq.png ├── ir.png ├── is.png ├── it.png ├── ja.png ├── je.png ├── jm.png ├── jo.png ├── jp.png ├── ke.png ├── kg.png ├── kh.png ├── ki.png ├── km.png ├── kn.png ├── kp.png ├── kr.png ├── kw.png ├── ky.png ├── kz.png ├── la.png ├── lb.png ├── lc.png ├── li.png ├── lk.png ├── lr.png ├── ls.png ├── lt.png ├── lu.png ├── lv.png ├── ly.png ├── ma.png ├── mc.png ├── md.png ├── me.png ├── mf.png ├── mg.png ├── mh.png ├── mk.png ├── ml.png ├── mm.png ├── mn.png ├── mo.png ├── mp.png ├── mq.png ├── mr.png ├── ms.png ├── mt.png ├── mu.png ├── mv.png ├── mw.png ├── mx.png ├── my.png ├── mz.png ├── na.png ├── nc.png ├── nc2.png ├── ne.png ├── nf.png ├── ng.png ├── ni.png ├── nl.png ├── no.png ├── np.png ├── nr.png ├── nu.png ├── nz.png ├── om.png ├── pa.png ├── pe.png ├── pf.png ├── pg.png ├── ph.png ├── pk.png ├── pl.png ├── pm.png ├── pn.png ├── pr.png ├── ps.png ├── pt.png ├── pw.png ├── py.png ├── qa.png ├── re.png ├── ro.png ├── rs.png ├── ru.png ├── rw.png ├── sa.png ├── sb.png ├── sc.png ├── scotland.png ├── sd.png ├── se.png ├── sg.png ├── sh.png ├── si.png ├── sj.png ├── sk.png ├── sl.png ├── sm.png ├── sn.png ├── so.png ├── sr.png ├── st.png ├── sv.png ├── sy.png ├── sz.png ├── tc.png ├── td.png ├── tf.png ├── tg.png ├── th.png ├── tj.png ├── tk.png ├── tl.png ├── tm.png ├── tn.png ├── to.png ├── tr.png ├── tt.png ├── tv.png ├── tw.png ├── tz.png ├── ua.png ├── ug.png ├── uk.png ├── um.png ├── unknown.png ├── us.png ├── uy.png ├── uz.png ├── va.png ├── vc.png ├── ve.png ├── vg.png ├── vi.png ├── vn.png ├── vu.png ├── wales.png ├── wf.png ├── ws.png ├── ye.png ├── yt.png ├── za.png ├── zm.png └── zw.png ├── get-last-data.py ├── heatcanvas-leaflet.js ├── heatcanvas-worker.js ├── heatcanvas.js ├── highcharts ├── gfx │ └── vml-radial-gradient.png ├── graphics │ ├── skies.jpg │ ├── snow.png │ └── sun.png ├── index.htm └── js │ ├── adapters │ ├── mootools-adapter.js │ ├── mootools-adapter.src.js │ ├── prototype-adapter.js │ └── prototype-adapter.src.js │ ├── highcharts-more.js │ ├── highcharts.js │ ├── highcharts.src.js │ ├── modules │ ├── canvas-tools.js │ ├── canvas-tools.src.js │ ├── data.js │ ├── data.src.js │ ├── exporting.js │ └── exporting.src.js │ └── themes │ ├── dark-blue.js │ ├── dark-green.js │ ├── gray.js │ ├── grid.js │ └── skies.js ├── i ├── 6012.png ├── 6017.png ├── Next.png ├── Pause.png ├── Play.png ├── Previous.png ├── facebook.png ├── full-time.png ├── marker.svg └── twitter.png ├── index.html ├── jquery-1.8.0.min.js ├── jquery.dateFormat-1.0.js ├── jquery.lightbox_me.js ├── jquery.scrollTo-min.js ├── livechanges.js └── pulse.html /README.md: -------------------------------------------------------------------------------- 1 | osm-livechanges 2 | =============== 3 | 4 | Near-real-time display of edits in the OpenStreetMap database 5 | 6 | How does it work ? 7 | ------------------ 8 | 9 | osm-livechanges is mostly based on the [minutely diffs](http://planet.openstreetmap.org) produced by the master OSM database. 10 | 11 | ### Backend side 12 | 13 | Diffs are pulled every minute, and information is aggregated from them, to gather, for each changeset: 14 | 15 | * The list of created/modified/deleted nodes, ways, and relations 16 | * The bounding box of the changeset 17 | * The user and timestamp information 18 | 19 | Information is saved to a SQLite database. 20 | 21 | 22 | This is handled by the backend/compute-changeset-data.py script 23 | 24 | 25 | ### Frontend side 26 | 27 | Each minute, data is fetched using frontend/get-last-data.py 28 | 29 | This script aggregates the changesets using a configurable period (generally 10s). It computes aggregate statistics for the period, and the full list of changesets for each period. 30 | 31 | Optionally, it can do reverse-geocoding lookup, to have the country for each changeset, by using cstenac/tiny-geocoder 32 | 33 | The JS part buffers the data, and redisplays it at the same rate (so generally once every 10s), using a fixed delay of 140s between the current time and the displayed time (required to ensure that the pipeline never gets out of data). 34 | 35 | A random changeset from the period is selected and zoomed. Its meta is optionnally fetched from the OSM API. It currently uses the http://api.openstreetmap.fr mirror to avoid load on the official osm.org API. 36 | 37 | Authors 38 | ------- 39 | 40 | Created by Christian Quest and Clément Stenac 41 | 42 | License 43 | ------- 44 | 45 | This project includes several third-party dependencies 46 | * jquery 47 | * jquery-dateformat plugin 48 | * jquery-lighboxme plugin 49 | * highcharts 50 | * leaflet 51 | * heatcanvas 52 | * The Phoca flags set (public domain) 53 | 54 | The osm-livechanges code itself is available under the Apache License Version 2.0 55 | Basically, you can use it, modify it and redistribute it for whatever purposes, provided that you 56 | do it using a compatible license. 57 | 58 | Copyright 2012 OpenStreetMap France 59 | 60 | Licensed under the Apache License, Version 2.0 (the "License"); 61 | you may not use this file except in compliance with the License. 62 | You may obtain a copy of the License at 63 | 64 | http://www.apache.org/licenses/LICENSE-2.0 65 | 66 | Unless required by applicable law or agreed to in writing, software 67 | distributed under the License is distributed on an "AS IS" BASIS, 68 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 69 | See the License for the specific language governing permissions and 70 | limitations under the License. 71 | -------------------------------------------------------------------------------- /backend/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | -------------------------------------------------------------------------------- /backend/compute-changeset-data.py: -------------------------------------------------------------------------------- 1 | from lxml import etree 2 | import sys, time, datetime, math, sqlite3, iso8601 3 | 4 | root = etree.parse(sys.stdin) 5 | 6 | changesetData = {} 7 | db = sqlite3.connect("changesets.db") 8 | db.row_factory = sqlite3.Row 9 | 10 | def getChangeset(id): 11 | if changesetData.has_key(id): 12 | return changesetData[id] 13 | x = { 14 | "minLon" : -180.0, "maxLon": 180.0, "minLat": -90.0, "maxLat" : 90.0, 15 | "cnode" : 0, "mnode" : 0, "dnode": 0, 16 | "cway" : 0, "mway" : 0, "dway" : 0, 17 | "crel": 0, "mrel": 0, "drel": 0, 18 | "updated" : 0, 19 | "tags" : {} 20 | } 21 | # Load changeset from DB if already exists 22 | c = db.cursor() 23 | for row in c.execute("SELECT * from changeset WHERE id=?", (id,)): 24 | print "Reloading changeset %s" % id 25 | x["updated"] = row["updated"] + 1 26 | x["minLon"] = row["minLon"] 27 | x["minLat"] = row["minLat"] 28 | x["maxLon"] = row["maxLon"] 29 | x["maxLat"] = row["maxLat"] 30 | x["cnode"] = row["cnode"] 31 | x["mnode"] = row["mnode"] 32 | x["dnode"] = row["dnode"] 33 | x["cway"] = row["cway"] 34 | x["mway"] = row["mway"] 35 | x["dway"] = row["dway"] 36 | x["crel"] = row["crel"] 37 | x["mrel"] = row["mrel"] 38 | x["drel"] = row["drel"] 39 | changesetData[id] = x 40 | return x 41 | 42 | # 43 | 44 | def recordTags(data, node): 45 | for child in node: 46 | if child.tag == "tag": 47 | data["tags"][child.get("k")]= child.get("v") 48 | 49 | 50 | def getAndUpdate(node): 51 | cid = node.get("changeset") 52 | change = getChangeset(cid) 53 | change["id"] = cid 54 | change["user"] = node.get("user") 55 | change["uid"] = node.get("uid") 56 | # change["time"] = time.mktime(isodate.parse_datetime(node.get("timestamp")).timetuple()) 57 | # change["time"] = time.mktime(datetime.datetime.strptime(node.get("timestamp"), "%Y-%m-%dT%H:%M:%S%Z").timetuple()) 58 | change["time"] = time.mktime(iso8601.parse_date(node.get("timestamp")).timetuple()) + 3600 # SOMETHING IS FUCKING WRONG ! 59 | return change 60 | 61 | for cnode in root.xpath("create/node"): 62 | change = getAndUpdate(cnode) 63 | change["minLon"] = max(change["minLon"], float(cnode.get("lon"))) 64 | change["minLat"] = max(change["minLat"], float(cnode.get("lat"))) 65 | change["maxLon"] = min(change["maxLon"], float(cnode.get("lon"))) 66 | change["maxLat"] = min(change["maxLat"], float(cnode.get("lat"))) 67 | change["cnode"] += 1 68 | recordTags(change, cnode) 69 | for cnode in root.xpath("modify/node"): 70 | change = getAndUpdate(cnode) 71 | change["minLon"] = max(change["minLon"], float(cnode.get("lon"))) 72 | change["minLat"] = max(change["minLat"], float(cnode.get("lat"))) 73 | change["maxLon"] = min(change["maxLon"], float(cnode.get("lon"))) 74 | change["maxLat"] = min(change["maxLat"], float(cnode.get("lat"))) 75 | change["mnode"] += 1 76 | recordTags(change, cnode) 77 | for cnode in root.xpath("delete/node"): 78 | change = getAndUpdate(cnode) 79 | change["minLon"] = max(change["minLon"], float(cnode.get("lon"))) 80 | change["minLat"] = max(change["minLat"], float(cnode.get("lat"))) 81 | change["maxLon"] = min(change["maxLon"], float(cnode.get("lon"))) 82 | change["maxLat"] = min(change["maxLat"], float(cnode.get("lat"))) 83 | change["dnode"] += 1 84 | 85 | for cnode in root.xpath("create/way"): 86 | change = getAndUpdate(cnode) 87 | change["cway"] += 1 88 | recordTags(change, cnode) 89 | for cnode in root.xpath("modify/way"): 90 | change = getAndUpdate(cnode) 91 | change["mway"] += 1 92 | recordTags(change, cnode) 93 | for cnode in root.xpath("delete/way"): 94 | change = getAndUpdate(cnode) 95 | change["dway"] += 1 96 | for cnode in root.xpath("create/relation"): 97 | change = getAndUpdate(cnode) 98 | change["crel"] += 1 99 | recordTags(change, cnode) 100 | for cnode in root.xpath("modify/relation"): 101 | change = getAndUpdate(cnode) 102 | change["mrel"] += 1 103 | recordTags(change, cnode) 104 | for cnode in root.xpath("delete/relation"): 105 | change = getAndUpdate(cnode) 106 | change["drel"] += 1 107 | 108 | tuples = [] 109 | tag_tuples = [] 110 | c = db.cursor() 111 | for id in changesetData.keys(): 112 | d = changesetData[id] 113 | tuples.append( 114 | (d["id"], d["user"], d["uid"], d["time"], 115 | d["minLon"], d["minLat"], d["maxLon"], d["maxLat"], 116 | d["cnode"], d["mnode"], d["dnode"], 117 | d["cway"], d["mway"], d["dway"], 118 | d["crel"], d["mrel"], d["drel"], d["updated"])) 119 | print "%s [%s] -> %s" % (id, changesetData[id]["time"], changesetData[id]) 120 | for tagKey,tagVal in changesetData[id]["tags"].items(): 121 | tag_tuples.append((d["id"], tagKey, tagVal)); 122 | # Remove prev data 123 | c.execute("DELETE FROM changeset where id=?", (id,)) 124 | c.execute("DELETE FROM changeset_content_tag where changeset_id=?", (id,)); 125 | 126 | db.commit() 127 | c = db.cursor() 128 | c.executemany("INSERT INTO changeset (id, user, uid, time, minLon, minLat, maxLon, maxLat, cnode, mnode, dnode, cway, mway, dway, crel, mrel, drel, updated) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", tuples) 129 | c.executemany("INSERT INTO changeset_content_tag VALUES (?,?,?)", tag_tuples) 130 | db.commit() 131 | #doc = ElementTree(file='915.osc') 132 | # 133 | #for e in 134 | -------------------------------------------------------------------------------- /backend/cron-dl.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | SEQ=`wget -o /dev/null -O /dev/stdout http://planet.openstreetmap.org/replication/minute/state.txt|grep sequenceNumber|cut -d '=' -f 2` 4 | 5 | MM=$[$SEQ/1000000] 6 | KK=$[$SEQ-$MM*1000000] 7 | KK=$[$KK/1000] 8 | UU=$[$SEQ-$MM*1000000-$KK*1000] 9 | A=`printf %03d $MM` 10 | B=`printf %03d $KK` 11 | C=`printf %03d $UU` 12 | 13 | echo $A/$B/$C 14 | 15 | wget -o /dev/null -O /dev/stdout http://planet.openstreetmap.org/replication/minute/$A/$B/$C.osc.gz|gunzip -c|python compute-changeset-data.py 16 | -------------------------------------------------------------------------------- /backend/iso8601/__init__.py: -------------------------------------------------------------------------------- 1 | from iso8601 import * 2 | -------------------------------------------------------------------------------- /backend/iso8601/iso8601.py: -------------------------------------------------------------------------------- 1 | """ISO 8601 date time string parsing 2 | 3 | Basic usage: 4 | >>> import iso8601 5 | >>> iso8601.parse_date("2007-01-25T12:00:00Z") 6 | datetime.datetime(2007, 1, 25, 12, 0, tzinfo=) 7 | >>> 8 | 9 | """ 10 | 11 | from datetime import datetime, timedelta, tzinfo 12 | import re 13 | 14 | __all__ = ["parse_date", "ParseError"] 15 | 16 | # Adapted from http://delete.me.uk/2005/03/iso8601.html 17 | ISO8601_REGEX = re.compile(r"(?P[0-9]{4})(-(?P[0-9]{1,2})(-(?P[0-9]{1,2})" 18 | r"((?P.)(?P[0-9]{2}):(?P[0-9]{2})(:(?P[0-9]{2})(\.(?P[0-9]+))?)?" 19 | r"(?PZ|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?" 20 | ) 21 | TIMEZONE_REGEX = re.compile("(?P[+-])(?P[0-9]{2}).(?P[0-9]{2})") 22 | 23 | class ParseError(Exception): 24 | """Raised when there is a problem parsing a date string""" 25 | 26 | # Yoinked from python docs 27 | ZERO = timedelta(0) 28 | class Utc(tzinfo): 29 | """UTC 30 | 31 | """ 32 | def utcoffset(self, dt): 33 | return ZERO 34 | 35 | def tzname(self, dt): 36 | return "UTC" 37 | 38 | def dst(self, dt): 39 | return ZERO 40 | UTC = Utc() 41 | 42 | class FixedOffset(tzinfo): 43 | """Fixed offset in hours and minutes from UTC 44 | 45 | """ 46 | def __init__(self, offset_hours, offset_minutes, name): 47 | self.__offset = timedelta(hours=offset_hours, minutes=offset_minutes) 48 | self.__name = name 49 | 50 | def utcoffset(self, dt): 51 | return self.__offset 52 | 53 | def tzname(self, dt): 54 | return self.__name 55 | 56 | def dst(self, dt): 57 | return ZERO 58 | 59 | def __repr__(self): 60 | return "" % self.__name 61 | 62 | def parse_timezone(tzstring, default_timezone=UTC): 63 | """Parses ISO 8601 time zone specs into tzinfo offsets 64 | 65 | """ 66 | if tzstring == "Z": 67 | return default_timezone 68 | # This isn't strictly correct, but it's common to encounter dates without 69 | # timezones so I'll assume the default (which defaults to UTC). 70 | # Addresses issue 4. 71 | if tzstring is None: 72 | return default_timezone 73 | m = TIMEZONE_REGEX.match(tzstring) 74 | prefix, hours, minutes = m.groups() 75 | hours, minutes = int(hours), int(minutes) 76 | if prefix == "-": 77 | hours = -hours 78 | minutes = -minutes 79 | return FixedOffset(hours, minutes, tzstring) 80 | 81 | def parse_date(datestring, default_timezone=UTC): 82 | """Parses ISO 8601 dates into datetime objects 83 | 84 | The timezone is parsed from the date string. However it is quite common to 85 | have dates without a timezone (not strictly correct). In this case the 86 | default timezone specified in default_timezone is used. This is UTC by 87 | default. 88 | """ 89 | if not isinstance(datestring, basestring): 90 | raise ParseError("Expecting a string %r" % datestring) 91 | m = ISO8601_REGEX.match(datestring) 92 | if not m: 93 | raise ParseError("Unable to parse date string %r" % datestring) 94 | groups = m.groupdict() 95 | tz = parse_timezone(groups["timezone"], default_timezone=default_timezone) 96 | if groups["fraction"] is None: 97 | groups["fraction"] = 0 98 | else: 99 | groups["fraction"] = int(float("0.%s" % groups["fraction"]) * 1e6) 100 | return datetime(int(groups["year"]), int(groups["month"]), int(groups["day"]), 101 | int(groups["hour"]), int(groups["minute"]), int(groups["second"]), 102 | int(groups["fraction"]), tz) 103 | -------------------------------------------------------------------------------- /backend/schema: -------------------------------------------------------------------------------- 1 | CREATE TABLE changeset ( 2 | id INTEGER PRIMARY KEY, 3 | user TEXT, uid INTEGER, 4 | updated INTEGER, 5 | time LONG, 6 | minLon FLOAT, minLat FLOAT, maxLon FLOAT, maxLat FLOAT, 7 | cnode INTEGER, mnode INTEGER, dnode INTEGER, 8 | cway INTEGER, mway INTEGER, dway INTEGER, 9 | crel INTEGER, mrel INTEGER, drel INTEGER 10 | ); 11 | 12 | create index idx_changeset_time on changeset(time); 13 | 14 | CREATE TABLE changeset_content_tag ( 15 | changeset_id INTEGER REFERENCES changeset(id), 16 | key TEXT, 17 | value TEXT 18 | ); 19 | 20 | create index idx_changeset_content_tag on changeset_content_tag(changeset_id); 21 | 22 | 23 | CREATE TABLE changeset_meta_tag ( 24 | changeset_id INTEGER REFERENCES changeset(id), 25 | key TEXT, 26 | value TEXT 27 | ); 28 | create index idx_changeset_meta_tag on changeset_meta_tag(changeset_id); 29 | 30 | create table changeset_meta ( 31 | changeset_id INTEGER REFERENCES changeset(id), 32 | open_at INTEGER, 33 | closed_at INTEGER 34 | ); 35 | 36 | -------------------------------------------------------------------------------- /frontend/close-button.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/close-button.gif -------------------------------------------------------------------------------- /frontend/fetch-changeset-meta.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import sys, time, datetime, math, sqlite3, json, cgi, os, urllib2 3 | from lxml import etree 4 | 5 | print "Content-Type: application/json" 6 | print "" 7 | 8 | 9 | changesetId = int(os.environ["QUERY_STRING"].split('=')[1]) 10 | 11 | data = { "id": changesetId, "tags" : {}, "requested" : False } 12 | 13 | db = sqlite3.connect("/data/work/live/changesets.db") 14 | db.row_factory = sqlite3.Row 15 | c = db.cursor() 16 | 17 | found = False 18 | for row in c.execute("SELECT * from changeset_meta where changeset_id=?", (changesetId,)): 19 | found = True 20 | if found: 21 | for row in c.execute("SELECT * from changeset_meta_tag where changeset_id=?", (changesetId,)): 22 | data["tags"][row["key"]] = row["value"]; 23 | else: 24 | # Request the API, and save in DB 25 | # xml = etree.parse("http://openstreetmap.org/api/0.6/changeset/%s?contact=clement.stenac@gmail.com&client=live.openstreetmap.fr" % changesetId) 26 | xml = etree.parse("http://api.openstreetmap.fr/api/0.6/changeset/%s?contact=clement.stenac@gmail.com&client=live.openstreetmap.fr" % changesetId) 27 | data["requested"] = True 28 | 29 | c.execute("INSERT INTO changeset_meta (changeset_id) VALUES(?)",(changesetId,)); 30 | 31 | for tag in xml.xpath("changeset/tag"): 32 | data["tags"][tag.get("k")] = tag.get("v") 33 | c.execute("INSERT INTO changeset_meta_tag (changeset_id,key,value) VALUES(?,?,?)",(changesetId,tag.get("k"), tag.get("v"))); 34 | 35 | db.commit() 36 | print json.dumps(data) 37 | 38 | 39 | -------------------------------------------------------------------------------- /frontend/flags/_info.txt: -------------------------------------------------------------------------------- 1 | Flag Icons 2 | 3 | Flag icons in this package are public domain. 4 | Graphic effects were created by Phoca.cz in GIMP. 5 | 6 | For more info see: 7 | 8 | * Phoca.cz - http://www.phoca.cz 9 | * Flag Icons - http://www.phoca.cz/flag-icons 10 | 11 | or contact: 12 | 13 | * info [at] phoca [dot] cz 14 | 15 | If you find some bug, please report it to info [at] phoca [dot] cz 16 | 17 | Thank you. 18 | 19 | -------------------------------------------------------------------------------- /frontend/flags/ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ad.png -------------------------------------------------------------------------------- /frontend/flags/ae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ae.png -------------------------------------------------------------------------------- /frontend/flags/af.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/af.png -------------------------------------------------------------------------------- /frontend/flags/ag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ag.png -------------------------------------------------------------------------------- /frontend/flags/ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ai.png -------------------------------------------------------------------------------- /frontend/flags/al.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/al.png -------------------------------------------------------------------------------- /frontend/flags/am.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/am.png -------------------------------------------------------------------------------- /frontend/flags/an.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/an.png -------------------------------------------------------------------------------- /frontend/flags/ao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ao.png -------------------------------------------------------------------------------- /frontend/flags/ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ar.png -------------------------------------------------------------------------------- /frontend/flags/as.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/as.png -------------------------------------------------------------------------------- /frontend/flags/at.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/at.png -------------------------------------------------------------------------------- /frontend/flags/au.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/au.png -------------------------------------------------------------------------------- /frontend/flags/aw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/aw.png -------------------------------------------------------------------------------- /frontend/flags/ax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ax.png -------------------------------------------------------------------------------- /frontend/flags/az.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/az.png -------------------------------------------------------------------------------- /frontend/flags/ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ba.png -------------------------------------------------------------------------------- /frontend/flags/bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bb.png -------------------------------------------------------------------------------- /frontend/flags/bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bd.png -------------------------------------------------------------------------------- /frontend/flags/be.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/be.png -------------------------------------------------------------------------------- /frontend/flags/bf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bf.png -------------------------------------------------------------------------------- /frontend/flags/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bg.png -------------------------------------------------------------------------------- /frontend/flags/bh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bh.png -------------------------------------------------------------------------------- /frontend/flags/bi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bi.png -------------------------------------------------------------------------------- /frontend/flags/bj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bj.png -------------------------------------------------------------------------------- /frontend/flags/bm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bm.png -------------------------------------------------------------------------------- /frontend/flags/bn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bn.png -------------------------------------------------------------------------------- /frontend/flags/bo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bo.png -------------------------------------------------------------------------------- /frontend/flags/br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/br.png -------------------------------------------------------------------------------- /frontend/flags/bs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bs.png -------------------------------------------------------------------------------- /frontend/flags/bt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bt.png -------------------------------------------------------------------------------- /frontend/flags/bv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bv.png -------------------------------------------------------------------------------- /frontend/flags/bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bw.png -------------------------------------------------------------------------------- /frontend/flags/by.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/by.png -------------------------------------------------------------------------------- /frontend/flags/bz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/bz.png -------------------------------------------------------------------------------- /frontend/flags/ca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ca.png -------------------------------------------------------------------------------- /frontend/flags/catalonia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/catalonia.png -------------------------------------------------------------------------------- /frontend/flags/cc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cc.png -------------------------------------------------------------------------------- /frontend/flags/cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cd.png -------------------------------------------------------------------------------- /frontend/flags/cf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cf.png -------------------------------------------------------------------------------- /frontend/flags/cg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cg.png -------------------------------------------------------------------------------- /frontend/flags/ch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ch.png -------------------------------------------------------------------------------- /frontend/flags/ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ci.png -------------------------------------------------------------------------------- /frontend/flags/ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ck.png -------------------------------------------------------------------------------- /frontend/flags/cl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cl.png -------------------------------------------------------------------------------- /frontend/flags/cm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cm.png -------------------------------------------------------------------------------- /frontend/flags/cn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cn.png -------------------------------------------------------------------------------- /frontend/flags/co.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/co.png -------------------------------------------------------------------------------- /frontend/flags/cr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cr.png -------------------------------------------------------------------------------- /frontend/flags/cs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cs.png -------------------------------------------------------------------------------- /frontend/flags/cu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cu.png -------------------------------------------------------------------------------- /frontend/flags/cv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cv.png -------------------------------------------------------------------------------- /frontend/flags/cx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cx.png -------------------------------------------------------------------------------- /frontend/flags/cy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cy.png -------------------------------------------------------------------------------- /frontend/flags/cz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/cz.png -------------------------------------------------------------------------------- /frontend/flags/de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/de.png -------------------------------------------------------------------------------- /frontend/flags/dj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/dj.png -------------------------------------------------------------------------------- /frontend/flags/dk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/dk.png -------------------------------------------------------------------------------- /frontend/flags/dm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/dm.png -------------------------------------------------------------------------------- /frontend/flags/do.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/do.png -------------------------------------------------------------------------------- /frontend/flags/dz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/dz.png -------------------------------------------------------------------------------- /frontend/flags/ec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ec.png -------------------------------------------------------------------------------- /frontend/flags/ee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ee.png -------------------------------------------------------------------------------- /frontend/flags/eg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/eg.png -------------------------------------------------------------------------------- /frontend/flags/eh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/eh.png -------------------------------------------------------------------------------- /frontend/flags/england.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/england.png -------------------------------------------------------------------------------- /frontend/flags/er.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/er.png -------------------------------------------------------------------------------- /frontend/flags/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/es.png -------------------------------------------------------------------------------- /frontend/flags/et.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/et.png -------------------------------------------------------------------------------- /frontend/flags/eu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/eu.png -------------------------------------------------------------------------------- /frontend/flags/fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/fi.png -------------------------------------------------------------------------------- /frontend/flags/fj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/fj.png -------------------------------------------------------------------------------- /frontend/flags/fk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/fk.png -------------------------------------------------------------------------------- /frontend/flags/fm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/fm.png -------------------------------------------------------------------------------- /frontend/flags/fo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/fo.png -------------------------------------------------------------------------------- /frontend/flags/fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/fr.png -------------------------------------------------------------------------------- /frontend/flags/ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ga.png -------------------------------------------------------------------------------- /frontend/flags/galicia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/galicia.png -------------------------------------------------------------------------------- /frontend/flags/gb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gb.png -------------------------------------------------------------------------------- /frontend/flags/gd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gd.png -------------------------------------------------------------------------------- /frontend/flags/ge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ge.png -------------------------------------------------------------------------------- /frontend/flags/gf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gf.png -------------------------------------------------------------------------------- /frontend/flags/gg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gg.png -------------------------------------------------------------------------------- /frontend/flags/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gh.png -------------------------------------------------------------------------------- /frontend/flags/gi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gi.png -------------------------------------------------------------------------------- /frontend/flags/gl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gl.png -------------------------------------------------------------------------------- /frontend/flags/gm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gm.png -------------------------------------------------------------------------------- /frontend/flags/gn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gn.png -------------------------------------------------------------------------------- /frontend/flags/gp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gp.png -------------------------------------------------------------------------------- /frontend/flags/gq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gq.png -------------------------------------------------------------------------------- /frontend/flags/gr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gr.png -------------------------------------------------------------------------------- /frontend/flags/gs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gs.png -------------------------------------------------------------------------------- /frontend/flags/gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gt.png -------------------------------------------------------------------------------- /frontend/flags/gu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gu.png -------------------------------------------------------------------------------- /frontend/flags/gw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gw.png -------------------------------------------------------------------------------- /frontend/flags/gy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/gy.png -------------------------------------------------------------------------------- /frontend/flags/hk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/hk.png -------------------------------------------------------------------------------- /frontend/flags/hm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/hm.png -------------------------------------------------------------------------------- /frontend/flags/hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/hn.png -------------------------------------------------------------------------------- /frontend/flags/hr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/hr.png -------------------------------------------------------------------------------- /frontend/flags/ht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ht.png -------------------------------------------------------------------------------- /frontend/flags/hu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/hu.png -------------------------------------------------------------------------------- /frontend/flags/id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/id.png -------------------------------------------------------------------------------- /frontend/flags/ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ie.png -------------------------------------------------------------------------------- /frontend/flags/il.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/il.png -------------------------------------------------------------------------------- /frontend/flags/im.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/im.png -------------------------------------------------------------------------------- /frontend/flags/in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/in.png -------------------------------------------------------------------------------- /frontend/flags/io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/io.png -------------------------------------------------------------------------------- /frontend/flags/iq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/iq.png -------------------------------------------------------------------------------- /frontend/flags/ir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ir.png -------------------------------------------------------------------------------- /frontend/flags/is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/is.png -------------------------------------------------------------------------------- /frontend/flags/it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/it.png -------------------------------------------------------------------------------- /frontend/flags/ja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ja.png -------------------------------------------------------------------------------- /frontend/flags/je.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/je.png -------------------------------------------------------------------------------- /frontend/flags/jm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/jm.png -------------------------------------------------------------------------------- /frontend/flags/jo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/jo.png -------------------------------------------------------------------------------- /frontend/flags/jp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/jp.png -------------------------------------------------------------------------------- /frontend/flags/ke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ke.png -------------------------------------------------------------------------------- /frontend/flags/kg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/kg.png -------------------------------------------------------------------------------- /frontend/flags/kh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/kh.png -------------------------------------------------------------------------------- /frontend/flags/ki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ki.png -------------------------------------------------------------------------------- /frontend/flags/km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/km.png -------------------------------------------------------------------------------- /frontend/flags/kn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/kn.png -------------------------------------------------------------------------------- /frontend/flags/kp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/kp.png -------------------------------------------------------------------------------- /frontend/flags/kr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/kr.png -------------------------------------------------------------------------------- /frontend/flags/kw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/kw.png -------------------------------------------------------------------------------- /frontend/flags/ky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ky.png -------------------------------------------------------------------------------- /frontend/flags/kz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/kz.png -------------------------------------------------------------------------------- /frontend/flags/la.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/la.png -------------------------------------------------------------------------------- /frontend/flags/lb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/lb.png -------------------------------------------------------------------------------- /frontend/flags/lc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/lc.png -------------------------------------------------------------------------------- /frontend/flags/li.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/li.png -------------------------------------------------------------------------------- /frontend/flags/lk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/lk.png -------------------------------------------------------------------------------- /frontend/flags/lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/lr.png -------------------------------------------------------------------------------- /frontend/flags/ls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ls.png -------------------------------------------------------------------------------- /frontend/flags/lt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/lt.png -------------------------------------------------------------------------------- /frontend/flags/lu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/lu.png -------------------------------------------------------------------------------- /frontend/flags/lv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/lv.png -------------------------------------------------------------------------------- /frontend/flags/ly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ly.png -------------------------------------------------------------------------------- /frontend/flags/ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ma.png -------------------------------------------------------------------------------- /frontend/flags/mc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mc.png -------------------------------------------------------------------------------- /frontend/flags/md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/md.png -------------------------------------------------------------------------------- /frontend/flags/me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/me.png -------------------------------------------------------------------------------- /frontend/flags/mf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mf.png -------------------------------------------------------------------------------- /frontend/flags/mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mg.png -------------------------------------------------------------------------------- /frontend/flags/mh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mh.png -------------------------------------------------------------------------------- /frontend/flags/mk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mk.png -------------------------------------------------------------------------------- /frontend/flags/ml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ml.png -------------------------------------------------------------------------------- /frontend/flags/mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mm.png -------------------------------------------------------------------------------- /frontend/flags/mn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mn.png -------------------------------------------------------------------------------- /frontend/flags/mo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mo.png -------------------------------------------------------------------------------- /frontend/flags/mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mp.png -------------------------------------------------------------------------------- /frontend/flags/mq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mq.png -------------------------------------------------------------------------------- /frontend/flags/mr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mr.png -------------------------------------------------------------------------------- /frontend/flags/ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ms.png -------------------------------------------------------------------------------- /frontend/flags/mt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mt.png -------------------------------------------------------------------------------- /frontend/flags/mu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mu.png -------------------------------------------------------------------------------- /frontend/flags/mv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mv.png -------------------------------------------------------------------------------- /frontend/flags/mw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mw.png -------------------------------------------------------------------------------- /frontend/flags/mx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mx.png -------------------------------------------------------------------------------- /frontend/flags/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/my.png -------------------------------------------------------------------------------- /frontend/flags/mz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/mz.png -------------------------------------------------------------------------------- /frontend/flags/na.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/na.png -------------------------------------------------------------------------------- /frontend/flags/nc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/nc.png -------------------------------------------------------------------------------- /frontend/flags/nc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/nc2.png -------------------------------------------------------------------------------- /frontend/flags/ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ne.png -------------------------------------------------------------------------------- /frontend/flags/nf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/nf.png -------------------------------------------------------------------------------- /frontend/flags/ng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ng.png -------------------------------------------------------------------------------- /frontend/flags/ni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ni.png -------------------------------------------------------------------------------- /frontend/flags/nl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/nl.png -------------------------------------------------------------------------------- /frontend/flags/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/no.png -------------------------------------------------------------------------------- /frontend/flags/np.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/np.png -------------------------------------------------------------------------------- /frontend/flags/nr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/nr.png -------------------------------------------------------------------------------- /frontend/flags/nu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/nu.png -------------------------------------------------------------------------------- /frontend/flags/nz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/nz.png -------------------------------------------------------------------------------- /frontend/flags/om.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/om.png -------------------------------------------------------------------------------- /frontend/flags/pa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pa.png -------------------------------------------------------------------------------- /frontend/flags/pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pe.png -------------------------------------------------------------------------------- /frontend/flags/pf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pf.png -------------------------------------------------------------------------------- /frontend/flags/pg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pg.png -------------------------------------------------------------------------------- /frontend/flags/ph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ph.png -------------------------------------------------------------------------------- /frontend/flags/pk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pk.png -------------------------------------------------------------------------------- /frontend/flags/pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pl.png -------------------------------------------------------------------------------- /frontend/flags/pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pm.png -------------------------------------------------------------------------------- /frontend/flags/pn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pn.png -------------------------------------------------------------------------------- /frontend/flags/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pr.png -------------------------------------------------------------------------------- /frontend/flags/ps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ps.png -------------------------------------------------------------------------------- /frontend/flags/pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pt.png -------------------------------------------------------------------------------- /frontend/flags/pw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/pw.png -------------------------------------------------------------------------------- /frontend/flags/py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/py.png -------------------------------------------------------------------------------- /frontend/flags/qa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/qa.png -------------------------------------------------------------------------------- /frontend/flags/re.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/re.png -------------------------------------------------------------------------------- /frontend/flags/ro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ro.png -------------------------------------------------------------------------------- /frontend/flags/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/rs.png -------------------------------------------------------------------------------- /frontend/flags/ru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ru.png -------------------------------------------------------------------------------- /frontend/flags/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/rw.png -------------------------------------------------------------------------------- /frontend/flags/sa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sa.png -------------------------------------------------------------------------------- /frontend/flags/sb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sb.png -------------------------------------------------------------------------------- /frontend/flags/sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sc.png -------------------------------------------------------------------------------- /frontend/flags/scotland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/scotland.png -------------------------------------------------------------------------------- /frontend/flags/sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sd.png -------------------------------------------------------------------------------- /frontend/flags/se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/se.png -------------------------------------------------------------------------------- /frontend/flags/sg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sg.png -------------------------------------------------------------------------------- /frontend/flags/sh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sh.png -------------------------------------------------------------------------------- /frontend/flags/si.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/si.png -------------------------------------------------------------------------------- /frontend/flags/sj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sj.png -------------------------------------------------------------------------------- /frontend/flags/sk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sk.png -------------------------------------------------------------------------------- /frontend/flags/sl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sl.png -------------------------------------------------------------------------------- /frontend/flags/sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sm.png -------------------------------------------------------------------------------- /frontend/flags/sn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sn.png -------------------------------------------------------------------------------- /frontend/flags/so.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/so.png -------------------------------------------------------------------------------- /frontend/flags/sr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sr.png -------------------------------------------------------------------------------- /frontend/flags/st.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/st.png -------------------------------------------------------------------------------- /frontend/flags/sv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sv.png -------------------------------------------------------------------------------- /frontend/flags/sy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sy.png -------------------------------------------------------------------------------- /frontend/flags/sz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/sz.png -------------------------------------------------------------------------------- /frontend/flags/tc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tc.png -------------------------------------------------------------------------------- /frontend/flags/td.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/td.png -------------------------------------------------------------------------------- /frontend/flags/tf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tf.png -------------------------------------------------------------------------------- /frontend/flags/tg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tg.png -------------------------------------------------------------------------------- /frontend/flags/th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/th.png -------------------------------------------------------------------------------- /frontend/flags/tj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tj.png -------------------------------------------------------------------------------- /frontend/flags/tk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tk.png -------------------------------------------------------------------------------- /frontend/flags/tl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tl.png -------------------------------------------------------------------------------- /frontend/flags/tm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tm.png -------------------------------------------------------------------------------- /frontend/flags/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tn.png -------------------------------------------------------------------------------- /frontend/flags/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/to.png -------------------------------------------------------------------------------- /frontend/flags/tr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tr.png -------------------------------------------------------------------------------- /frontend/flags/tt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tt.png -------------------------------------------------------------------------------- /frontend/flags/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tv.png -------------------------------------------------------------------------------- /frontend/flags/tw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tw.png -------------------------------------------------------------------------------- /frontend/flags/tz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/tz.png -------------------------------------------------------------------------------- /frontend/flags/ua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ua.png -------------------------------------------------------------------------------- /frontend/flags/ug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ug.png -------------------------------------------------------------------------------- /frontend/flags/uk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/uk.png -------------------------------------------------------------------------------- /frontend/flags/um.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/um.png -------------------------------------------------------------------------------- /frontend/flags/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/unknown.png -------------------------------------------------------------------------------- /frontend/flags/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/us.png -------------------------------------------------------------------------------- /frontend/flags/uy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/uy.png -------------------------------------------------------------------------------- /frontend/flags/uz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/uz.png -------------------------------------------------------------------------------- /frontend/flags/va.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/va.png -------------------------------------------------------------------------------- /frontend/flags/vc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/vc.png -------------------------------------------------------------------------------- /frontend/flags/ve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ve.png -------------------------------------------------------------------------------- /frontend/flags/vg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/vg.png -------------------------------------------------------------------------------- /frontend/flags/vi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/vi.png -------------------------------------------------------------------------------- /frontend/flags/vn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/vn.png -------------------------------------------------------------------------------- /frontend/flags/vu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/vu.png -------------------------------------------------------------------------------- /frontend/flags/wales.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/wales.png -------------------------------------------------------------------------------- /frontend/flags/wf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/wf.png -------------------------------------------------------------------------------- /frontend/flags/ws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ws.png -------------------------------------------------------------------------------- /frontend/flags/ye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/ye.png -------------------------------------------------------------------------------- /frontend/flags/yt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/yt.png -------------------------------------------------------------------------------- /frontend/flags/za.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/za.png -------------------------------------------------------------------------------- /frontend/flags/zm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/zm.png -------------------------------------------------------------------------------- /frontend/flags/zw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/flags/zw.png -------------------------------------------------------------------------------- /frontend/get-last-data.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import sys, time, datetime, math, sqlite3, json, cgi, os, cgitb, urllib2 3 | 4 | print "Content-Type: application/json" 5 | print "" 6 | 7 | cgitb.enable() 8 | data = {} 9 | ts = [] 10 | 11 | scale = int(os.environ["QUERY_STRING"].split('=')[1]) 12 | max_delay = 600 13 | 14 | now = int(time.time()) 15 | now_aligned = now - now % scale 16 | beg = (now - max_delay) 17 | 18 | db = sqlite3.connect("/data/work/live/changesets.db") 19 | db.row_factory = sqlite3.Row 20 | c = db.cursor() 21 | 22 | rows = [] 23 | max_valid_timestamp = 0 24 | #print "Working from %s to %s" % (beg, now_aligned) 25 | for row in c.execute("SELECT * from changeset where time > ? ORDER BY time", (beg,)): 26 | rows.append(row) 27 | max_valid_timestamp = row["time"] 28 | 29 | data["debug"] = "I want data from %s to %s and my max is %s" % (now_aligned - max_delay, now_aligned, max_valid_timestamp) 30 | #print "Studying %i rows " % len(rows) 31 | 32 | def copy(row): 33 | x = {} 34 | for key in row.keys(): 35 | x[key] = row[key] 36 | return x 37 | 38 | # TODO: Really gruik 39 | for time in xrange(now_aligned - max_delay, now_aligned, scale): 40 | e = {"time" : time, "nbChangesets" : 0, "totalActivity": 0, 41 | "cnode" : 0, "mnode" : 0, "dnode" : 0, 42 | "cway" : 0, "mway" : 0, "dway" : 0, 43 | "crel" : 0, "mrel" : 0, "drel" : 0, "changesets" : []} 44 | # print "look for data for %s" % time 45 | for row in rows: 46 | rowTime = int(row["time"]) 47 | # print " changeset is at %s" % rowTime 48 | if rowTime >= time and rowTime < time + scale: 49 | lat = row["minLat"] 50 | lon = row["minLon"] 51 | rowCopy = copy(row) 52 | # geoData = urllib2.urlopen("http://localhost:9999/reverse?lat=%s&lon=%s" % (lat, lon)).read() 53 | # print geoData 54 | # geocode = json.loads(geoData) 55 | 56 | rowCopy["countries"] = [] 57 | # for match in geocode["matches"]: 58 | # rowCopy["countries"].append(match["payload"]) 59 | # if len(match["payload"]) == 2: 60 | # rowCopy["country"] = match["payload"] 61 | # print "Found candidate changeset" 62 | # Keep this changeset for this time entry 63 | e["changesets"].append(rowCopy) 64 | #{ "id" : row["id"], "user": row["user"], 65 | # "minLon" : row["minLon" 66 | e["cnode"] += int(row["cnode"]) 67 | e["mnode"] += int(row["mnode"]) 68 | e["dnode"] += int(row["dnode"]) 69 | e["cway"] += int(row["cway"]) 70 | e["mway"] += int(row["mway"]) 71 | e["dway"] += int(row["dway"]) 72 | e["crel"] += int(row["crel"]) 73 | e["mrel"] += int(row["mrel"]) 74 | e["drel"] += int(row["drel"]) 75 | e["nbChangesets"] += 1 76 | e["totalActivity"] += e["cnode"] + e["mnode"] + e["dnode"] 77 | e["totalActivity"] += e["cway"] + e["mway"] + e["dway"] 78 | e["totalActivity"] += e["crel"] + e["mrel"] + e["drel"] 79 | ts.append(e) 80 | if time > max_valid_timestamp: 81 | break 82 | 83 | data["timeseries"] = ts 84 | print json.dumps(data) 85 | 86 | 87 | -------------------------------------------------------------------------------- /frontend/heatcanvas-leaflet.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2010 Sun Ning 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to deal 6 | * in the Software without restriction, including without limitation the rights 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | * copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in all 12 | * copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | * SOFTWARE. 21 | */ 22 | 23 | L.TileLayer.HeatCanvas = L.Class.extend({ 24 | 25 | initialize: function(options, heatCanvasOptions){ 26 | this.heatCanvasOptions = heatCanvasOptions; 27 | this.data= []; 28 | }, 29 | 30 | onAdd: function(map) { 31 | this.map = map; 32 | this._initHeatCanvas(this.map, this.heatCanvasOptions); 33 | map.on("viewreset", this._redraw, this); 34 | map.on("moveend", this._redraw, this); 35 | map.on("dragend", this._redraw, this); 36 | map.on("zoomend", this._redraw, this); 37 | this._redraw(); 38 | }, 39 | 40 | onRemove: function(map) { 41 | map.getPanes().overlayPane.removeChild(this._div); 42 | map.off("viewreset", this._redraw, this); 43 | map.off("moveend", this._redraw, this); 44 | map.off("dragend", this._redraw, this); 45 | map.off("zoomend", this._redraw, this); 46 | }, 47 | 48 | _initHeatCanvas: function(map, options){ 49 | options = options || {}; 50 | this._step = options.step || 1; 51 | this._degree = options.degree || HeatCanvas.LINEAR; 52 | this._opacity = options.opacity || 0.6; 53 | this._colorscheme = options.colorscheme || null; 54 | 55 | var container = L.DomUtil.create('div', 'leaflet-heatmap-container'); 56 | container.style.position = 'absolute'; 57 | container.style.width = this.map.getSize().x+"px"; 58 | container.style.height = this.map.getSize().y+"px"; 59 | 60 | var canv = document.createElement("canvas"); 61 | canv.style.width = this.map.getSize().x+"px"; 62 | canv.style.height = this.map.getSize().y+"px"; 63 | canv.width = parseInt(canv.style.width); 64 | canv.height = parseInt(canv.style.height); 65 | canv.style.opacity = this._opacity; 66 | container.appendChild(canv); 67 | 68 | this.heatmap = new HeatCanvas(canv); 69 | this._div = container; 70 | this.map.getPanes().overlayPane.appendChild(this._div); 71 | }, 72 | 73 | pushData: function(lat, lon, value) { 74 | this.data.push({"lon":lon, "lat":lat, "v":value}); 75 | }, 76 | 77 | _resetCanvasPosition: function() { 78 | var bounds = this.map.getBounds(); 79 | var topLeft = this.map.latLngToLayerPoint(bounds.getNorthWest()); 80 | //topLeft = this.map.layerPointToContainerPoint(topLeft); 81 | 82 | L.DomUtil.setPosition(this._div, topLeft); 83 | }, 84 | 85 | _redraw: function() { 86 | this._resetCanvasPosition(); 87 | this.heatmap.clear(); 88 | if (this.data.length > 0) { 89 | for (var i=0, l=this.data.length; i 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to deal 6 | * in the Software without restriction, including without limitation the rights 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | * copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in all 12 | * copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | * SOFTWARE. 21 | */ 22 | onmessage = function(e){ 23 | calc(e.data); 24 | } 25 | 26 | function calc(params) { 27 | value = params.value || {}; 28 | degree = params.degree || 1; 29 | 30 | for(var pos in params.data){ 31 | var data = params.data[pos]; 32 | var radius = Math.floor(Math.pow((data / params.step), 1/degree)); 33 | 34 | var x = Math.floor(pos%params.width); 35 | var y = Math.floor(pos/params.width); 36 | 37 | // calculate point x.y 38 | for(var scanx=x-radius; scanxparams.width){ 41 | continue; 42 | } 43 | for(var scany=y-radius; scanyparams.height){ 46 | continue; 47 | } 48 | 49 | var dist = Math.sqrt(Math.pow((scanx-x), 2)+Math.pow((scany-y), 2)); 50 | if(dist > radius){ 51 | continue; 52 | } else { 53 | var v = data - params.step * Math.pow(dist, degree); 54 | 55 | var id = scanx+scany*params.width ; 56 | 57 | if(value[id]){ 58 | value[id] = value[id] + v; 59 | } else { 60 | value[id] = v; 61 | } 62 | } 63 | } 64 | } 65 | } 66 | postMessage({'value': value}); 67 | } 68 | -------------------------------------------------------------------------------- /frontend/heatcanvas.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2010-2011 Sun Ning 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to deal 6 | * in the Software without restriction, including without limitation the rights 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | * copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in all 12 | * copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | * SOFTWARE. 21 | */ 22 | 23 | /** 24 | * Heatmap api based on canvas 25 | * 26 | */ 27 | var HeatCanvas = function(canvas){ 28 | if (typeof(canvas) == "string") { 29 | this.canvas = document.getElementById(canvas); 30 | } else { 31 | this.canvas = canvas; 32 | } 33 | if(this.canvas == null){ 34 | return null; 35 | } 36 | 37 | this.worker = new Worker(HeatCanvas.getPath()+'heatcanvas-worker.js'); 38 | 39 | this.width = this.canvas.width; 40 | this.height = this.canvas.height; 41 | 42 | this.onRenderingStart = null; 43 | this.onRenderingEnd = null; 44 | 45 | this.data = {}; 46 | }; 47 | 48 | HeatCanvas.prototype.push = function(x, y, data){ 49 | // ignore all data out of extent 50 | if (x < 0 || x > this.width) { 51 | return ; 52 | } 53 | if (y < 0 || y > this.height) { 54 | return; 55 | } 56 | 57 | var id = x+y*this.width; 58 | if(this.data[id]){ 59 | this.data[id] = this.data[id] + data; 60 | } else { 61 | this.data[id] = data; 62 | } 63 | }; 64 | 65 | HeatCanvas.prototype.render = function(step, degree, f_value_color){ 66 | step = step || 1; 67 | degree = degree || HeatCanvas.LINEAR ; 68 | 69 | var self = this; 70 | this.worker.onmessage = function(e){ 71 | self.value = e.data.value; 72 | self.data = {}; 73 | self._render(f_value_color); 74 | if (self.onRenderingEnd){ 75 | self.onRenderingEnd(); 76 | } 77 | } 78 | var msg = { 79 | 'data': self.data, 80 | 'width': self.width, 81 | 'height': self.height, 82 | 'step': step, 83 | 'degree': degree, 84 | 'value': self.value 85 | }; 86 | this.worker.postMessage(msg); 87 | if (this.onRenderingStart){ 88 | this.onRenderingStart(); 89 | } 90 | }; 91 | 92 | 93 | HeatCanvas.prototype._render = function(f_value_color){ 94 | f_value_color = f_value_color || HeatCanvas.defaultValue2Color; 95 | 96 | var ctx = this.canvas.getContext("2d"); 97 | ctx.clearRect(0, 0, this.width, this.height); 98 | 99 | defaultColor = this.bgcolor || [0, 0, 0, 255]; 100 | var canvasData = ctx.createImageData(this.width, this.height); 101 | for (var i=0; i 1) t -= 1; 164 | if(t < 1/6) return p + (q - p) * 6 * t; 165 | if(t < 1/2) return q; 166 | if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; 167 | return p; 168 | } 169 | 170 | var q = l < 0.5 ? l * (1 + s) : l + s - l * s; 171 | var p = 2 * l - q; 172 | r = hue2rgb(p, q, h + 1/3); 173 | g = hue2rgb(p, q, h); 174 | b = hue2rgb(p, q, h - 1/3); 175 | } 176 | 177 | return [r * 255, g * 255, b * 255, a * 255]; 178 | } 179 | 180 | HeatCanvas.LINEAR = 1; 181 | HeatCanvas.QUAD = 2; 182 | HeatCanvas.CUBIC = 3; 183 | 184 | HeatCanvas.getPath = function() { 185 | var scriptTags = document.getElementsByTagName("script"); 186 | for (var i=0; i 0) { 190 | return src.substring(0, pos); 191 | } 192 | } 193 | return ""; 194 | } 195 | 196 | -------------------------------------------------------------------------------- /frontend/highcharts/gfx/vml-radial-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/highcharts/gfx/vml-radial-gradient.png -------------------------------------------------------------------------------- /frontend/highcharts/graphics/skies.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/highcharts/graphics/skies.jpg -------------------------------------------------------------------------------- /frontend/highcharts/graphics/snow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/highcharts/graphics/snow.png -------------------------------------------------------------------------------- /frontend/highcharts/graphics/sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/highcharts/graphics/sun.png -------------------------------------------------------------------------------- /frontend/highcharts/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Highcharts Examples 6 | 7 | 8 |

Highcharts Examples

9 |

Line and scatter charts

10 | 22 |

Area charts

23 | 32 |

Column and bar charts

33 | 46 |

Pie charts

47 | 53 |

Dynamic charts

54 | 59 |

Combinations

60 | 66 |

More chart types

67 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /frontend/highcharts/js/adapters/mootools-adapter.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v2.3.0 (2012-08-24) 3 | MooTools adapter 4 | 5 | (c) 2010-2011 Torstein H?nsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(){var e=window,i=document,f=e.MooTools.version.substring(0,3),g=f==="1.2"||f==="1.1",j=g||f==="1.3",h=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,e=d.compute;b.start=function(b,d){var e=this.element;if(b.d)this.paths=a.init(e,e.d,this.toD);c.apply(this,arguments);return this};d.compute=function(b,c,d){var f=this.paths;if(f)this.element.attr("d",a.step(f[0],f[1],d,this.toD));else return e.apply(this, 10 | arguments)}},adapterRun:function(a,b){if(b==="width"||b==="height")return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=i.getElementsByTagName("head")[0],d=i.createElement("script");d.type="text/javascript";d.src=a;d.onload=b;c.appendChild(d)},animate:function(a,b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle)a.getStyle=a.attr,a.setStyle=function(){var b=arguments;a.attr.call(a,b[0],b[1][0])},a.$family=function(){return!0};e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),h({transition:Fx.Transitions.Quad.easeInOut}, 11 | c));if(d)c.element=a;if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return g?$each(a,b):Array.each(a,b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},inArray:function(a,b,c){return b.indexOf(a,c)},merge:function(){var a=arguments,b=[{}],c=a.length;if(g)a=$merge.apply(null,a);else{for(;c--;)typeof a[c]!=="boolean"&&(b[c+1]=a[c]);a=Object.merge.apply(Object,b)}return a},offset:function(a){a=$(a).getOffsets();return{left:a.x,top:a.y}}, 12 | extendWithEvents:function(a){a.addEvent||(a.nodeName?$(a):h(a,new Events))},addEvent:function(a,b,c){typeof b==="string"&&(b==="unload"&&(b="beforeunload"),e.HighchartsAdapter.extendWithEvents(a),a.addEvent(b,c))},removeEvent:function(a,b,c){typeof a!=="string"&&(e.HighchartsAdapter.extendWithEvents(a),b?(b==="unload"&&(b="beforeunload"),c?a.removeEvent(b,c):a.removeEvents&&a.removeEvents(b)):a.removeEvents())},fireEvent:function(a,b,c,d){b={type:b,target:a};b=j?new Event(b):new DOMEvent(b);b=h(b, 13 | c);b.preventDefault=function(){d=null};a.fireEvent&&a.fireEvent(b.type,b);d&&d(b)},washMouseEvent:function(a){return a.event||a},stop:function(a){a.fx&&a.fx.cancel()}}})(); 14 | -------------------------------------------------------------------------------- /frontend/highcharts/js/adapters/mootools-adapter.src.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Highcharts JS v2.3.0 (2012-08-24) 3 | * MooTools adapter 4 | * 5 | * (c) 2010-2011 Torstein Hønsi 6 | * 7 | * License: www.highcharts.com/license 8 | */ 9 | 10 | // JSLint options: 11 | /*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */ 12 | 13 | (function () { 14 | 15 | var win = window, 16 | doc = document, 17 | mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number 18 | legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not. 19 | legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent. 20 | $extend = win.$extend || function () { 21 | return Object.append.apply(Object, arguments); 22 | }; 23 | 24 | win.HighchartsAdapter = { 25 | /** 26 | * Initialize the adapter. This is run once as Highcharts is first run. 27 | * @param {Object} pathAnim The helper object to do animations across adapters. 28 | */ 29 | init: function (pathAnim) { 30 | var fxProto = Fx.prototype, 31 | fxStart = fxProto.start, 32 | morphProto = Fx.Morph.prototype, 33 | morphCompute = morphProto.compute; 34 | 35 | // override Fx.start to allow animation of SVG element wrappers 36 | /*jslint unparam: true*//* allow unused parameters in fx functions */ 37 | fxProto.start = function (from, to) { 38 | var fx = this, 39 | elem = fx.element; 40 | 41 | // special for animating paths 42 | if (from.d) { 43 | //this.fromD = this.element.d.split(' '); 44 | fx.paths = pathAnim.init( 45 | elem, 46 | elem.d, 47 | fx.toD 48 | ); 49 | } 50 | fxStart.apply(fx, arguments); 51 | 52 | return this; // chainable 53 | }; 54 | 55 | // override Fx.step to allow animation of SVG element wrappers 56 | morphProto.compute = function (from, to, delta) { 57 | var fx = this, 58 | paths = fx.paths; 59 | 60 | if (paths) { 61 | fx.element.attr( 62 | 'd', 63 | pathAnim.step(paths[0], paths[1], delta, fx.toD) 64 | ); 65 | } else { 66 | return morphCompute.apply(fx, arguments); 67 | } 68 | }; 69 | /*jslint unparam: false*/ 70 | }, 71 | 72 | /** 73 | * Run a general method on the framework, following jQuery syntax 74 | * @param {Object} el The HTML element 75 | * @param {String} method Which method to run on the wrapped element 76 | */ 77 | adapterRun: function (el, method) { 78 | 79 | // This currently works for getting inner width and height. If adding 80 | // more methods later, we need a conditional implementation for each. 81 | if (method === 'width' || method === 'height') { 82 | return parseInt($(el).getStyle(method), 10); 83 | } 84 | }, 85 | 86 | /** 87 | * Downloads a script and executes a callback when done. 88 | * @param {String} scriptLocation 89 | * @param {Function} callback 90 | */ 91 | getScript: function (scriptLocation, callback) { 92 | // We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script. 93 | var head = doc.getElementsByTagName('head')[0]; 94 | var script = doc.createElement('script'); 95 | 96 | script.type = 'text/javascript'; 97 | script.src = scriptLocation; 98 | script.onload = callback; 99 | 100 | head.appendChild(script); 101 | }, 102 | 103 | /** 104 | * Animate a HTML element or SVG element wrapper 105 | * @param {Object} el 106 | * @param {Object} params 107 | * @param {Object} options jQuery-like animation options: duration, easing, callback 108 | */ 109 | animate: function (el, params, options) { 110 | var isSVGElement = el.attr, 111 | effect, 112 | complete = options && options.complete; 113 | 114 | if (isSVGElement && !el.setStyle) { 115 | // add setStyle and getStyle methods for internal use in Moo 116 | el.getStyle = el.attr; 117 | el.setStyle = function () { // property value is given as array in Moo - break it down 118 | var args = arguments; 119 | el.attr.call(el, args[0], args[1][0]); 120 | }; 121 | // dirty hack to trick Moo into handling el as an element wrapper 122 | el.$family = function () { return true; }; 123 | } 124 | 125 | // stop running animations 126 | win.HighchartsAdapter.stop(el); 127 | 128 | // define and run the effect 129 | effect = new Fx.Morph( 130 | isSVGElement ? el : $(el), 131 | $extend({ 132 | transition: Fx.Transitions.Quad.easeInOut 133 | }, options) 134 | ); 135 | 136 | // Make sure that the element reference is set when animating svg elements 137 | if (isSVGElement) { 138 | effect.element = el; 139 | } 140 | 141 | // special treatment for paths 142 | if (params.d) { 143 | effect.toD = params.d; 144 | } 145 | 146 | // jQuery-like events 147 | if (complete) { 148 | effect.addEvent('complete', complete); 149 | } 150 | 151 | // run 152 | effect.start(params); 153 | 154 | // record for use in stop method 155 | el.fx = effect; 156 | }, 157 | 158 | /** 159 | * MooTool's each function 160 | * 161 | */ 162 | each: function (arr, fn) { 163 | return legacy ? 164 | $each(arr, fn) : 165 | Array.each(arr, fn); 166 | }, 167 | 168 | /** 169 | * Map an array 170 | * @param {Array} arr 171 | * @param {Function} fn 172 | */ 173 | map: function (arr, fn) { 174 | return arr.map(fn); 175 | }, 176 | 177 | /** 178 | * Grep or filter an array 179 | * @param {Array} arr 180 | * @param {Function} fn 181 | */ 182 | grep: function (arr, fn) { 183 | return arr.filter(fn); 184 | }, 185 | 186 | /** 187 | * Return the index of an item in an array, or -1 if not matched 188 | */ 189 | inArray: function (item, arr, from) { 190 | return arr.indexOf(item, from); 191 | }, 192 | 193 | /** 194 | * Deep merge two objects and return a third 195 | */ 196 | merge: function () { 197 | var args = arguments, 198 | args13 = [{}], // MooTools 1.3+ 199 | i = args.length, 200 | ret; 201 | 202 | if (legacy) { 203 | ret = $merge.apply(null, args); 204 | } else { 205 | while (i--) { 206 | // Boolean argumens should not be merged. 207 | // JQuery explicitly skips this, so we do it here as well. 208 | if (typeof args[i] !== 'boolean') { 209 | args13[i + 1] = args[i]; 210 | } 211 | } 212 | ret = Object.merge.apply(Object, args13); 213 | } 214 | 215 | return ret; 216 | }, 217 | 218 | /** 219 | * Get the offset of an element relative to the top left corner of the web page 220 | */ 221 | offset: function (el) { 222 | var offsets = $(el).getOffsets(); 223 | return { 224 | left: offsets.x, 225 | top: offsets.y 226 | }; 227 | }, 228 | 229 | /** 230 | * Extends an object with Events, if its not done 231 | */ 232 | extendWithEvents: function (el) { 233 | // if the addEvent method is not defined, el is a custom Highcharts object 234 | // like series or point 235 | if (!el.addEvent) { 236 | if (el.nodeName) { 237 | el = $(el); // a dynamically generated node 238 | } else { 239 | $extend(el, new Events()); // a custom object 240 | } 241 | } 242 | }, 243 | 244 | /** 245 | * Add an event listener 246 | * @param {Object} el HTML element or custom object 247 | * @param {String} type Event type 248 | * @param {Function} fn Event handler 249 | */ 250 | addEvent: function (el, type, fn) { 251 | if (typeof type === 'string') { // chart broke due to el being string, type function 252 | 253 | if (type === 'unload') { // Moo self destructs before custom unload events 254 | type = 'beforeunload'; 255 | } 256 | 257 | win.HighchartsAdapter.extendWithEvents(el); 258 | 259 | el.addEvent(type, fn); 260 | } 261 | }, 262 | 263 | removeEvent: function (el, type, fn) { 264 | if (typeof el === 'string') { 265 | // el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out. 266 | return; 267 | } 268 | 269 | win.HighchartsAdapter.extendWithEvents(el); 270 | if (type) { 271 | if (type === 'unload') { // Moo self destructs before custom unload events 272 | type = 'beforeunload'; 273 | } 274 | 275 | if (fn) { 276 | el.removeEvent(type, fn); 277 | } else if (el.removeEvents) { // #958 278 | el.removeEvents(type); 279 | } 280 | } else { 281 | el.removeEvents(); 282 | } 283 | }, 284 | 285 | fireEvent: function (el, event, eventArguments, defaultFunction) { 286 | var eventArgs = { 287 | type: event, 288 | target: el 289 | }; 290 | // create an event object that keeps all functions 291 | event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs); 292 | event = $extend(event, eventArguments); 293 | // override the preventDefault function to be able to use 294 | // this for custom events 295 | event.preventDefault = function () { 296 | defaultFunction = null; 297 | }; 298 | // if fireEvent is not available on the object, there hasn't been added 299 | // any events to it above 300 | if (el.fireEvent) { 301 | el.fireEvent(event.type, event); 302 | } 303 | 304 | // fire the default if it is passed and it is not prevented above 305 | if (defaultFunction) { 306 | defaultFunction(event); 307 | } 308 | }, 309 | 310 | /** 311 | * Set back e.pageX and e.pageY that MooTools has abstracted away 312 | */ 313 | washMouseEvent: function (e) { 314 | return e.event || e; 315 | }, 316 | 317 | /** 318 | * Stop running animations on the object 319 | */ 320 | stop: function (el) { 321 | if (el.fx) { 322 | el.fx.cancel(); 323 | } 324 | } 325 | }; 326 | 327 | }()); 328 | -------------------------------------------------------------------------------- /frontend/highcharts/js/adapters/prototype-adapter.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v2.3.0 (2012-08-24) 3 | Prototype adapter 4 | 5 | @author Michael Nelson, Torstein H?nsi. 6 | 7 | Feel free to use and modify this script. 8 | Highcharts license: www.highcharts.com/license. 9 | */ 10 | var HighchartsAdapter=function(){var g=typeof Effect!=="undefined";return{init:function(c){if(g)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(a,b,d,e){var f;this.element=a;this.key=b;f=a.attr?a.attr(b):$(a).getStyle(b);if(b==="d")this.paths=c.init(a,a.d,d),this.toD=d,f=0,d=1;this.start(Object.extend(e||{},{from:f,to:d,attribute:b}))},setup:function(){HighchartsAdapter._extend(this.element);if(!this.element._highchart_animation)this.element._highchart_animation={};this.element._highchart_animation[this.key]= 11 | this},update:function(a){var b=this.paths,d=this.element;b&&(a=c.step(b[0],b[1],a,this.toD));d.attr?d.attr(this.options.attribute,a):(b={},b[this.options.attribute]=a,$(d).setStyle(b))},finish:function(){delete this.element._highchart_animation[this.key]}})},adapterRun:function(c,a){return parseInt($(c).getStyle(a),10)},getScript:function(c,a){var b=$$("head")[0];b&&b.appendChild((new Element("script",{type:"text/javascript",src:c})).observe("load",a))},addNS:function(c){var a=/^(?:click|mouse(?:down|up|over|move|out))$/; 12 | return/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/.test(c)||a.test(c)?c:"h:"+c},addEvent:function(c,a,b){c.addEventListener||c.attachEvent?Event.observe($(c),HighchartsAdapter.addNS(a),b):(HighchartsAdapter._extend(c),c._highcharts_observe(a,b))},animate:function(c,a,b){var d,b=b||{};b.delay=0;b.duration=(b.duration||500)/1E3;b.afterFinish=b.complete;if(g)for(d in a)new Effect.HighchartsTransition($(c),d,a[d],b);else{if(c.attr)for(d in a)c.attr(d,a[d]);b.complete&& 13 | b.complete()}c.attr||$(c).setStyle(a)},stop:function(c){var a;if(c._highcharts_extended&&c._highchart_animation)for(a in c._highchart_animation)c._highchart_animation[a].cancel()},each:function(c,a){$A(c).each(a)},inArray:function(c,a){return a.indexOf(c)},offset:function(c){return $(c).cumulativeOffset()},fireEvent:function(c,a,b,d){c.fire?c.fire(HighchartsAdapter.addNS(a),b):c._highcharts_extended&&(b=b||{},c._highcharts_fire(a,b));b&&b.defaultPrevented&&(d=null);d&&d(b)},removeEvent:function(c, 14 | a,b){$(c).stopObserving&&(a&&(a=HighchartsAdapter.addNS(a)),$(c).stopObserving(a,b));window===c?Event.stopObserving(c,a,b):(HighchartsAdapter._extend(c),c._highcharts_stop_observing(a,b))},washMouseEvent:function(c){return c},grep:function(c,a){return c.findAll(a)},map:function(c,a){return c.map(a)},merge:function(){function c(a,b){var d,e;for(e in b)d=b[e],a[e]=d&&typeof d==="object"&&d.constructor!==Array&&typeof d.nodeType!=="number"?c(a[e]||{},d):b[e];return a}return function(){var a=arguments, 15 | b,d={};for(b=0;b {a : 'a', b : {b1 : 'b1', b2 : 'b2_prime'}, c : 'c'} 265 | /*merge: function(){ 266 | function doCopy(copy, original) { 267 | var value, 268 | key, 269 | undef, 270 | nil, 271 | same, 272 | obj, 273 | arr, 274 | node; 275 | 276 | for (key in original) { 277 | value = original[key]; 278 | undef = typeof(value) === 'undefined'; 279 | nil = value === null; 280 | same = original === copy[key]; 281 | 282 | if (undef || nil || same) { 283 | continue; 284 | } 285 | 286 | obj = typeof(value) === 'object'; 287 | arr = value && obj && value.constructor == Array; 288 | node = !!value.nodeType; 289 | 290 | if (obj && !arr && !node) { 291 | copy[key] = doCopy(typeof copy[key] == 'object' ? copy[key] : {}, value); 292 | } 293 | else { 294 | copy[key] = original[key]; 295 | } 296 | } 297 | return copy; 298 | } 299 | 300 | var args = arguments, retVal = {}; 301 | 302 | for (var i = 0; i < args.length; i++) { 303 | retVal = doCopy(retVal, args[i]); 304 | } 305 | 306 | return retVal; 307 | },*/ 308 | merge: function () { // the built-in prototype merge function doesn't do deep copy 309 | function doCopy(copy, original) { 310 | var value, key; 311 | 312 | for (key in original) { 313 | value = original[key]; 314 | if (value && typeof value === 'object' && value.constructor !== Array && 315 | typeof value.nodeType !== 'number') { 316 | copy[key] = doCopy(copy[key] || {}, value); // copy 317 | 318 | } else { 319 | copy[key] = original[key]; 320 | } 321 | } 322 | return copy; 323 | } 324 | 325 | function merge() { 326 | var args = arguments, 327 | i, 328 | retVal = {}; 329 | 330 | for (i = 0; i < args.length; i++) { 331 | retVal = doCopy(retVal, args[i]); 332 | 333 | } 334 | return retVal; 335 | } 336 | 337 | return merge.apply(this, arguments); 338 | }, 339 | 340 | // extend an object to handle highchart events (highchart objects, not svg elements). 341 | // this is a very simple way of handling events but whatever, it works (i think) 342 | _extend: function (object) { 343 | if (!object._highcharts_extended) { 344 | Object.extend(object, { 345 | _highchart_events: {}, 346 | _highchart_animation: null, 347 | _highcharts_extended: true, 348 | _highcharts_observe: function (name, fn) { 349 | this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten(); 350 | }, 351 | _highcharts_stop_observing: function (name, fn) { 352 | if (name) { 353 | if (fn) { 354 | this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn); 355 | } else { 356 | delete this._highchart_events[name]; 357 | } 358 | } else { 359 | this._highchart_events = {}; 360 | } 361 | }, 362 | _highcharts_fire: function (name, args) { 363 | (this._highchart_events[name] || []).each(function (fn) { 364 | // args is never null here 365 | if (args.stopped) { 366 | return; // "throw $break" wasn't working. i think because of the scope of 'this'. 367 | } 368 | 369 | // Attach a simple preventDefault function to skip default handler if called 370 | args.preventDefault = function () { 371 | args.defaultPrevented = true; 372 | }; 373 | 374 | // If the event handler return false, prevent the default handler from executing 375 | if (fn.bind(this)(args) === false) { 376 | args.preventDefault(); 377 | } 378 | } 379 | .bind(this)); 380 | } 381 | }); 382 | } 383 | } 384 | }; 385 | }()); 386 | -------------------------------------------------------------------------------- /frontend/highcharts/js/highcharts-more.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v2.3.0 (2012-08-24) 3 | 4 | (c) 2009-2011 Torstein H?nsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(h,t){function z(a,b,c){this.init.call(this,a,b,c)}function A(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var b=this.xAxis.center;a.push("L",b[0],b[1])},this.closedStacks=!0}function B(a,b){var c=this.chart,d=this.options.animation,f=this.group,e=this.markerGroup,g=this.xAxis.center,i=c.plotLeft,m=c.plotTop;if(c.polar){if(c.renderer.isSVG)if(d===!0&&(d={}),b){if(f.attrSetters.scaleX=f.attrSetters.scaleY=function(a,b){this[b]=a;this.scaleX!==t&&this.scaleY!== 9 | t&&this.element.setAttribute("transform","translate("+this.translateX+","+this.translateY+") scale("+this.scaleX+","+this.scaleY+")");return!1},c={translateX:g[0]+i,translateY:g[1]+m,scaleX:0,scaleY:0},f.attr(c),e)e.attrSetters=f.attrSetters,e.attr(c)}else c={translateX:i,translateY:m,scaleX:1,scaleY:1},f.animate(c,d),e&&e.animate(c,d),this.animate=null}else a.call(this,b)}var p=h.each,u=h.extend,o=h.merge,D=h.map,n=h.pick,v=h.pInt,j=h.getOptions().plotOptions,k=h.seriesTypes,w=h.extendClass,l=h.wrap, 10 | q=h.Axis,F=h.Tick,y=h.Series,r=k.column.prototype,s=function(){};u(z.prototype,{init:function(a,b,c){var d=this,f=d.defaultOptions;d.chart=b;if(b.angular)f.background={};d.options=a=o(f,a);(a=a.background)&&p([].concat(h.splat(a)).reverse(),function(a){var b=a.backgroundColor,a=o(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1, 11 | borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:Number.MIN_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});var x=q.prototype,q=F.prototype,G={getOffset:s,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:s,setCategories:s,setTitle:s},E={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside", 12 | minorTickWidth:1,plotBands:[],tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,plotBands:[],showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},plotBands:[],showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){this.options=o(this.defaultOptions,this.defaultRadialOptions,a)},getOffset:function(){x.getOffset.call(this); 13 | this.chart.axisOffset[this.side]=0;this.center=this.pane.center=k.pie.prototype.getCenter.call(this.pane)},getLinePath:function(a,b){var c=this.center,b=n(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){x.setAxisTranslation.call(this);if(this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/ 14 | (this.max-this.min||1),this.isXAxis))this.minPixelPadding=this.transA*this.minPointOffset+(this.reversed?(this.endAngleRad-this.startAngleRad)/4:0)},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.closestPointRange)},setAxisSize:function(){x.setAxisSize.call(this);if(this.center)this.len=this.width=this.height=this.isCircular?this.center[2]*(this.endAngleRad-this.startAngleRad)/2:this.center[2]/2},getPosition:function(a,b){if(!this.isCircular)b=this.translate(a),a=this.min;return this.postTranslate(this.translate(a), 15 | n(b,this.center[2]/2)-this.offset)},postTranslate:function(a,b){var c=this.chart,d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,f=this.startAngleRad,e=d[2]/2,g=[n(c.outerRadius,"100%"),c.innerRadius,n(c.thickness,10)],i=/%$/,m,C=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(C||(g[0]=this.translate(a),g[1]=this.translate(b)), 16 | g=D(g,function(a){i.test(a)&&(a=v(a,10)*e/100);return a}),c.shape==="circle"||!C?(a=-Math.PI/2,b=Math.PI*1.5,m=!0):(a=f+this.translate(a),b=f+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],g[0],g[0],{start:a,end:b,innerR:n(g[1],g[0]-g[2]),open:m}));return d},getPlotLinePath:function(a,b){var c=this.center,d=this.chart,f=this.getPosition(a),e,g,i;this.isCircular?i=["M",c[0]+d.plotLeft,c[1]+d.plotTop,"L",f.x,f.y]:this.options.gridLineInterpolation==="circle"?(a=this.translate(a))&& 17 | (i=this.getLinePath(0,a)):(e=d.xAxis[0],i=[],a=this.translate(a),c=e.tickPositions,e.autoConnect&&(c=c.concat([c[0]])),b&&(c=[].concat(c).reverse()),p(c,function(b,c){g=e.getPosition(b,a);i.push(c?"L":"M",g.x,g.y)}));return i},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};l(x,"init",function(a,b,c){var d=this,f=b.angular,e=b.polar,g=c.isX,i=f&&g,m;if(f){if(u(this, 18 | i?G:E),m=!g)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else if(e)u(this,E),this.defaultRadialOptions=(m=g)?this.defaultRadialXOptions:o(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!i&&(f||e)){a=this.options;if(!b.panes)b.panes=D(h.splat(b.options.pane),function(a){return new z(a,b,d)});this.pane=f=b.panes[c.pane||0];e=f.options;b.inverted=!1;b.options.chart.zoomType=null;this.startAngleRad=f=(e.startAngle-90)*Math.PI/180;this.endAngleRad=e=(n(e.endAngle, 19 | e.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular=m)&&c.max===t&&e-f===2*Math.PI)this.autoConnect=!0}});l(q,"getPosition",function(a,b,c,d,f){var e=this.axis;return e.getPosition?e.getPosition(c):a.call(this,b,c,d,f)});l(q,"getLabelPosition",function(a,b,c,d,f,e,g,i,m){var h=this.axis,k=e.y,j=e.align,l=(h.translate(this.pos)+h.startAngleRad+Math.PI/2)/Math.PI*180;h.isRadial?(a=h.getPosition(this.pos,h.center[2]/2+n(e.distance,-25)),e.rotation==="auto"?d.attr({rotation:l}): 20 | k===null&&(k=v(d.styles.lineHeight)*0.9-d.getBBox().height/2),j===null&&(j=h.isCircular?l>20&&l<160?"left":l>200&&l<340?"right":"center":"center",d.attr({align:j})),a.x+=e.x,a.y+=k):a=a.call(this,b,c,d,f,e,g,i,m);return a});l(q,"getMarkPath",function(a,b,c,d,f,e,g){var i=this.axis;i.isRadial?(a=i.getPosition(this.pos,i.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,f,e,g);return b});j.arearange=o(j.area,{lineWidth:0,marker:null,threshold:null,tooltip:{pointFormat:'{series.name}: {point.low} - {point.high}
'}, 21 | trackByArea:!0,dataLabels:{xLow:0,xHigh:0,yLow:16,yHigh:-6}});q=h.extendClass(h.Point,{applyOptions:function(a,b){var c=this.series,d=c.pointArrayMap,f=0,e=0,g=d.length;if(typeof a==="object"&&typeof a.length!=="number")u(this,a),this.options=a;else if(a.length){if(a.length>g){if(typeof a[0]==="string")this.name=a[0];else if(typeof a[0]==="number")this.x=a[0];f++}for(;eMath.PI/2&&(j-=Math.PI),i=f+Math.cos(j)*b,h=e+Math.sin(j)*b,g=f+Math.cos(Math.PI+j)*k,j=e+Math.sin(Math.PI+j)*k,c.rightContX=g,c.rightContY=j;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,i||f,h||e,f,e],a.rightContX=a.rightContY=null):c=["M",f,e]}else c=a.call(this,b,c,d);return c}); 31 | l(j,"translate",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});l(j,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});l(j,"animate",B);l(r,"animate",B);l(j,"setTooltipPoints",function(a,b){this.chart.polar&&u(this.xAxis,{tooltipLen:360,tooltipPosName:"deg"}); 32 | return a.call(this,b)});l(r,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,f=b.startAngleRad,e=this.chart.renderer,g;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){a=this.points;for(g=a.length;g--;)b=a[g],b.shapeType="path",b.shapeArgs={d:e.symbols.arc(d[0],d[1],c-b.plotY,null,{start:f+b.barX,end:f+b.barX+b.pointWidth,innerR:c-n(b.yBottom,c)})},this.toXY(b)}});l(w,"getIndex",function(a,b){var c,d=this.chart,f;d.polar?(f=d.xAxis[0].center,c=b.chartX-f[0]-d.plotLeft, 33 | d=b.chartY-f[1]-d.plotTop,c=180-Math.round(Math.atan2(c,d)/Math.PI*180)):c=a.call(this,b);return c});l(w,"getMouseCoordinates",function(a,b){var c=this.chart,d={xAxis:[],yAxis:[]};c.polar?p(c.axes,function(a){var e=a.isXAxis,g=a.center,h=b.chartX-g[0]-c.plotLeft,g=b.chartY-g[1]-c.plotTop;d[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(h,g):Math.sqrt(Math.pow(h,2)+Math.pow(g,2)),!0)})}):d=a.call(this,b);return d})})(Highcharts); 34 | -------------------------------------------------------------------------------- /frontend/highcharts/js/modules/data.js: -------------------------------------------------------------------------------- 1 | /* 2 | Data plugin for Highcharts v0.1 3 | 4 | (c) 2012 Torstein H?nsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(m){var l=m.each,n=function(a){this.init(a)};m.extend(n.prototype,{init:function(a){this.options=a;this.columns=[];this.parseCSV();this.parseTable();this.parseTypes();this.findHeaderRow();this.parsed();this.complete()},parseCSV:function(){var a=this.options,b=a.csv,d=this.columns,c=a.startRow||0,f=a.endRow||Number.MAX_VALUE,e=a.startColumn||0,j=a.endColumn||Number.MAX_VALUE;b&&(b=b.split(a.lineDelimiter||"\n"),l(b,function(b,k){if(k>=c&&k<=f){var h=b.split(a.itemDelimiter||",");l(h,function(a, 9 | b){b>=e&&b<=j&&(d[b-e]||(d[b-e]=[]),d[b-e][k-c]=a)})}}))},parseTable:function(){var a=this.options,b=a.table,d=this.columns,c=a.startRow||0,f=a.endRow||Number.MAX_VALUE,e=a.startColumn||0,j=a.endColumn||Number.MAX_VALUE,g;b&&(typeof b==="string"&&(b=document.getElementById(b)),l(b.getElementsByTagName("tr"),function(a,b){g=0;b>=c&&b<=f&&l(a.childNodes,function(a){if((a.tagName==="TD"||a.tagName==="TH")&&g>=e&&g<=j)d[g]||(d[g]=[]),d[g][b-c]=a.innerHTML,g+=1})}))},findHeaderRow:function(){l(this.columns, 10 | function(){});this.headerRow=0},trim:function(a){return a.replace(/^\s+|\s+$/g,"")},parseTypes:function(){for(var a=this.columns,b=a.length,d,c,f,e;b--;)for(d=a[b].length;d--;)c=a[b][d],f=parseFloat(c),e=this.trim(c),e==f?(a[b][d]=f,f>31536E6?a[b].isDatetime=!0:a[b].isNumeric=!0):(c=Date.parse(c),b===0&&typeof c==="number"&&!isNaN(c)?(a[b][d]=c,a[b].isDatetime=!0):a[b][d]=e)},parsed:function(){this.options.parsed&&this.options.parsed.call(this,this.columns)},complete:function(){var a=this.columns, 11 | b,d,c,f,e=this.options,j,g,k,h,i;if(e.complete){a.length>1&&(c=a.shift(),this.headerRow===0&&c.shift(),(b=c.isNumeric||c.isDatetime)||(d=c),c.isDatetime&&(f="datetime"));j=[];for(h=0;h= startRow && rowNo <= endRow) { 73 | var items = line.split(options.itemDelimiter || ','); 74 | each(items, function (item, colNo) { 75 | if (colNo >= startColumn && colNo <= endColumn) { 76 | if (!columns[colNo - startColumn]) { 77 | columns[colNo - startColumn] = []; 78 | } 79 | 80 | columns[colNo - startColumn][rowNo - startRow] = item; 81 | } 82 | }); 83 | } 84 | }); 85 | } 86 | }, 87 | 88 | /** 89 | * Parse a HTML table 90 | */ 91 | parseTable: function () { 92 | var options = this.options, 93 | table = options.table, 94 | columns = this.columns, 95 | startRow = options.startRow || 0, 96 | endRow = options.endRow || Number.MAX_VALUE, 97 | startColumn = options.startColumn || 0, 98 | endColumn = options.endColumn || Number.MAX_VALUE, 99 | colNo; 100 | 101 | if (table) { 102 | 103 | if (typeof table === 'string') { 104 | table = document.getElementById(table); 105 | } 106 | 107 | each(table.getElementsByTagName('tr'), function (tr, rowNo) { 108 | colNo = 0; 109 | if (rowNo >= startRow && rowNo <= endRow) { 110 | each(tr.childNodes, function (item) { 111 | if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) { 112 | if (!columns[colNo]) { 113 | columns[colNo] = []; 114 | } 115 | columns[colNo][rowNo - startRow] = item.innerHTML; 116 | 117 | colNo += 1; 118 | } 119 | }); 120 | } 121 | }); 122 | } 123 | }, 124 | 125 | /** 126 | * Find the header row. For now, we just check whether the first row contains 127 | * numbers or strings. Later we could loop down and find the first row with 128 | * numbers. 129 | */ 130 | findHeaderRow: function () { 131 | var headerRow = 0; 132 | each(this.columns, function (column) { 133 | if (typeof column[0] !== 'string') { 134 | headerRow = null; 135 | } 136 | }); 137 | this.headerRow = 0; 138 | }, 139 | 140 | /** 141 | * Trim a string from whitespace 142 | */ 143 | trim: function (str) { 144 | return str.replace(/^\s+|\s+$/g, ''); 145 | }, 146 | 147 | /** 148 | * Parse numeric cells in to number types and date types in to true dates. 149 | * @param {Object} columns 150 | */ 151 | parseTypes: function () { 152 | var columns = this.columns, 153 | col = columns.length, 154 | row, 155 | val, 156 | floatVal, 157 | trimVal, 158 | dateVal; 159 | 160 | while (col--) { 161 | row = columns[col].length; 162 | while (row--) { 163 | val = columns[col][row]; 164 | floatVal = parseFloat(val); 165 | trimVal = this.trim(val); 166 | /*jslint eqeq: true*/ 167 | if (trimVal == floatVal) { // is numeric 168 | /*jslint eqeq: false*/ 169 | columns[col][row] = floatVal; 170 | 171 | // If the number is greater than milliseconds in a year, assume datetime 172 | if (floatVal > 365 * 24 * 3600 * 1000) { 173 | columns[col].isDatetime = true; 174 | } else { 175 | columns[col].isNumeric = true; 176 | } 177 | 178 | } else { // string, continue to determine if it is a date string or really a string 179 | dateVal = Date.parse(val); 180 | 181 | if (col === 0 && typeof dateVal === 'number' && !isNaN(dateVal)) { // is date 182 | columns[col][row] = dateVal; 183 | columns[col].isDatetime = true; 184 | 185 | } else { // string 186 | columns[col][row] = trimVal; 187 | } 188 | } 189 | 190 | } 191 | } 192 | }, 193 | 194 | parsed: function () { 195 | if (this.options.parsed) { 196 | this.options.parsed.call(this, this.columns); 197 | } 198 | }, 199 | 200 | /** 201 | * If a complete callback function is provided in the options, interpret the 202 | * columns into a Highcharts options object. 203 | */ 204 | complete: function () { 205 | 206 | var columns = this.columns, 207 | hasXData, 208 | categories, 209 | firstCol, 210 | type, 211 | options = this.options, 212 | series, 213 | data, 214 | name, 215 | i, 216 | j; 217 | 218 | 219 | if (options.complete) { 220 | 221 | // Use first column for X data or categories? 222 | if (columns.length > 1) { 223 | firstCol = columns.shift(); 224 | if (this.headerRow === 0) { 225 | firstCol.shift(); // remove the first cell 226 | } 227 | 228 | // Use the first column for categories or X values 229 | hasXData = firstCol.isNumeric || firstCol.isDatetime; 230 | if (!hasXData) { // means type is neither datetime nor linear 231 | categories = firstCol; 232 | } 233 | 234 | if (firstCol.isDatetime) { 235 | type = 'datetime'; 236 | } 237 | } 238 | 239 | // Use the next columns for series 240 | series = []; 241 | for (i = 0; i < columns.length; i++) { 242 | if (this.headerRow === 0) { 243 | name = columns[i].shift(); 244 | } 245 | data = []; 246 | for (j = 0; j < columns[i].length; j++) { 247 | data[j] = columns[i][j] !== undefined ? 248 | (hasXData ? 249 | [firstCol[j], columns[i][j]] : 250 | columns[i][j] 251 | ) : 252 | null; 253 | } 254 | series[i] = { 255 | name: name, 256 | data: data 257 | }; 258 | } 259 | 260 | // Do the callback 261 | options.complete({ 262 | xAxis: { 263 | categories: categories, 264 | type: type 265 | }, 266 | series: series 267 | }); 268 | } 269 | } 270 | }); 271 | 272 | // Register the Data prototype and data function on Highcharts 273 | Highcharts.Data = Data; 274 | Highcharts.data = function (options) { 275 | return new Data(options); 276 | }; 277 | }(Highcharts)); 278 | -------------------------------------------------------------------------------- /frontend/highcharts/js/modules/exporting.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v2.3.0 (2012-08-24) 3 | Exporting module 4 | 5 | (c) 2010-2011 Torstein H?nsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(){function x(a){for(var b=a.length;b--;)typeof a[b]==="number"&&(a[b]=Math.round(a[b])-0.5);return a}var g=Highcharts,y=g.Chart,z=g.addEvent,B=g.removeEvent,r=g.createElement,u=g.discardElement,t=g.css,s=g.merge,k=g.each,n=g.extend,C=Math.max,h=document,D=window,A=h.documentElement.ontouchstart!==void 0,v=g.getOptions();n(v.lang,{downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",exportButtonTitle:"Export to raster or vector image", 10 | printButtonTitle:"Print the chart"});v.navigation={menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF"},menuItemStyle:{padding:"0 5px",background:"none",color:"#303030",fontSize:A?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{align:"right",backgroundColor:{linearGradient:[0,0,0,20],stops:[[0.4,"#F7F7F7"],[0.6,"#E3E3E3"]]},borderColor:"#B0B0B0",borderRadius:3,borderWidth:1,height:20,hoverBorderColor:"#909090",hoverSymbolFill:"#81A7CF",hoverSymbolStroke:"#4572A5", 11 | symbolFill:"#E0E0E0",symbolStroke:"#A0A0A0",symbolX:11.5,symbolY:10.5,verticalAlign:"top",width:24,y:10}};v.exporting={type:"image/png",url:"http://export.highcharts.com/",width:800,buttons:{exportButton:{symbol:"exportIcon",x:-10,symbolFill:"#A8BF77",hoverSymbolFill:"#768F3E",_id:"exportButton",_titleKey:"exportButtonTitle",menuItems:[{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF", 12 | onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]},printButton:{symbol:"printIcon",x:-36,symbolFill:"#B5C9DF",hoverSymbolFill:"#779ABF",_id:"printButton",_titleKey:"printButtonTitle",onclick:function(){this.print()}}}};n(y.prototype,{getSVG:function(a){var b=this,c,d,e,f=s(b.options,a);if(!h.createElementNS)h.createElementNS=function(a,b){return h.createElement(b)};a=r("div",null,{position:"absolute", 13 | top:"-9999em",width:b.chartWidth+"px",height:b.chartHeight+"px"},h.body);n(f.chart,{renderTo:a,forExport:!0});f.exporting.enabled=!1;f.chart.plotBackgroundImage=null;f.series=[];k(b.series,function(a){e=s(a.options,{animation:!1,showCheckbox:!1,visible:a.visible});if(!e.isInternal){if(e&&e.marker&&/^url\(/.test(e.marker.symbol))e.marker.symbol="circle";f.series.push(e)}});c=new Highcharts.Chart(f);k(["xAxis","yAxis"],function(a){k(b[a],function(b,d){var e=c[a][d],f=b.getExtremes(),g=f.userMin,f=f.userMax; 14 | (g!==void 0||f!==void 0)&&e.setExtremes(g,f,!0,!1)})});d=c.container.innerHTML;f=null;c.destroy();u(a);d=d.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/isTracker="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/.*?$/,"").replace(/ /g,"\u00a0").replace(/­/g, 15 | "\u00ad").replace(//g,'xlink:href="$1"/>').replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()});d=d.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'");d.match(/ xmlns="/g).length===2&&(d=d.replace(/xmlns="[^"]+"/, 16 | ""));return d},exportChart:function(a,b){var c,d=this.getSVG(s(this.options.exporting.chartOptions,b)),a=s(this.options.exporting,a);c=r("form",{method:"post",action:a.url,enctype:"multipart/form-data"},{display:"none"},h.body);k(["filename","type","width","svg"],function(b){r("input",{type:"hidden",name:b,value:{filename:a.filename||"chart",type:a.type,width:a.width,svg:d}[b]},null,c)});c.submit();u(c)},print:function(){var a=this,b=a.container,c=[],d=b.parentNode,e=h.body,f=e.childNodes;if(!a.isPrinting)a.isPrinting= 17 | !0,k(f,function(a,b){if(a.nodeType===1)c[b]=a.style.display,a.style.display="none"}),e.appendChild(b),D.print(),setTimeout(function(){d.appendChild(b);k(f,function(a,b){if(a.nodeType===1)a.style.display=c[b]});a.isPrinting=!1},1E3)},contextMenu:function(a,b,c,d,e,f){var i=this,g=i.options.navigation,h=g.menuItemStyle,o=i.chartWidth,p=i.chartHeight,q="cache-"+a,j=i[q],l=C(e,f),m,w;if(!j)i[q]=j=r("div",{className:"highcharts-"+a},{position:"absolute",zIndex:1E3,padding:l+"px"},i.container),m=r("div", 18 | null,n({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},g.menuStyle),j),w=function(){t(j,{display:"none"})},z(j,"mouseleave",w),k(b,function(a){if(a){var b=r("div",{onmouseover:function(){t(this,g.menuItemHoverStyle)},onmouseout:function(){t(this,h)},innerHTML:a.text||i.options.lang[a.textKey]},n({cursor:"pointer"},h),m);b[A?"ontouchstart":"onclick"]=function(){w();a.onclick.apply(i,arguments)};i.exportDivElements.push(b)}}),i.exportDivElements.push(m, 19 | j),i.exportMenuWidth=j.offsetWidth,i.exportMenuHeight=j.offsetHeight;a={display:"block"};c+i.exportMenuWidth>o?a.right=o-c-e-l+"px":a.left=c-l+"px";d+f+i.exportMenuHeight>p?a.bottom=p-d-l+"px":a.top=d+f-l+"px";t(j,a)},addButton:function(a){function b(){p.attr(l);o.attr(j)}var c=this,d=c.renderer,e=s(c.options.navigation.buttonOptions,a),f=e.onclick,g=e.menuItems,h=e.width,k=e.height,o,p,q,a=e.borderWidth,j={stroke:e.borderColor},l={stroke:e.symbolStroke,fill:e.symbolFill},m=e.symbolSize||12;if(!c.exportDivElements)c.exportDivElements= 20 | [],c.exportSVGElements=[];e.enabled!==!1&&(o=d.rect(0,0,h,k,e.borderRadius,a).align(e,!0).attr(n({fill:e.backgroundColor,"stroke-width":a,zIndex:19},j)).add(),q=d.rect(0,0,h,k,0).align(e).attr({id:e._id,fill:"rgba(255, 255, 255, 0.001)",title:c.options.lang[e._titleKey],zIndex:21}).css({cursor:"pointer"}).on("mouseover",function(){p.attr({stroke:e.hoverSymbolStroke,fill:e.hoverSymbolFill});o.attr({stroke:e.hoverBorderColor})}).on("mouseout",b).on("click",b).add(),g&&(f=function(){b();var a=q.getBBox(); 21 | c.contextMenu("export-menu",g,a.x,a.y,h,k)}),q.on("click",function(){f.apply(c,arguments)}),p=d.symbol(e.symbol,e.symbolX-m/2,e.symbolY-m/2,m,m).align(e,!0).attr(n(l,{"stroke-width":e.symbolStrokeWidth||1,zIndex:20})).add(),c.exportSVGElements.push(o,q,p))},destroyExport:function(){var a,b;for(a=0;a 2 | -------------------------------------------------------------------------------- /frontend/i/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cstenac/osm-livechanges/0d281b0eceff483e8368fbcb97d1ca64ad57912b/frontend/i/twitter.png -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | OpenStreetMap live edits - live.openstreetmap.fr 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 |
220 |
221 | 222 |
223 | 224 | 230 | 231 | 232 | 233 | 234 |
235 | 236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
/
250 |
251 |
252 |
253 |
254 | 255 |
256 |
257 |
258 | 259 |
260 | 261 |
262 |
263 |
264 |
265 |
266 | 267 | ... edits were made to OpenStreetMap, by 268 |
269 |
0
270 |
271 |
272 |
273 | 274 | contributors, in the last ... 275 |
276 |
0
277 |
278 |
279 |
280 | 281 | minutes 282 |
283 |
0'
284 |
285 |
286 |
287 | 288 |
289 | close 290 |
291 | 292 |

OpenStreetMap live edits

293 |
294 | 295 | 299 | 300 | Source code for the osm-livechanges project can be found on Github 301 |
302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /frontend/jquery.lightbox_me.js: -------------------------------------------------------------------------------- 1 | /* 2 | * $ lightbox_me 3 | * By: Buck Wilson 4 | * Version : 2.3 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | 20 | (function($) { 21 | 22 | $.fn.lightbox_me = function(options) { 23 | 24 | return this.each(function() { 25 | 26 | var 27 | opts = $.extend({}, $.fn.lightbox_me.defaults, options), 28 | $overlay = $(), 29 | $self = $(this), 30 | $iframe = $('