Newer
Older
* Drupal to Google Maps API bridge.
*/
/*global $, Drupal, GLatLng, GSmallZoomControl, GLargeMapControl, GMap2 */
/*global GMapTypeControl, GSmallMapControl, G_HYBRID_MAP, G_NORMAL_MAP */
/*global G_PHYSICAL_MAP, G_SATELLITE_MAP, GHierarchicalMapTypeControl */
/*global GKeyboardHandler, GLatLngBounds, GMenuMapTypeControl, GEvent */
/*global GOverviewMapControl, GScaleControl, GUnload */
var _handlers = {};
var _maps = {};
/**
* Retrieve a map object for use by a non-widget.
* Use this if you need to be able to fire events against a certain map
* which you have the mapid for.
* Be a good GMap citizen! Remember to send change()s after modifying variables!
*/
if (!_handlers[handler]) {
_handlers[handler] = [];
}
_handlers[handler].push(callback);
};
for (var mapid in Drupal.settings.gmap) {
if (Drupal.settings.gmap.hasOwnProperty(mapid)) {
_maps[mapid].change(name, -1, userdata);
}
var initcallback = function (mapid) {
return (function () {
_maps[mapid].change("bootstrap_options", -1);
_maps[mapid].change("boot", -1);
_maps[mapid].change("init", -1);
// Send some changed events to fire up the rest of the initial settings..
_maps[mapid].change("maptypechange", -1);
_maps[mapid].change("controltypechange", -1);
_maps[mapid].change("alignchange", -1);
// Set ready to put the event system into action.
_maps[mapid].ready = true;
});
};
if (Drupal.settings && Drupal.settings.gmap) {
var mapid = obj.id.split('-');
var instanceid = mapid.pop();
mapid.shift();
Brandon Bergren
committed
mapid = mapid.join('-');
var control = instanceid.replace(/\d+$/, '');
// Lazy init the map object.
if (!_maps[mapid]) {
_maps[mapid] = new Drupal.gmap.map(Drupal.settings.gmap[mapid]);
// Prepare the initialization callback.
var callback = initcallback(mapid);
setTimeout(callback, 0);
}
for (var i = 0; i < _handlers[control].length; i++) {
_handlers[control][i].call(_maps[mapid], obj);
}
}
else {
// Element with wrong class?
}
}
};
}();
Drupal.gmap.factory = {};
this.vars = v;
this.map = undefined;
this.ready = false;
var _bindings = {};
/**
* Register interest in a change.
*/
if (!_bindings[name]) {
_bindings[name] = [];
}
return _bindings[name].push(callback) - 1;
};
/**
* Change notification.
* Interested parties can act on changes.
*/
var c;
if (_bindings[name]) {
for (c = 0; c < _bindings[name].length; c++) {
if (c != id) {
_bindings[name][c](userdata);
}
}
}
if (name != 'all') {
}
};
/**
* Deferred change notification.
* This will cause a change notification to be tacked on to the *end* of the event queue.
*/
var obj = this;
// This will move the function call to the end of the event loop.
setTimeout(function () {
obj.change(name, id, userdata);
}, 0);
};
};
////////////////////////////////////////
// Map widget //
////////////////////////////////////////
var obj = this;
var _ib = {};
// Respond to incoming zooms
obj.map.setZoom(obj.vars.zoom);
});
// Respond to incoming moves
_ib.move = obj.bind("move", function () {
obj.map.panTo(new GLatLng(obj.vars.latitude, obj.vars.longitude));
});
// Respond to incoming map type changes
var i;
for (i = 0; i < obj.opts.mapTypeNames.length; i++) {
if (obj.opts.mapTypeNames[i] == obj.vars.maptype) {
obj.map.setMapType(obj.opts.mapTypes[i]);
break;
}
}
});
// Respond to incoming width changes.
obj.map.getContainer().style.width = w;
obj.map.checkResize();
});
// Send out outgoing width changes.
// N/A
// Respond to incoming height changes.
_ib.height = obj.bind("heightchange", function (h) {
obj.map.getContainer().style.height = h;
obj.map.checkResize();
});
// Send out outgoing height changes.
// N/A
// Respond to incoming control type changes.
_ib.ctc = obj.bind("controltypechange", function () {
if (obj.currentcontrol) {
obj.map.removeControl(obj.currentcontrol);
}
if (obj.vars.controltype == 'Micro') {
obj.map.addControl(obj.currentcontrol = new GSmallZoomControl());
}
else if (obj.vars.controltype == 'Small') {
obj.map.addControl(obj.currentcontrol = new GSmallMapControl());
}
else if (obj.vars.controltype == 'Large') {
obj.map.addControl(obj.currentcontrol = new GLargeMapControl());
}
});
// Send out outgoing control type changes.
// N/A
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
// Bootup options.
var opts = {}; // Object literal GMapOptions
obj.opts = opts;
// Null out the enabled types.
opts.mapTypes = [];
opts.mapTypeNames = [];
// Load google map types.
if (obj.vars.baselayers['Map']) {
opts.mapTypes.push(G_NORMAL_MAP);
opts.mapTypeNames.push('Map');
}
if (obj.vars.baselayers['Satellite']) {
opts.mapTypes.push(G_SATELLITE_MAP);
opts.mapTypeNames.push('Satellite');
}
if (obj.vars.baselayers['Hybrid']) {
opts.mapTypes.push(G_HYBRID_MAP);
opts.mapTypeNames.push('Hybrid');
}
if (obj.vars.baselayers['Physical']) {
opts.mapTypes.push(G_PHYSICAL_MAP);
opts.mapTypeNames.push('Physical');
}
});
obj.map = new GMap2(elem, obj.opts);
});
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
var map = obj.map;
// Map type control
if (obj.vars.mtc == 'standard') {
map.addControl(new GMapTypeControl());
}
else if (obj.vars.mtc == 'hier') {
map.addControl(new GHierarchicalMapTypeControl());
}
else if (obj.vars.mtc == 'menu') {
map.addControl(new GMenuMapTypeControl());
}
if (obj.vars.behavior.overview) {
map.addControl(new GOverviewMapControl());
}
if (obj.vars.behavior.scale) {
map.addControl(new GScaleControl());
}
if (obj.vars.behavior.nodrag) {
map.disableDragging();
}
else if (!obj.vars.behavior.nokeyboard) {
obj._kbdhandler = new GKeyboardHandler(map);
}
if (obj.vars.extent) {
var c = obj.vars.extent;
var extent = new GLatLngBounds(new GLatLng(c[0][0], c[0][1]), new GLatLng(c[1][0], c[1][1]));
obj.vars.latitude = extent.getCenter().lat();
obj.vars.longitude = extent.getCenter().lng();
obj.vars.zoom = map.getBoundsZoomLevel(extent);
}
if (obj.vars.behavior.collapsehack) {
// Modify collapsable fieldsets to make maps check dom state when the resize handle
// is clicked. This may not necessarily be the correct thing to do in all themes,
// hence it being a behavior.
map.setCenter(new GLatLng(obj.vars.latitude, obj.vars.longitude), obj.vars.zoom);
};
$(elem).parents('fieldset.collapsible').children('legend').children('a').click(r);
// Would be nice, but doesn't work.
//$(elem).parents('fieldset.collapsible').children('.fieldset-wrapper').scroll(r);
map.setCenter(new GLatLng(obj.vars.latitude, obj.vars.longitude), obj.vars.zoom);
Brandon Bergren
committed
if (!obj.vars.nocontzoom) {
map.enableDoubleClickZoom();
map.enableContinuousZoom();
}
if (!obj.vars.behavior.nomousezoom) {
Brandon Bergren
committed
map.enableScrollWheelZoom();
}
// Send out outgoing zooms
GEvent.addListener(map, "zoomend", function (oldzoom, newzoom) {
obj.vars.zoom = newzoom;
obj.change("zoom", _ib.zoom);
});
// Send out outgoing moves
var coord = map.getCenter();
obj.vars.latitude = coord.lat();
obj.vars.longitude = coord.lng();
obj.change("move", _ib.move);
});
// Send out outgoing map type changes.
GEvent.addListener(map, "maptypechanged", function () {
// If the map isn't ready yet, ignore it.
if (obj.ready) {
var type = map.getCurrentMapType();
var i;
for (i = 0; i < obj.opts.mapTypes.length; i++) {
if (obj.opts.mapTypes[i] == type) {
obj.vars.maptype = obj.opts.mapTypeNames[i];
}
}
obj.change("maptypechange", _ib.mtc);
}
});
});
});
////////////////////////////////////////
// Zoom widget //
////////////////////////////////////////
var obj = this;
// Respond to incoming zooms
elem.value = obj.vars.zoom;
});
// Send out outgoing zooms
obj.vars.zoom = parseInt(elem.value, 10);
obj.change("zoom", binding);
});
});
////////////////////////////////////////
// Latitude widget //
////////////////////////////////////////
Drupal.gmap.addHandler('latitude', function (elem) {
var obj = this;
// Respond to incoming movements.
elem.value = '' + obj.vars.latitude;
});
// Send out outgoing movements.
obj.vars.latitude = Number(this.value);
obj.change("move", binding);
});
});
////////////////////////////////////////
// Longitude widget //
////////////////////////////////////////
Drupal.gmap.addHandler('longitude', function (elem) {
var obj = this;
// Respond to incoming movements.
elem.value = '' + obj.vars.longitude;
});
// Send out outgoing movements.
obj.vars.longitude = Number(this.value);
obj.change("move", binding);
});
});
////////////////////////////////////////
// Latlon widget //
////////////////////////////////////////
var obj = this;
// Respond to incoming movements.
elem.value = '' + obj.vars.latitude + ',' + obj.vars.longitude;
});
// Send out outgoing movements.
var t = this.value.split(',');
obj.vars.latitude = Number(t[0]);
obj.vars.longitude = Number(t[1]);
obj.change("move", binding);
});
});
////////////////////////////////////////
// Maptype widget //
////////////////////////////////////////
var obj = this;
// Respond to incoming movements.
var binding = obj.bind("maptypechange", function () {
elem.value = obj.vars.maptype;
});
// Send out outgoing movements.
obj.vars.maptype = elem.value;
obj.change("maptypechange", binding);
});
});
var re = /([0-9.]+)\s*(em|ex|px|in|cm|mm|pt|pc|%)/;
var ar;
if ((ar = re.exec(str.toLowerCase()))) {
return ar[1] + ar[2];
}
return null;
};
////////////////////////////////////////
// Width widget //
////////////////////////////////////////
Drupal.gmap.addHandler('width', function (elem) {
var obj = this;
// Respond to incoming width changes.
var binding = obj.bind("widthchange", function (w) {
elem.value = normalize(w);
});
// Send out outgoing width changes.
$(elem).change(function () {
var n;
if ((n = normalize(elem.value))) {
elem.value = n;
obj.change('widthchange', binding, n);
}
});
obj.bind('init', function () {
$(elem).change();
});
////////////////////////////////////////
// Height widget //
////////////////////////////////////////
Drupal.gmap.addHandler('height', function (elem) {
var obj = this;
// Respond to incoming height changes.
var binding = obj.bind("heightchange", function (h) {
elem.value = normalize(h);
});
// Send out outgoing height changes.
$(elem).change(function () {
var n;
if ((n = normalize(elem.value))) {
elem.value = n;
obj.change('heightchange', binding, n);
}
});
obj.bind('init', function () {
$(elem).change();
});
});
})(); // END CLOSURE
////////////////////////////////////////
// Control type widget //
////////////////////////////////////////
Drupal.gmap.addHandler('controltype', function (elem) {
var obj = this;
// Respond to incoming height changes.
var binding = obj.bind("controltypechange", function () {
elem.value = obj.vars.controltype;
});
// Send out outgoing height changes.
obj.vars.controltype = elem.value;
obj.change("controltypechange", binding);
});
});
Drupal.behaviors.GMap = function (context) {
$('.gmap-control:not(.gmap-processed)', context).addClass('gmap-processed').each(Drupal.gmap.setup);
};