/**
* @file
* Common marker routines.
*/
/*global jQuery, Drupal, GEvent, GInfoWindowTab, GLatLng, GLatLngBounds */
Drupal.gmap.addHandler('gmap', function (elem) {
var obj = this;
var infowindow = new google.maps.InfoWindow();
obj.bind('init', function () {
if (obj.vars.behavior.autozoom) {
obj.bounds = new google.maps.LatLngBounds();
}
});
obj.bind('addmarker', function (marker) {
marker.opts.position = new google.maps.LatLng(marker.latitude, marker.longitude);
marker.opts.map = obj.map;
//var m = Drupal.gmap.factory.marker(marker.opts);
/***/
if (typeof Drupal.settings.gmap['markerlist'] == 'undefined') {
Drupal.settings.gmap['markerlist'] = new Array();
}
//create the latitude / logitude and store the marker
if (typeof Drupal.settings.gmap['markerlist'][marker.latitude] == 'undefined') {
Drupal.settings.gmap['markerlist'][marker.latitude] = new Array();
}
if (typeof Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude] == 'undefined') {
Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude] = new Array();
//no marker available for lat/long. create one
m = Drupal.gmap.factory.marker(marker.opts);
}
else {
//marker available for lat/long. reuse and reduce the number of objects created.
m = Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude][0].marker;
}
/***/
marker.marker = m;
/***/
Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude].push(marker);
/***/
google.maps.event.addListener(m, 'click', function () {
/***/
/*obj.change('clickmarker', -1, marker);*/
obj.change('clicknodemarker', -1, marker);
/***/
});
/*
if (obj.vars.behavior.highlight) {
GEvent.addListener(m, 'mouseover', function () {
};
}*/
if (obj.vars.behavior.extramarkerevents) {
google.maps.event.addListener(m, 'mouseover', function () {
obj.change('mouseovermarker', -1, marker);
});
google.maps.event.addListener(m, 'mouseout', function () {
obj.change('mouseoutmarker', -1, marker);
});
google.maps.event.addListener(m, 'dblclick', function () {
obj.change('dblclickmarker', -1, marker);
});
}
/**
* Perform a synthetic marker click on this marker on load.
*/
if (marker.autoclick || (marker.options && marker.options.autoclick)) {
obj.deferChange('clickmarker', -1, marker);
}
if (obj.vars.behavior.autozoom) {
obj.bounds.extend(new google.maps.LatLng(marker.latitude, marker.longitude));
}
});
//clicknodemaker provides the capability to merge contents of multiple markers at a given
//latitude/longitude
obj.bind('clicknodemarker', function (marker) {
//if there are more than one items at a lat/long, club them
if (Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude].length > 1) {
//showMultipleNodes(marker);
//obj.change('clickmultiplemarker', -1, marker);
obj.change('clickmultiplemarkerCustom', -1, marker);
}
else {
//delegate to single node display
obj.change('clickmarker', -1, marker);
}
});
// Default marker actions.
obj.bind('clickmarker', function (marker) {
// Close infowindow if open to prevent multiple windows
if (infowindow != null) {
infowindow.close();
}
if (marker.text) {
infowindow.setContent(marker.text);
infowindow.open(obj.map, marker.marker);
}
// Info Window Query / Info Window Offset
else if (marker.iwq || (obj.vars.iwq && typeof marker.iwo != 'undefined')) {
var iwq, iwo;
if (obj.vars.iwq) {
iwq = obj.vars.iwq;
}
if (marker.iwq) {
iwq = marker.iwq;
}
iwo = 0;
if (marker.iwo) {
iwo = marker.iwo;
}
// Create a container to store the cloned DOM elements.
var el = document.createElement('div');
// Clone the matched object, run through the clone, stripping off ids, and move the clone into the container.
jQuery(iwq).eq(iwo).clone(false).find('*').removeAttr('id').appendTo(jQuery(el));
marker.setContent(el);
infowindow.open(obj.map, marker.marker);
}
// AJAX content
else if (marker.rmt) {
var uri = marker.rmt;
// If there was a callback, prefix that.
// (If there wasn't, marker.rmt was the FULL path.)
if (obj.vars.rmtcallback) {
uri = obj.vars.rmtcallback + '/' + marker.rmt;
}
// @Bevan: I think it makes more sense to do it in this order.
// @Bevan: I don't like your choice of variable btw, seems to me like
// @Bevan: it belongs in the map object, or at *least* somewhere in
// @Bevan: the gmap settings proper...
//if (!marker.text && Drupal.settings.loadingImage) {
// marker.marker.openInfoWindowHtml(Drupal.settings.loadingImage);
//}
jQuery.get(uri, {}, function (data) {
infowindow.setContent(data);
infowindow.open(obj.map, marker.marker);
});
}
// Tabbed content
else if (marker.tabs) {
var data = "";
//tabs in an infowindow is no longer supported in API ver3.
for (var m in marker.tabs) {
data += marker.tabs[m];
}
infowindow.setContent(data);
infowindow.open(obj.map, marker.marker);
}
// No content -- marker is a link
else if (marker.link) {
open(marker.link, '_self');
}
});
obj.bind('clickmultiplemarker', function (marker) {
var location = window.location.pathname;
//path must be node/ or map/node/
var path = 'node/';
if (location.indexOf('node') == -1 && location.indexOf('user') == -1) {
//node or user is not in the path, create url to navigate to map/node/nid.
path = 'map/node/';
}
var txt = '';
//get the text that needs to be displayed on multiple items. This facilitates
//translation. The module / any module can set the javascript setting for multiple_items_text
//parameter. If none is present, a default text is defined below.
if (typeof Drupal.settings.gmap['multiple_items_text'] != 'undefined') {
txt = '
' + Drupal.settings.gmap['multiple_items_text'] + '
';
}
else {
txt = 'There are multiple items at this location.
Click an item title below for more details about the item.
';
}
var totalLength = Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude].length;
for (var cnt = 0; cnt < totalLength; cnt++) {
var currMarker = Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude][cnt];
var linkpath = '';
if (typeof currMarker['rmt'] == 'undefined') {
linkpath = '/';
}
else {
linkpath = path + currMarker['rmt'];
}
txt += '' + currMarker['opts']['title'] + '
'; //
}
//marker.marker.openInfoWindowHtml(txt);
if (infowindow != null) {
infowindow.close();
}
if (txt) {
infowindow.setContent(txt);
infowindow.open(obj.map, marker.marker);
}
});
obj.bind('clickmultiplemarkerCustom', function (marker) {
var txt = '';
//get the text that needs to be displayed on multiple items. This facilitates
//translation. The module / any module can set the javascript setting for multiple_items_text
//parameter. If none is present, a default text is defined below.
var totalLength = Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude].length;
var maxInfowindowHeight = jQuery('.gmap').height() * 0.6;
txt += '';
//marker.marker.openInfoWindowHtml(txt);
if (infowindow != null) {
infowindow.close();
}
if (txt) {
infowindow.setContent(txt);
infowindow.open(obj.map, marker.marker);
}
});
obj.bind('nodeclicked', function () {
//if cnt is -1 then show the list of items at a given lat/long
if (cnt == -1) {
var marker = Drupal.settings.gmap['markerlist'][latitude][longitude][0];
//marker.marker.closeInfoWindow();
infowindow.close();
//showMultipleNodes(marker);
obj.change('clickmultiplemarker', -1, marker);
return false;
}
else {
//show the details for the selected item
var marker = Drupal.settings.gmap['markerlist'][latitude][longitude][cnt];
//marker.marker.closeInfoWindow();
infowindow.close();
if (marker.text) {
var txt = '';
//get the text that needs to be displayed to return back to multiple items list. This facilitates
//translation. The module / any module can set the javascript setting for multiple_items_return_text
//parameter. If none is present, a default text is defined below.
if (typeof Drupal.settings.gmap['multiple_items_return_text'] != 'undefined') {
txt = Drupal.settings.gmap['multiple_items_return_text']
}
else {
txt = 'Click here to return to item title list.';
}
//add "Back" link to list of items
txt = marker.text + '
' + txt + ''
//marker.marker.openInfoWindowHtml(txt);
if (infowindow != null) {
infowindow.close();
}
if (txt) {
infowindow.setContent(txt);
infowindow.open(obj.map, marker.marker);
}
return false;
}
}
//no text was found, propagate the click event further up
return true;
});
obj.bind('markersready', function () {
// If we are autozooming, set the map center at this time.
if (obj.vars.behavior.autozoom) {
if (!obj.bounds.isEmpty()) {
obj.map.fitBounds(obj.bounds);
var listener = google.maps.event.addListener(obj.map, "idle", function () {
if (obj.vars.maxzoom) {
var maxzoom = parseInt(obj.vars.maxzoom)
if (obj.map.getZoom() > maxzoom) obj.map.setZoom(maxzoom);
google.maps.event.removeListener(listener);
}
});
}
}
});
obj.bind('clearmarkers', function () {
// Reset bounds if autozooming
// @@@ Perhaps we should have a bounds for both markers and shapes?
if (obj.vars.behavior.autozoom) {
obj.bounds = new google.maps.LatLngBounds();
}
});
Drupal.gmap.getInfoWindow = function () {
return infowindow;
};
// @@@ TODO: Some sort of bounds handling for deletemarker? We'd have to walk the whole thing to figure out the new bounds...
});
/*
var nodeclicked = function(latitude, longitude, cnt) {
//if cnt is -1 then show the list of items at a given lat/long
if (cnt == -1) {
var marker = Drupal.settings.gmap['markerlist'][latitude][longitude][0];
marker.marker.closeInfoWindow();
showMultipleNodes(marker);
return false;
}
else {
//show the details for the selected item
var marker = Drupal.settings.gmap['markerlist'][latitude][longitude][cnt];
marker.marker.closeInfoWindow();
if (marker.text) {
var txt = '';
//get the text that needs to be displayed to return back to multiple items list. This facilitates
//translation. The module / any module can set the javascript setting for multiple_items_return_text
//parameter. If none is present, a default text is defined below.
if (typeof Drupal.settings.gmap['multiple_items_return_text'] != 'undefined') {
txt = Drupal.settings.gmap['multiple_items_return_text']
}
else {
txt = 'Click here to return to item title list.';
}
//add "Back" link to list of items
txt = marker.text + '
' + txt + ''
//marker.marker.openInfoWindowHtml(txt);
if (infowindow != null) {
infowindow.close();
}
if (txt) {
infowindow.setContent(txt);
infowindow.open(obj.map, marker.marker);
}
return false;
}
}
//no text was found, propagate the click event further up
return true;
};
var showMultipleNodes = function(marker){
var location = window.location.pathname;
//path must be node/ or map/node/
var path = 'node/';
if (location.indexOf('node') == -1 && location.indexOf('user') == -1) {
//node or user is not in the path, create url to navigate to map/node/nid.
path = 'map/node/';
}
var txt = '';
//get the text that needs to be displayed on multiple items. This facilitates
//translation. The module / any module can set the javascript setting for multiple_items_text
//parameter. If none is present, a default text is defined below.
if (typeof Drupal.settings.gmap['multiple_items_text'] != 'undefined') {
txt = '' + Drupal.settings.gmap['multiple_items_text'] + '
';
}
else {
txt = 'There are multiple items at this location.
Click an item title below for more details about the item.
';
}
var totalLength = Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude].length;
for (var cnt = 0; cnt < totalLength; cnt++) {
var currMarker = Drupal.settings.gmap['markerlist'][marker.latitude][marker.longitude][cnt];
var linkpath = '';
if (typeof currMarker['rmt'] == 'undefined') {
linkpath = '/';
}
else {
linkpath = path + currMarker['rmt'];
}
txt += '' + currMarker['opts']['title'] + '
';
}
//marker.marker.openInfoWindowHtml(txt);
if (infowindow != null) {
infowindow.close();
}
if (txt) {
infowindow.setContent(txt);
infowindow.open(obj.map, marker.marker);
}
};*/