Skip to content

Instantly share code, notes, and snippets.

@cynici
Created January 10, 2013 08:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cynici/4500585 to your computer and use it in GitHub Desktop.
Save cynici/4500585 to your computer and use it in GitHub Desktop.
Fire pixel clustering javascript code from http://www.unorthodox.com.au/fire/js/cluster.bin.js unobfuscated using method described in http://www.mikepostma.com/blog/unobfuscate-javascript
(function () {
var d = null;
function e(a) {
return function (b) {
this[a] = b
}
}
function h(a) {
return function () {
return this[a]
}
}
var j;
function k(a, b, c) {
this.extend(k, google.maps.OverlayView);
this.c = a;
this.a = [];
this.f = [];
this.ca = [53, 56, 66, 78, 90];
this.j = [];
this.A = !1;
c = c || {};
this.g = c.gridSize || 60;
this.l = c.minimumClusterSize || 2;
this.J = c.maxZoom || d;
this.j = c.styles || [];
this.X = c.imagePath || this.Q;
this.W = c.imageExtension || this.P;
this.O = !0;
if (c.zoomOnClick != void 0) this.O = c.zoomOnClick;
this.r = !1;
if (c.averageCenter != void 0) this.r = c.averageCenter;
l(this);
this.setMap(a);
this.K = this.c.getZoom();
var f = this;
google.maps.event.addListener(this.c, "zoom_changed", function () {
var a = f.c.getZoom();
if (f.K != a) f.K = a, f.m()
});
google.maps.event.addListener(this.c, "idle", function () {
f.i()
});
b && b.length && this.C(b, !1)
}
j = k.prototype;
j.Q = "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m";
j.P = "png";
j.extend = function (a, b) {
return function (a) {
for (var b in a.prototype) this.prototype[b] = a.prototype[b];
return this
}.apply(a, [b])
};
j.onAdd = function () {
if (!this.A) this.A = !0, n(this)
};
j.draw = function () {};
function l(a) {
if (!a.j.length) for (var b = 0, c; c = a.ca[b]; b++) a.j.push({
url: a.X + (b + 1) + "." + a.W,
height: c,
width: c
})
}
j.S = function () {
for (var a = this.o(), b = new google.maps.LatLngBounds, c = 0, f; f = a[c]; c++) b.extend(f.getPosition());
this.c.fitBounds(b)
};
j.z = h("j");
j.o = h("a");
j.V = function () {
return this.a.length
};
j.ba = e("J");
j.I = h("J");
j.G = function (a, b) {
for (var c = 0, f = a.length, g = f; g !== 0;) g = parseInt(g / 10, 10), c++;
c = Math.min(c, b);
return {
text: f,
index: c
}
};
j.$ = e("G");
j.H = h("G");
j.C = function (a, b) {
for (var c = 0, f; f = a[c]; c++) q(this, f);
b || this.i()
};
function q(a, b) {
b.s = !1;
b.draggable && google.maps.event.addListener(b, "dragend", function () {
b.s = !1;
a.L()
});
a.a.push(b)
}
j.q = function (a, b) {
q(this, a);
b || this.i()
};
function r(a, b) {
var c = -1;
if (a.a.indexOf) c = a.a.indexOf(b);
else for (var f = 0, g; g = a.a[f]; f++) if (g == b) {
c = f;
break
}
if (c == -1) return !1;
b.setMap(d);
a.a.splice(c, 1);
return !0
}
j.Y = function (a, b) {
var c = r(this, a);
return !b && c ? (this.m(), this.i(), !0) : !1
};
j.Z = function (a, b) {
for (var c = !1, f = 0, g; g = a[f]; f++) g = r(this, g), c = c || g;
if (!b && c) return this.m(), this.i(), !0
};
j.U = function () {
return this.f.length
};
j.getMap = h("c");
j.setMap = e("c");
j.w = h("g");
j.aa = e("g");
j.v = function (a) {
var b = this.getProjection(),
c = new google.maps.LatLng(a.getNorthEast().lat(), a.getNorthEast().lng()),
f = new google.maps.LatLng(a.getSouthWest().lat(), a.getSouthWest().lng()),
c = b.fromLatLngToDivPixel(c);
c.x += this.g;
c.y -= this.g;
f = b.fromLatLngToDivPixel(f);
f.x -= this.g;
f.y += this.g;
c = b.fromDivPixelToLatLng(c);
b = b.fromDivPixelToLatLng(f);
a.extend(c);
a.extend(b);
return a
};
j.R = function () {
this.m(!0);
this.a = []
};
j.m = function (a) {
for (var b = 0, c; c = this.f[b]; b++) c.remove();
for (b = 0; c = this.a[b]; b++) c.s = !1, a && c.setMap(d);
this.f = []
};
j.L = function () {
var a = this.f.slice();
this.f.length = 0;
this.m();
this.i();
window.setTimeout(function () {
for (var b = 0, c; c = a[b]; b++) c.remove()
}, 0)
};
j.i = function () {
n(this)
};
function n(a) {
if (a.A) for (var b = a.v(new google.maps.LatLngBounds(a.c.getBounds().getSouthWest(), a.c.getBounds().getNorthEast())), c = 0, f; f = a.a[c]; c++) if (!f.s && b.contains(f.getPosition())) {
for (var g = a, u = 4E4, o = d, v = 0, m = void 0; m = g.f[v]; v++) {
var i = m.getCenter();
if (i) {
var p = f.getPosition();
if (!i || !p) i = 0;
else var w = (p.lat() - i.lat()) * Math.PI / 180,
x = (p.lng() - i.lng()) * Math.PI / 180,
i = Math.sin(w / 2) * Math.sin(w / 2) + Math.cos(i.lat() * Math.PI / 180) * Math.cos(p.lat() * Math.PI / 180) * Math.sin(x / 2) * Math.sin(x / 2),
i = 6371 * 2 * Math.atan2(Math.sqrt(i), Math.sqrt(1 - i));
i < u && (u = i, o = m)
}
}
o && o.F.contains(f.getPosition()) ? o.q(f) : (m = new s(g), m.q(f), g.f.push(m))
}
}
function s(a) {
this.k = a;
this.c = a.getMap();
this.g = a.w();
this.l = a.l;
this.r = a.r;
this.d = d;
this.a = [];
this.F = d;
this.n = new t(this, a.z(), a.w())
}
j = s.prototype;
j.q = function (a) {
var b;
a: if (this.a.indexOf) b = this.a.indexOf(a) != -1;
else {
b = 0;
for (var c; c = this.a[b]; b++) if (c == a) {
b = !0;
break a
}
b = !1
}
if (b) return !1;
if (this.d) {
if (this.r) c = this.a.length + 1, b = (this.d.lat() * (c - 1) + a.getPosition().lat()) / c, c = (this.d.lng() * (c - 1) + a.getPosition().lng()) / c, this.d = new google.maps.LatLng(b, c), y(this)
} else this.d = a.getPosition(), y(this);
a.s = !0;
this.a.push(a);
b = this.a.length;
b < this.l && a.getMap() != this.c && a.setMap(this.c);
if (b == this.l) for (c = 0; c < b; c++) this.a[c].setMap(d);
b >= this.l && a.setMap(d);
a = this.c.getZoom();
if ((b = this.k.I()) && a > b) for (a = 0; b = this.a[a]; a++) b.setMap(this.c);
else if (this.a.length < this.l) z(this.n);
else {
b = this.k.H()(this.a, this.k.z().length);
this.n.setCenter(this.d);
a = this.n;
a.B = b;
a.ga = b.text;
a.ea = b.index;
if (a.b) a.b.innerHTML = b.text;
b = Math.max(0, a.B.index - 1);
b = Math.min(a.j.length - 1, b);
b = a.j[b];
a.da = b.url;
a.h = b.height;
a.p = b.width;
a.M = b.textColor;
a.e = b.anchor;
a.N = b.textSize;
a.D = b.backgroundPosition;
this.n.show()
}
return !0
};
j.getBounds = function () {
for (var a = new google.maps.LatLngBounds(this.d, this.d), b = this.o(), c = 0, f; f = b[c]; c++) a.extend(f.getPosition());
return a
};
j.remove = function () {
this.n.remove();
this.a.length = 0;
delete this.a
};
j.T = function () {
return this.a.length
};
j.o = h("a");
j.getCenter = h("d");
function y(a) {
a.F = a.k.v(new google.maps.LatLngBounds(a.d, a.d))
}
j.getMap = h("c");
function t(a, b, c) {
a.k.extend(t, google.maps.OverlayView);
this.j = b;
this.fa = c || 0;
this.u = a;
this.d = d;
this.c = a.getMap();
this.B = this.b = d;
this.t = !1;
this.setMap(this.c)
}
j = t.prototype;
j.onAdd = function () {
this.b = document.createElement("DIV");
if (this.t) this.b.style.cssText = A(this, B(this, this.d)), this.b.innerHTML = this.B.text;
this.getPanes().overlayMouseTarget.appendChild(this.b);
var a = this;
google.maps.event.addDomListener(this.b, "click", function () {
var b = a.u.k;
google.maps.event.trigger(b, "clusterclick", a.u);
b.O && a.c.fitBounds(a.u.getBounds())
})
};
function B(a, b) {
var c = a.getProjection().fromLatLngToDivPixel(b);
c.x -= parseInt(a.p / 2, 10);
c.y -= parseInt(a.h / 2, 10);
return c
}
j.draw = function () {
if (this.t) {
var a = B(this, this.d);
this.b.style.top = a.y + "px";
this.b.style.left = a.x + "px"
}
};
function z(a) {
if (a.b) a.b.style.display = "none";
a.t = !1
}
j.show = function () {
if (this.b) this.b.style.cssText = A(this, B(this, this.d)), this.b.style.display = "";
this.t = !0
};
j.remove = function () {
this.setMap(d)
};
j.onRemove = function () {
if (this.b && this.b.parentNode) z(this), this.b.parentNode.removeChild(this.b), this.b = d
};
j.setCenter = e("d");
function A(a, b) {
var c = [];
c.push("background-image:url(" + a.da + ");");
c.push("background-position:" + (a.D ? a.D : "0 0") + ";");
typeof a.e === "object" ? (typeof a.e[0] === "number" && a.e[0] > 0 && a.e[0] < a.h ? c.push("height:" + (a.h - a.e[0]) + "px; padding-top:" + a.e[0] + "px;") : c.push("height:" + a.h + "px; line-height:" + a.h + "px;"), typeof a.e[1] === "number" && a.e[1] > 0 && a.e[1] < a.p ? c.push("width:" + (a.p - a.e[1]) + "px; padding-left:" + a.e[1] + "px;") : c.push("width:" + a.p + "px; text-align:center;")) : c.push("height:" + a.h + "px; line-height:" + a.h + "px; width:" + a.p + "px; text-align:center;");
c.push("cursor:pointer; top:" + b.y + "px; left:" + b.x + "px; color:" + (a.M ? a.M : "black") + "; position:absolute; font-size:" + (a.N ? a.N : 11) + "px; font-family:Arial,sans-serif; font-weight:bold");
return c.join("")
}
window.MarkerClusterer = k;
k.prototype.addMarker = k.prototype.q;
k.prototype.addMarkers = k.prototype.C;
k.prototype.clearMarkers = k.prototype.R;
k.prototype.fitMapToMarkers = k.prototype.S;
k.prototype.getCalculator = k.prototype.H;
k.prototype.getGridSize = k.prototype.w;
k.prototype.getExtendedBounds = k.prototype.v;
k.prototype.getMap = k.prototype.getMap;
k.prototype.getMarkers = k.prototype.o;
k.prototype.getMaxZoom = k.prototype.I;
k.prototype.getStyles = k.prototype.z;
k.prototype.getTotalClusters = k.prototype.U;
k.prototype.getTotalMarkers = k.prototype.V;
k.prototype.redraw = k.prototype.i;
k.prototype.removeMarker = k.prototype.Y;
k.prototype.removeMarkers = k.prototype.Z;
k.prototype.resetViewport = k.prototype.m;
k.prototype.repaint = k.prototype.L;
k.prototype.setCalculator = k.prototype.$;
k.prototype.setGridSize = k.prototype.aa;
k.prototype.setMaxZoom = k.prototype.ba;
k.prototype.onAdd = k.prototype.onAdd;
k.prototype.draw = k.prototype.draw;
s.prototype.getCenter = s.prototype.getCenter;
s.prototype.getSize = s.prototype.T;
s.prototype.getMarkers = s.prototype.o;
t.prototype.onAdd = t.prototype.onAdd;
t.prototype.draw = t.prototype.draw;
t.prototype.onRemove = t.prototype.onRemove
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment