From 92a5fceab428b017b27fab5cf27374c868338b49 Mon Sep 17 00:00:00 2001 From: Tom Carden Date: Thu, 19 Aug 2010 15:49:19 -0700 Subject: [PATCH 1/7] implemented webkit-specific touch handler - experimental; crashy --- Makefile | 1 + examples/touch/map.html | 47 +++++++++++++++++++ examples/touch/map.js | 71 ++++++++++++++++++++++++++++ polymaps.js | 94 +++++++++++++++++++++++++++++++++++++ polymaps.min.js | 100 +++++++++++++++++++++------------------- src/Touch.js | 94 +++++++++++++++++++++++++++++++++++++ 6 files changed, 359 insertions(+), 48 deletions(-) create mode 100644 examples/touch/map.html create mode 100644 examples/touch/map.js create mode 100644 src/Touch.js diff --git a/Makefile b/Makefile index 59cf7dc..27d3b8f 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ JS_FILES = \ src/GeoJson.js \ src/Dblclick.js \ src/Drag.js \ + src/Touch.js \ src/Wheel.js \ src/Arrow.js \ src/Hash.js \ diff --git a/examples/touch/map.html b/examples/touch/map.html new file mode 100644 index 0000000..9685042 --- /dev/null +++ b/examples/touch/map.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + +
+ + + diff --git a/examples/touch/map.js b/examples/touch/map.js new file mode 100644 index 0000000..193d977 --- /dev/null +++ b/examples/touch/map.js @@ -0,0 +1,71 @@ +var po = org.polymaps; + +var div = document.getElementById("map"); + +var map = po.map() + .container(div.appendChild(po.svg("svg"))) + .add(po.touch()) +// .add(po.hash()); + +/* + * Load the "AerialWithLabels" metadata. "Aerial" and "Road" also work. For more + * information about the Imagery Metadata service, see + * http://msdn.microsoft.com/en-us/library/ff701716.aspx + * You should register for your own key at https://www.bingmapsportal.com/. + */ +var script = document.createElement("script"); +script.setAttribute("type", "text/javascript"); +script.setAttribute("src", "http://dev.virtualearth.net" + + "/REST/V1/Imagery/Metadata/AerialWithLabels" + + "?key=AmT-ZC3HPevQq5IBJ7v8qiDUxrojNaqbW1zBsKF0oMNEs53p7Nk5RlAuAmwSG7bg" + + "&jsonp=callback"); +document.body.appendChild(script); + +function callback(data) { + + /* Display each resource as an image layer. */ + var resourceSets = data.resourceSets; + for (var i = 0; i < resourceSets.length; i++) { + var resources = data.resourceSets[i].resources; + for (var j = 0; j < resources.length; j++) { + var resource = resources[j]; + map.add(po.image() + .url(template(resource.imageUrl, resource.imageUrlSubdomains))) + .tileSize({x: resource.imageWidth, y: resource.imageHeight}); + } + } + + /* Display brand logo. */ + document.getElementById("logo").src = data.brandLogoUri; + + /* Display copyright notice. */ + document.getElementById("copy").appendChild(document.createTextNode(data.copyright)); + + /* Display compass control. */ + map.add(po.compass() + .pan("none")); + +} + +/** Returns a Bing URL template given a string and a list of subdomains. */ +function template(url, subdomains) { + var n = subdomains.length, + salt = ~~(Math.random() * n); // per-session salt + + /** Returns the given coordinate formatted as a 'quadkey'. */ + function quad(column, row, zoom) { + var key = ""; + for (var i = 1; i <= zoom; i++) { + key += (((row >> zoom - i) & 1) << 1) | ((column >> zoom - i) & 1); + } + return key; + } + + return function(c) { + var quadKey = quad(c.column, c.row, c.zoom), + server = Math.abs(salt + c.column + c.row + c.zoom) % n; + return url + .replace("{quadkey}", quadKey) + .replace("{subdomain}", subdomains[server]); + }; +} diff --git a/polymaps.js b/polymaps.js index ae567e7..3aed2ac 100644 --- a/polymaps.js +++ b/polymaps.js @@ -1248,6 +1248,100 @@ po.drag = function() { return drag; }; +po.touch = function() { + var touch = {}, + map, + prevPoints = {}, + startDist = null, + startCenter = null, + scaleFactor = null, + center = null; + + touch.map = function(x) { + if (!arguments.length) return map; + map = x; + // TODO remove from old map container? + // TODO update if map container changes? + map.container().addEventListener("touchstart", touchstart, false); + return touch; + } + + function client(t) { + return { x: t.clientX, y: t.clientY }; + } + + function distance(p1, p2) { + var dx = p2.x - p1.x, + dy = p2.y - p1.y; + return Math.sqrt(dx*dx + dy*dy); + } + + function interpolate(p1, p2, t) { + var px = p1.x + (p2.x - p1.x) * t, + py = p1.y + (p2.y - p1.y) * t; + return { x: px, y: py }; + } + + function touchstart(e) { + for (var i = 0; i < e.touches.length; i++) { + if (e.touches[i].identifier in prevPoints) continue; + prevPoints[e.touches[i].identifier] = client(e.touches[i]); + } + if (e.touches.length == 2) { + var p0 = prevPoints[e.touches[0].identifier]; + p1 = prevPoints[e.touches[1].identifier]; + startDist = distance(p0, p1); + startCenter = interpolate(p0, p1, 0.5); + } + e.preventDefault(); + return false; + } + function touchmove(e) { + if (e.touches.length == 1) { + var prevTouch = prevPoints[e.touches[0].identifier], + thisTouch = client(e.touches[0]); + map.panBy({ x: thisTouch.x - prevTouch.x, y: thisTouch.y - prevTouch.y }); + prevPoints[e.touches[0].identifier] = thisTouch; + } + if (e.touches.length == 2) { + var p0 = client(e.touches[0]), + p1 = client(e.touches[1]); + dist = distance(p0,p1); + scaleFactor = dist / startDist; + center = interpolate(p0, p1, 0.5); + map.container().style.webkitTransformOrigin = startCenter.x + 'px ' + startCenter.y + 'px'; + map.container().style.webkitTransform = 'translate3d('+ (center.x-startCenter.x) +'px,' + + (center.y-startCenter.y) +'px,0px) ' + + 'scale3d('+ scaleFactor +','+ scaleFactor +',1) '; + prevPoints[e.touches[0].identifier] = p0; + prevPoints[e.touches[1].identifier] = p1; + } + e.preventDefault(); + return false; + } + function touchend(e) { + if (e.touches.length < 2 && scaleFactor) { + map.container().style.webkitTransformOrigin = ''; + map.container().style.webkitTransform = ''; + map.panBy({ x: -startCenter.x, y: -startCenter.y }); + map.zoomBy(Math.log(scaleFactor)/Math.LN2, { x: 0, y: 0 }); + map.panBy({ x: center.x-startCenter.x, y: center.y-startCenter.y }); + map.panBy({ x: startCenter.x, y: startCenter.y }); + scaleFactor = undefined; + center = undefined; + } + for (var i = 0; i < e.changedTouches.length; i++) { + if (e.changedTouches[i].identifier in prevPoints) { + delete prevPoints[e.changedTouches[i].identifier]; + } + } + } + + window.addEventListener("touchmove", touchmove, false); + window.addEventListener("touchend", touchend, false); + + return touch; +}; po.wheel = function() { var wheel = {}, timePrev = 0, diff --git a/polymaps.min.js b/polymaps.min.js index 4d7ff6a..e012b8f 100644 --- a/polymaps.min.js +++ b/polymaps.min.js @@ -1,49 +1,53 @@ if(!org)var org={};if(!org.polymaps)org.polymaps={}; -(function(r){function J(){for(var h=0;ha.row){var e=h;h=a;a=e}return{x0:h.column,y0:h.row,x1:a.column,y1:a.row,dx:a.column-h.column,dy:a.row-h.row}}function X(h,a,e,d,c){e=Math.max(e,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(h.x00,o=a.dx<0;for(e=e;ea.dy){e=i;i=a;a=e}if(i.dy>h.dy){e=i;i=h;h=e}if(a.dy>h.dy){e=a;a=h;h=e}i.dy&&X(h,i,d,c,g);a.dy&&X(h,a,d,c,g)}r.version="2.0.1";var R={x:0,y:0};r.id=function(){var h=0;return function(){return++h}}();r.svg=function(h){return document.createElementNS(r.ns.svg,h)};r.ns={svg:"http://www.w3.org/2000/svg", -xlink:"http://www.w3.org/1999/xlink"};r.transform=function(h,a,e,d,c,g){var i={},n,o,t;if(!arguments.length){h=1;a=c=e=0;d=1;g=0}i.zoomFraction=function(j){if(!arguments.length)return o;o=j;n=Math.floor(o+Math.log(Math.sqrt(h*h+a*a+e*e+d*d))/Math.log(2));t=Math.pow(2,-n);return i};i.apply=function(j){var k=Math.pow(2,-j.zoom),f=Math.pow(2,j.zoom-n);return{column:(h*j.column*k+e*j.row*k+c)*f,row:(a*j.column*k+d*j.row*k+g)*f,zoom:j.zoom-n}};i.unapply=function(j){var k=Math.pow(2,-j.zoom),f=Math.pow(2, -j.zoom+n);return{column:(j.column*k*d-j.row*k*e-c*d+g*e)/(h*d-a*e)*f,row:(j.column*k*a-j.row*k*h-c*a+g*h)/(e*a-d*h)*f,zoom:j.zoom+n}};i.toString=function(){return"matrix("+[h*t,a*t,e*t,d*t].join(" ")+" 0 0)"};return i.zoomFraction(0)};r.cache=function(h,a){function e(k){j--;a&&a(k);delete i[k.key];if(k.next)k.next.prev=k.prev;else if(o=k.prev)o.next=null;if(k.prev)k.prev.next=k.next;else if(n=k.next)n.prev=null}function d(){for(var k=o;j>t;k=k.prev){if(!k)break;k.lock||e(k)}}var c={},g={},i={},n= -null,o=null,t=64,j=0;c.peek=function(k){return i[[k.zoom,k.column,k.row].join("/")]};c.load=function(k,f){var q=[k.zoom,k.column,k.row].join("/"),s=i[q];if(s){if(s.prev){if(s.prev.next=s.next)s.next.prev=s.prev;else o=s.prev;s.prev=null;s.next=n;n=n.prev=s}s.lock=1;return g[q]=s}s={key:q,column:k.column,row:k.row,zoom:k.zoom,next:n,prev:null,lock:1};h.call(null,s,f);g[q]=i[q]=s;if(n)n.prev=s;else o=s;n=s;j++;d();return s};c.unload=function(k){if(!(k in g))return false;var f=g[k];f.lock=0;delete g[k]; -f.request&&f.request.abort(false)?e(f):d();return f};c.locks=function(){return g};c.size=function(k){if(!arguments.length)return t;t=k;d();return c};return c};r.url=function(h){function a(d){var c=1<=g||!d.length)){c++;d.pop()()}}function a(i){for(var n=0;n=0)return l;return window};a.mouse=function(l){var u=(e.ownerSVGElement||e).createSVGPoint();u.x=l.clientX;u.y=l.clientY;return u.matrixTransform(e.getScreenCTM().inverse())}; -a.size=function(l){if(!arguments.length)return c;d=l;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var l=e.ownerSVGElement||e;if(l.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");l=C}b=l.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);g={x:c.x/2,y:c.y/2};h();a.dispatch({type:"resize"});return a};a.tileSize=function(l){if(!arguments.length)return i;i=l;a.dispatch({type:"move"}); -return a};a.center=function(l){if(!arguments.length)return n;n=l;h();a.dispatch({type:"move"});return a};a.panBy=function(l){var u=45/Math.pow(2,o+t-3),y=l.x*u;l=l.y*u;return a.center({lon:n.lon+(w*l-m*y)/i.x,lat:P(Q(n.lat)+(w*y+m*l)/i.y)})};a.centerRange=function(l){if(!arguments.length)return G;if(G=l){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}h();a.dispatch({type:"move"});return a};a.zoom=function(l){if(!arguments.length)return o+t;o=Math.max(k[0], -Math.min(k[1],l));t=o-(o=Math.round(o));j=Math.pow(2,t);return a.center(n)};a.zoomBy=function(l,u,y){if(arguments.length<2)return a.zoom(o+t+l);if(arguments.length<3)y=a.pointLocation(u);o=Math.max(k[0],Math.min(k[1],o+t+l));t=o-(o=Math.round(o));j=Math.pow(2,t);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(l){if(!arguments.length)return k;k=l;return a.zoom(o+t)};a.angle=function(l){if(!arguments.length)return f;f=l;q=Math.cos(f);s=Math.sin(f);m=Math.cos(-f); -w=Math.sin(-f);h();a.dispatch({type:"move"});return a};a.add=function(l){l.map(a);return a};a.remove=function(l){l.map(null);return a};a.dispatch=r.dispatch(a);return a};J.maps=[];J.add=function(h){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var m=d.map(),w=m.zoom(),B=w-(w=Math.round(w)),H=m.size(),G=m.angle(),C=m.tileSize(),l=m.locationCoordinate(m.center()); -i?j.removeAttribute("visibility"):j.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)f[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));j.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(k?k.zoomFraction(B):""));var y=m.pointCoordinate(l,R);u=m.pointCoordinate(l,{x:H.x,y:0});var D=m.pointCoordinate(l,H);m=m.pointCoordinate(l,{x:0,y:H.y});if(!k&&!G&&!B){l.column=(Math.round(C.x*l.column)+(H.x&1)/2)/ -C.x;l.row=(Math.round(C.y*l.row)+(H.y&1)/2)/C.y}var E=n?n(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;m.column*=B;m.row*=B;y.zoom=u.zoom=D.zoom=m.zoom+=E}if(k){y=k.unapply(y);u=k.unapply(u);D=k.unapply(D);m=k.unapply(m);l=k.unapply(l)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(i&&E>-5&&E<3){B=1<>u<>u<=1;s--)(f[s]=j.appendChild(r.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-s)+")");f[0]=j.appendChild(r.svg("g")); -d.init&&d.init(j);t.on("move",e).on("resize",e);e()}return d};d.container=function(){return j};d.id=function(q){if(!arguments.length)return o;o=q;return d};d.visible=function(q){if(!arguments.length)return i;i=q;t&&e();return d};d.transform=function(q){if(!arguments.length)return k;k=q;t&&e();return d};d.zoom=function(q){if(!arguments.length)return n;n=typeof q=="function"||q==null?q:function(){return q};return d};d.tile=function(q){if(!arguments.length)return g;g=q;return d};d.dispatch=r.dispatch(d); -d.on("load",function(q){if(q.tile.proxyRefs){for(var s in q.tile.proxyRefs){var m=q.tile.proxyRefs[s];--m.proxyCount<=0&&c.unload(s)&&m.element.parentNode.removeChild(m.element)}delete q.tile.proxyRefs}});return d};r.image=function(){var h=r.layer(function(e){var d=e.element=r.svg("image"),c=h.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")e.request=r.queue.image(d,a(e),function(){delete e.request; -e.ready=true;d.removeAttribute("opacity");h.dispatch({type:"load",tile:e})});else{e.ready=true;d.setAttributeNS(r.ns.xlink,"href",a);h.dispatch({type:"load",tile:e})}},function(e){e.request&&e.request.abort(true)}),a="about:blank";h.url=function(e){if(!arguments.length)return a;a=typeof e=="string"&&/{.}/.test(e)?r.url(e):e;return h};return h};r.geoJson=function(h){function a(f,q){var s=q({lat:f[1],lon:f[0]}),m=r.svg("circle");m.setAttribute("r",4.5);m.setAttribute("cx",s.x);m.setAttribute("cy",s.y); -return m}function e(f,q,s,m){m.push("M");for(var w=0;w0.5)j*=0.4}g||(g=o.pointLocation(k));o.off("move",h);if(c)o.zoomBy(j,k,g);else if(j){var f=Date.now();if(f-d>200){o.zoomBy(j>0?+1:-1,k,g);d=f}}o.on("move",h);t.preventDefault();return false}var e={},d=0,c=true,g,i=/WebKit\/533/.test(navigator.userAgent),n=0.3,o;e.smooth=function(t){if(!arguments.length)return c; -c=t;return e};e.map=function(t){if(!arguments.length)return o;(o=t).on("move",h);var j=o.container();j.addEventListener("mousemove",h,false);j.addEventListener("mousewheel",a,false);j.addEventListener("DOMMouseScroll",a,false);return e};return e};r.arrow=function(){function h(k){if(!(k.ctrlKey||k.altKey||k.metaKey)){var f=Date.now(),q=0,s=0,m=0;switch(k.keyCode){case 37:if(!c.left){g=f;c.left=1;c.right||(q=t)}break;case 39:if(!c.right){g=f;c.right=1;c.left||(q=-t)}break;case 38:if(!c.up){g=f;c.up= -1;c.down||(s=t)}break;case 40:if(!c.down){g=f;c.down=1;c.up||(s=-t)}break;case 109:case 189:if(!c.plus){g=f;c.plus=1;c.minus||(m=-1)}break;case 61:case 187:if(!c.minus){g=f;c.minus=1;c.plus||(m=1)}break;default:return}if(m){f=j.zoom();j.zoom(m<0?Math.ceil(f)-1:Math.floor(f)+1)}else if(q||s)j.panBy({x:q,y:s});if(!i&&c.left|c.right|c.up|c.down)i=setInterval(e,o);k.preventDefault()}}function a(k){g=Date.now();switch(k.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down= -0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(i&&!(c.left|c.right|c.up|c.down))i=clearInterval(i);k.preventDefault()}function e(){if(j)if(!(Date.now()B+H&&E.panBy(D)}, -G));D&&E.panBy(D);B=Date.now();n(x)}function a(){q.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function e(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");D=x}}function d(x){return function(v){q.setAttribute("class","compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)-1:Math.floor(z)+1);n(v)}}function c(x){return function(v){E.zoom(x);n(v)}}function g(){this.setAttribute("class","active")}function i(){this.removeAttribute("class")}function n(x){x.stopPropagation(); -x.preventDefault()}function o(x){var v=Math.SQRT1_2*m,z=m*0.7,A=m*0.2,F=r.svg("g"),I=F.appendChild(r.svg("path")),N=F.appendChild(r.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events","all");I.setAttribute("d","M0,0L"+v+","+v+"A"+m+","+m+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class","chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",h,false);F.addEventListener("mouseover",e(x), -false);F.addEventListener("mouseout",e(null),false);F.addEventListener("dblclick",n,false);return F}function t(x){var v=m*0.4,z=v/2,A=r.svg("g"),F=A.appendChild(r.svg("path")),I=A.appendChild(r.svg("path")),N=A.appendChild(r.svg("path")),M=A.appendChild(r.svg("path"));F.setAttribute("class","back");F.setAttribute("d","M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d", -"M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",g,false);A.addEventListener("mouseout",i,false);A.addEventListener("dblclick",n,false);return A}function j(x){var v=m*0.2,z=m*0.4,A=r.svg("g"),F=A.appendChild(r.svg("rect")),I=A.appendChild(r.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x", --z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",n,false);return A}function k(){if(q){var x=m+6,v=x,z=E.size();switch(C){case "top-left":break;case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}q.setAttribute("transform","translate("+x+","+v+")");for(var A in s)A== -E.zoom()?s[A].setAttribute("class","active"):s[A].removeAttribute("class")}}var f={},q,s={},m=30,w=16,B=0,H=250,G=50,C="top-left",l="small",u="small",y,D,E;f.radius=function(x){if(!arguments.length)return m;m=x;return f};f.speed=function(x){if(!arguments.length)return m;w=x;return f};f.position=function(x){if(!arguments.length)return C;C=x;return f};f.pan=function(x){if(!arguments.length)return u;u=x;return f};f.zoom=function(x){if(!arguments.length)return l;l=x;return f};f.map=function(x){if(!arguments.length)return E; -E=x;E.on("move",k);E.on("resize",k);q=E.container().appendChild(r.svg("g"));q.setAttribute("class","compass");if(u!="none"){var v=q.appendChild(r.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(r.svg("circle"));z.setAttribute("class","back");z.setAttribute("r",m);v.appendChild(o({x:0,y:-w})).setAttribute("transform","rotate(0)");v.appendChild(o({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(o({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(o({x:-w,y:0})).setAttribute("transform", -"rotate(270)");v=v.appendChild(r.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",m);window.addEventListener("mouseup",a,false)}if(l!="none"){v=q.appendChild(r.svg("g"));v.setAttribute("class","zoom");z=-0.5;if(l=="big"){s={};var A=E.zoomRange()[0];for(z=0;A<=E.zoomRange()[1];A++,z++)(s[A]=v.appendChild(j(A))).setAttribute("transform","translate(0,"+-(z+0.75)*m*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+m*(/^top-/.test(C)?A+(z+ -0.5)*0.4:-A)+")");v.appendChild(t(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*m*0.4+")");v.appendChild(t(-1)).setAttribute("transform","scale(-1)")}k();return f};return f};r.grid=function(){function h(){var c=d.firstChild,g=e.size(),i=e.pointLocation(R);e.pointLocation(g);var n=Math.pow(2,4-Math.round(e.zoom()));i.lat=Math.floor(i.lat/n)*n;i.lon=Math.ceil(i.lon/n)*n;for(var o;(o=e.locationPoint(i).x)<=g.x;i.lon+=n){c||(c=d.appendChild(r.svg("line")));c.setAttribute("x1",o);c.setAttribute("x2", -o);c.setAttribute("y1",0);c.setAttribute("y2",g.y);c=c.nextSibling}for(;(o=e.locationPoint(i).y)<=g.y;i.lat-=n){c||(c=d.appendChild(r.svg("line")));c.setAttribute("y1",o);c.setAttribute("y2",o);c.setAttribute("x1",0);c.setAttribute("x2",g.x);c=c.nextSibling}for(;c;){g=c.nextSibling;d.removeChild(c);c=g}}var a={},e,d;a.map=function(c){if(!arguments.length)return e;e=c;e.on("move",h);e.on("resize",h);if(!d){d=r.svg("g");d.setAttribute("class","grid")}e.container().appendChild(d);h();return a};return a}})(org.polymaps); +(function(s){function J(){for(var h=0;ha.row){var e=h;h=a;a=e}return{x0:h.column,y0:h.row,x1:a.column,y1:a.row,dx:a.column-h.column,dy:a.row-h.row}}function X(h,a,e,d,c){e=Math.max(e,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(h.x00,q=a.dx<0;for(e=e;ea.dy){e=j;j=a;a=e}if(j.dy>h.dy){e=j;j=h;h=e}if(a.dy>h.dy){e=a;a=h;h=e}j.dy&&X(h,j,d,c,g);a.dy&&X(h,a,d,c,g)}s.version="2.0.1";var R={x:0,y:0};s.id=function(){var h=0;return function(){return++h}}();s.svg=function(h){return document.createElementNS(s.ns.svg,h)};s.ns={svg:"http://www.w3.org/2000/svg", +xlink:"http://www.w3.org/1999/xlink"};s.transform=function(h,a,e,d,c,g){var j={},o,q,l;if(!arguments.length){h=1;a=c=e=0;d=1;g=0}j.zoomFraction=function(i){if(!arguments.length)return q;q=i;o=Math.floor(q+Math.log(Math.sqrt(h*h+a*a+e*e+d*d))/Math.log(2));l=Math.pow(2,-o);return j};j.apply=function(i){var k=Math.pow(2,-i.zoom),f=Math.pow(2,i.zoom-o);return{column:(h*i.column*k+e*i.row*k+c)*f,row:(a*i.column*k+d*i.row*k+g)*f,zoom:i.zoom-o}};j.unapply=function(i){var k=Math.pow(2,-i.zoom),f=Math.pow(2, +i.zoom+o);return{column:(i.column*k*d-i.row*k*e-c*d+g*e)/(h*d-a*e)*f,row:(i.column*k*a-i.row*k*h-c*a+g*h)/(e*a-d*h)*f,zoom:i.zoom+o}};j.toString=function(){return"matrix("+[h*l,a*l,e*l,d*l].join(" ")+" 0 0)"};return j.zoomFraction(0)};s.cache=function(h,a){function e(k){i--;a&&a(k);delete j[k.key];if(k.next)k.next.prev=k.prev;else if(q=k.prev)q.next=null;if(k.prev)k.prev.next=k.next;else if(o=k.next)o.prev=null}function d(){for(var k=q;i>l;k=k.prev){if(!k)break;k.lock||e(k)}}var c={},g={},j={},o= +null,q=null,l=64,i=0;c.peek=function(k){return j[[k.zoom,k.column,k.row].join("/")]};c.load=function(k,f){var r=[k.zoom,k.column,k.row].join("/"),t=j[r];if(t){if(t.prev){if(t.prev.next=t.next)t.next.prev=t.prev;else q=t.prev;t.prev=null;t.next=o;o=o.prev=t}t.lock=1;return g[r]=t}t={key:r,column:k.column,row:k.row,zoom:k.zoom,next:o,prev:null,lock:1};h.call(null,t,f);g[r]=j[r]=t;if(o)o.prev=t;else q=t;o=t;i++;d();return t};c.unload=function(k){if(!(k in g))return false;var f=g[k];f.lock=0;delete g[k]; +f.request&&f.request.abort(false)?e(f):d();return f};c.locks=function(){return g};c.size=function(k){if(!arguments.length)return l;l=k;d();return c};return c};s.url=function(h){function a(d){var c=1<=g||!d.length)){c++;d.pop()()}}function a(j){for(var o=0;o=0)return m;return window};a.mouse=function(m){var u=(e.ownerSVGElement||e).createSVGPoint();u.x=m.clientX;u.y=m.clientY;return u.matrixTransform(e.getScreenCTM().inverse())}; +a.size=function(m){if(!arguments.length)return c;d=m;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var m=e.ownerSVGElement||e;if(m.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");m=C}b=m.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);g={x:c.x/2,y:c.y/2};h();a.dispatch({type:"resize"});return a};a.tileSize=function(m){if(!arguments.length)return j;j=m;a.dispatch({type:"move"}); +return a};a.center=function(m){if(!arguments.length)return o;o=m;h();a.dispatch({type:"move"});return a};a.panBy=function(m){var u=45/Math.pow(2,q+l-3),y=m.x*u;m=m.y*u;return a.center({lon:o.lon+(w*m-n*y)/j.x,lat:P(Q(o.lat)+(w*y+n*m)/j.y)})};a.centerRange=function(m){if(!arguments.length)return G;if(G=m){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}h();a.dispatch({type:"move"});return a};a.zoom=function(m){if(!arguments.length)return q+l;q=Math.max(k[0], +Math.min(k[1],m));l=q-(q=Math.round(q));i=Math.pow(2,l);return a.center(o)};a.zoomBy=function(m,u,y){if(arguments.length<2)return a.zoom(q+l+m);if(arguments.length<3)y=a.pointLocation(u);q=Math.max(k[0],Math.min(k[1],q+l+m));l=q-(q=Math.round(q));i=Math.pow(2,l);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(m){if(!arguments.length)return k;k=m;return a.zoom(q+l)};a.angle=function(m){if(!arguments.length)return f;f=m;r=Math.cos(f);t=Math.sin(f);n=Math.cos(-f); +w=Math.sin(-f);h();a.dispatch({type:"move"});return a};a.add=function(m){m.map(a);return a};a.remove=function(m){m.map(null);return a};a.dispatch=s.dispatch(a);return a};J.maps=[];J.add=function(h){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var n=d.map(),w=n.zoom(),B=w-(w=Math.round(w)),H=n.size(),G=n.angle(),C=n.tileSize(),m=n.locationCoordinate(n.center()); +j?i.removeAttribute("visibility"):i.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)f[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));i.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(k?k.zoomFraction(B):""));var y=n.pointCoordinate(m,R);u=n.pointCoordinate(m,{x:H.x,y:0});var D=n.pointCoordinate(m,H);n=n.pointCoordinate(m,{x:0,y:H.y});if(!k&&!G&&!B){m.column=(Math.round(C.x*m.column)+(H.x&1)/2)/ +C.x;m.row=(Math.round(C.y*m.row)+(H.y&1)/2)/C.y}var E=o?o(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;n.column*=B;n.row*=B;y.zoom=u.zoom=D.zoom=n.zoom+=E}if(k){y=k.unapply(y);u=k.unapply(u);D=k.unapply(D);n=k.unapply(n);m=k.unapply(m)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(j&&E>-5&&E<3){B=1<>u<>u<=1;t--)(f[t]=i.appendChild(s.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-t)+")");f[0]=i.appendChild(s.svg("g")); +d.init&&d.init(i);l.on("move",e).on("resize",e);e()}return d};d.container=function(){return i};d.id=function(r){if(!arguments.length)return q;q=r;return d};d.visible=function(r){if(!arguments.length)return j;j=r;l&&e();return d};d.transform=function(r){if(!arguments.length)return k;k=r;l&&e();return d};d.zoom=function(r){if(!arguments.length)return o;o=typeof r=="function"||r==null?r:function(){return r};return d};d.tile=function(r){if(!arguments.length)return g;g=r;return d};d.dispatch=s.dispatch(d); +d.on("load",function(r){if(r.tile.proxyRefs){for(var t in r.tile.proxyRefs){var n=r.tile.proxyRefs[t];--n.proxyCount<=0&&c.unload(t)&&n.element.parentNode.removeChild(n.element)}delete r.tile.proxyRefs}});return d};s.image=function(){var h=s.layer(function(e){var d=e.element=s.svg("image"),c=h.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")e.request=s.queue.image(d,a(e),function(){delete e.request; +e.ready=true;d.removeAttribute("opacity");h.dispatch({type:"load",tile:e})});else{e.ready=true;d.setAttributeNS(s.ns.xlink,"href",a);h.dispatch({type:"load",tile:e})}},function(e){e.request&&e.request.abort(true)}),a="about:blank";h.url=function(e){if(!arguments.length)return a;a=typeof e=="string"&&/{.}/.test(e)?s.url(e):e;return h};return h};s.geoJson=function(h){function a(f,r){var t=r({lat:f[1],lon:f[0]}),n=s.svg("circle");n.setAttribute("r",4.5);n.setAttribute("cx",t.x);n.setAttribute("cy",t.y); +return n}function e(f,r,t,n){n.push("M");for(var w=0;w0.5)i*=0.4}g||(g=q.pointLocation(k));q.off("move",h);if(c)q.zoomBy(i,k,g);else if(i){var f=Date.now();if(f-d>200){q.zoomBy(i> +0?+1:-1,k,g);d=f}}q.on("move",h);l.preventDefault();return false}var e={},d=0,c=true,g,j=/WebKit\/533/.test(navigator.userAgent),o=0.3,q;e.smooth=function(l){if(!arguments.length)return c;c=l;return e};e.map=function(l){if(!arguments.length)return q;(q=l).on("move",h);var i=q.container();i.addEventListener("mousemove",h,false);i.addEventListener("mousewheel",a,false);i.addEventListener("DOMMouseScroll",a,false);return e};return e};s.arrow=function(){function h(k){if(!(k.ctrlKey||k.altKey||k.metaKey)){var f= +Date.now(),r=0,t=0,n=0;switch(k.keyCode){case 37:if(!c.left){g=f;c.left=1;c.right||(r=l)}break;case 39:if(!c.right){g=f;c.right=1;c.left||(r=-l)}break;case 38:if(!c.up){g=f;c.up=1;c.down||(t=l)}break;case 40:if(!c.down){g=f;c.down=1;c.up||(t=-l)}break;case 109:case 189:if(!c.plus){g=f;c.plus=1;c.minus||(n=-1)}break;case 61:case 187:if(!c.minus){g=f;c.minus=1;c.plus||(n=1)}break;default:return}if(n){f=i.zoom();i.zoom(n<0?Math.ceil(f)-1:Math.floor(f)+1)}else if(r||t)i.panBy({x:r,y:t});if(!j&&c.left| +c.right|c.up|c.down)j=setInterval(e,q);k.preventDefault()}}function a(k){g=Date.now();switch(k.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down=0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(j&&!(c.left|c.right|c.up|c.down))j=clearInterval(j);k.preventDefault()}function e(){if(i)if(!(Date.now()B+H&&E.panBy(D)},G));D&&E.panBy(D);B=Date.now();o(x)}function a(){r.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function e(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");D=x}}function d(x){return function(v){r.setAttribute("class","compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)- +1:Math.floor(z)+1);o(v)}}function c(x){return function(v){E.zoom(x);o(v)}}function g(){this.setAttribute("class","active")}function j(){this.removeAttribute("class")}function o(x){x.stopPropagation();x.preventDefault()}function q(x){var v=Math.SQRT1_2*n,z=n*0.7,A=n*0.2,F=s.svg("g"),I=F.appendChild(s.svg("path")),N=F.appendChild(s.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events","all");I.setAttribute("d","M0,0L"+v+","+v+"A"+n+","+n+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class", +"chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",h,false);F.addEventListener("mouseover",e(x),false);F.addEventListener("mouseout",e(null),false);F.addEventListener("dblclick",o,false);return F}function l(x){var v=n*0.4,z=v/2,A=s.svg("g"),F=A.appendChild(s.svg("path")),I=A.appendChild(s.svg("path")),N=A.appendChild(s.svg("path")),M=A.appendChild(s.svg("path"));F.setAttribute("class","back");F.setAttribute("d", +"M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d","M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",g,false);A.addEventListener("mouseout",j,false);A.addEventListener("dblclick",o,false);return A} +function i(x){var v=n*0.2,z=n*0.4,A=s.svg("g"),F=A.appendChild(s.svg("rect")),I=A.appendChild(s.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x",-z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",o,false);return A}function k(){if(r){var x=n+6,v=x,z=E.size();switch(C){case "top-left":break; +case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}r.setAttribute("transform","translate("+x+","+v+")");for(var A in t)A==E.zoom()?t[A].setAttribute("class","active"):t[A].removeAttribute("class")}}var f={},r,t={},n=30,w=16,B=0,H=250,G=50,C="top-left",m="small",u="small",y,D,E;f.radius=function(x){if(!arguments.length)return n;n=x;return f};f.speed=function(x){if(!arguments.length)return n;w=x;return f};f.position=function(x){if(!arguments.length)return C; +C=x;return f};f.pan=function(x){if(!arguments.length)return u;u=x;return f};f.zoom=function(x){if(!arguments.length)return m;m=x;return f};f.map=function(x){if(!arguments.length)return E;E=x;E.on("move",k);E.on("resize",k);r=E.container().appendChild(s.svg("g"));r.setAttribute("class","compass");if(u!="none"){var v=r.appendChild(s.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(s.svg("circle"));z.setAttribute("class","back");z.setAttribute("r",n);v.appendChild(q({x:0,y:-w})).setAttribute("transform", +"rotate(0)");v.appendChild(q({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(q({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(q({x:-w,y:0})).setAttribute("transform","rotate(270)");v=v.appendChild(s.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",n);window.addEventListener("mouseup",a,false)}if(m!="none"){v=r.appendChild(s.svg("g"));v.setAttribute("class","zoom");z=-0.5;if(m=="big"){t={};var A=E.zoomRange()[0];for(z= +0;A<=E.zoomRange()[1];A++,z++)(t[A]=v.appendChild(i(A))).setAttribute("transform","translate(0,"+-(z+0.75)*n*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+n*(/^top-/.test(C)?A+(z+0.5)*0.4:-A)+")");v.appendChild(l(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*n*0.4+")");v.appendChild(l(-1)).setAttribute("transform","scale(-1)")}k();return f};return f};s.grid=function(){function h(){var c=d.firstChild,g=e.size(),j=e.pointLocation(R);e.pointLocation(g);var o=Math.pow(2, +4-Math.round(e.zoom()));j.lat=Math.floor(j.lat/o)*o;j.lon=Math.ceil(j.lon/o)*o;for(var q;(q=e.locationPoint(j).x)<=g.x;j.lon+=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("x1",q);c.setAttribute("x2",q);c.setAttribute("y1",0);c.setAttribute("y2",g.y);c=c.nextSibling}for(;(q=e.locationPoint(j).y)<=g.y;j.lat-=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("y1",q);c.setAttribute("y2",q);c.setAttribute("x1",0);c.setAttribute("x2",g.x);c=c.nextSibling}for(;c;){g=c.nextSibling;d.removeChild(c); +c=g}}var a={},e,d;a.map=function(c){if(!arguments.length)return e;e=c;e.on("move",h);e.on("resize",h);if(!d){d=s.svg("g");d.setAttribute("class","grid")}e.container().appendChild(d);h();return a};return a}})(org.polymaps); diff --git a/src/Touch.js b/src/Touch.js new file mode 100644 index 0000000..4437dc3 --- /dev/null +++ b/src/Touch.js @@ -0,0 +1,94 @@ +po.touch = function() { + var touch = {}, + map, + prevPoints = {}, + startDist = null, + startCenter = null, + scaleFactor = null, + center = null; + + touch.map = function(x) { + if (!arguments.length) return map; + map = x; + // TODO remove from old map container? + // TODO update if map container changes? + map.container().addEventListener("touchstart", touchstart, false); + return touch; + } + + function client(t) { + return { x: t.clientX, y: t.clientY }; + } + + function distance(p1, p2) { + var dx = p2.x - p1.x, + dy = p2.y - p1.y; + return Math.sqrt(dx*dx + dy*dy); + } + + function interpolate(p1, p2, t) { + var px = p1.x + (p2.x - p1.x) * t, + py = p1.y + (p2.y - p1.y) * t; + return { x: px, y: py }; + } + + function touchstart(e) { + for (var i = 0; i < e.touches.length; i++) { + if (e.touches[i].identifier in prevPoints) continue; + prevPoints[e.touches[i].identifier] = client(e.touches[i]); + } + if (e.touches.length == 2) { + var p0 = prevPoints[e.touches[0].identifier]; + p1 = prevPoints[e.touches[1].identifier]; + startDist = distance(p0, p1); + startCenter = interpolate(p0, p1, 0.5); + } + e.preventDefault(); + return false; + } + function touchmove(e) { + if (e.touches.length == 1) { + var prevTouch = prevPoints[e.touches[0].identifier], + thisTouch = client(e.touches[0]); + map.panBy({ x: thisTouch.x - prevTouch.x, y: thisTouch.y - prevTouch.y }); + prevPoints[e.touches[0].identifier] = thisTouch; + } + if (e.touches.length == 2) { + var p0 = client(e.touches[0]), + p1 = client(e.touches[1]); + dist = distance(p0,p1); + scaleFactor = dist / startDist; + center = interpolate(p0, p1, 0.5); + map.container().style.webkitTransformOrigin = startCenter.x + 'px ' + startCenter.y + 'px'; + map.container().style.webkitTransform = 'translate3d('+ (center.x-startCenter.x) +'px,' + + (center.y-startCenter.y) +'px,0px) ' + + 'scale3d('+ scaleFactor +','+ scaleFactor +',1) '; + prevPoints[e.touches[0].identifier] = p0; + prevPoints[e.touches[1].identifier] = p1; + } + e.preventDefault(); + return false; + } + function touchend(e) { + if (e.touches.length < 2 && scaleFactor) { + map.container().style.webkitTransformOrigin = ''; + map.container().style.webkitTransform = ''; + map.panBy({ x: -startCenter.x, y: -startCenter.y }); + map.zoomBy(Math.log(scaleFactor)/Math.LN2, { x: 0, y: 0 }); + map.panBy({ x: center.x-startCenter.x, y: center.y-startCenter.y }); + map.panBy({ x: startCenter.x, y: startCenter.y }); + scaleFactor = undefined; + center = undefined; + } + for (var i = 0; i < e.changedTouches.length; i++) { + if (e.changedTouches[i].identifier in prevPoints) { + delete prevPoints[e.changedTouches[i].identifier]; + } + } + } + + window.addEventListener("touchmove", touchmove, false); + window.addEventListener("touchend", touchend, false); + + return touch; +}; From cb160c516cd14528f76c29c6faffb6bdad078e6b Mon Sep 17 00:00:00 2001 From: Nathan Vander Wilt Date: Fri, 18 Mar 2011 22:22:29 +0100 Subject: [PATCH 2/7] basic port of the touch handler code from https://github.com/andyet/OpenLayers-Multitouch --- polymaps.js | 130 ++++++++++++++++++++---------------------------- polymaps.min.js | 102 +++++++++++++++++++------------------ src/Touch.js | 128 ++++++++++++++++++++--------------------------- 3 files changed, 159 insertions(+), 201 deletions(-) diff --git a/polymaps.js b/polymaps.js index 3aed2ac..c724045 100644 --- a/polymaps.js +++ b/polymaps.js @@ -1251,95 +1251,75 @@ po.drag = function() { po.touch = function() { var touch = {}, map, - prevPoints = {}, - startDist = null, - startCenter = null, - scaleFactor = null, - center = null; + last; touch.map = function(x) { if (!arguments.length) return map; map = x; // TODO remove from old map container? // TODO update if map container changes? - map.container().addEventListener("touchstart", touchstart, false); + var container = map.container(); + container.addEventListener("touchstart", touchstart, false); + container.addEventListener("touchmove", touchmove, false); + container.addEventListener("touchend", touchend, false); + container.addEventListener("touchcancel", touchend, false); return touch; } - - function client(t) { - return { x: t.clientX, y: t.clientY }; - } - - function distance(p1, p2) { - var dx = p2.x - p1.x, - dy = p2.y - p1.y; - return Math.sqrt(dx*dx + dy*dy); - } - - function interpolate(p1, p2, t) { - var px = p1.x + (p2.x - p1.x) * t, - py = p1.y + (p2.y - p1.y) * t; - return { x: px, y: py }; + + function updateMap(last, now) { + var delta = { + x: now.clientX - last.clientX, + y: now.clientY - last.clientY, + scale: now.scale - last.scale + }; + if (delta.x || delta.y || delta.scale) { + var oldPoint = map.mouse(last), + location = map.pointLocation(oldPoint); + map.zoomBy(delta.scale, map.mouse(now), location); + } } - + function touchstart(e) { - for (var i = 0; i < e.touches.length; i++) { - if (e.touches[i].identifier in prevPoints) continue; - prevPoints[e.touches[i].identifier] = client(e.touches[i]); - } - if (e.touches.length == 2) { - var p0 = prevPoints[e.touches[0].identifier]; - p1 = prevPoints[e.touches[1].identifier]; - startDist = distance(p0, p1); - startCenter = interpolate(p0, p1, 0.5); - } + if (last) { + // if new finger being added, finish current move sequence first + touchend(); + } e.preventDefault(); - return false; - } - function touchmove(e) { - if (e.touches.length == 1) { - var prevTouch = prevPoints[e.touches[0].identifier], - thisTouch = client(e.touches[0]); - map.panBy({ x: thisTouch.x - prevTouch.x, y: thisTouch.y - prevTouch.y }); - prevPoints[e.touches[0].identifier] = thisTouch; - } - if (e.touches.length == 2) { - var p0 = client(e.touches[0]), - p1 = client(e.touches[1]); - dist = distance(p0,p1); - scaleFactor = dist / startDist; - center = interpolate(p0, p1, 0.5); - map.container().style.webkitTransformOrigin = startCenter.x + 'px ' + startCenter.y + 'px'; - map.container().style.webkitTransform = 'translate3d('+ (center.x-startCenter.x) +'px,' - + (center.y-startCenter.y) +'px,0px) ' - + 'scale3d('+ scaleFactor +','+ scaleFactor +',1) '; - prevPoints[e.touches[0].identifier] = p0; - prevPoints[e.touches[1].identifier] = p1; - } + + last = touchesCenter(e); + } + + function touchmove(e) { + if (!last) { + // if finger was lifted, start new move sequence instead + return touchstart(e); + } e.preventDefault(); - return false; - } - function touchend(e) { - if (e.touches.length < 2 && scaleFactor) { - map.container().style.webkitTransformOrigin = ''; - map.container().style.webkitTransform = ''; - map.panBy({ x: -startCenter.x, y: -startCenter.y }); - map.zoomBy(Math.log(scaleFactor)/Math.LN2, { x: 0, y: 0 }); - map.panBy({ x: center.x-startCenter.x, y: center.y-startCenter.y }); - map.panBy({ x: startCenter.x, y: startCenter.y }); - scaleFactor = undefined; - center = undefined; - } - for (var i = 0; i < e.changedTouches.length; i++) { - if (e.changedTouches[i].identifier in prevPoints) { - delete prevPoints[e.changedTouches[i].identifier]; - } - } + + var now = touchesCenter(e); + updateMap(last, now); + last = now; } - window.addEventListener("touchmove", touchmove, false); - window.addEventListener("touchend", touchend, false); - + function touchend(e) { + last = null; + } + + function touchesCenter(e) { + var touches = e.touches; + var sumX = 0, sumY = 0; + for (var i = 0; i < touches.length; ++i) { + var touch = touches[i]; + sumX += touch.clientX; + sumY += touch.clientY; + } + return { + clientX: sumX / touches.length, + clientY: sumY / touches.length, + scale: e.scale + }; + } + return touch; }; po.wheel = function() { diff --git a/polymaps.min.js b/polymaps.min.js index e012b8f..e9b750a 100644 --- a/polymaps.min.js +++ b/polymaps.min.js @@ -1,53 +1,51 @@ if(!org)var org={};if(!org.polymaps)org.polymaps={}; -(function(s){function J(){for(var h=0;ha.row){var e=h;h=a;a=e}return{x0:h.column,y0:h.row,x1:a.column,y1:a.row,dx:a.column-h.column,dy:a.row-h.row}}function X(h,a,e,d,c){e=Math.max(e,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(h.x00,q=a.dx<0;for(e=e;ea.dy){e=j;j=a;a=e}if(j.dy>h.dy){e=j;j=h;h=e}if(a.dy>h.dy){e=a;a=h;h=e}j.dy&&X(h,j,d,c,g);a.dy&&X(h,a,d,c,g)}s.version="2.0.1";var R={x:0,y:0};s.id=function(){var h=0;return function(){return++h}}();s.svg=function(h){return document.createElementNS(s.ns.svg,h)};s.ns={svg:"http://www.w3.org/2000/svg", -xlink:"http://www.w3.org/1999/xlink"};s.transform=function(h,a,e,d,c,g){var j={},o,q,l;if(!arguments.length){h=1;a=c=e=0;d=1;g=0}j.zoomFraction=function(i){if(!arguments.length)return q;q=i;o=Math.floor(q+Math.log(Math.sqrt(h*h+a*a+e*e+d*d))/Math.log(2));l=Math.pow(2,-o);return j};j.apply=function(i){var k=Math.pow(2,-i.zoom),f=Math.pow(2,i.zoom-o);return{column:(h*i.column*k+e*i.row*k+c)*f,row:(a*i.column*k+d*i.row*k+g)*f,zoom:i.zoom-o}};j.unapply=function(i){var k=Math.pow(2,-i.zoom),f=Math.pow(2, -i.zoom+o);return{column:(i.column*k*d-i.row*k*e-c*d+g*e)/(h*d-a*e)*f,row:(i.column*k*a-i.row*k*h-c*a+g*h)/(e*a-d*h)*f,zoom:i.zoom+o}};j.toString=function(){return"matrix("+[h*l,a*l,e*l,d*l].join(" ")+" 0 0)"};return j.zoomFraction(0)};s.cache=function(h,a){function e(k){i--;a&&a(k);delete j[k.key];if(k.next)k.next.prev=k.prev;else if(q=k.prev)q.next=null;if(k.prev)k.prev.next=k.next;else if(o=k.next)o.prev=null}function d(){for(var k=q;i>l;k=k.prev){if(!k)break;k.lock||e(k)}}var c={},g={},j={},o= -null,q=null,l=64,i=0;c.peek=function(k){return j[[k.zoom,k.column,k.row].join("/")]};c.load=function(k,f){var r=[k.zoom,k.column,k.row].join("/"),t=j[r];if(t){if(t.prev){if(t.prev.next=t.next)t.next.prev=t.prev;else q=t.prev;t.prev=null;t.next=o;o=o.prev=t}t.lock=1;return g[r]=t}t={key:r,column:k.column,row:k.row,zoom:k.zoom,next:o,prev:null,lock:1};h.call(null,t,f);g[r]=j[r]=t;if(o)o.prev=t;else q=t;o=t;i++;d();return t};c.unload=function(k){if(!(k in g))return false;var f=g[k];f.lock=0;delete g[k]; -f.request&&f.request.abort(false)?e(f):d();return f};c.locks=function(){return g};c.size=function(k){if(!arguments.length)return l;l=k;d();return c};return c};s.url=function(h){function a(d){var c=1<=g||!d.length)){c++;d.pop()()}}function a(j){for(var o=0;o=0)return m;return window};a.mouse=function(m){var u=(e.ownerSVGElement||e).createSVGPoint();u.x=m.clientX;u.y=m.clientY;return u.matrixTransform(e.getScreenCTM().inverse())}; -a.size=function(m){if(!arguments.length)return c;d=m;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var m=e.ownerSVGElement||e;if(m.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");m=C}b=m.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);g={x:c.x/2,y:c.y/2};h();a.dispatch({type:"resize"});return a};a.tileSize=function(m){if(!arguments.length)return j;j=m;a.dispatch({type:"move"}); -return a};a.center=function(m){if(!arguments.length)return o;o=m;h();a.dispatch({type:"move"});return a};a.panBy=function(m){var u=45/Math.pow(2,q+l-3),y=m.x*u;m=m.y*u;return a.center({lon:o.lon+(w*m-n*y)/j.x,lat:P(Q(o.lat)+(w*y+n*m)/j.y)})};a.centerRange=function(m){if(!arguments.length)return G;if(G=m){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}h();a.dispatch({type:"move"});return a};a.zoom=function(m){if(!arguments.length)return q+l;q=Math.max(k[0], -Math.min(k[1],m));l=q-(q=Math.round(q));i=Math.pow(2,l);return a.center(o)};a.zoomBy=function(m,u,y){if(arguments.length<2)return a.zoom(q+l+m);if(arguments.length<3)y=a.pointLocation(u);q=Math.max(k[0],Math.min(k[1],q+l+m));l=q-(q=Math.round(q));i=Math.pow(2,l);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(m){if(!arguments.length)return k;k=m;return a.zoom(q+l)};a.angle=function(m){if(!arguments.length)return f;f=m;r=Math.cos(f);t=Math.sin(f);n=Math.cos(-f); -w=Math.sin(-f);h();a.dispatch({type:"move"});return a};a.add=function(m){m.map(a);return a};a.remove=function(m){m.map(null);return a};a.dispatch=s.dispatch(a);return a};J.maps=[];J.add=function(h){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var n=d.map(),w=n.zoom(),B=w-(w=Math.round(w)),H=n.size(),G=n.angle(),C=n.tileSize(),m=n.locationCoordinate(n.center()); -j?i.removeAttribute("visibility"):i.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)f[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));i.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(k?k.zoomFraction(B):""));var y=n.pointCoordinate(m,R);u=n.pointCoordinate(m,{x:H.x,y:0});var D=n.pointCoordinate(m,H);n=n.pointCoordinate(m,{x:0,y:H.y});if(!k&&!G&&!B){m.column=(Math.round(C.x*m.column)+(H.x&1)/2)/ -C.x;m.row=(Math.round(C.y*m.row)+(H.y&1)/2)/C.y}var E=o?o(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;n.column*=B;n.row*=B;y.zoom=u.zoom=D.zoom=n.zoom+=E}if(k){y=k.unapply(y);u=k.unapply(u);D=k.unapply(D);n=k.unapply(n);m=k.unapply(m)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(j&&E>-5&&E<3){B=1<>u<>u<=1;t--)(f[t]=i.appendChild(s.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-t)+")");f[0]=i.appendChild(s.svg("g")); -d.init&&d.init(i);l.on("move",e).on("resize",e);e()}return d};d.container=function(){return i};d.id=function(r){if(!arguments.length)return q;q=r;return d};d.visible=function(r){if(!arguments.length)return j;j=r;l&&e();return d};d.transform=function(r){if(!arguments.length)return k;k=r;l&&e();return d};d.zoom=function(r){if(!arguments.length)return o;o=typeof r=="function"||r==null?r:function(){return r};return d};d.tile=function(r){if(!arguments.length)return g;g=r;return d};d.dispatch=s.dispatch(d); -d.on("load",function(r){if(r.tile.proxyRefs){for(var t in r.tile.proxyRefs){var n=r.tile.proxyRefs[t];--n.proxyCount<=0&&c.unload(t)&&n.element.parentNode.removeChild(n.element)}delete r.tile.proxyRefs}});return d};s.image=function(){var h=s.layer(function(e){var d=e.element=s.svg("image"),c=h.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")e.request=s.queue.image(d,a(e),function(){delete e.request; -e.ready=true;d.removeAttribute("opacity");h.dispatch({type:"load",tile:e})});else{e.ready=true;d.setAttributeNS(s.ns.xlink,"href",a);h.dispatch({type:"load",tile:e})}},function(e){e.request&&e.request.abort(true)}),a="about:blank";h.url=function(e){if(!arguments.length)return a;a=typeof e=="string"&&/{.}/.test(e)?s.url(e):e;return h};return h};s.geoJson=function(h){function a(f,r){var t=r({lat:f[1],lon:f[0]}),n=s.svg("circle");n.setAttribute("r",4.5);n.setAttribute("cx",t.x);n.setAttribute("cy",t.y); -return n}function e(f,r,t,n){n.push("M");for(var w=0;w0.5)i*=0.4}g||(g=q.pointLocation(k));q.off("move",h);if(c)q.zoomBy(i,k,g);else if(i){var f=Date.now();if(f-d>200){q.zoomBy(i> -0?+1:-1,k,g);d=f}}q.on("move",h);l.preventDefault();return false}var e={},d=0,c=true,g,j=/WebKit\/533/.test(navigator.userAgent),o=0.3,q;e.smooth=function(l){if(!arguments.length)return c;c=l;return e};e.map=function(l){if(!arguments.length)return q;(q=l).on("move",h);var i=q.container();i.addEventListener("mousemove",h,false);i.addEventListener("mousewheel",a,false);i.addEventListener("DOMMouseScroll",a,false);return e};return e};s.arrow=function(){function h(k){if(!(k.ctrlKey||k.altKey||k.metaKey)){var f= -Date.now(),r=0,t=0,n=0;switch(k.keyCode){case 37:if(!c.left){g=f;c.left=1;c.right||(r=l)}break;case 39:if(!c.right){g=f;c.right=1;c.left||(r=-l)}break;case 38:if(!c.up){g=f;c.up=1;c.down||(t=l)}break;case 40:if(!c.down){g=f;c.down=1;c.up||(t=-l)}break;case 109:case 189:if(!c.plus){g=f;c.plus=1;c.minus||(n=-1)}break;case 61:case 187:if(!c.minus){g=f;c.minus=1;c.plus||(n=1)}break;default:return}if(n){f=i.zoom();i.zoom(n<0?Math.ceil(f)-1:Math.floor(f)+1)}else if(r||t)i.panBy({x:r,y:t});if(!j&&c.left| -c.right|c.up|c.down)j=setInterval(e,q);k.preventDefault()}}function a(k){g=Date.now();switch(k.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down=0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(j&&!(c.left|c.right|c.up|c.down))j=clearInterval(j);k.preventDefault()}function e(){if(i)if(!(Date.now()B+H&&E.panBy(D)},G));D&&E.panBy(D);B=Date.now();o(x)}function a(){r.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function e(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");D=x}}function d(x){return function(v){r.setAttribute("class","compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)- -1:Math.floor(z)+1);o(v)}}function c(x){return function(v){E.zoom(x);o(v)}}function g(){this.setAttribute("class","active")}function j(){this.removeAttribute("class")}function o(x){x.stopPropagation();x.preventDefault()}function q(x){var v=Math.SQRT1_2*n,z=n*0.7,A=n*0.2,F=s.svg("g"),I=F.appendChild(s.svg("path")),N=F.appendChild(s.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events","all");I.setAttribute("d","M0,0L"+v+","+v+"A"+n+","+n+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class", -"chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",h,false);F.addEventListener("mouseover",e(x),false);F.addEventListener("mouseout",e(null),false);F.addEventListener("dblclick",o,false);return F}function l(x){var v=n*0.4,z=v/2,A=s.svg("g"),F=A.appendChild(s.svg("path")),I=A.appendChild(s.svg("path")),N=A.appendChild(s.svg("path")),M=A.appendChild(s.svg("path"));F.setAttribute("class","back");F.setAttribute("d", -"M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d","M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",g,false);A.addEventListener("mouseout",j,false);A.addEventListener("dblclick",o,false);return A} -function i(x){var v=n*0.2,z=n*0.4,A=s.svg("g"),F=A.appendChild(s.svg("rect")),I=A.appendChild(s.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x",-z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",o,false);return A}function k(){if(r){var x=n+6,v=x,z=E.size();switch(C){case "top-left":break; -case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}r.setAttribute("transform","translate("+x+","+v+")");for(var A in t)A==E.zoom()?t[A].setAttribute("class","active"):t[A].removeAttribute("class")}}var f={},r,t={},n=30,w=16,B=0,H=250,G=50,C="top-left",m="small",u="small",y,D,E;f.radius=function(x){if(!arguments.length)return n;n=x;return f};f.speed=function(x){if(!arguments.length)return n;w=x;return f};f.position=function(x){if(!arguments.length)return C; -C=x;return f};f.pan=function(x){if(!arguments.length)return u;u=x;return f};f.zoom=function(x){if(!arguments.length)return m;m=x;return f};f.map=function(x){if(!arguments.length)return E;E=x;E.on("move",k);E.on("resize",k);r=E.container().appendChild(s.svg("g"));r.setAttribute("class","compass");if(u!="none"){var v=r.appendChild(s.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(s.svg("circle"));z.setAttribute("class","back");z.setAttribute("r",n);v.appendChild(q({x:0,y:-w})).setAttribute("transform", -"rotate(0)");v.appendChild(q({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(q({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(q({x:-w,y:0})).setAttribute("transform","rotate(270)");v=v.appendChild(s.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",n);window.addEventListener("mouseup",a,false)}if(m!="none"){v=r.appendChild(s.svg("g"));v.setAttribute("class","zoom");z=-0.5;if(m=="big"){t={};var A=E.zoomRange()[0];for(z= -0;A<=E.zoomRange()[1];A++,z++)(t[A]=v.appendChild(i(A))).setAttribute("transform","translate(0,"+-(z+0.75)*n*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+n*(/^top-/.test(C)?A+(z+0.5)*0.4:-A)+")");v.appendChild(l(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*n*0.4+")");v.appendChild(l(-1)).setAttribute("transform","scale(-1)")}k();return f};return f};s.grid=function(){function h(){var c=d.firstChild,g=e.size(),j=e.pointLocation(R);e.pointLocation(g);var o=Math.pow(2, -4-Math.round(e.zoom()));j.lat=Math.floor(j.lat/o)*o;j.lon=Math.ceil(j.lon/o)*o;for(var q;(q=e.locationPoint(j).x)<=g.x;j.lon+=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("x1",q);c.setAttribute("x2",q);c.setAttribute("y1",0);c.setAttribute("y2",g.y);c=c.nextSibling}for(;(q=e.locationPoint(j).y)<=g.y;j.lat-=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("y1",q);c.setAttribute("y2",q);c.setAttribute("x1",0);c.setAttribute("x2",g.x);c=c.nextSibling}for(;c;){g=c.nextSibling;d.removeChild(c); -c=g}}var a={},e,d;a.map=function(c){if(!arguments.length)return e;e=c;e.on("move",h);e.on("resize",h);if(!d){d=s.svg("g");d.setAttribute("class","grid")}e.container().appendChild(d);h();return a};return a}})(org.polymaps); +(function(r){function J(){for(var h=0;ha.row){var f=h;h=a;a=f}return{x0:h.column,y0:h.row,x1:a.column,y1:a.row,dx:a.column-h.column,dy:a.row-h.row}}function X(h,a,f,d,c){f=Math.max(f,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(h.x00,k=a.dx<0;for(f=f;fa.dy){f=i;i=a;a=f}if(i.dy>h.dy){f=i;i=h;h=f}if(a.dy>h.dy){f=a;a=h;h=f}i.dy&&X(h,i,d,c,e);a.dy&&X(h,a,d,c,e)}r.version="2.0.1";var R={x:0,y:0};r.id=function(){var h=0;return function(){return++h}}();r.svg=function(h){return document.createElementNS(r.ns.svg,h)};r.ns={svg:"http://www.w3.org/2000/svg", +xlink:"http://www.w3.org/1999/xlink"};r.transform=function(h,a,f,d,c,e){var i={},j,k,s;if(!arguments.length){h=1;a=c=f=0;d=1;e=0}i.zoomFraction=function(m){if(!arguments.length)return k;k=m;j=Math.floor(k+Math.log(Math.sqrt(h*h+a*a+f*f+d*d))/Math.log(2));s=Math.pow(2,-j);return i};i.apply=function(m){var l=Math.pow(2,-m.zoom),g=Math.pow(2,m.zoom-j);return{column:(h*m.column*l+f*m.row*l+c)*g,row:(a*m.column*l+d*m.row*l+e)*g,zoom:m.zoom-j}};i.unapply=function(m){var l=Math.pow(2,-m.zoom),g=Math.pow(2, +m.zoom+j);return{column:(m.column*l*d-m.row*l*f-c*d+e*f)/(h*d-a*f)*g,row:(m.column*l*a-m.row*l*h-c*a+e*h)/(f*a-d*h)*g,zoom:m.zoom+j}};i.toString=function(){return"matrix("+[h*s,a*s,f*s,d*s].join(" ")+" 0 0)"};return i.zoomFraction(0)};r.cache=function(h,a){function f(l){m--;a&&a(l);delete i[l.key];if(l.next)l.next.prev=l.prev;else if(k=l.prev)k.next=null;if(l.prev)l.prev.next=l.next;else if(j=l.next)j.prev=null}function d(){for(var l=k;m>s;l=l.prev){if(!l)break;l.lock||f(l)}}var c={},e={},i={},j= +null,k=null,s=64,m=0;c.peek=function(l){return i[[l.zoom,l.column,l.row].join("/")]};c.load=function(l,g){var q=[l.zoom,l.column,l.row].join("/"),t=i[q];if(t){if(t.prev){if(t.prev.next=t.next)t.next.prev=t.prev;else k=t.prev;t.prev=null;t.next=j;j=j.prev=t}t.lock=1;return e[q]=t}t={key:q,column:l.column,row:l.row,zoom:l.zoom,next:j,prev:null,lock:1};h.call(null,t,g);e[q]=i[q]=t;if(j)j.prev=t;else k=t;j=t;m++;d();return t};c.unload=function(l){if(!(l in e))return false;var g=e[l];g.lock=0;delete e[l]; +g.request&&g.request.abort(false)?f(g):d();return g};c.locks=function(){return e};c.size=function(l){if(!arguments.length)return s;s=l;d();return c};return c};r.url=function(h){function a(d){var c=1<=e||!d.length)){c++;d.pop()()}}function a(i){for(var j=0;j=0)return n;return window};a.mouse=function(n){var u=(f.ownerSVGElement||f).createSVGPoint();u.x=n.clientX;u.y=n.clientY;return u.matrixTransform(f.getScreenCTM().inverse())}; +a.size=function(n){if(!arguments.length)return c;d=n;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var n=f.ownerSVGElement||f;if(n.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");n=C}b=n.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);e={x:c.x/2,y:c.y/2};h();a.dispatch({type:"resize"});return a};a.tileSize=function(n){if(!arguments.length)return i;i=n;a.dispatch({type:"move"}); +return a};a.center=function(n){if(!arguments.length)return j;j=n;h();a.dispatch({type:"move"});return a};a.panBy=function(n){var u=45/Math.pow(2,k+s-3),y=n.x*u;n=n.y*u;return a.center({lon:j.lon+(w*n-o*y)/i.x,lat:P(Q(j.lat)+(w*y+o*n)/i.y)})};a.centerRange=function(n){if(!arguments.length)return G;if(G=n){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}h();a.dispatch({type:"move"});return a};a.zoom=function(n){if(!arguments.length)return k+s;k=Math.max(l[0], +Math.min(l[1],n));s=k-(k=Math.round(k));m=Math.pow(2,s);return a.center(j)};a.zoomBy=function(n,u,y){if(arguments.length<2)return a.zoom(k+s+n);if(arguments.length<3)y=a.pointLocation(u);k=Math.max(l[0],Math.min(l[1],k+s+n));s=k-(k=Math.round(k));m=Math.pow(2,s);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(n){if(!arguments.length)return l;l=n;return a.zoom(k+s)};a.angle=function(n){if(!arguments.length)return g;g=n;q=Math.cos(g);t=Math.sin(g);o=Math.cos(-g); +w=Math.sin(-g);h();a.dispatch({type:"move"});return a};a.add=function(n){n.map(a);return a};a.remove=function(n){n.map(null);return a};a.dispatch=r.dispatch(a);return a};J.maps=[];J.add=function(h){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var o=d.map(),w=o.zoom(),B=w-(w=Math.round(w)),H=o.size(),G=o.angle(),C=o.tileSize(),n=o.locationCoordinate(o.center()); +i?m.removeAttribute("visibility"):m.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)g[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));m.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(l?l.zoomFraction(B):""));var y=o.pointCoordinate(n,R);u=o.pointCoordinate(n,{x:H.x,y:0});var D=o.pointCoordinate(n,H);o=o.pointCoordinate(n,{x:0,y:H.y});if(!l&&!G&&!B){n.column=(Math.round(C.x*n.column)+(H.x&1)/2)/ +C.x;n.row=(Math.round(C.y*n.row)+(H.y&1)/2)/C.y}var E=j?j(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;o.column*=B;o.row*=B;y.zoom=u.zoom=D.zoom=o.zoom+=E}if(l){y=l.unapply(y);u=l.unapply(u);D=l.unapply(D);o=l.unapply(o);n=l.unapply(n)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(i&&E>-5&&E<3){B=1<>u<>u<=1;t--)(g[t]=m.appendChild(r.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-t)+")");g[0]=m.appendChild(r.svg("g")); +d.init&&d.init(m);s.on("move",f).on("resize",f);f()}return d};d.container=function(){return m};d.id=function(q){if(!arguments.length)return k;k=q;return d};d.visible=function(q){if(!arguments.length)return i;i=q;s&&f();return d};d.transform=function(q){if(!arguments.length)return l;l=q;s&&f();return d};d.zoom=function(q){if(!arguments.length)return j;j=typeof q=="function"||q==null?q:function(){return q};return d};d.tile=function(q){if(!arguments.length)return e;e=q;return d};d.dispatch=r.dispatch(d); +d.on("load",function(q){if(q.tile.proxyRefs){for(var t in q.tile.proxyRefs){var o=q.tile.proxyRefs[t];--o.proxyCount<=0&&c.unload(t)&&o.element.parentNode.removeChild(o.element)}delete q.tile.proxyRefs}});return d};r.image=function(){var h=r.layer(function(f){var d=f.element=r.svg("image"),c=h.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")f.request=r.queue.image(d,a(f),function(){delete f.request; +f.ready=true;d.removeAttribute("opacity");h.dispatch({type:"load",tile:f})});else{f.ready=true;d.setAttributeNS(r.ns.xlink,"href",a);h.dispatch({type:"load",tile:f})}},function(f){f.request&&f.request.abort(true)}),a="about:blank";h.url=function(f){if(!arguments.length)return a;a=typeof f=="string"&&/{.}/.test(f)?r.url(f):f;return h};return h};r.geoJson=function(h){function a(g,q){var t=q({lat:g[1],lon:g[0]}),o=r.svg("circle");o.setAttribute("r",4.5);o.setAttribute("cx",t.x);o.setAttribute("cy",t.y); +return o}function f(g,q,t,o){o.push("M");for(var w=0;w0.5)m*=0.4}e||(e=k.pointLocation(l));k.off("move", +h);if(c)k.zoomBy(m,l,e);else if(m){var g=Date.now();if(g-d>200){k.zoomBy(m>0?+1:-1,l,e);d=g}}k.on("move",h);s.preventDefault();return false}var f={},d=0,c=true,e,i=/WebKit\/533/.test(navigator.userAgent),j=0.3,k;f.smooth=function(s){if(!arguments.length)return c;c=s;return f};f.map=function(s){if(!arguments.length)return k;(k=s).on("move",h);var m=k.container();m.addEventListener("mousemove",h,false);m.addEventListener("mousewheel",a,false);m.addEventListener("DOMMouseScroll",a,false);return f};return f}; +r.arrow=function(){function h(l){if(!(l.ctrlKey||l.altKey||l.metaKey)){var g=Date.now(),q=0,t=0,o=0;switch(l.keyCode){case 37:if(!c.left){e=g;c.left=1;c.right||(q=s)}break;case 39:if(!c.right){e=g;c.right=1;c.left||(q=-s)}break;case 38:if(!c.up){e=g;c.up=1;c.down||(t=s)}break;case 40:if(!c.down){e=g;c.down=1;c.up||(t=-s)}break;case 109:case 189:if(!c.plus){e=g;c.plus=1;c.minus||(o=-1)}break;case 61:case 187:if(!c.minus){e=g;c.minus=1;c.plus||(o=1)}break;default:return}if(o){g=m.zoom();m.zoom(o<0? +Math.ceil(g)-1:Math.floor(g)+1)}else if(q||t)m.panBy({x:q,y:t});if(!i&&c.left|c.right|c.up|c.down)i=setInterval(f,k);l.preventDefault()}}function a(l){e=Date.now();switch(l.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down=0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(i&&!(c.left|c.right|c.up|c.down))i=clearInterval(i);l.preventDefault()}function f(){if(m)if(!(Date.now()B+H&&E.panBy(D)},G));D&&E.panBy(D);B=Date.now();j(x)}function a(){q.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function f(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");D=x}}function d(x){return function(v){q.setAttribute("class", +"compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)-1:Math.floor(z)+1);j(v)}}function c(x){return function(v){E.zoom(x);j(v)}}function e(){this.setAttribute("class","active")}function i(){this.removeAttribute("class")}function j(x){x.stopPropagation();x.preventDefault()}function k(x){var v=Math.SQRT1_2*o,z=o*0.7,A=o*0.2,F=r.svg("g"),I=F.appendChild(r.svg("path")),N=F.appendChild(r.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events","all");I.setAttribute("d","M0,0L"+ +v+","+v+"A"+o+","+o+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class","chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",h,false);F.addEventListener("mouseover",f(x),false);F.addEventListener("mouseout",f(null),false);F.addEventListener("dblclick",j,false);return F}function s(x){var v=o*0.4,z=v/2,A=r.svg("g"),F=A.appendChild(r.svg("path")),I=A.appendChild(r.svg("path")),N=A.appendChild(r.svg("path")),M=A.appendChild(r.svg("path")); +F.setAttribute("class","back");F.setAttribute("d","M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d","M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",e,false);A.addEventListener("mouseout",i,false); +A.addEventListener("dblclick",j,false);return A}function m(x){var v=o*0.2,z=o*0.4,A=r.svg("g"),F=A.appendChild(r.svg("rect")),I=A.appendChild(r.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x",-z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",j,false);return A}function l(){if(q){var x= +o+6,v=x,z=E.size();switch(C){case "top-left":break;case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}q.setAttribute("transform","translate("+x+","+v+")");for(var A in t)A==E.zoom()?t[A].setAttribute("class","active"):t[A].removeAttribute("class")}}var g={},q,t={},o=30,w=16,B=0,H=250,G=50,C="top-left",n="small",u="small",y,D,E;g.radius=function(x){if(!arguments.length)return o;o=x;return g};g.speed=function(x){if(!arguments.length)return o;w= +x;return g};g.position=function(x){if(!arguments.length)return C;C=x;return g};g.pan=function(x){if(!arguments.length)return u;u=x;return g};g.zoom=function(x){if(!arguments.length)return n;n=x;return g};g.map=function(x){if(!arguments.length)return E;E=x;E.on("move",l);E.on("resize",l);q=E.container().appendChild(r.svg("g"));q.setAttribute("class","compass");if(u!="none"){var v=q.appendChild(r.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(r.svg("circle"));z.setAttribute("class","back"); +z.setAttribute("r",o);v.appendChild(k({x:0,y:-w})).setAttribute("transform","rotate(0)");v.appendChild(k({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(k({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(k({x:-w,y:0})).setAttribute("transform","rotate(270)");v=v.appendChild(r.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",o);window.addEventListener("mouseup",a,false)}if(n!="none"){v=q.appendChild(r.svg("g"));v.setAttribute("class", +"zoom");z=-0.5;if(n=="big"){t={};var A=E.zoomRange()[0];for(z=0;A<=E.zoomRange()[1];A++,z++)(t[A]=v.appendChild(m(A))).setAttribute("transform","translate(0,"+-(z+0.75)*o*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+o*(/^top-/.test(C)?A+(z+0.5)*0.4:-A)+")");v.appendChild(s(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*o*0.4+")");v.appendChild(s(-1)).setAttribute("transform","scale(-1)")}l();return g};return g};r.grid=function(){function h(){var c=d.firstChild,e=f.size(), +i=f.pointLocation(R);f.pointLocation(e);var j=Math.pow(2,4-Math.round(f.zoom()));i.lat=Math.floor(i.lat/j)*j;i.lon=Math.ceil(i.lon/j)*j;for(var k;(k=f.locationPoint(i).x)<=e.x;i.lon+=j){c||(c=d.appendChild(r.svg("line")));c.setAttribute("x1",k);c.setAttribute("x2",k);c.setAttribute("y1",0);c.setAttribute("y2",e.y);c=c.nextSibling}for(;(k=f.locationPoint(i).y)<=e.y;i.lat-=j){c||(c=d.appendChild(r.svg("line")));c.setAttribute("y1",k);c.setAttribute("y2",k);c.setAttribute("x1",0);c.setAttribute("x2", +e.x);c=c.nextSibling}for(;c;){e=c.nextSibling;d.removeChild(c);c=e}}var a={},f,d;a.map=function(c){if(!arguments.length)return f;f=c;f.on("move",h);f.on("resize",h);if(!d){d=r.svg("g");d.setAttribute("class","grid")}f.container().appendChild(d);h();return a};return a}})(org.polymaps); diff --git a/src/Touch.js b/src/Touch.js index 4437dc3..108f777 100644 --- a/src/Touch.js +++ b/src/Touch.js @@ -1,94 +1,74 @@ po.touch = function() { var touch = {}, map, - prevPoints = {}, - startDist = null, - startCenter = null, - scaleFactor = null, - center = null; + last; touch.map = function(x) { if (!arguments.length) return map; map = x; // TODO remove from old map container? // TODO update if map container changes? - map.container().addEventListener("touchstart", touchstart, false); + var container = map.container(); + container.addEventListener("touchstart", touchstart, false); + container.addEventListener("touchmove", touchmove, false); + container.addEventListener("touchend", touchend, false); + container.addEventListener("touchcancel", touchend, false); return touch; } - - function client(t) { - return { x: t.clientX, y: t.clientY }; - } - - function distance(p1, p2) { - var dx = p2.x - p1.x, - dy = p2.y - p1.y; - return Math.sqrt(dx*dx + dy*dy); + + function updateMap(last, now) { + var delta = { + x: now.clientX - last.clientX, + y: now.clientY - last.clientY, + scale: now.scale - last.scale + }; + if (delta.x || delta.y || delta.scale) { + var oldPoint = map.mouse(last), + location = map.pointLocation(oldPoint); + map.zoomBy(delta.scale, map.mouse(now), location); + } } - - function interpolate(p1, p2, t) { - var px = p1.x + (p2.x - p1.x) * t, - py = p1.y + (p2.y - p1.y) * t; - return { x: px, y: py }; - } - + function touchstart(e) { - for (var i = 0; i < e.touches.length; i++) { - if (e.touches[i].identifier in prevPoints) continue; - prevPoints[e.touches[i].identifier] = client(e.touches[i]); - } - if (e.touches.length == 2) { - var p0 = prevPoints[e.touches[0].identifier]; - p1 = prevPoints[e.touches[1].identifier]; - startDist = distance(p0, p1); - startCenter = interpolate(p0, p1, 0.5); - } + if (last) { + // if new finger being added, finish current move sequence first + touchend(); + } e.preventDefault(); - return false; - } - function touchmove(e) { - if (e.touches.length == 1) { - var prevTouch = prevPoints[e.touches[0].identifier], - thisTouch = client(e.touches[0]); - map.panBy({ x: thisTouch.x - prevTouch.x, y: thisTouch.y - prevTouch.y }); - prevPoints[e.touches[0].identifier] = thisTouch; - } - if (e.touches.length == 2) { - var p0 = client(e.touches[0]), - p1 = client(e.touches[1]); - dist = distance(p0,p1); - scaleFactor = dist / startDist; - center = interpolate(p0, p1, 0.5); - map.container().style.webkitTransformOrigin = startCenter.x + 'px ' + startCenter.y + 'px'; - map.container().style.webkitTransform = 'translate3d('+ (center.x-startCenter.x) +'px,' - + (center.y-startCenter.y) +'px,0px) ' - + 'scale3d('+ scaleFactor +','+ scaleFactor +',1) '; - prevPoints[e.touches[0].identifier] = p0; - prevPoints[e.touches[1].identifier] = p1; - } + + last = touchesCenter(e); + } + + function touchmove(e) { + if (!last) { + // if finger was lifted, start new move sequence instead + return touchstart(e); + } e.preventDefault(); - return false; - } - function touchend(e) { - if (e.touches.length < 2 && scaleFactor) { - map.container().style.webkitTransformOrigin = ''; - map.container().style.webkitTransform = ''; - map.panBy({ x: -startCenter.x, y: -startCenter.y }); - map.zoomBy(Math.log(scaleFactor)/Math.LN2, { x: 0, y: 0 }); - map.panBy({ x: center.x-startCenter.x, y: center.y-startCenter.y }); - map.panBy({ x: startCenter.x, y: startCenter.y }); - scaleFactor = undefined; - center = undefined; - } - for (var i = 0; i < e.changedTouches.length; i++) { - if (e.changedTouches[i].identifier in prevPoints) { - delete prevPoints[e.changedTouches[i].identifier]; - } - } + + var now = touchesCenter(e); + updateMap(last, now); + last = now; } - window.addEventListener("touchmove", touchmove, false); - window.addEventListener("touchend", touchend, false); + function touchend(e) { + last = null; + } + function touchesCenter(e) { + var touches = e.touches; + var sumX = 0, sumY = 0; + for (var i = 0; i < touches.length; ++i) { + var touch = touches[i]; + sumX += touch.clientX; + sumY += touch.clientY; + } + return { + clientX: sumX / touches.length, + clientY: sumY / touches.length, + scale: e.scale + }; + } + return touch; }; From 443870b0c89f7e46e4702a2e8bb3217bc9c8c825 Mon Sep 17 00:00:00 2001 From: Nathan Vander Wilt Date: Mon, 21 Mar 2011 08:33:20 +0100 Subject: [PATCH 3/7] map can now be changed/unset on wheel and touch handlers --- src/Touch.js | 26 +++++++++++++++++++------- src/Wheel.js | 27 ++++++++++++++++++++------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/Touch.js b/src/Touch.js index 108f777..016674e 100644 --- a/src/Touch.js +++ b/src/Touch.js @@ -5,14 +5,26 @@ po.touch = function() { touch.map = function(x) { if (!arguments.length) return map; + + if (map) { + var container = map.container(); + container.removeEventListener("touchstart", touchstart, false); + container.removeEventListener("touchmove", touchmove, false); + container.removeEventListener("touchend", touchend, false); + container.removeEventListener("touchcancel", touchend, false); + } + map = x; - // TODO remove from old map container? - // TODO update if map container changes? - var container = map.container(); - container.addEventListener("touchstart", touchstart, false); - container.addEventListener("touchmove", touchmove, false); - container.addEventListener("touchend", touchend, false); - container.addEventListener("touchcancel", touchend, false); + + if (map) { + var container = map.container(); + container.addEventListener("touchstart", touchstart, false); + container.addEventListener("touchmove", touchmove, false); + container.addEventListener("touchend", touchend, false); + container.addEventListener("touchcancel", touchend, false); + // TODO update if map container changes? + } + return touch; } diff --git a/src/Wheel.js b/src/Wheel.js index 2d54251..c7d4458 100644 --- a/src/Wheel.js +++ b/src/Wheel.js @@ -42,13 +42,26 @@ po.wheel = function() { wheel.map = function(x) { if (!arguments.length) return map; - (map = x).on("move", move); - // TODO remove from old map container? - // TODO update if map container changes? - var container = map.container(); - container.addEventListener("mousemove", move, false); - container.addEventListener("mousewheel", mousewheel, false); - container.addEventListener("DOMMouseScroll", mousewheel, false); + + if (map) { + map.off("move", move); + var container = map.container(); + container.removeEventListener("mousemove", move, false); + container.removeEventListener("mousewheel", mousewheel, false); + container.removeEventListener("DOMMouseScroll", mousewheel, false); + } + + map = x; + + if (map) { + map.on("move", move); + var container = map.container(); + container.addEventListener("mousemove", move, false); + container.addEventListener("mousewheel", mousewheel, false); + container.addEventListener("DOMMouseScroll", mousewheel, false); + // TODO update if map container changes? + } + return wheel; }; From 74e22ce12b899236fe1c6ce6b802d89e03e3026f Mon Sep 17 00:00:00 2001 From: Nathan Vander Wilt Date: Mon, 21 Mar 2011 09:17:24 +0100 Subject: [PATCH 4/7] wheel and touch handlers now handle new map container change event (though the map itself doesn't seem to change containers corrrectly) --- polymaps.js | 74 +++++++++++++++++++++++++++-------- polymaps.min.js | 101 ++++++++++++++++++++++++------------------------ src/Map.js | 1 + src/Touch.js | 32 +++++++++------ src/Wheel.js | 28 +++++++++----- 5 files changed, 148 insertions(+), 88 deletions(-) diff --git a/polymaps.js b/polymaps.js index c724045..5fd9751 100644 --- a/polymaps.js +++ b/polymaps.js @@ -436,6 +436,7 @@ po.map = function() { map.container = function(x) { if (!arguments.length) return container; + map.dispatch({type: "container", 'old':container, 'new':x}); container = x; container.setAttribute("class", "map"); container.appendChild(rect); @@ -1252,17 +1253,37 @@ po.touch = function() { var touch = {}, map, last; - + + function container(c) { + if (c['old']) { + c['old'].removeEventListener("touchstart", touchstart, false); + c['old'].removeEventListener("touchmove", touchmove, false); + c['old'].removeEventListener("touchend", touchend, false); + c['old'].removeEventListener("touchcancel", touchend, false); + } + if (c['new']) { + console.log(c['new']); + c['new'].addEventListener("touchstart", touchstart, false); + c['new'].addEventListener("touchmove", touchmove, false); + c['new'].addEventListener("touchend", touchend, false); + c['new'].addEventListener("touchcancel", touchend, false); + } + } + touch.map = function(x) { if (!arguments.length) return map; + + if (map) { + map.off("container", container); + } + + container({'old':(map && map.container()), 'new':(x && x.container())}); map = x; - // TODO remove from old map container? - // TODO update if map container changes? - var container = map.container(); - container.addEventListener("touchstart", touchstart, false); - container.addEventListener("touchmove", touchmove, false); - container.addEventListener("touchend", touchend, false); - container.addEventListener("touchcancel", touchend, false); + + if (map) { + map.on("container", container); + } + return touch; } @@ -1363,16 +1384,37 @@ po.wheel = function() { smooth = x; return wheel; }; - + + + function container(c) { + if (c['old']) { + c['old'].removeEventListener("mousemove", move, false); + c['old'].removeEventListener("mousewheel", mousewheel, false); + c['old'].removeEventListener("DOMMouseScroll", mousewheel, false); + } + if (c['new']) { + c['new'].addEventListener("mousemove", move, false); + c['new'].addEventListener("mousewheel", mousewheel, false); + c['new'].addEventListener("DOMMouseScroll", mousewheel, false); + } + } + wheel.map = function(x) { if (!arguments.length) return map; - (map = x).on("move", move); - // TODO remove from old map container? - // TODO update if map container changes? - var container = map.container(); - container.addEventListener("mousemove", move, false); - container.addEventListener("mousewheel", mousewheel, false); - container.addEventListener("DOMMouseScroll", mousewheel, false); + + if (map) { + map.off("move", move); + map.off("container", container); + } + + container({'old':(map && map.container()), 'new':(x && x.container())}); + map = x; + + if (map) { + map.on("move", move); + map.on("container", container); + } + return wheel; }; diff --git a/polymaps.min.js b/polymaps.min.js index e9b750a..f1543b4 100644 --- a/polymaps.min.js +++ b/polymaps.min.js @@ -1,51 +1,52 @@ if(!org)var org={};if(!org.polymaps)org.polymaps={}; -(function(r){function J(){for(var h=0;ha.row){var f=h;h=a;a=f}return{x0:h.column,y0:h.row,x1:a.column,y1:a.row,dx:a.column-h.column,dy:a.row-h.row}}function X(h,a,f,d,c){f=Math.max(f,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(h.x00,k=a.dx<0;for(f=f;fa.dy){f=i;i=a;a=f}if(i.dy>h.dy){f=i;i=h;h=f}if(a.dy>h.dy){f=a;a=h;h=f}i.dy&&X(h,i,d,c,e);a.dy&&X(h,a,d,c,e)}r.version="2.0.1";var R={x:0,y:0};r.id=function(){var h=0;return function(){return++h}}();r.svg=function(h){return document.createElementNS(r.ns.svg,h)};r.ns={svg:"http://www.w3.org/2000/svg", -xlink:"http://www.w3.org/1999/xlink"};r.transform=function(h,a,f,d,c,e){var i={},j,k,s;if(!arguments.length){h=1;a=c=f=0;d=1;e=0}i.zoomFraction=function(m){if(!arguments.length)return k;k=m;j=Math.floor(k+Math.log(Math.sqrt(h*h+a*a+f*f+d*d))/Math.log(2));s=Math.pow(2,-j);return i};i.apply=function(m){var l=Math.pow(2,-m.zoom),g=Math.pow(2,m.zoom-j);return{column:(h*m.column*l+f*m.row*l+c)*g,row:(a*m.column*l+d*m.row*l+e)*g,zoom:m.zoom-j}};i.unapply=function(m){var l=Math.pow(2,-m.zoom),g=Math.pow(2, -m.zoom+j);return{column:(m.column*l*d-m.row*l*f-c*d+e*f)/(h*d-a*f)*g,row:(m.column*l*a-m.row*l*h-c*a+e*h)/(f*a-d*h)*g,zoom:m.zoom+j}};i.toString=function(){return"matrix("+[h*s,a*s,f*s,d*s].join(" ")+" 0 0)"};return i.zoomFraction(0)};r.cache=function(h,a){function f(l){m--;a&&a(l);delete i[l.key];if(l.next)l.next.prev=l.prev;else if(k=l.prev)k.next=null;if(l.prev)l.prev.next=l.next;else if(j=l.next)j.prev=null}function d(){for(var l=k;m>s;l=l.prev){if(!l)break;l.lock||f(l)}}var c={},e={},i={},j= -null,k=null,s=64,m=0;c.peek=function(l){return i[[l.zoom,l.column,l.row].join("/")]};c.load=function(l,g){var q=[l.zoom,l.column,l.row].join("/"),t=i[q];if(t){if(t.prev){if(t.prev.next=t.next)t.next.prev=t.prev;else k=t.prev;t.prev=null;t.next=j;j=j.prev=t}t.lock=1;return e[q]=t}t={key:q,column:l.column,row:l.row,zoom:l.zoom,next:j,prev:null,lock:1};h.call(null,t,g);e[q]=i[q]=t;if(j)j.prev=t;else k=t;j=t;m++;d();return t};c.unload=function(l){if(!(l in e))return false;var g=e[l];g.lock=0;delete e[l]; -g.request&&g.request.abort(false)?f(g):d();return g};c.locks=function(){return e};c.size=function(l){if(!arguments.length)return s;s=l;d();return c};return c};r.url=function(h){function a(d){var c=1<=e||!d.length)){c++;d.pop()()}}function a(i){for(var j=0;j=0)return n;return window};a.mouse=function(n){var u=(f.ownerSVGElement||f).createSVGPoint();u.x=n.clientX;u.y=n.clientY;return u.matrixTransform(f.getScreenCTM().inverse())}; -a.size=function(n){if(!arguments.length)return c;d=n;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var n=f.ownerSVGElement||f;if(n.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");n=C}b=n.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);e={x:c.x/2,y:c.y/2};h();a.dispatch({type:"resize"});return a};a.tileSize=function(n){if(!arguments.length)return i;i=n;a.dispatch({type:"move"}); -return a};a.center=function(n){if(!arguments.length)return j;j=n;h();a.dispatch({type:"move"});return a};a.panBy=function(n){var u=45/Math.pow(2,k+s-3),y=n.x*u;n=n.y*u;return a.center({lon:j.lon+(w*n-o*y)/i.x,lat:P(Q(j.lat)+(w*y+o*n)/i.y)})};a.centerRange=function(n){if(!arguments.length)return G;if(G=n){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}h();a.dispatch({type:"move"});return a};a.zoom=function(n){if(!arguments.length)return k+s;k=Math.max(l[0], -Math.min(l[1],n));s=k-(k=Math.round(k));m=Math.pow(2,s);return a.center(j)};a.zoomBy=function(n,u,y){if(arguments.length<2)return a.zoom(k+s+n);if(arguments.length<3)y=a.pointLocation(u);k=Math.max(l[0],Math.min(l[1],k+s+n));s=k-(k=Math.round(k));m=Math.pow(2,s);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(n){if(!arguments.length)return l;l=n;return a.zoom(k+s)};a.angle=function(n){if(!arguments.length)return g;g=n;q=Math.cos(g);t=Math.sin(g);o=Math.cos(-g); -w=Math.sin(-g);h();a.dispatch({type:"move"});return a};a.add=function(n){n.map(a);return a};a.remove=function(n){n.map(null);return a};a.dispatch=r.dispatch(a);return a};J.maps=[];J.add=function(h){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var o=d.map(),w=o.zoom(),B=w-(w=Math.round(w)),H=o.size(),G=o.angle(),C=o.tileSize(),n=o.locationCoordinate(o.center()); -i?m.removeAttribute("visibility"):m.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)g[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));m.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(l?l.zoomFraction(B):""));var y=o.pointCoordinate(n,R);u=o.pointCoordinate(n,{x:H.x,y:0});var D=o.pointCoordinate(n,H);o=o.pointCoordinate(n,{x:0,y:H.y});if(!l&&!G&&!B){n.column=(Math.round(C.x*n.column)+(H.x&1)/2)/ -C.x;n.row=(Math.round(C.y*n.row)+(H.y&1)/2)/C.y}var E=j?j(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;o.column*=B;o.row*=B;y.zoom=u.zoom=D.zoom=o.zoom+=E}if(l){y=l.unapply(y);u=l.unapply(u);D=l.unapply(D);o=l.unapply(o);n=l.unapply(n)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(i&&E>-5&&E<3){B=1<>u<>u<=1;t--)(g[t]=m.appendChild(r.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-t)+")");g[0]=m.appendChild(r.svg("g")); -d.init&&d.init(m);s.on("move",f).on("resize",f);f()}return d};d.container=function(){return m};d.id=function(q){if(!arguments.length)return k;k=q;return d};d.visible=function(q){if(!arguments.length)return i;i=q;s&&f();return d};d.transform=function(q){if(!arguments.length)return l;l=q;s&&f();return d};d.zoom=function(q){if(!arguments.length)return j;j=typeof q=="function"||q==null?q:function(){return q};return d};d.tile=function(q){if(!arguments.length)return e;e=q;return d};d.dispatch=r.dispatch(d); -d.on("load",function(q){if(q.tile.proxyRefs){for(var t in q.tile.proxyRefs){var o=q.tile.proxyRefs[t];--o.proxyCount<=0&&c.unload(t)&&o.element.parentNode.removeChild(o.element)}delete q.tile.proxyRefs}});return d};r.image=function(){var h=r.layer(function(f){var d=f.element=r.svg("image"),c=h.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")f.request=r.queue.image(d,a(f),function(){delete f.request; -f.ready=true;d.removeAttribute("opacity");h.dispatch({type:"load",tile:f})});else{f.ready=true;d.setAttributeNS(r.ns.xlink,"href",a);h.dispatch({type:"load",tile:f})}},function(f){f.request&&f.request.abort(true)}),a="about:blank";h.url=function(f){if(!arguments.length)return a;a=typeof f=="string"&&/{.}/.test(f)?r.url(f):f;return h};return h};r.geoJson=function(h){function a(g,q){var t=q({lat:g[1],lon:g[0]}),o=r.svg("circle");o.setAttribute("r",4.5);o.setAttribute("cx",t.x);o.setAttribute("cy",t.y); -return o}function f(g,q,t,o){o.push("M");for(var w=0;w0.5)m*=0.4}e||(e=k.pointLocation(l));k.off("move", -h);if(c)k.zoomBy(m,l,e);else if(m){var g=Date.now();if(g-d>200){k.zoomBy(m>0?+1:-1,l,e);d=g}}k.on("move",h);s.preventDefault();return false}var f={},d=0,c=true,e,i=/WebKit\/533/.test(navigator.userAgent),j=0.3,k;f.smooth=function(s){if(!arguments.length)return c;c=s;return f};f.map=function(s){if(!arguments.length)return k;(k=s).on("move",h);var m=k.container();m.addEventListener("mousemove",h,false);m.addEventListener("mousewheel",a,false);m.addEventListener("DOMMouseScroll",a,false);return f};return f}; -r.arrow=function(){function h(l){if(!(l.ctrlKey||l.altKey||l.metaKey)){var g=Date.now(),q=0,t=0,o=0;switch(l.keyCode){case 37:if(!c.left){e=g;c.left=1;c.right||(q=s)}break;case 39:if(!c.right){e=g;c.right=1;c.left||(q=-s)}break;case 38:if(!c.up){e=g;c.up=1;c.down||(t=s)}break;case 40:if(!c.down){e=g;c.down=1;c.up||(t=-s)}break;case 109:case 189:if(!c.plus){e=g;c.plus=1;c.minus||(o=-1)}break;case 61:case 187:if(!c.minus){e=g;c.minus=1;c.plus||(o=1)}break;default:return}if(o){g=m.zoom();m.zoom(o<0? -Math.ceil(g)-1:Math.floor(g)+1)}else if(q||t)m.panBy({x:q,y:t});if(!i&&c.left|c.right|c.up|c.down)i=setInterval(f,k);l.preventDefault()}}function a(l){e=Date.now();switch(l.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down=0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(i&&!(c.left|c.right|c.up|c.down))i=clearInterval(i);l.preventDefault()}function f(){if(m)if(!(Date.now()B+H&&E.panBy(D)},G));D&&E.panBy(D);B=Date.now();j(x)}function a(){q.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function f(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");D=x}}function d(x){return function(v){q.setAttribute("class", -"compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)-1:Math.floor(z)+1);j(v)}}function c(x){return function(v){E.zoom(x);j(v)}}function e(){this.setAttribute("class","active")}function i(){this.removeAttribute("class")}function j(x){x.stopPropagation();x.preventDefault()}function k(x){var v=Math.SQRT1_2*o,z=o*0.7,A=o*0.2,F=r.svg("g"),I=F.appendChild(r.svg("path")),N=F.appendChild(r.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events","all");I.setAttribute("d","M0,0L"+ -v+","+v+"A"+o+","+o+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class","chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",h,false);F.addEventListener("mouseover",f(x),false);F.addEventListener("mouseout",f(null),false);F.addEventListener("dblclick",j,false);return F}function s(x){var v=o*0.4,z=v/2,A=r.svg("g"),F=A.appendChild(r.svg("path")),I=A.appendChild(r.svg("path")),N=A.appendChild(r.svg("path")),M=A.appendChild(r.svg("path")); -F.setAttribute("class","back");F.setAttribute("d","M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d","M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",e,false);A.addEventListener("mouseout",i,false); -A.addEventListener("dblclick",j,false);return A}function m(x){var v=o*0.2,z=o*0.4,A=r.svg("g"),F=A.appendChild(r.svg("rect")),I=A.appendChild(r.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x",-z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",j,false);return A}function l(){if(q){var x= -o+6,v=x,z=E.size();switch(C){case "top-left":break;case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}q.setAttribute("transform","translate("+x+","+v+")");for(var A in t)A==E.zoom()?t[A].setAttribute("class","active"):t[A].removeAttribute("class")}}var g={},q,t={},o=30,w=16,B=0,H=250,G=50,C="top-left",n="small",u="small",y,D,E;g.radius=function(x){if(!arguments.length)return o;o=x;return g};g.speed=function(x){if(!arguments.length)return o;w= -x;return g};g.position=function(x){if(!arguments.length)return C;C=x;return g};g.pan=function(x){if(!arguments.length)return u;u=x;return g};g.zoom=function(x){if(!arguments.length)return n;n=x;return g};g.map=function(x){if(!arguments.length)return E;E=x;E.on("move",l);E.on("resize",l);q=E.container().appendChild(r.svg("g"));q.setAttribute("class","compass");if(u!="none"){var v=q.appendChild(r.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(r.svg("circle"));z.setAttribute("class","back"); -z.setAttribute("r",o);v.appendChild(k({x:0,y:-w})).setAttribute("transform","rotate(0)");v.appendChild(k({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(k({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(k({x:-w,y:0})).setAttribute("transform","rotate(270)");v=v.appendChild(r.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",o);window.addEventListener("mouseup",a,false)}if(n!="none"){v=q.appendChild(r.svg("g"));v.setAttribute("class", -"zoom");z=-0.5;if(n=="big"){t={};var A=E.zoomRange()[0];for(z=0;A<=E.zoomRange()[1];A++,z++)(t[A]=v.appendChild(m(A))).setAttribute("transform","translate(0,"+-(z+0.75)*o*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+o*(/^top-/.test(C)?A+(z+0.5)*0.4:-A)+")");v.appendChild(s(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*o*0.4+")");v.appendChild(s(-1)).setAttribute("transform","scale(-1)")}l();return g};return g};r.grid=function(){function h(){var c=d.firstChild,e=f.size(), -i=f.pointLocation(R);f.pointLocation(e);var j=Math.pow(2,4-Math.round(f.zoom()));i.lat=Math.floor(i.lat/j)*j;i.lon=Math.ceil(i.lon/j)*j;for(var k;(k=f.locationPoint(i).x)<=e.x;i.lon+=j){c||(c=d.appendChild(r.svg("line")));c.setAttribute("x1",k);c.setAttribute("x2",k);c.setAttribute("y1",0);c.setAttribute("y2",e.y);c=c.nextSibling}for(;(k=f.locationPoint(i).y)<=e.y;i.lat-=j){c||(c=d.appendChild(r.svg("line")));c.setAttribute("y1",k);c.setAttribute("y2",k);c.setAttribute("x1",0);c.setAttribute("x2", -e.x);c=c.nextSibling}for(;c;){e=c.nextSibling;d.removeChild(c);c=e}}var a={},f,d;a.map=function(c){if(!arguments.length)return f;f=c;f.on("move",h);f.on("resize",h);if(!d){d=r.svg("g");d.setAttribute("class","grid")}f.container().appendChild(d);h();return a};return a}})(org.polymaps); +(function(s){function J(){for(var f=0;fa.row){var g=f;f=a;a=g}return{x0:f.column,y0:f.row,x1:a.column,y1:a.row,dx:a.column-f.column,dy:a.row-f.row}}function X(f,a,g,d,c){g=Math.max(g,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(f.x00,j=a.dx<0;for(g=g;ga.dy){g=i;i=a;a=g}if(i.dy>f.dy){g=i;i=f;f=g}if(a.dy>f.dy){g=a;a=f;f=g}i.dy&&X(f,i,d,c,h);a.dy&&X(f,a,d,c,h)}s.version="2.0.1";var R={x:0,y:0};s.id=function(){var f=0;return function(){return++f}}();s.svg=function(f){return document.createElementNS(s.ns.svg,f)};s.ns={svg:"http://www.w3.org/2000/svg", +xlink:"http://www.w3.org/1999/xlink"};s.transform=function(f,a,g,d,c,h){var i={},o,j,r;if(!arguments.length){f=1;a=c=g=0;d=1;h=0}i.zoomFraction=function(k){if(!arguments.length)return j;j=k;o=Math.floor(j+Math.log(Math.sqrt(f*f+a*a+g*g+d*d))/Math.log(2));r=Math.pow(2,-o);return i};i.apply=function(k){var l=Math.pow(2,-k.zoom),e=Math.pow(2,k.zoom-o);return{column:(f*k.column*l+g*k.row*l+c)*e,row:(a*k.column*l+d*k.row*l+h)*e,zoom:k.zoom-o}};i.unapply=function(k){var l=Math.pow(2,-k.zoom),e=Math.pow(2, +k.zoom+o);return{column:(k.column*l*d-k.row*l*g-c*d+h*g)/(f*d-a*g)*e,row:(k.column*l*a-k.row*l*f-c*a+h*f)/(g*a-d*f)*e,zoom:k.zoom+o}};i.toString=function(){return"matrix("+[f*r,a*r,g*r,d*r].join(" ")+" 0 0)"};return i.zoomFraction(0)};s.cache=function(f,a){function g(l){k--;a&&a(l);delete i[l.key];if(l.next)l.next.prev=l.prev;else if(j=l.prev)j.next=null;if(l.prev)l.prev.next=l.next;else if(o=l.next)o.prev=null}function d(){for(var l=j;k>r;l=l.prev){if(!l)break;l.lock||g(l)}}var c={},h={},i={},o= +null,j=null,r=64,k=0;c.peek=function(l){return i[[l.zoom,l.column,l.row].join("/")]};c.load=function(l,e){var q=[l.zoom,l.column,l.row].join("/"),t=i[q];if(t){if(t.prev){if(t.prev.next=t.next)t.next.prev=t.prev;else j=t.prev;t.prev=null;t.next=o;o=o.prev=t}t.lock=1;return h[q]=t}t={key:q,column:l.column,row:l.row,zoom:l.zoom,next:o,prev:null,lock:1};f.call(null,t,e);h[q]=i[q]=t;if(o)o.prev=t;else j=t;o=t;k++;d();return t};c.unload=function(l){if(!(l in h))return false;var e=h[l];e.lock=0;delete h[l]; +e.request&&e.request.abort(false)?g(e):d();return e};c.locks=function(){return h};c.size=function(l){if(!arguments.length)return r;r=l;d();return c};return c};s.url=function(f){function a(d){var c=1<=h||!d.length)){c++;d.pop()()}}function a(i){for(var o=0;o=0)return m;return window};a.mouse=function(m){var u=(g.ownerSVGElement||g).createSVGPoint();u.x=m.clientX;u.y=m.clientY; +return u.matrixTransform(g.getScreenCTM().inverse())};a.size=function(m){if(!arguments.length)return c;d=m;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var m=g.ownerSVGElement||g;if(m.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");m=C}b=m.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);h={x:c.x/2,y:c.y/2};f();a.dispatch({type:"resize"});return a};a.tileSize=function(m){if(!arguments.length)return i; +i=m;a.dispatch({type:"move"});return a};a.center=function(m){if(!arguments.length)return o;o=m;f();a.dispatch({type:"move"});return a};a.panBy=function(m){var u=45/Math.pow(2,j+r-3),y=m.x*u;m=m.y*u;return a.center({lon:o.lon+(w*m-n*y)/i.x,lat:P(Q(o.lat)+(w*y+n*m)/i.y)})};a.centerRange=function(m){if(!arguments.length)return G;if(G=m){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}f();a.dispatch({type:"move"});return a};a.zoom=function(m){if(!arguments.length)return j+ +r;j=Math.max(l[0],Math.min(l[1],m));r=j-(j=Math.round(j));k=Math.pow(2,r);return a.center(o)};a.zoomBy=function(m,u,y){if(arguments.length<2)return a.zoom(j+r+m);if(arguments.length<3)y=a.pointLocation(u);j=Math.max(l[0],Math.min(l[1],j+r+m));r=j-(j=Math.round(j));k=Math.pow(2,r);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(m){if(!arguments.length)return l;l=m;return a.zoom(j+r)};a.angle=function(m){if(!arguments.length)return e;e=m;q=Math.cos(e);t=Math.sin(e); +n=Math.cos(-e);w=Math.sin(-e);f();a.dispatch({type:"move"});return a};a.add=function(m){m.map(a);return a};a.remove=function(m){m.map(null);return a};a.dispatch=s.dispatch(a);return a};J.maps=[];J.add=function(f){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var n=d.map(),w=n.zoom(),B=w-(w=Math.round(w)),H=n.size(),G=n.angle(),C=n.tileSize(),m=n.locationCoordinate(n.center()); +i?k.removeAttribute("visibility"):k.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)e[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));k.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(l?l.zoomFraction(B):""));var y=n.pointCoordinate(m,R);u=n.pointCoordinate(m,{x:H.x,y:0});var D=n.pointCoordinate(m,H);n=n.pointCoordinate(m,{x:0,y:H.y});if(!l&&!G&&!B){m.column=(Math.round(C.x*m.column)+(H.x&1)/2)/ +C.x;m.row=(Math.round(C.y*m.row)+(H.y&1)/2)/C.y}var E=o?o(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;n.column*=B;n.row*=B;y.zoom=u.zoom=D.zoom=n.zoom+=E}if(l){y=l.unapply(y);u=l.unapply(u);D=l.unapply(D);n=l.unapply(n);m=l.unapply(m)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(i&&E>-5&&E<3){B=1<>u<>u<=1;t--)(e[t]=k.appendChild(s.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-t)+")");e[0]=k.appendChild(s.svg("g")); +d.init&&d.init(k);r.on("move",g).on("resize",g);g()}return d};d.container=function(){return k};d.id=function(q){if(!arguments.length)return j;j=q;return d};d.visible=function(q){if(!arguments.length)return i;i=q;r&&g();return d};d.transform=function(q){if(!arguments.length)return l;l=q;r&&g();return d};d.zoom=function(q){if(!arguments.length)return o;o=typeof q=="function"||q==null?q:function(){return q};return d};d.tile=function(q){if(!arguments.length)return h;h=q;return d};d.dispatch=s.dispatch(d); +d.on("load",function(q){if(q.tile.proxyRefs){for(var t in q.tile.proxyRefs){var n=q.tile.proxyRefs[t];--n.proxyCount<=0&&c.unload(t)&&n.element.parentNode.removeChild(n.element)}delete q.tile.proxyRefs}});return d};s.image=function(){var f=s.layer(function(g){var d=g.element=s.svg("image"),c=f.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")g.request=s.queue.image(d,a(g),function(){delete g.request; +g.ready=true;d.removeAttribute("opacity");f.dispatch({type:"load",tile:g})});else{g.ready=true;d.setAttributeNS(s.ns.xlink,"href",a);f.dispatch({type:"load",tile:g})}},function(g){g.request&&g.request.abort(true)}),a="about:blank";f.url=function(g){if(!arguments.length)return a;a=typeof g=="string"&&/{.}/.test(g)?s.url(g):g;return f};return f};s.geoJson=function(f){function a(e,q){var t=q({lat:e[1],lon:e[0]}),n=s.svg("circle");n.setAttribute("r",4.5);n.setAttribute("cx",t.x);n.setAttribute("cy",t.y); +return n}function g(e,q,t,n){n.push("M");for(var w=0;w0.5)l*=0.4}i||(i=r.pointLocation(e));r.off("move",f);if(h)r.zoomBy(l,e,i);else if(l){var q=Date.now();if(q-c>200){r.zoomBy(l>0?+1:-1,e,i);c=q}}r.on("move",f);k.preventDefault();return false}function g(k){if(k.old){k.old.removeEventListener("mousemove", +f,false);k.old.removeEventListener("mousewheel",a,false);k.old.removeEventListener("DOMMouseScroll",a,false)}if(k["new"]){k["new"].addEventListener("mousemove",f,false);k["new"].addEventListener("mousewheel",a,false);k["new"].addEventListener("DOMMouseScroll",a,false)}}var d={},c=0,h=true,i,o=/WebKit\/533/.test(navigator.userAgent),j=0.3,r;d.smooth=function(k){if(!arguments.length)return h;h=k;return d};d.map=function(k){if(!arguments.length)return r;if(r){r.off("move",f);r.off("container",g)}g({old:r&& +r.container(),"new":k&&k.container()});if(r=k){r.on("move",f);r.on("container",g)}return d};return d};s.arrow=function(){function f(l){if(!(l.ctrlKey||l.altKey||l.metaKey)){var e=Date.now(),q=0,t=0,n=0;switch(l.keyCode){case 37:if(!c.left){h=e;c.left=1;c.right||(q=r)}break;case 39:if(!c.right){h=e;c.right=1;c.left||(q=-r)}break;case 38:if(!c.up){h=e;c.up=1;c.down||(t=r)}break;case 40:if(!c.down){h=e;c.down=1;c.up||(t=-r)}break;case 109:case 189:if(!c.plus){h=e;c.plus=1;c.minus||(n=-1)}break;case 61:case 187:if(!c.minus){h= +e;c.minus=1;c.plus||(n=1)}break;default:return}if(n){e=k.zoom();k.zoom(n<0?Math.ceil(e)-1:Math.floor(e)+1)}else if(q||t)k.panBy({x:q,y:t});if(!i&&c.left|c.right|c.up|c.down)i=setInterval(g,j);l.preventDefault()}}function a(l){h=Date.now();switch(l.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down=0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(i&&!(c.left|c.right|c.up|c.down))i=clearInterval(i);l.preventDefault()} +function g(){if(k)if(!(Date.now()B+H&&E.panBy(D)},G));D&&E.panBy(D);B=Date.now();o(x)}function a(){q.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function g(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class"); +D=x}}function d(x){return function(v){q.setAttribute("class","compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)-1:Math.floor(z)+1);o(v)}}function c(x){return function(v){E.zoom(x);o(v)}}function h(){this.setAttribute("class","active")}function i(){this.removeAttribute("class")}function o(x){x.stopPropagation();x.preventDefault()}function j(x){var v=Math.SQRT1_2*n,z=n*0.7,A=n*0.2,F=s.svg("g"),I=F.appendChild(s.svg("path")),N=F.appendChild(s.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events", +"all");I.setAttribute("d","M0,0L"+v+","+v+"A"+n+","+n+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class","chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",f,false);F.addEventListener("mouseover",g(x),false);F.addEventListener("mouseout",g(null),false);F.addEventListener("dblclick",o,false);return F}function r(x){var v=n*0.4,z=v/2,A=s.svg("g"),F=A.appendChild(s.svg("path")),I=A.appendChild(s.svg("path")),N=A.appendChild(s.svg("path")), +M=A.appendChild(s.svg("path"));F.setAttribute("class","back");F.setAttribute("d","M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d","M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",h,false);A.addEventListener("mouseout", +i,false);A.addEventListener("dblclick",o,false);return A}function k(x){var v=n*0.2,z=n*0.4,A=s.svg("g"),F=A.appendChild(s.svg("rect")),I=A.appendChild(s.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x",-z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",o,false);return A} +function l(){if(q){var x=n+6,v=x,z=E.size();switch(C){case "top-left":break;case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}q.setAttribute("transform","translate("+x+","+v+")");for(var A in t)A==E.zoom()?t[A].setAttribute("class","active"):t[A].removeAttribute("class")}}var e={},q,t={},n=30,w=16,B=0,H=250,G=50,C="top-left",m="small",u="small",y,D,E;e.radius=function(x){if(!arguments.length)return n;n=x;return e};e.speed=function(x){if(!arguments.length)return n; +w=x;return e};e.position=function(x){if(!arguments.length)return C;C=x;return e};e.pan=function(x){if(!arguments.length)return u;u=x;return e};e.zoom=function(x){if(!arguments.length)return m;m=x;return e};e.map=function(x){if(!arguments.length)return E;E=x;E.on("move",l);E.on("resize",l);q=E.container().appendChild(s.svg("g"));q.setAttribute("class","compass");if(u!="none"){var v=q.appendChild(s.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(s.svg("circle"));z.setAttribute("class","back"); +z.setAttribute("r",n);v.appendChild(j({x:0,y:-w})).setAttribute("transform","rotate(0)");v.appendChild(j({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(j({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(j({x:-w,y:0})).setAttribute("transform","rotate(270)");v=v.appendChild(s.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",n);window.addEventListener("mouseup",a,false)}if(m!="none"){v=q.appendChild(s.svg("g"));v.setAttribute("class", +"zoom");z=-0.5;if(m=="big"){t={};var A=E.zoomRange()[0];for(z=0;A<=E.zoomRange()[1];A++,z++)(t[A]=v.appendChild(k(A))).setAttribute("transform","translate(0,"+-(z+0.75)*n*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+n*(/^top-/.test(C)?A+(z+0.5)*0.4:-A)+")");v.appendChild(r(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*n*0.4+")");v.appendChild(r(-1)).setAttribute("transform","scale(-1)")}l();return e};return e};s.grid=function(){function f(){var c=d.firstChild,h=g.size(), +i=g.pointLocation(R);g.pointLocation(h);var o=Math.pow(2,4-Math.round(g.zoom()));i.lat=Math.floor(i.lat/o)*o;i.lon=Math.ceil(i.lon/o)*o;for(var j;(j=g.locationPoint(i).x)<=h.x;i.lon+=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("x1",j);c.setAttribute("x2",j);c.setAttribute("y1",0);c.setAttribute("y2",h.y);c=c.nextSibling}for(;(j=g.locationPoint(i).y)<=h.y;i.lat-=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("y1",j);c.setAttribute("y2",j);c.setAttribute("x1",0);c.setAttribute("x2", +h.x);c=c.nextSibling}for(;c;){h=c.nextSibling;d.removeChild(c);c=h}}var a={},g,d;a.map=function(c){if(!arguments.length)return g;g=c;g.on("move",f);g.on("resize",f);if(!d){d=s.svg("g");d.setAttribute("class","grid")}g.container().appendChild(d);f();return a};return a}})(org.polymaps); diff --git a/src/Map.js b/src/Map.js index 90015b8..dc49a19 100644 --- a/src/Map.js +++ b/src/Map.js @@ -102,6 +102,7 @@ po.map = function() { map.container = function(x) { if (!arguments.length) return container; + map.dispatch({type: "container", 'old':container, 'new':x}); container = x; container.setAttribute("class", "map"); container.appendChild(rect); diff --git a/src/Touch.js b/src/Touch.js index 016674e..749660a 100644 --- a/src/Touch.js +++ b/src/Touch.js @@ -2,27 +2,35 @@ po.touch = function() { var touch = {}, map, last; - + + function container(c) { + if (c['old']) { + c['old'].removeEventListener("touchstart", touchstart, false); + c['old'].removeEventListener("touchmove", touchmove, false); + c['old'].removeEventListener("touchend", touchend, false); + c['old'].removeEventListener("touchcancel", touchend, false); + } + if (c['new']) { + console.log(c['new']); + c['new'].addEventListener("touchstart", touchstart, false); + c['new'].addEventListener("touchmove", touchmove, false); + c['new'].addEventListener("touchend", touchend, false); + c['new'].addEventListener("touchcancel", touchend, false); + } + } + touch.map = function(x) { if (!arguments.length) return map; if (map) { - var container = map.container(); - container.removeEventListener("touchstart", touchstart, false); - container.removeEventListener("touchmove", touchmove, false); - container.removeEventListener("touchend", touchend, false); - container.removeEventListener("touchcancel", touchend, false); + map.off("container", container); } + container({'old':(map && map.container()), 'new':(x && x.container())}); map = x; if (map) { - var container = map.container(); - container.addEventListener("touchstart", touchstart, false); - container.addEventListener("touchmove", touchmove, false); - container.addEventListener("touchend", touchend, false); - container.addEventListener("touchcancel", touchend, false); - // TODO update if map container changes? + map.on("container", container); } return touch; diff --git a/src/Wheel.js b/src/Wheel.js index c7d4458..15993eb 100644 --- a/src/Wheel.js +++ b/src/Wheel.js @@ -39,27 +39,35 @@ po.wheel = function() { smooth = x; return wheel; }; - + + + function container(c) { + if (c['old']) { + c['old'].removeEventListener("mousemove", move, false); + c['old'].removeEventListener("mousewheel", mousewheel, false); + c['old'].removeEventListener("DOMMouseScroll", mousewheel, false); + } + if (c['new']) { + c['new'].addEventListener("mousemove", move, false); + c['new'].addEventListener("mousewheel", mousewheel, false); + c['new'].addEventListener("DOMMouseScroll", mousewheel, false); + } + } + wheel.map = function(x) { if (!arguments.length) return map; if (map) { map.off("move", move); - var container = map.container(); - container.removeEventListener("mousemove", move, false); - container.removeEventListener("mousewheel", mousewheel, false); - container.removeEventListener("DOMMouseScroll", mousewheel, false); + map.off("container", container); } + container({'old':(map && map.container()), 'new':(x && x.container())}); map = x; if (map) { map.on("move", move); - var container = map.container(); - container.addEventListener("mousemove", move, false); - container.addEventListener("mousewheel", mousewheel, false); - container.addEventListener("DOMMouseScroll", mousewheel, false); - // TODO update if map container changes? + map.on("container", container); } return wheel; From c1a6c6df6c3a1ba4a52d28e855599d41ab7809e3 Mon Sep 17 00:00:00 2001 From: Nathan Vander Wilt Date: Mon, 21 Mar 2011 11:44:12 +0100 Subject: [PATCH 5/7] Revert "wheel and touch handlers now handle new map container change event (though the map itself doesn't seem to change containers corrrectly)" This reverts commit 74e22ce12b899236fe1c6ce6b802d89e03e3026f. --- polymaps.js | 74 ++++++++--------------------------- polymaps.min.js | 101 ++++++++++++++++++++++++------------------------ src/Map.js | 1 - src/Touch.js | 32 ++++++--------- src/Wheel.js | 28 +++++--------- 5 files changed, 88 insertions(+), 148 deletions(-) diff --git a/polymaps.js b/polymaps.js index 5fd9751..c724045 100644 --- a/polymaps.js +++ b/polymaps.js @@ -436,7 +436,6 @@ po.map = function() { map.container = function(x) { if (!arguments.length) return container; - map.dispatch({type: "container", 'old':container, 'new':x}); container = x; container.setAttribute("class", "map"); container.appendChild(rect); @@ -1253,37 +1252,17 @@ po.touch = function() { var touch = {}, map, last; - - function container(c) { - if (c['old']) { - c['old'].removeEventListener("touchstart", touchstart, false); - c['old'].removeEventListener("touchmove", touchmove, false); - c['old'].removeEventListener("touchend", touchend, false); - c['old'].removeEventListener("touchcancel", touchend, false); - } - if (c['new']) { - console.log(c['new']); - c['new'].addEventListener("touchstart", touchstart, false); - c['new'].addEventListener("touchmove", touchmove, false); - c['new'].addEventListener("touchend", touchend, false); - c['new'].addEventListener("touchcancel", touchend, false); - } - } - + touch.map = function(x) { if (!arguments.length) return map; - - if (map) { - map.off("container", container); - } - - container({'old':(map && map.container()), 'new':(x && x.container())}); map = x; - - if (map) { - map.on("container", container); - } - + // TODO remove from old map container? + // TODO update if map container changes? + var container = map.container(); + container.addEventListener("touchstart", touchstart, false); + container.addEventListener("touchmove", touchmove, false); + container.addEventListener("touchend", touchend, false); + container.addEventListener("touchcancel", touchend, false); return touch; } @@ -1384,37 +1363,16 @@ po.wheel = function() { smooth = x; return wheel; }; - - - function container(c) { - if (c['old']) { - c['old'].removeEventListener("mousemove", move, false); - c['old'].removeEventListener("mousewheel", mousewheel, false); - c['old'].removeEventListener("DOMMouseScroll", mousewheel, false); - } - if (c['new']) { - c['new'].addEventListener("mousemove", move, false); - c['new'].addEventListener("mousewheel", mousewheel, false); - c['new'].addEventListener("DOMMouseScroll", mousewheel, false); - } - } - + wheel.map = function(x) { if (!arguments.length) return map; - - if (map) { - map.off("move", move); - map.off("container", container); - } - - container({'old':(map && map.container()), 'new':(x && x.container())}); - map = x; - - if (map) { - map.on("move", move); - map.on("container", container); - } - + (map = x).on("move", move); + // TODO remove from old map container? + // TODO update if map container changes? + var container = map.container(); + container.addEventListener("mousemove", move, false); + container.addEventListener("mousewheel", mousewheel, false); + container.addEventListener("DOMMouseScroll", mousewheel, false); return wheel; }; diff --git a/polymaps.min.js b/polymaps.min.js index f1543b4..e9b750a 100644 --- a/polymaps.min.js +++ b/polymaps.min.js @@ -1,52 +1,51 @@ if(!org)var org={};if(!org.polymaps)org.polymaps={}; -(function(s){function J(){for(var f=0;fa.row){var g=f;f=a;a=g}return{x0:f.column,y0:f.row,x1:a.column,y1:a.row,dx:a.column-f.column,dy:a.row-f.row}}function X(f,a,g,d,c){g=Math.max(g,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(f.x00,j=a.dx<0;for(g=g;ga.dy){g=i;i=a;a=g}if(i.dy>f.dy){g=i;i=f;f=g}if(a.dy>f.dy){g=a;a=f;f=g}i.dy&&X(f,i,d,c,h);a.dy&&X(f,a,d,c,h)}s.version="2.0.1";var R={x:0,y:0};s.id=function(){var f=0;return function(){return++f}}();s.svg=function(f){return document.createElementNS(s.ns.svg,f)};s.ns={svg:"http://www.w3.org/2000/svg", -xlink:"http://www.w3.org/1999/xlink"};s.transform=function(f,a,g,d,c,h){var i={},o,j,r;if(!arguments.length){f=1;a=c=g=0;d=1;h=0}i.zoomFraction=function(k){if(!arguments.length)return j;j=k;o=Math.floor(j+Math.log(Math.sqrt(f*f+a*a+g*g+d*d))/Math.log(2));r=Math.pow(2,-o);return i};i.apply=function(k){var l=Math.pow(2,-k.zoom),e=Math.pow(2,k.zoom-o);return{column:(f*k.column*l+g*k.row*l+c)*e,row:(a*k.column*l+d*k.row*l+h)*e,zoom:k.zoom-o}};i.unapply=function(k){var l=Math.pow(2,-k.zoom),e=Math.pow(2, -k.zoom+o);return{column:(k.column*l*d-k.row*l*g-c*d+h*g)/(f*d-a*g)*e,row:(k.column*l*a-k.row*l*f-c*a+h*f)/(g*a-d*f)*e,zoom:k.zoom+o}};i.toString=function(){return"matrix("+[f*r,a*r,g*r,d*r].join(" ")+" 0 0)"};return i.zoomFraction(0)};s.cache=function(f,a){function g(l){k--;a&&a(l);delete i[l.key];if(l.next)l.next.prev=l.prev;else if(j=l.prev)j.next=null;if(l.prev)l.prev.next=l.next;else if(o=l.next)o.prev=null}function d(){for(var l=j;k>r;l=l.prev){if(!l)break;l.lock||g(l)}}var c={},h={},i={},o= -null,j=null,r=64,k=0;c.peek=function(l){return i[[l.zoom,l.column,l.row].join("/")]};c.load=function(l,e){var q=[l.zoom,l.column,l.row].join("/"),t=i[q];if(t){if(t.prev){if(t.prev.next=t.next)t.next.prev=t.prev;else j=t.prev;t.prev=null;t.next=o;o=o.prev=t}t.lock=1;return h[q]=t}t={key:q,column:l.column,row:l.row,zoom:l.zoom,next:o,prev:null,lock:1};f.call(null,t,e);h[q]=i[q]=t;if(o)o.prev=t;else j=t;o=t;k++;d();return t};c.unload=function(l){if(!(l in h))return false;var e=h[l];e.lock=0;delete h[l]; -e.request&&e.request.abort(false)?g(e):d();return e};c.locks=function(){return h};c.size=function(l){if(!arguments.length)return r;r=l;d();return c};return c};s.url=function(f){function a(d){var c=1<=h||!d.length)){c++;d.pop()()}}function a(i){for(var o=0;o=0)return m;return window};a.mouse=function(m){var u=(g.ownerSVGElement||g).createSVGPoint();u.x=m.clientX;u.y=m.clientY; -return u.matrixTransform(g.getScreenCTM().inverse())};a.size=function(m){if(!arguments.length)return c;d=m;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var m=g.ownerSVGElement||g;if(m.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");m=C}b=m.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);h={x:c.x/2,y:c.y/2};f();a.dispatch({type:"resize"});return a};a.tileSize=function(m){if(!arguments.length)return i; -i=m;a.dispatch({type:"move"});return a};a.center=function(m){if(!arguments.length)return o;o=m;f();a.dispatch({type:"move"});return a};a.panBy=function(m){var u=45/Math.pow(2,j+r-3),y=m.x*u;m=m.y*u;return a.center({lon:o.lon+(w*m-n*y)/i.x,lat:P(Q(o.lat)+(w*y+n*m)/i.y)})};a.centerRange=function(m){if(!arguments.length)return G;if(G=m){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}f();a.dispatch({type:"move"});return a};a.zoom=function(m){if(!arguments.length)return j+ -r;j=Math.max(l[0],Math.min(l[1],m));r=j-(j=Math.round(j));k=Math.pow(2,r);return a.center(o)};a.zoomBy=function(m,u,y){if(arguments.length<2)return a.zoom(j+r+m);if(arguments.length<3)y=a.pointLocation(u);j=Math.max(l[0],Math.min(l[1],j+r+m));r=j-(j=Math.round(j));k=Math.pow(2,r);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(m){if(!arguments.length)return l;l=m;return a.zoom(j+r)};a.angle=function(m){if(!arguments.length)return e;e=m;q=Math.cos(e);t=Math.sin(e); -n=Math.cos(-e);w=Math.sin(-e);f();a.dispatch({type:"move"});return a};a.add=function(m){m.map(a);return a};a.remove=function(m){m.map(null);return a};a.dispatch=s.dispatch(a);return a};J.maps=[];J.add=function(f){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var n=d.map(),w=n.zoom(),B=w-(w=Math.round(w)),H=n.size(),G=n.angle(),C=n.tileSize(),m=n.locationCoordinate(n.center()); -i?k.removeAttribute("visibility"):k.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)e[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));k.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(l?l.zoomFraction(B):""));var y=n.pointCoordinate(m,R);u=n.pointCoordinate(m,{x:H.x,y:0});var D=n.pointCoordinate(m,H);n=n.pointCoordinate(m,{x:0,y:H.y});if(!l&&!G&&!B){m.column=(Math.round(C.x*m.column)+(H.x&1)/2)/ -C.x;m.row=(Math.round(C.y*m.row)+(H.y&1)/2)/C.y}var E=o?o(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;n.column*=B;n.row*=B;y.zoom=u.zoom=D.zoom=n.zoom+=E}if(l){y=l.unapply(y);u=l.unapply(u);D=l.unapply(D);n=l.unapply(n);m=l.unapply(m)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(i&&E>-5&&E<3){B=1<>u<>u<=1;t--)(e[t]=k.appendChild(s.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-t)+")");e[0]=k.appendChild(s.svg("g")); -d.init&&d.init(k);r.on("move",g).on("resize",g);g()}return d};d.container=function(){return k};d.id=function(q){if(!arguments.length)return j;j=q;return d};d.visible=function(q){if(!arguments.length)return i;i=q;r&&g();return d};d.transform=function(q){if(!arguments.length)return l;l=q;r&&g();return d};d.zoom=function(q){if(!arguments.length)return o;o=typeof q=="function"||q==null?q:function(){return q};return d};d.tile=function(q){if(!arguments.length)return h;h=q;return d};d.dispatch=s.dispatch(d); -d.on("load",function(q){if(q.tile.proxyRefs){for(var t in q.tile.proxyRefs){var n=q.tile.proxyRefs[t];--n.proxyCount<=0&&c.unload(t)&&n.element.parentNode.removeChild(n.element)}delete q.tile.proxyRefs}});return d};s.image=function(){var f=s.layer(function(g){var d=g.element=s.svg("image"),c=f.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")g.request=s.queue.image(d,a(g),function(){delete g.request; -g.ready=true;d.removeAttribute("opacity");f.dispatch({type:"load",tile:g})});else{g.ready=true;d.setAttributeNS(s.ns.xlink,"href",a);f.dispatch({type:"load",tile:g})}},function(g){g.request&&g.request.abort(true)}),a="about:blank";f.url=function(g){if(!arguments.length)return a;a=typeof g=="string"&&/{.}/.test(g)?s.url(g):g;return f};return f};s.geoJson=function(f){function a(e,q){var t=q({lat:e[1],lon:e[0]}),n=s.svg("circle");n.setAttribute("r",4.5);n.setAttribute("cx",t.x);n.setAttribute("cy",t.y); -return n}function g(e,q,t,n){n.push("M");for(var w=0;w0.5)l*=0.4}i||(i=r.pointLocation(e));r.off("move",f);if(h)r.zoomBy(l,e,i);else if(l){var q=Date.now();if(q-c>200){r.zoomBy(l>0?+1:-1,e,i);c=q}}r.on("move",f);k.preventDefault();return false}function g(k){if(k.old){k.old.removeEventListener("mousemove", -f,false);k.old.removeEventListener("mousewheel",a,false);k.old.removeEventListener("DOMMouseScroll",a,false)}if(k["new"]){k["new"].addEventListener("mousemove",f,false);k["new"].addEventListener("mousewheel",a,false);k["new"].addEventListener("DOMMouseScroll",a,false)}}var d={},c=0,h=true,i,o=/WebKit\/533/.test(navigator.userAgent),j=0.3,r;d.smooth=function(k){if(!arguments.length)return h;h=k;return d};d.map=function(k){if(!arguments.length)return r;if(r){r.off("move",f);r.off("container",g)}g({old:r&& -r.container(),"new":k&&k.container()});if(r=k){r.on("move",f);r.on("container",g)}return d};return d};s.arrow=function(){function f(l){if(!(l.ctrlKey||l.altKey||l.metaKey)){var e=Date.now(),q=0,t=0,n=0;switch(l.keyCode){case 37:if(!c.left){h=e;c.left=1;c.right||(q=r)}break;case 39:if(!c.right){h=e;c.right=1;c.left||(q=-r)}break;case 38:if(!c.up){h=e;c.up=1;c.down||(t=r)}break;case 40:if(!c.down){h=e;c.down=1;c.up||(t=-r)}break;case 109:case 189:if(!c.plus){h=e;c.plus=1;c.minus||(n=-1)}break;case 61:case 187:if(!c.minus){h= -e;c.minus=1;c.plus||(n=1)}break;default:return}if(n){e=k.zoom();k.zoom(n<0?Math.ceil(e)-1:Math.floor(e)+1)}else if(q||t)k.panBy({x:q,y:t});if(!i&&c.left|c.right|c.up|c.down)i=setInterval(g,j);l.preventDefault()}}function a(l){h=Date.now();switch(l.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down=0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(i&&!(c.left|c.right|c.up|c.down))i=clearInterval(i);l.preventDefault()} -function g(){if(k)if(!(Date.now()B+H&&E.panBy(D)},G));D&&E.panBy(D);B=Date.now();o(x)}function a(){q.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function g(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class"); -D=x}}function d(x){return function(v){q.setAttribute("class","compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)-1:Math.floor(z)+1);o(v)}}function c(x){return function(v){E.zoom(x);o(v)}}function h(){this.setAttribute("class","active")}function i(){this.removeAttribute("class")}function o(x){x.stopPropagation();x.preventDefault()}function j(x){var v=Math.SQRT1_2*n,z=n*0.7,A=n*0.2,F=s.svg("g"),I=F.appendChild(s.svg("path")),N=F.appendChild(s.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events", -"all");I.setAttribute("d","M0,0L"+v+","+v+"A"+n+","+n+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class","chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",f,false);F.addEventListener("mouseover",g(x),false);F.addEventListener("mouseout",g(null),false);F.addEventListener("dblclick",o,false);return F}function r(x){var v=n*0.4,z=v/2,A=s.svg("g"),F=A.appendChild(s.svg("path")),I=A.appendChild(s.svg("path")),N=A.appendChild(s.svg("path")), -M=A.appendChild(s.svg("path"));F.setAttribute("class","back");F.setAttribute("d","M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d","M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",h,false);A.addEventListener("mouseout", -i,false);A.addEventListener("dblclick",o,false);return A}function k(x){var v=n*0.2,z=n*0.4,A=s.svg("g"),F=A.appendChild(s.svg("rect")),I=A.appendChild(s.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x",-z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",o,false);return A} -function l(){if(q){var x=n+6,v=x,z=E.size();switch(C){case "top-left":break;case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}q.setAttribute("transform","translate("+x+","+v+")");for(var A in t)A==E.zoom()?t[A].setAttribute("class","active"):t[A].removeAttribute("class")}}var e={},q,t={},n=30,w=16,B=0,H=250,G=50,C="top-left",m="small",u="small",y,D,E;e.radius=function(x){if(!arguments.length)return n;n=x;return e};e.speed=function(x){if(!arguments.length)return n; -w=x;return e};e.position=function(x){if(!arguments.length)return C;C=x;return e};e.pan=function(x){if(!arguments.length)return u;u=x;return e};e.zoom=function(x){if(!arguments.length)return m;m=x;return e};e.map=function(x){if(!arguments.length)return E;E=x;E.on("move",l);E.on("resize",l);q=E.container().appendChild(s.svg("g"));q.setAttribute("class","compass");if(u!="none"){var v=q.appendChild(s.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(s.svg("circle"));z.setAttribute("class","back"); -z.setAttribute("r",n);v.appendChild(j({x:0,y:-w})).setAttribute("transform","rotate(0)");v.appendChild(j({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(j({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(j({x:-w,y:0})).setAttribute("transform","rotate(270)");v=v.appendChild(s.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",n);window.addEventListener("mouseup",a,false)}if(m!="none"){v=q.appendChild(s.svg("g"));v.setAttribute("class", -"zoom");z=-0.5;if(m=="big"){t={};var A=E.zoomRange()[0];for(z=0;A<=E.zoomRange()[1];A++,z++)(t[A]=v.appendChild(k(A))).setAttribute("transform","translate(0,"+-(z+0.75)*n*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+n*(/^top-/.test(C)?A+(z+0.5)*0.4:-A)+")");v.appendChild(r(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*n*0.4+")");v.appendChild(r(-1)).setAttribute("transform","scale(-1)")}l();return e};return e};s.grid=function(){function f(){var c=d.firstChild,h=g.size(), -i=g.pointLocation(R);g.pointLocation(h);var o=Math.pow(2,4-Math.round(g.zoom()));i.lat=Math.floor(i.lat/o)*o;i.lon=Math.ceil(i.lon/o)*o;for(var j;(j=g.locationPoint(i).x)<=h.x;i.lon+=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("x1",j);c.setAttribute("x2",j);c.setAttribute("y1",0);c.setAttribute("y2",h.y);c=c.nextSibling}for(;(j=g.locationPoint(i).y)<=h.y;i.lat-=o){c||(c=d.appendChild(s.svg("line")));c.setAttribute("y1",j);c.setAttribute("y2",j);c.setAttribute("x1",0);c.setAttribute("x2", -h.x);c=c.nextSibling}for(;c;){h=c.nextSibling;d.removeChild(c);c=h}}var a={},g,d;a.map=function(c){if(!arguments.length)return g;g=c;g.on("move",f);g.on("resize",f);if(!d){d=s.svg("g");d.setAttribute("class","grid")}g.container().appendChild(d);f();return a};return a}})(org.polymaps); +(function(r){function J(){for(var h=0;ha.row){var f=h;h=a;a=f}return{x0:h.column,y0:h.row,x1:a.column,y1:a.row,dx:a.column-h.column,dy:a.row-h.row}}function X(h,a,f,d,c){f=Math.max(f,Math.floor(a.y0));d=Math.min(d,Math.ceil(a.y1));if(h.x00,k=a.dx<0;for(f=f;fa.dy){f=i;i=a;a=f}if(i.dy>h.dy){f=i;i=h;h=f}if(a.dy>h.dy){f=a;a=h;h=f}i.dy&&X(h,i,d,c,e);a.dy&&X(h,a,d,c,e)}r.version="2.0.1";var R={x:0,y:0};r.id=function(){var h=0;return function(){return++h}}();r.svg=function(h){return document.createElementNS(r.ns.svg,h)};r.ns={svg:"http://www.w3.org/2000/svg", +xlink:"http://www.w3.org/1999/xlink"};r.transform=function(h,a,f,d,c,e){var i={},j,k,s;if(!arguments.length){h=1;a=c=f=0;d=1;e=0}i.zoomFraction=function(m){if(!arguments.length)return k;k=m;j=Math.floor(k+Math.log(Math.sqrt(h*h+a*a+f*f+d*d))/Math.log(2));s=Math.pow(2,-j);return i};i.apply=function(m){var l=Math.pow(2,-m.zoom),g=Math.pow(2,m.zoom-j);return{column:(h*m.column*l+f*m.row*l+c)*g,row:(a*m.column*l+d*m.row*l+e)*g,zoom:m.zoom-j}};i.unapply=function(m){var l=Math.pow(2,-m.zoom),g=Math.pow(2, +m.zoom+j);return{column:(m.column*l*d-m.row*l*f-c*d+e*f)/(h*d-a*f)*g,row:(m.column*l*a-m.row*l*h-c*a+e*h)/(f*a-d*h)*g,zoom:m.zoom+j}};i.toString=function(){return"matrix("+[h*s,a*s,f*s,d*s].join(" ")+" 0 0)"};return i.zoomFraction(0)};r.cache=function(h,a){function f(l){m--;a&&a(l);delete i[l.key];if(l.next)l.next.prev=l.prev;else if(k=l.prev)k.next=null;if(l.prev)l.prev.next=l.next;else if(j=l.next)j.prev=null}function d(){for(var l=k;m>s;l=l.prev){if(!l)break;l.lock||f(l)}}var c={},e={},i={},j= +null,k=null,s=64,m=0;c.peek=function(l){return i[[l.zoom,l.column,l.row].join("/")]};c.load=function(l,g){var q=[l.zoom,l.column,l.row].join("/"),t=i[q];if(t){if(t.prev){if(t.prev.next=t.next)t.next.prev=t.prev;else k=t.prev;t.prev=null;t.next=j;j=j.prev=t}t.lock=1;return e[q]=t}t={key:q,column:l.column,row:l.row,zoom:l.zoom,next:j,prev:null,lock:1};h.call(null,t,g);e[q]=i[q]=t;if(j)j.prev=t;else k=t;j=t;m++;d();return t};c.unload=function(l){if(!(l in e))return false;var g=e[l];g.lock=0;delete e[l]; +g.request&&g.request.abort(false)?f(g):d();return g};c.locks=function(){return e};c.size=function(l){if(!arguments.length)return s;s=l;d();return c};return c};r.url=function(h){function a(d){var c=1<=e||!d.length)){c++;d.pop()()}}function a(i){for(var j=0;j=0)return n;return window};a.mouse=function(n){var u=(f.ownerSVGElement||f).createSVGPoint();u.x=n.clientX;u.y=n.clientY;return u.matrixTransform(f.getScreenCTM().inverse())}; +a.size=function(n){if(!arguments.length)return c;d=n;return a.resize()};a.resize=function(){if(d){c=d;J.remove(a)}else{var n=f.ownerSVGElement||f;if(n.offsetWidth==null){C.setAttribute("width","100%");C.setAttribute("height","100%");n=C}b=n.getBoundingClientRect();c={x:b.width,y:b.height};J.add(a)}C.setAttribute("width",c.x);C.setAttribute("height",c.y);e={x:c.x/2,y:c.y/2};h();a.dispatch({type:"resize"});return a};a.tileSize=function(n){if(!arguments.length)return i;i=n;a.dispatch({type:"move"}); +return a};a.center=function(n){if(!arguments.length)return j;j=n;h();a.dispatch({type:"move"});return a};a.panBy=function(n){var u=45/Math.pow(2,k+s-3),y=n.x*u;n=n.y*u;return a.center({lon:j.lon+(w*n-o*y)/i.x,lat:P(Q(j.lat)+(w*y+o*n)/i.y)})};a.centerRange=function(n){if(!arguments.length)return G;if(G=n){B=G[0].lat>-90?Q(G[0].lat):-Infinity;H=G[0].lat<90?Q(G[1].lat):Infinity}else{B=-Infinity;H=Infinity}h();a.dispatch({type:"move"});return a};a.zoom=function(n){if(!arguments.length)return k+s;k=Math.max(l[0], +Math.min(l[1],n));s=k-(k=Math.round(k));m=Math.pow(2,s);return a.center(j)};a.zoomBy=function(n,u,y){if(arguments.length<2)return a.zoom(k+s+n);if(arguments.length<3)y=a.pointLocation(u);k=Math.max(l[0],Math.min(l[1],k+s+n));s=k-(k=Math.round(k));m=Math.pow(2,s);var D=a.locationPoint(y);return a.panBy({x:u.x-D.x,y:u.y-D.y})};a.zoomRange=function(n){if(!arguments.length)return l;l=n;return a.zoom(k+s)};a.angle=function(n){if(!arguments.length)return g;g=n;q=Math.cos(g);t=Math.sin(g);o=Math.cos(-g); +w=Math.sin(-g);h();a.dispatch({type:"move"});return a};a.add=function(n){n.map(a);return a};a.remove=function(n){n.map(null);return a};a.dispatch=r.dispatch(a);return a};J.maps=[];J.add=function(h){for(var a=0;a>L,row:F>>L,zoom:I-L}))&&K.ready){x[K.key]=c.load(S);K.proxyCount++;O.proxyRefs[K.key]=K;break}}x[O.key]=O}}var o=d.map(),w=o.zoom(),B=w-(w=Math.round(w)),H=o.size(),G=o.angle(),C=o.tileSize(),n=o.locationCoordinate(o.center()); +i?m.removeAttribute("visibility"):m.setAttribute("visibility","hidden");for(var u=-4;u<=2;u++)g[u].setAttribute("class","zoom"+(u<0?"":"+")+u+" zoom"+(w+u));m.setAttribute("transform","translate("+H.x/2+","+H.y/2+")"+(G?"rotate("+G/Math.PI*180+")":"")+(B?"scale("+Math.pow(2,B)+")":"")+(l?l.zoomFraction(B):""));var y=o.pointCoordinate(n,R);u=o.pointCoordinate(n,{x:H.x,y:0});var D=o.pointCoordinate(n,H);o=o.pointCoordinate(n,{x:0,y:H.y});if(!l&&!G&&!B){n.column=(Math.round(C.x*n.column)+(H.x&1)/2)/ +C.x;n.row=(Math.round(C.y*n.row)+(H.y&1)/2)/C.y}var E=j?j(w)-w:0;if(E){B=Math.pow(2,E);y.column*=B;y.row*=B;u.column*=B;u.row*=B;D.column*=B;D.row*=B;o.column*=B;o.row*=B;y.zoom=u.zoom=D.zoom=o.zoom+=E}if(l){y=l.unapply(y);u=l.unapply(u);D=l.unapply(D);o=l.unapply(o);n=l.unapply(n)}w=c.locks();var x={};for(var v in w)w[v].proxyCount=0;if(i&&E>-5&&E<3){B=1<>u<>u<=1;t--)(g[t]=m.appendChild(r.svg("g"))).setAttribute("transform","scale("+Math.pow(2,-t)+")");g[0]=m.appendChild(r.svg("g")); +d.init&&d.init(m);s.on("move",f).on("resize",f);f()}return d};d.container=function(){return m};d.id=function(q){if(!arguments.length)return k;k=q;return d};d.visible=function(q){if(!arguments.length)return i;i=q;s&&f();return d};d.transform=function(q){if(!arguments.length)return l;l=q;s&&f();return d};d.zoom=function(q){if(!arguments.length)return j;j=typeof q=="function"||q==null?q:function(){return q};return d};d.tile=function(q){if(!arguments.length)return e;e=q;return d};d.dispatch=r.dispatch(d); +d.on("load",function(q){if(q.tile.proxyRefs){for(var t in q.tile.proxyRefs){var o=q.tile.proxyRefs[t];--o.proxyCount<=0&&c.unload(t)&&o.element.parentNode.removeChild(o.element)}delete q.tile.proxyRefs}});return d};r.image=function(){var h=r.layer(function(f){var d=f.element=r.svg("image"),c=h.map().tileSize();d.setAttribute("preserveAspectRatio","none");d.setAttribute("width",c.x);d.setAttribute("height",c.y);d.setAttribute("opacity",0);if(typeof a=="function")f.request=r.queue.image(d,a(f),function(){delete f.request; +f.ready=true;d.removeAttribute("opacity");h.dispatch({type:"load",tile:f})});else{f.ready=true;d.setAttributeNS(r.ns.xlink,"href",a);h.dispatch({type:"load",tile:f})}},function(f){f.request&&f.request.abort(true)}),a="about:blank";h.url=function(f){if(!arguments.length)return a;a=typeof f=="string"&&/{.}/.test(f)?r.url(f):f;return h};return h};r.geoJson=function(h){function a(g,q){var t=q({lat:g[1],lon:g[0]}),o=r.svg("circle");o.setAttribute("r",4.5);o.setAttribute("cx",t.x);o.setAttribute("cy",t.y); +return o}function f(g,q,t,o){o.push("M");for(var w=0;w0.5)m*=0.4}e||(e=k.pointLocation(l));k.off("move", +h);if(c)k.zoomBy(m,l,e);else if(m){var g=Date.now();if(g-d>200){k.zoomBy(m>0?+1:-1,l,e);d=g}}k.on("move",h);s.preventDefault();return false}var f={},d=0,c=true,e,i=/WebKit\/533/.test(navigator.userAgent),j=0.3,k;f.smooth=function(s){if(!arguments.length)return c;c=s;return f};f.map=function(s){if(!arguments.length)return k;(k=s).on("move",h);var m=k.container();m.addEventListener("mousemove",h,false);m.addEventListener("mousewheel",a,false);m.addEventListener("DOMMouseScroll",a,false);return f};return f}; +r.arrow=function(){function h(l){if(!(l.ctrlKey||l.altKey||l.metaKey)){var g=Date.now(),q=0,t=0,o=0;switch(l.keyCode){case 37:if(!c.left){e=g;c.left=1;c.right||(q=s)}break;case 39:if(!c.right){e=g;c.right=1;c.left||(q=-s)}break;case 38:if(!c.up){e=g;c.up=1;c.down||(t=s)}break;case 40:if(!c.down){e=g;c.down=1;c.up||(t=-s)}break;case 109:case 189:if(!c.plus){e=g;c.plus=1;c.minus||(o=-1)}break;case 61:case 187:if(!c.minus){e=g;c.minus=1;c.plus||(o=1)}break;default:return}if(o){g=m.zoom();m.zoom(o<0? +Math.ceil(g)-1:Math.floor(g)+1)}else if(q||t)m.panBy({x:q,y:t});if(!i&&c.left|c.right|c.up|c.down)i=setInterval(f,k);l.preventDefault()}}function a(l){e=Date.now();switch(l.keyCode){case 37:c.left=0;break;case 39:c.right=0;break;case 38:c.up=0;break;case 40:c.down=0;break;case 109:case 189:c.plus=0;break;case 61:case 187:c.minus=0;break;default:return}if(i&&!(c.left|c.right|c.up|c.down))i=clearInterval(i);l.preventDefault()}function f(){if(m)if(!(Date.now()B+H&&E.panBy(D)},G));D&&E.panBy(D);B=Date.now();j(x)}function a(){q.setAttribute("class","compass");if(y){clearInterval(y);y=0}}function f(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");D=x}}function d(x){return function(v){q.setAttribute("class", +"compass active");var z=E.zoom();E.zoom(x<0?Math.ceil(z)-1:Math.floor(z)+1);j(v)}}function c(x){return function(v){E.zoom(x);j(v)}}function e(){this.setAttribute("class","active")}function i(){this.removeAttribute("class")}function j(x){x.stopPropagation();x.preventDefault()}function k(x){var v=Math.SQRT1_2*o,z=o*0.7,A=o*0.2,F=r.svg("g"),I=F.appendChild(r.svg("path")),N=F.appendChild(r.svg("path"));I.setAttribute("class","direction");I.setAttribute("pointer-events","all");I.setAttribute("d","M0,0L"+ +v+","+v+"A"+o+","+o+" 0 0,1 "+-v+","+v+"Z");N.setAttribute("class","chevron");N.setAttribute("d","M"+A+","+(z-A)+"L0,"+z+" "+-A+","+(z-A));N.setAttribute("pointer-events","none");F.addEventListener("mousedown",h,false);F.addEventListener("mouseover",f(x),false);F.addEventListener("mouseout",f(null),false);F.addEventListener("dblclick",j,false);return F}function s(x){var v=o*0.4,z=v/2,A=r.svg("g"),F=A.appendChild(r.svg("path")),I=A.appendChild(r.svg("path")),N=A.appendChild(r.svg("path")),M=A.appendChild(r.svg("path")); +F.setAttribute("class","back");F.setAttribute("d","M"+-v+",0V"+-v+"A"+v+","+v+" 0 1,1 "+v+","+-v+"V0Z");I.setAttribute("class","direction");I.setAttribute("d",F.getAttribute("d"));N.setAttribute("class","chevron");N.setAttribute("d","M"+-z+","+-v+"H"+z+(x>0?"M0,"+(-v-z)+"V"+-z:""));M.setAttribute("class","fore");M.setAttribute("fill","none");M.setAttribute("d",F.getAttribute("d"));A.addEventListener("mousedown",d(x),false);A.addEventListener("mouseover",e,false);A.addEventListener("mouseout",i,false); +A.addEventListener("dblclick",j,false);return A}function m(x){var v=o*0.2,z=o*0.4,A=r.svg("g"),F=A.appendChild(r.svg("rect")),I=A.appendChild(r.svg("path"));F.setAttribute("pointer-events","all");F.setAttribute("fill","none");F.setAttribute("x",-z);F.setAttribute("y",-0.75*z);F.setAttribute("width",2*z);F.setAttribute("height",1.5*z);I.setAttribute("class","chevron");I.setAttribute("d","M"+-v+",0H"+v);A.addEventListener("mousedown",c(x),false);A.addEventListener("dblclick",j,false);return A}function l(){if(q){var x= +o+6,v=x,z=E.size();switch(C){case "top-left":break;case "top-right":x=z.x-x;break;case "bottom-left":v=z.y-v;break;case "bottom-right":x=z.x-x;v=z.y-v;break}q.setAttribute("transform","translate("+x+","+v+")");for(var A in t)A==E.zoom()?t[A].setAttribute("class","active"):t[A].removeAttribute("class")}}var g={},q,t={},o=30,w=16,B=0,H=250,G=50,C="top-left",n="small",u="small",y,D,E;g.radius=function(x){if(!arguments.length)return o;o=x;return g};g.speed=function(x){if(!arguments.length)return o;w= +x;return g};g.position=function(x){if(!arguments.length)return C;C=x;return g};g.pan=function(x){if(!arguments.length)return u;u=x;return g};g.zoom=function(x){if(!arguments.length)return n;n=x;return g};g.map=function(x){if(!arguments.length)return E;E=x;E.on("move",l);E.on("resize",l);q=E.container().appendChild(r.svg("g"));q.setAttribute("class","compass");if(u!="none"){var v=q.appendChild(r.svg("g"));v.setAttribute("class","pan");var z=v.appendChild(r.svg("circle"));z.setAttribute("class","back"); +z.setAttribute("r",o);v.appendChild(k({x:0,y:-w})).setAttribute("transform","rotate(0)");v.appendChild(k({x:w,y:0})).setAttribute("transform","rotate(90)");v.appendChild(k({x:0,y:w})).setAttribute("transform","rotate(180)");v.appendChild(k({x:-w,y:0})).setAttribute("transform","rotate(270)");v=v.appendChild(r.svg("circle"));v.setAttribute("fill","none");v.setAttribute("class","fore");v.setAttribute("r",o);window.addEventListener("mouseup",a,false)}if(n!="none"){v=q.appendChild(r.svg("g"));v.setAttribute("class", +"zoom");z=-0.5;if(n=="big"){t={};var A=E.zoomRange()[0];for(z=0;A<=E.zoomRange()[1];A++,z++)(t[A]=v.appendChild(m(A))).setAttribute("transform","translate(0,"+-(z+0.75)*o*0.4+")")}A=u=="none"?0.4:2;v.setAttribute("transform","translate(0,"+o*(/^top-/.test(C)?A+(z+0.5)*0.4:-A)+")");v.appendChild(s(+1)).setAttribute("transform","translate(0,"+-(z+0.5)*o*0.4+")");v.appendChild(s(-1)).setAttribute("transform","scale(-1)")}l();return g};return g};r.grid=function(){function h(){var c=d.firstChild,e=f.size(), +i=f.pointLocation(R);f.pointLocation(e);var j=Math.pow(2,4-Math.round(f.zoom()));i.lat=Math.floor(i.lat/j)*j;i.lon=Math.ceil(i.lon/j)*j;for(var k;(k=f.locationPoint(i).x)<=e.x;i.lon+=j){c||(c=d.appendChild(r.svg("line")));c.setAttribute("x1",k);c.setAttribute("x2",k);c.setAttribute("y1",0);c.setAttribute("y2",e.y);c=c.nextSibling}for(;(k=f.locationPoint(i).y)<=e.y;i.lat-=j){c||(c=d.appendChild(r.svg("line")));c.setAttribute("y1",k);c.setAttribute("y2",k);c.setAttribute("x1",0);c.setAttribute("x2", +e.x);c=c.nextSibling}for(;c;){e=c.nextSibling;d.removeChild(c);c=e}}var a={},f,d;a.map=function(c){if(!arguments.length)return f;f=c;f.on("move",h);f.on("resize",h);if(!d){d=r.svg("g");d.setAttribute("class","grid")}f.container().appendChild(d);h();return a};return a}})(org.polymaps); diff --git a/src/Map.js b/src/Map.js index dc49a19..90015b8 100644 --- a/src/Map.js +++ b/src/Map.js @@ -102,7 +102,6 @@ po.map = function() { map.container = function(x) { if (!arguments.length) return container; - map.dispatch({type: "container", 'old':container, 'new':x}); container = x; container.setAttribute("class", "map"); container.appendChild(rect); diff --git a/src/Touch.js b/src/Touch.js index 749660a..016674e 100644 --- a/src/Touch.js +++ b/src/Touch.js @@ -2,35 +2,27 @@ po.touch = function() { var touch = {}, map, last; - - function container(c) { - if (c['old']) { - c['old'].removeEventListener("touchstart", touchstart, false); - c['old'].removeEventListener("touchmove", touchmove, false); - c['old'].removeEventListener("touchend", touchend, false); - c['old'].removeEventListener("touchcancel", touchend, false); - } - if (c['new']) { - console.log(c['new']); - c['new'].addEventListener("touchstart", touchstart, false); - c['new'].addEventListener("touchmove", touchmove, false); - c['new'].addEventListener("touchend", touchend, false); - c['new'].addEventListener("touchcancel", touchend, false); - } - } - + touch.map = function(x) { if (!arguments.length) return map; if (map) { - map.off("container", container); + var container = map.container(); + container.removeEventListener("touchstart", touchstart, false); + container.removeEventListener("touchmove", touchmove, false); + container.removeEventListener("touchend", touchend, false); + container.removeEventListener("touchcancel", touchend, false); } - container({'old':(map && map.container()), 'new':(x && x.container())}); map = x; if (map) { - map.on("container", container); + var container = map.container(); + container.addEventListener("touchstart", touchstart, false); + container.addEventListener("touchmove", touchmove, false); + container.addEventListener("touchend", touchend, false); + container.addEventListener("touchcancel", touchend, false); + // TODO update if map container changes? } return touch; diff --git a/src/Wheel.js b/src/Wheel.js index 15993eb..c7d4458 100644 --- a/src/Wheel.js +++ b/src/Wheel.js @@ -39,35 +39,27 @@ po.wheel = function() { smooth = x; return wheel; }; - - - function container(c) { - if (c['old']) { - c['old'].removeEventListener("mousemove", move, false); - c['old'].removeEventListener("mousewheel", mousewheel, false); - c['old'].removeEventListener("DOMMouseScroll", mousewheel, false); - } - if (c['new']) { - c['new'].addEventListener("mousemove", move, false); - c['new'].addEventListener("mousewheel", mousewheel, false); - c['new'].addEventListener("DOMMouseScroll", mousewheel, false); - } - } - + wheel.map = function(x) { if (!arguments.length) return map; if (map) { map.off("move", move); - map.off("container", container); + var container = map.container(); + container.removeEventListener("mousemove", move, false); + container.removeEventListener("mousewheel", mousewheel, false); + container.removeEventListener("DOMMouseScroll", mousewheel, false); } - container({'old':(map && map.container()), 'new':(x && x.container())}); map = x; if (map) { map.on("move", move); - map.on("container", container); + var container = map.container(); + container.addEventListener("mousemove", move, false); + container.addEventListener("mousewheel", mousewheel, false); + container.addEventListener("DOMMouseScroll", mousewheel, false); + // TODO update if map container changes? } return wheel; From 276c20706419048aebe91cd77f6244d64196ccac Mon Sep 17 00:00:00 2001 From: Nathan Vander Wilt Date: Mon, 21 Mar 2011 11:44:20 +0100 Subject: [PATCH 6/7] Revert "map can now be changed/unset on wheel and touch handlers" This reverts commit 443870b0c89f7e46e4702a2e8bb3217bc9c8c825. --- src/Touch.js | 26 +++++++------------------- src/Wheel.js | 27 +++++++-------------------- 2 files changed, 14 insertions(+), 39 deletions(-) diff --git a/src/Touch.js b/src/Touch.js index 016674e..108f777 100644 --- a/src/Touch.js +++ b/src/Touch.js @@ -5,26 +5,14 @@ po.touch = function() { touch.map = function(x) { if (!arguments.length) return map; - - if (map) { - var container = map.container(); - container.removeEventListener("touchstart", touchstart, false); - container.removeEventListener("touchmove", touchmove, false); - container.removeEventListener("touchend", touchend, false); - container.removeEventListener("touchcancel", touchend, false); - } - map = x; - - if (map) { - var container = map.container(); - container.addEventListener("touchstart", touchstart, false); - container.addEventListener("touchmove", touchmove, false); - container.addEventListener("touchend", touchend, false); - container.addEventListener("touchcancel", touchend, false); - // TODO update if map container changes? - } - + // TODO remove from old map container? + // TODO update if map container changes? + var container = map.container(); + container.addEventListener("touchstart", touchstart, false); + container.addEventListener("touchmove", touchmove, false); + container.addEventListener("touchend", touchend, false); + container.addEventListener("touchcancel", touchend, false); return touch; } diff --git a/src/Wheel.js b/src/Wheel.js index c7d4458..2d54251 100644 --- a/src/Wheel.js +++ b/src/Wheel.js @@ -42,26 +42,13 @@ po.wheel = function() { wheel.map = function(x) { if (!arguments.length) return map; - - if (map) { - map.off("move", move); - var container = map.container(); - container.removeEventListener("mousemove", move, false); - container.removeEventListener("mousewheel", mousewheel, false); - container.removeEventListener("DOMMouseScroll", mousewheel, false); - } - - map = x; - - if (map) { - map.on("move", move); - var container = map.container(); - container.addEventListener("mousemove", move, false); - container.addEventListener("mousewheel", mousewheel, false); - container.addEventListener("DOMMouseScroll", mousewheel, false); - // TODO update if map container changes? - } - + (map = x).on("move", move); + // TODO remove from old map container? + // TODO update if map container changes? + var container = map.container(); + container.addEventListener("mousemove", move, false); + container.addEventListener("mousewheel", mousewheel, false); + container.addEventListener("DOMMouseScroll", mousewheel, false); return wheel; }; From efaca791ed116a8c0e2050456df952ca964c47c9 Mon Sep 17 00:00:00 2001 From: Nathan Vander Wilt Date: Mon, 21 Mar 2011 11:57:52 +0100 Subject: [PATCH 7/7] fixed touch events and matched touch map initialization to latest trunk --- polymaps.js | 24 ++++++++++++++++-------- polymaps.min.js | 48 ++++++++++++++++++++++++------------------------ src/Touch.js | 24 ++++++++++++++++-------- 3 files changed, 56 insertions(+), 40 deletions(-) diff --git a/polymaps.js b/polymaps.js index 749b82c..167cd17 100644 --- a/polymaps.js +++ b/polymaps.js @@ -1550,14 +1550,20 @@ po.touch = function() { touch.map = function(x) { if (!arguments.length) return map; - map = x; - // TODO remove from old map container? - // TODO update if map container changes? - var container = map.container(); - container.addEventListener("touchstart", touchstart, false); - container.addEventListener("touchmove", touchmove, false); - container.addEventListener("touchend", touchend, false); - container.addEventListener("touchcancel", touchend, false); + if (map) { + var container = map.container(); + container.removeEventListener("touchstart", touchstart, false); + container.removeEventListener("touchmove", touchmove, false); + container.removeEventListener("touchend", touchend, false); + container.removeEventListener("touchcancel", touchend, false); + } + if (map = x) { + var container = map.container(); + container.addEventListener("touchstart", touchstart, false); + container.addEventListener("touchmove", touchmove, false); + container.addEventListener("touchend", touchend, false); + container.addEventListener("touchcancel", touchend, false); + } return touch; } @@ -1610,7 +1616,9 @@ po.touch = function() { } return { clientX: sumX / touches.length, + pageX: sumX / touches.length, clientY: sumY / touches.length, + pageY: sumY / touches.length, scale: e.scale }; } diff --git a/polymaps.min.js b/polymaps.min.js index cbcb5b9..c004d88 100644 --- a/polymaps.min.js +++ b/polymaps.min.js @@ -38,27 +38,27 @@ t.url(k):k;if(i!=null)A=null;typeof i=="string"&&a.tile(false);return a.reload() arguments)};var K=a.map;a.map=function(k){if(k&&u){var q=k.tileSize();u.setAttribute("width",q.x);u.setAttribute("height",q.y)}return K.apply(a,arguments)};a.scale=function(k){if(!arguments.length)return y;(y=k)?a.on("move",h):a.off("move",h);a.map()&&h();return a};a.show=function(k){n?k.element.setAttribute("clip-path",m):k.element.removeAttribute("clip-path");a.dispatch({type:"show",tile:k,features:k.features});return a};a.reshow=function(){var k=a.cache.locks();for(var q in k)a.show(k[q]);return a}; return a};t.dblclick=function(){function d(a){var f=l.zoom();f=a.shiftKey?Math.ceil(f)-f-1:1-f+Math.floor(f);c==="mouse"?l.zoomBy(f,l.mouse(a)):l.zoomBy(f)}var g={},c="mouse",l,h;g.zoom=function(a){if(!arguments.length)return c;c=a;return g};g.map=function(a){if(!arguments.length)return l;if(l){h.removeEventListener("dblclick",d,false);h=null}if(l=a){h=l.container();h.addEventListener("dblclick",d,false)}return g};return g};t.drag=function(){function d(f){if(!f.shiftKey){a={x:f.clientX,y:f.clientY}; l.focusableParent().focus();f.preventDefault();document.body.style.setProperty("cursor","move",null)}}function g(f){if(a){l.panBy({x:f.clientX-a.x,y:f.clientY-a.y});a.x=f.clientX;a.y=f.clientY}}var c={},l,h,a;c.map=function(f){if(!arguments.length)return l;if(l){h.removeEventListener("mousedown",d,false);h=null}if(l=f){h=l.container();h.addEventListener("mousedown",d,false)}return c};window.addEventListener("mousemove",g,false);window.addEventListener("mouseup",function(f){if(a){g(f);a=null;document.body.style.removeProperty("cursor")}}, -false);return c};t.touch=function(){function d(i){f&&c();i.preventDefault();f=l(i)}function g(i){if(!f)return d(i);i.preventDefault();i=l(i);var n={x:i.clientX-f.clientX,y:i.clientY-f.clientY,scale:i.scale-f.scale};if(n.x||n.y||n.scale){var o=a.mouse(f);o=a.pointLocation(o);a.zoomBy(n.scale,a.mouse(i),o)}f=i}function c(){f=null}function l(i){for(var n=i.touches,o=0,m=0,j=0;j9&&Math.abs(m.wheelDelta)/y>=50)ba=1;h=u}if(ba==1)j*=0.03;if(!a&&j){u=Date.now();if(u-l>200){j=j>0?+1:-1;l=u}else j= -0}if(j)switch(f){case "mouse":u=n.mouse(m);i||(i=n.pointLocation(u));n.off("move",d).zoomBy(j,u,i).on("move",d);break;case "location":n.zoomBy(j,n.locationPoint(i),i);break;default:n.zoomBy(j);break}m.preventDefault();return false}var c={},l=0,h=0,a=true,f="mouse",i,n,o;c.smooth=function(m){if(!arguments.length)return a;a=m;return c};c.zoom=function(m,j){if(!arguments.length)return f;f=m;i=j;if(n)f=="mouse"?n.on("move",d):n.off("move",d);return c};c.map=function(m){if(!arguments.length)return n;if(n){o.removeEventListener("mousemove", -d,false);o.removeEventListener("mousewheel",g,false);o.removeEventListener("DOMMouseScroll",g,false);o=null;n.off("move",d)}if(n=m){f=="mouse"&&n.on("move",d);o=n.container();o.addEventListener("mousemove",d,false);o.addEventListener("mousewheel",g,false);o.addEventListener("DOMMouseScroll",g,false)}return c};return c};var ba=/WebKit\/533/.test(navigator.userAgent)?-1:0;t.arrow=function(){function d(y){if(!(y.ctrlKey||y.altKey||y.metaKey)){var A=Date.now(),C=0,E=0;switch(y.keyCode){case 37:if(!a.left){f= -A;a.left=1;a.right||(C=m)}break;case 39:if(!a.right){f=A;a.right=1;a.left||(C=-m)}break;case 38:if(!a.up){f=A;a.up=1;a.down||(E=m)}break;case 40:if(!a.down){f=A;a.down=1;a.up||(E=-m)}break;default:return}if(C||E)j.panBy({x:C,y:E});if(!i&&a.left|a.right|a.up|a.down)i=setInterval(l,o);y.preventDefault()}}function g(y){f=Date.now();switch(y.keyCode){case 37:a.left=0;break;case 39:a.right=0;break;case 38:a.up=0;break;case 40:a.down=0;break;default:return}if(i&&!(a.left|a.right|a.up|a.down))i=clearInterval(i); -y.preventDefault()}function c(y){switch(y.charCode){case 45:case 95:j.zoom(Math.ceil(j.zoom())-1);break;case 43:case 61:j.zoom(Math.floor(j.zoom())+1);break;default:return}y.preventDefault()}function l(){if(j)if(!(Date.now()w+e&&H.panBy(R)}function c(x){if(x.shiftKey){F= -{x0:H.mouse(x)};H.focusableParent().focus();return m(x)}}function l(x){if(F){F.x1=H.mouse(x);O.setAttribute("x",Math.min(F.x0.x,F.x1.x));O.setAttribute("y",Math.min(F.x0.y,F.x1.y));O.setAttribute("width",Math.abs(F.x0.x-F.x1.x));O.setAttribute("height",Math.abs(F.x0.y-F.x1.y));O.removeAttribute("display")}}function h(){B.setAttribute("class","compass");if(F){if(F.x1){H.extent([H.pointLocation({x:Math.min(F.x0.x,F.x1.x),y:Math.max(F.x0.y,F.x1.y)}),H.pointLocation({x:Math.max(F.x0.x,F.x1.x),y:Math.min(F.x0.y, -F.x1.y)})]);O.setAttribute("display","none")}F=null}if(I){clearInterval(I);I=0}}function a(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");R=x}}function f(x){return function(D){B.setAttribute("class","compass active");var G=H.zoom();H.zoom(x<0?Math.ceil(G)-1:Math.floor(G)+1);return m(D)}}function i(x){return function(D){H.zoom(x);return m(D)}}function n(){this.setAttribute("class","active")}function o(){this.removeAttribute("class")}function m(x){x.stopPropagation(); -x.preventDefault();return false}function j(x){var D=Math.SQRT1_2*k,G=k*0.7,J=k*0.2,N=t.svg("g"),P=N.appendChild(t.svg("path")),Q=N.appendChild(t.svg("path"));P.setAttribute("class","direction");P.setAttribute("pointer-events","all");P.setAttribute("d","M0,0L"+D+","+D+"A"+k+","+k+" 0 0,1 "+-D+","+D+"Z");Q.setAttribute("class","chevron");Q.setAttribute("d","M"+J+","+(G-J)+"L0,"+G+" "+-J+","+(G-J));Q.setAttribute("pointer-events","none");N.addEventListener("mousedown",d,false);N.addEventListener("mouseover", -a(x),false);N.addEventListener("mouseout",a(null),false);N.addEventListener("dblclick",m,false);return N}function u(x){var D=k*0.4,G=D/2,J=t.svg("g"),N=J.appendChild(t.svg("path")),P=J.appendChild(t.svg("path")),Q=J.appendChild(t.svg("path")),X=J.appendChild(t.svg("path"));N.setAttribute("class","back");N.setAttribute("d","M"+-D+",0V"+-D+"A"+D+","+D+" 0 1,1 "+D+","+-D+"V0Z");P.setAttribute("class","direction");P.setAttribute("d",N.getAttribute("d"));Q.setAttribute("class","chevron");Q.setAttribute("d", -"M"+-G+","+-D+"H"+G+(x>0?"M0,"+(-D-G)+"V"+-G:""));X.setAttribute("class","fore");X.setAttribute("fill","none");X.setAttribute("d",N.getAttribute("d"));J.addEventListener("mousedown",f(x),false);J.addEventListener("mouseover",n,false);J.addEventListener("mouseout",o,false);J.addEventListener("dblclick",m,false);return J}function y(x){var D=k*0.2,G=k*0.4,J=t.svg("g"),N=J.appendChild(t.svg("rect")),P=J.appendChild(t.svg("path"));N.setAttribute("pointer-events","all");N.setAttribute("fill","none");N.setAttribute("x", --G);N.setAttribute("y",-0.75*G);N.setAttribute("width",2*G);N.setAttribute("height",1.5*G);P.setAttribute("class","chevron");P.setAttribute("d","M"+-D+",0H"+D);J.addEventListener("mousedown",i(x),false);J.addEventListener("dblclick",m,false);return J}function A(){var x=k+6,D=x,G=H.size();switch(r){case "top-left":break;case "top-right":x=G.x-x;break;case "bottom-left":D=G.y-D;break;case "bottom-right":x=G.x-x;D=G.y-D;break}x="translate("+x+","+D+")";M&&M.setAttribute("transform",x);v&&v.setAttribute("transform", -x);for(var J in K)J==H.zoom()?K[J].setAttribute("class","active"):K[J].removeAttribute("class")}function C(){for(;B.lastChild;)B.removeChild(B.lastChild);B.appendChild(O);if(L!="none"){M=B.appendChild(t.svg("g"));M.setAttribute("class","pan");var x=M.appendChild(t.svg("circle"));x.setAttribute("class","back");x.setAttribute("r",k);M.appendChild(j({x:0,y:-q})).setAttribute("transform","rotate(0)");M.appendChild(j({x:q,y:0})).setAttribute("transform","rotate(90)");M.appendChild(j({x:0,y:q})).setAttribute("transform", -"rotate(180)");M.appendChild(j({x:-q,y:0})).setAttribute("transform","rotate(270)");x=M.appendChild(t.svg("circle"));x.setAttribute("fill","none");x.setAttribute("class","fore");x.setAttribute("r",k)}else M=null;if(z!="none"){v=B.appendChild(t.svg("g"));v.setAttribute("class","zoom");x=-0.5;if(z=="big"){K={};var D=H.zoomRange()[0];for(x=0;D<=H.zoomRange()[1];D++,x++)(K[D]=v.appendChild(y(D))).setAttribute("transform","translate(0,"+-(x+0.75)*k*0.4+")")}D=L=="none"?0.4:2;v.setAttribute("transform", -"translate(0,"+k*(/^top-/.test(r)?D+(x+0.5)*0.4:-D)+")");v.appendChild(u(+1)).setAttribute("transform","translate(0,"+-(x+0.5)*k*0.4+")");v.appendChild(u(-1)).setAttribute("transform","scale(-1)")}else v=null;A()}var E={},B=t.svg("g"),K={},k=30,q=16,w=0,e=250,s=50,r="top-left",z="small",v,L="small",I,R,M,F,O=t.svg("rect"),H,T,U;B.setAttribute("class","compass");O.setAttribute("class","back fore");O.setAttribute("pointer-events","none");O.setAttribute("display","none");E.radius=function(x){if(!arguments.length)return k; -k=x;H&&C();return E};E.speed=function(x){if(!arguments.length)return k;q=x;return E};E.position=function(x){if(!arguments.length)return r;r=x;H&&C();return E};E.pan=function(x){if(!arguments.length)return L;L=x;H&&C();return E};E.zoom=function(x){if(!arguments.length)return z;z=x;H&&C();return E};E.map=function(x){if(!arguments.length)return H;if(H){T.removeEventListener("mousedown",c,false);T.removeChild(B);T=null;U.removeEventListener("mousemove",l,false);U.removeEventListener("mouseup",h,false); -U=null;H.off("move",A).off("resize",A)}if(H=x){T=H.container();T.appendChild(B);T.addEventListener("mousedown",c,false);U=T.ownerDocument.defaultView;U.addEventListener("mousemove",l,false);U.addEventListener("mouseup",h,false);H.on("move",A).on("resize",A);C()}return E};return E};t.grid=function(){function d(){var h=l.firstChild,a=c.size(),f=c.pointLocation(Y);c.pointLocation(a);var i=Math.pow(2,4-Math.round(c.zoom()));f.lat=Math.floor(f.lat/i)*i;f.lon=Math.ceil(f.lon/i)*i;for(var n;(n=c.locationPoint(f).x)<= -a.x;f.lon+=i){h||(h=l.appendChild(t.svg("line")));h.setAttribute("x1",n);h.setAttribute("x2",n);h.setAttribute("y1",0);h.setAttribute("y2",a.y);h=h.nextSibling}for(;(n=c.locationPoint(f).y)<=a.y;f.lat-=i){h||(h=l.appendChild(t.svg("line")));h.setAttribute("y1",n);h.setAttribute("y2",n);h.setAttribute("x1",0);h.setAttribute("x2",a.x);h=h.nextSibling}for(;h;){a=h.nextSibling;l.removeChild(h);h=a}}var g={},c,l=t.svg("g");l.setAttribute("class","grid");g.map=function(h){if(!arguments.length)return c; -if(c){l.parentNode.removeChild(l);c.off("move",d).off("resize",d)}if(c=h){c.on("move",d).on("resize",d);c.container().appendChild(l);c.dispatch({type:"move"})}return g};return g};t.stylist=function(){function d(h){var a=h.features.length,f=g.length,i=c.length,n,o,m,j,u,y;for(u=0;u9&&Math.abs(m.wheelDelta)/y>=50)ba=1;h=u}if(ba==1)j*=0.03;if(!a&&j){u=Date.now();if(u-l>200){j=j>0?+1:-1;l=u}else j=0}if(j)switch(f){case "mouse":u=n.mouse(m);i||(i=n.pointLocation(u));n.off("move",d).zoomBy(j,u,i).on("move",d);break;case "location":n.zoomBy(j,n.locationPoint(i),i);break;default:n.zoomBy(j);break}m.preventDefault();return false}var c={},l=0,h=0,a=true,f="mouse",i,n,o;c.smooth=function(m){if(!arguments.length)return a; +a=m;return c};c.zoom=function(m,j){if(!arguments.length)return f;f=m;i=j;if(n)f=="mouse"?n.on("move",d):n.off("move",d);return c};c.map=function(m){if(!arguments.length)return n;if(n){o.removeEventListener("mousemove",d,false);o.removeEventListener("mousewheel",g,false);o.removeEventListener("DOMMouseScroll",g,false);o=null;n.off("move",d)}if(n=m){f=="mouse"&&n.on("move",d);o=n.container();o.addEventListener("mousemove",d,false);o.addEventListener("mousewheel",g,false);o.addEventListener("DOMMouseScroll", +g,false)}return c};return c};var ba=/WebKit\/533/.test(navigator.userAgent)?-1:0;t.arrow=function(){function d(y){if(!(y.ctrlKey||y.altKey||y.metaKey)){var A=Date.now(),C=0,E=0;switch(y.keyCode){case 37:if(!a.left){f=A;a.left=1;a.right||(C=m)}break;case 39:if(!a.right){f=A;a.right=1;a.left||(C=-m)}break;case 38:if(!a.up){f=A;a.up=1;a.down||(E=m)}break;case 40:if(!a.down){f=A;a.down=1;a.up||(E=-m)}break;default:return}if(C||E)j.panBy({x:C,y:E});if(!i&&a.left|a.right|a.up|a.down)i=setInterval(l,o); +y.preventDefault()}}function g(y){f=Date.now();switch(y.keyCode){case 37:a.left=0;break;case 39:a.right=0;break;case 38:a.up=0;break;case 40:a.down=0;break;default:return}if(i&&!(a.left|a.right|a.up|a.down))i=clearInterval(i);y.preventDefault()}function c(y){switch(y.charCode){case 45:case 95:j.zoom(Math.ceil(j.zoom())-1);break;case 43:case 61:j.zoom(Math.floor(j.zoom())+1);break;default:return}y.preventDefault()}function l(){if(j)if(!(Date.now()w+e&&H.panBy(R)}function c(x){if(x.shiftKey){F={x0:H.mouse(x)};H.focusableParent().focus();return m(x)}}function l(x){if(F){F.x1=H.mouse(x);O.setAttribute("x",Math.min(F.x0.x,F.x1.x));O.setAttribute("y",Math.min(F.x0.y,F.x1.y));O.setAttribute("width",Math.abs(F.x0.x-F.x1.x));O.setAttribute("height", +Math.abs(F.x0.y-F.x1.y));O.removeAttribute("display")}}function h(){B.setAttribute("class","compass");if(F){if(F.x1){H.extent([H.pointLocation({x:Math.min(F.x0.x,F.x1.x),y:Math.max(F.x0.y,F.x1.y)}),H.pointLocation({x:Math.max(F.x0.x,F.x1.x),y:Math.min(F.x0.y,F.x1.y)})]);O.setAttribute("display","none")}F=null}if(I){clearInterval(I);I=0}}function a(x){return function(){x?this.setAttribute("class","active"):this.removeAttribute("class");R=x}}function f(x){return function(D){B.setAttribute("class","compass active"); +var G=H.zoom();H.zoom(x<0?Math.ceil(G)-1:Math.floor(G)+1);return m(D)}}function i(x){return function(D){H.zoom(x);return m(D)}}function n(){this.setAttribute("class","active")}function o(){this.removeAttribute("class")}function m(x){x.stopPropagation();x.preventDefault();return false}function j(x){var D=Math.SQRT1_2*k,G=k*0.7,J=k*0.2,N=t.svg("g"),P=N.appendChild(t.svg("path")),Q=N.appendChild(t.svg("path"));P.setAttribute("class","direction");P.setAttribute("pointer-events","all");P.setAttribute("d", +"M0,0L"+D+","+D+"A"+k+","+k+" 0 0,1 "+-D+","+D+"Z");Q.setAttribute("class","chevron");Q.setAttribute("d","M"+J+","+(G-J)+"L0,"+G+" "+-J+","+(G-J));Q.setAttribute("pointer-events","none");N.addEventListener("mousedown",d,false);N.addEventListener("mouseover",a(x),false);N.addEventListener("mouseout",a(null),false);N.addEventListener("dblclick",m,false);return N}function u(x){var D=k*0.4,G=D/2,J=t.svg("g"),N=J.appendChild(t.svg("path")),P=J.appendChild(t.svg("path")),Q=J.appendChild(t.svg("path")), +X=J.appendChild(t.svg("path"));N.setAttribute("class","back");N.setAttribute("d","M"+-D+",0V"+-D+"A"+D+","+D+" 0 1,1 "+D+","+-D+"V0Z");P.setAttribute("class","direction");P.setAttribute("d",N.getAttribute("d"));Q.setAttribute("class","chevron");Q.setAttribute("d","M"+-G+","+-D+"H"+G+(x>0?"M0,"+(-D-G)+"V"+-G:""));X.setAttribute("class","fore");X.setAttribute("fill","none");X.setAttribute("d",N.getAttribute("d"));J.addEventListener("mousedown",f(x),false);J.addEventListener("mouseover",n,false);J.addEventListener("mouseout", +o,false);J.addEventListener("dblclick",m,false);return J}function y(x){var D=k*0.2,G=k*0.4,J=t.svg("g"),N=J.appendChild(t.svg("rect")),P=J.appendChild(t.svg("path"));N.setAttribute("pointer-events","all");N.setAttribute("fill","none");N.setAttribute("x",-G);N.setAttribute("y",-0.75*G);N.setAttribute("width",2*G);N.setAttribute("height",1.5*G);P.setAttribute("class","chevron");P.setAttribute("d","M"+-D+",0H"+D);J.addEventListener("mousedown",i(x),false);J.addEventListener("dblclick",m,false);return J} +function A(){var x=k+6,D=x,G=H.size();switch(r){case "top-left":break;case "top-right":x=G.x-x;break;case "bottom-left":D=G.y-D;break;case "bottom-right":x=G.x-x;D=G.y-D;break}x="translate("+x+","+D+")";M&&M.setAttribute("transform",x);v&&v.setAttribute("transform",x);for(var J in K)J==H.zoom()?K[J].setAttribute("class","active"):K[J].removeAttribute("class")}function C(){for(;B.lastChild;)B.removeChild(B.lastChild);B.appendChild(O);if(L!="none"){M=B.appendChild(t.svg("g"));M.setAttribute("class", +"pan");var x=M.appendChild(t.svg("circle"));x.setAttribute("class","back");x.setAttribute("r",k);M.appendChild(j({x:0,y:-q})).setAttribute("transform","rotate(0)");M.appendChild(j({x:q,y:0})).setAttribute("transform","rotate(90)");M.appendChild(j({x:0,y:q})).setAttribute("transform","rotate(180)");M.appendChild(j({x:-q,y:0})).setAttribute("transform","rotate(270)");x=M.appendChild(t.svg("circle"));x.setAttribute("fill","none");x.setAttribute("class","fore");x.setAttribute("r",k)}else M=null;if(z!= +"none"){v=B.appendChild(t.svg("g"));v.setAttribute("class","zoom");x=-0.5;if(z=="big"){K={};var D=H.zoomRange()[0];for(x=0;D<=H.zoomRange()[1];D++,x++)(K[D]=v.appendChild(y(D))).setAttribute("transform","translate(0,"+-(x+0.75)*k*0.4+")")}D=L=="none"?0.4:2;v.setAttribute("transform","translate(0,"+k*(/^top-/.test(r)?D+(x+0.5)*0.4:-D)+")");v.appendChild(u(+1)).setAttribute("transform","translate(0,"+-(x+0.5)*k*0.4+")");v.appendChild(u(-1)).setAttribute("transform","scale(-1)")}else v=null;A()}var E= +{},B=t.svg("g"),K={},k=30,q=16,w=0,e=250,s=50,r="top-left",z="small",v,L="small",I,R,M,F,O=t.svg("rect"),H,T,U;B.setAttribute("class","compass");O.setAttribute("class","back fore");O.setAttribute("pointer-events","none");O.setAttribute("display","none");E.radius=function(x){if(!arguments.length)return k;k=x;H&&C();return E};E.speed=function(x){if(!arguments.length)return k;q=x;return E};E.position=function(x){if(!arguments.length)return r;r=x;H&&C();return E};E.pan=function(x){if(!arguments.length)return L; +L=x;H&&C();return E};E.zoom=function(x){if(!arguments.length)return z;z=x;H&&C();return E};E.map=function(x){if(!arguments.length)return H;if(H){T.removeEventListener("mousedown",c,false);T.removeChild(B);T=null;U.removeEventListener("mousemove",l,false);U.removeEventListener("mouseup",h,false);U=null;H.off("move",A).off("resize",A)}if(H=x){T=H.container();T.appendChild(B);T.addEventListener("mousedown",c,false);U=T.ownerDocument.defaultView;U.addEventListener("mousemove",l,false);U.addEventListener("mouseup", +h,false);H.on("move",A).on("resize",A);C()}return E};return E};t.grid=function(){function d(){var h=l.firstChild,a=c.size(),f=c.pointLocation(Y);c.pointLocation(a);var i=Math.pow(2,4-Math.round(c.zoom()));f.lat=Math.floor(f.lat/i)*i;f.lon=Math.ceil(f.lon/i)*i;for(var n;(n=c.locationPoint(f).x)<=a.x;f.lon+=i){h||(h=l.appendChild(t.svg("line")));h.setAttribute("x1",n);h.setAttribute("x2",n);h.setAttribute("y1",0);h.setAttribute("y2",a.y);h=h.nextSibling}for(;(n=c.locationPoint(f).y)<=a.y;f.lat-=i){h|| +(h=l.appendChild(t.svg("line")));h.setAttribute("y1",n);h.setAttribute("y2",n);h.setAttribute("x1",0);h.setAttribute("x2",a.x);h=h.nextSibling}for(;h;){a=h.nextSibling;l.removeChild(h);h=a}}var g={},c,l=t.svg("g");l.setAttribute("class","grid");g.map=function(h){if(!arguments.length)return c;if(c){l.parentNode.removeChild(l);c.off("move",d).off("resize",d)}if(c=h){c.on("move",d).on("resize",d);c.container().appendChild(l);c.dispatch({type:"move"})}return g};return g};t.stylist=function(){function d(h){var a= +h.features.length,f=g.length,i=c.length,n,o,m,j,u,y;for(u=0;u