+ },
+
+ parseHash: function(hash) {
+ var i = hash.indexOf('#');
+ if (i < 0) {
+ return false;
+ }
+
+ hash = hash.substr(i + 1);
+
+ if (hash === '') {
+ return false;
+ }
+
+ hash = querystring.parse(hash);
+
+ if (hash.map === undefined) {
+ return false;
+ }
+
+ var args = hash.map.split("/");
+ if (args.length !== 3) {
+ return false;
+ }
+
+ var zoom = parseInt(args[0], 10),
+ lat = parseFloat(args[1]),
+ lon = parseFloat(args[2]);
+
+ if (isNaN(zoom) || isNaN(lat) || isNaN(lon)) {
+ return false;
+ }
+
+ args = {
+ center: new L.LatLng(lat, lon),
+ zoom: zoom
+ };
+
+ if (hash.layers) {
+ args.layers = hash.layers;
+ }
+
+ return args;
+ },
+
+ formatHash: function(args) {
+ var center, zoom, layers;
+
+ if (args instanceof L.Map) {
+ center = args.getCenter();
+ zoom = args.getZoom();
+ layers = args.getLayersCode();
+ } else {
+ center = args.center || L.latLng(args.lat, args.lon);
+ zoom = args.zoom;
+ layers = args.layers || '';
+ }
+
+ center = center.wrap();
+ layers = layers.replace('M', '');
+
+ var precision = zoomPrecision(zoom),
+ hash = '#map=' + zoom +
+ '/' + center.lat.toFixed(precision) +
+ '/' + center.lng.toFixed(precision);
+
+ if (layers) {
+ hash += '&layers=' + layers;
+ }
+
+ return hash;