').css("height", me.opts.map.height ? me.opts.map.height + "px": "100%");
me.mapC.mapH.append('
Loading ...
');
me.mapC.parent.append(me.mapC.mapH);
this.loadMapScripts(this.initializeMap);
}
this.loadMapScripts = function(cb) {
window._gmapLoaded = function() {
initTFMarker();
me.directionsService = new google.maps.DirectionsService();
// load map utils
$jQ.ajax({url:'/static/js/gmap/map_utils-v1.7.js',
dataType:'script', cache:true, success: function() {
cb();
}});
};
if (window.google !== undefined && window.google.maps !== undefined) {
if (window.MAP_UTIL !== undefined) {cb(); return;}
_gmapLoaded(); return;
}
var s = document.createElement("script");
s.type = "text/javascript"; s.src = "//maps.googleapis.com/maps/api/js?key=AIzaSyB9pT2IxXZwk-jt2l7OdDaSwPQALOlM9zo&v=3&libraries=places,geometry,drawing&callback=_gmapLoaded";
$jQ('head').append(s);
}
this.initializeMap = function() {
me.mapTypeControlOptions = {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.TOP_LEFT
};
me.zoomControlOptions = {
style: google.maps.ZoomControlStyle.DEFAULT,
position: google.maps.ControlPosition.RIGHT_BOTTOM
};
var myOptions = {
zoom: MAP_UTIL.initialZoomLevel, scrollwheel:false,
center: new google.maps.LatLng(0, 0),
mapTypeId: google.maps.MapTypeId.ROADMAP, mapTypeControl:false, streetViewControl:false,
// mapTypeControlOptions: me.mapTypeControlOptions,
zoomControlOptions: me.zoomControlOptions
};
me.gmap = new google.maps.Map(me.mapC.mapH.get(0), myOptions);
if (MAP_UTIL.mapStyles[me.opts.map.theme]) {
me.gmap.setOptions({styles: MAP_UTIL.mapStyles[me.opts.map.theme]});
}
if (me.opts.map.trafficLyr) {
me.setTrafficLayer(true);
}
me.geocoder = new google.maps.Geocoder();
me.overlay = new google.maps.OverlayView();
me.overlay.draw = function() {};
me.overlay.setMap(me.gmap);
if (me.opts.actOMS) {me.oms = MAP_UTIL.createOms(me.gmap);}
if (me.afterInitCallback) {me.afterInitCallback();}
}
this.setupEditableLocationMarker = function(opts) {
opts = $jQ.extend({}, {lat:null, lng:null}, opts || {});
me.isEditMode = true;
me.clearEditableMarker();
if (opts.lat) {
var point = new google.maps.LatLng(opts.lat, opts.lng);
me.gmap.setCenter(point);
me.gmap.setZoom(16);
me.createEditableMarker(point);
}
}
this.getParentCtr = function() {
return me.mapC.parent;
}
this.searchOnMap = function(str, opts) {
opts = $jQ.extend({}, {clbk:null, zoom:16}, opts || {});
if (!str) return;
me.geocoder.geocode({'address':str}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
me.gmap.setCenter(results[0].geometry.location);
MAP_UTIL.smoothZoom(me.gmap, opts.zoom, me.gmap.getZoom());
if (me.isEditMode) {
me.clearEditableMarker();
me.createEditableMarker(results[0].geometry.location);
$jQ(document).trigger('mrkrposupdate', [{lat:results[0].geometry.location.lat(), lng:results[0].geometry.location.lng()}, me]);
}
me.gmap.panTo(results[0].geometry.location);
if (opts.clbk) opts.clbk(results[0]);
} else {
console.log('Error: search not successful: ' + status);
}
});
}
this.clearEditableMarker = function() {
if (!me.editMarker) return;
me.editMarker.setMap(null);
me.editMarker = null;
}
this.createEditableMarker = function(latLng) {
me.editMarker = new google.maps.Marker({map:me.gmap, position:latLng, icon:getMapMarkerIcon(cityMarkerIcon())});
me.editMarker.setDraggable(true);
google.maps.event.addListener(me.editMarker, 'click', function(event) {
var point = me.editMarker.getPosition();
if (point) $jQ(document).trigger('mrkrposupdate', [{lat:point.lat(), lng:point.lng()}, me]);
});
google.maps.event.addListener(me.editMarker, 'dragend', function(event) {
var point = me.editMarker.getPosition();
if (point) $jQ(document).trigger('mrkrposupdate', [{lat:point.lat(), lng:point.lng()}, me]);
});
return me.editMarker;
}
this.getProjection = function() {
return me.overlay.getProjection();
}
this.setTrafficLayer = function(on) {
if (on) {
if (!me.trafficLayer) me.trafficLayer = new google.maps.TrafficLayer();
me.trafficLayer.setMap(me.gmap);
} else if (!me.trafficLayer) {
me.trafficLayer.setMap(null);
}
}
this.setResizeOpts = function(opts) {
me.opts.map.resize = $jQ.extend({}, me.opts.map.resize, opts || {});
}
this.triggerResize = function() {
var center = me.gmap.getCenter();
google.maps.event.trigger(me.gmap, 'resize');
me.gmap.setCenter(center);
}
this.adjustMapSize = function() {
if (me.gmap) {
var mapCenter = me.gmap.getCenter();
google.maps.event.trigger(me.gmap, 'resize');
me.gmap.setCenter(mapCenter);
}
}
this.resizeMap = function(isMx) {
isMx = (isMx == undefined) ? !me.isMax: isMx; me.isMax = isMx;
JS_UTIL.toggleFullScr(me.mapC.parent, isMx);
var mapClsJ = $jQ('.mapCls', me.mapC.parent);
if (mapClsJ.length == 0) {
mapClsJ = $jQ('
✕
').appendTo(me.mapC.parent);
mapClsJ.click(function() {
me.resizeMap(false);
return false;
});
}
mapClsJ.toggle(isMx);
var offset = 0;
if (me.isMax) me.mapC.mapH.css("height", 'auto');
else me.mapC.mapH.css("height", me.opts.map.height ? me.opts.map.height + "px": "100%");
me.adjustMapSize();
if (me.opts.map.resize.cb) me.opts.map.resize.cb(me.isMax);
}
this.addControlDiv = function(htmlDiv, add) {
if (add) {
me.gmap.controls[MAP_UTIL.ctrlBxPos].clear();
me.gmap.controls[MAP_UTIL.ctrlBxPos].push(htmlDiv);
} else {
me.gmap.controls[MAP_UTIL.ctrlBxPos].clear();
}
}
this.addControlElement = function(id, ctrlJ, prntCls, add) {
var eJ = $jQ(id, me.mapC.parent);
if (add) {
if (eJ.length == 0) me.mapC.parent.append(ctrlJ);
if (prntCls) me.mapC.parent.addClass(prntCls);
} else if (eJ.length > 0) {
eJ.remove();
if (prntCls) me.mapC.parent.removeClass(prntCls);
}
me.adjustMapSize();
}
this.setCurrentMapProps = function(mapProps) {
me.currentMapProps = mapProps;
}
this.moveToMapViewProps = function(props) {
if (props && props.lt && props.ln && props.zoom) {
var centerLatLngDummy = new google.maps.LatLng(props.lt-0.00001, props.ln-0.00001);
var centerLatLng = new google.maps.LatLng(props.lt, props.ln);
me.gmap.setCenter(centerLatLngDummy);
me.gmap.setCenter(centerLatLng);
var currentZoom = me.gmap.getZoom();
MAP_UTIL.smoothZoom(me.gmap, props.zoom, currentZoom);
return true;
}
return false;
}
this.isCurrentViewportMatchesMapProps = function(mapProps) {
if (!mapProps || !mapProps.lt) return true;
var mapBounds = me.gmap.getBounds();
if (!mapBounds) return true;
var ltLng = new google.maps.LatLng(mapProps.lt, mapProps.ln);
if (!mapBounds.contains(ltLng) || me.gmap.getZoom() != mapProps.zoom) {
return false;
}
return true;
}
this.checkMarkersOnMapAndFarApart = function(markers) {
if (!markers) return true;
var mapBounds = me.gmap.getBounds();
if (!mapBounds) return true;
var overlay = new google.maps.OverlayView();
overlay.draw = function() {};
overlay.setMap(me.gmap);
var nePt = overlay.getProjection().fromLatLngToDivPixel(mapBounds.getNorthEast());
var swPt = overlay.getProjection().fromLatLngToDivPixel(mapBounds.getSouthWest());
var mnPt = new google.maps.Point(-1000, -1000), mxPt = new google.maps.Point(0, 0);
for (var i = 0; i < markers.length; i++ ) {
var isInMap = mapBounds.contains(markers[i].getPosition());
if (!isInMap) return false;
var pt = overlay.getProjection().fromLatLngToDivPixel(markers[i].getPosition());
if (mnPt.x == -1000 || pt.x < mnPt.x) {mnPt.x = pt.x;}
if (mnPt.y == -1000 || pt.y < mnPt.y) {mnPt.y = pt.y;}
if (pt.x > mxPt.x) {mxPt.x = pt.x;}
if (pt.y > mxPt.y) {mxPt.y = pt.y;}
}
overlay.setMap(null);
if ((nePt.x - swPt.x) * 0.10 > (mxPt.x - mnPt.x) && (swPt.y - nePt.y) * 0.10 > (mxPt.y - mnPt.y)) {return false;}
return true;
}
// Call back when the current event has started
this.cbEvent = function (callBackMethodStart, callBackMethodEnd) {
// console.log('*********** CALL BACK Events Setter callBackMethodStart and callBackMethodEnd');
// console.log('*********** CALL BACK Events Setter: ' + callBackMethodStart + ', ' + callBackMethodEnd);
me.eventStartCBMethod = callBackMethodStart;
me.eventStopCBMethod = callBackMethodEnd;
}
function logEvent(caller) {
// var now = new Date();
// console.log('*********** CALL BACK Event LOG by: ' + caller + ' at time: ' + ' - ' + now.getTime());
// console.log('*********** CALL BACK Event LOG by: ' + caller + ' - (' + me.eventStartCBMethod + ', ' + me.eventStopCBMethod + ') at time: ' + ' - ' + now.getTime());
}
function startEvent() {
var now = new Date();
var cbMethod = me.eventStartCBMethod;
me.eventStartCBMethod = null;
if (cbMethod) {
// console.log('>>>>>>>>>>>>>>> CALL BACK Event START called back cbMethod at time: ' + now.getTime());
// console.log('>>>>>>>>>>>>>>> CALL BACK Event START called back: ' + cbMethod + ' at time: ' + ' - ' + now.getTime());
cbMethod();
}
}
function endEvent() {
var now = new Date();
var cbMethod = me.eventStopCBMethod;
me.eventStopCBMethod = null;
if (cbMethod) {
// console.log('>>>>>>>>>>>>>>> CALL BACK Event STOP called back cbMethod at time: ' + ' - ' + now.getTime());
// console.log('>>>>>>>>>>>>>>> CALL BACK Event STOP called back: ' + cbMethod + ' at time: ' + ' - ' + now.getTime());
cbMethod();
}
}
var autoZoomLatLng = function(latLngArr, dfZoom) {
if (latLngArr && latLngArr.length > 1) {
var latlngbounds = new google.maps.LatLngBounds();
for (var i = 0; i < latLngArr.length; i++ ) {
if (latLngArr[i].lat() && latLngArr[i].lng()) {
latlngbounds.extend(latLngArr[i]);
}
}
me.gmap.fitBounds(latlngbounds);
//util.increaseZoom(me.gmap, -1);
} else if (latLngArr && latLngArr.length == 1 && latLngArr[0].lat() && latLngArr[0].lng()){
if (dfZoom) me.gmap.setZoom(dfZoom);
me.gmap.panTo(latLngArr[0]);
}
}
var autoZoomMarkers = function(markers, dfZoom) {
var latLngArr = [];
if (markers) {
for (var i = 0; i < markers.length; i++ ) {
var marker = markers[i];
if(marker && marker.getMap()) {
latLngArr.push(marker.getPosition());
}
}
}
autoZoomLatLng(latLngArr, dfZoom);
}
this.autoZoomVisibleMarkers = function(dfZoom) {
var latLngArr = [];
for (var k in me.markersMap) {
var mrkr = me.markersMap[k];
if (mrkr && mrkr.getMap() && mrkr.getVisible()) {
latLngArr.push(mrkr.getPosition());
}
}
autoZoomLatLng(latLngArr, dfZoom);
}
this.setHotelsData = function(htlA, opts) {
me.HOTELS_DATA = htlA;
repaintHotels(opts);
}
this.setPlacesData = function(plcA, opts) {
me.PLACES_DATA = plcA;
repaintPlaces(opts);
}
var repaintPlaces = function(opts) {
opts = $jQ.extend({}, {hide:false, isAddStaticLabel:false}, opts || {});
clearMarkersWithType('PLACE');
for (var i = 0; i < me.PLACES_DATA.length; i++) {
var pO = me.PLACES_DATA[i];
var marker = me.getMarkerById('PLACE', pO.id);
// Ignore those markers whose lat lng is not set.
if (pO.lt == 0 || pO.ln == 0 || pO.lt <= -200 || pO.ln <= -200){
continue;
}
if (marker && marker.getMap()) {
marker.setVisible(false);
} else {
if (opts.isAddStaticLabel) {
pO.staticLabel = pO.nm;
}
// Create the marker (hidden)
marker = me.createPlaceMarker(pO.id, pO, '', opts);
}
// show the marker
marker.setVisible(!opts.hide);
}
}
var repaintHotels = function(opts) {
opts = $jQ.extend({}, {hide:false, isAddStaticLabel:false}, opts || {});
clearMarkersWithType('HOTEL');
for (var i = 0; i < me.HOTELS_DATA.length; i++) {
var hO = me.HOTELS_DATA[i];
var marker = me.getMarkerById('HOTEL', hO.id);
// Ignore those markers whose lat lng is not set.
if (hO.lt == 0 || hO.ln == 0 || hO.lt <= -200 || hO.ln <= -200){
continue;
}
if (marker && marker.getMap()) {
marker.setVisible(false);
} else {
if (opts.isAddStaticLabel) {
hO.staticLabel = hO.nm;
}
// Create the marker (hidden)
marker = me.createHotelMarker(hO.id, hO, hO.st, opts);
}
// show the marker
if (marker) marker.setVisible(!opts.hide);
}
}
var createCityDetailHTM = function(cO, isLbl) {
if (isLbl) {
var cJ = $jQ('
');
cJ.append('
'+cO.nm+'
');
return cJ;
} else {
var cJ = $jQ('
');
if (cO.img) cJ.append('
');
var iJ = $jQ('
').appendTo(cJ);
iJ.append('
');
if (cO.abt) iJ.append('
'+MAP_UTIL.trimToLength(cO.abt, 140)+'
');
return cJ;
}
}
var createPlaceDetailHTM = function(pO, isLbl) {
if (isLbl) {
var pJ = $jQ('
');
pJ.append('
'+pO.nm+'
');
if (pO.typNm) {pJ.append('
'+pO.typNm+'
');}
return pJ;
} else {
var pJ = $jQ('
');
if (pO.img) pJ.append('
');
var iJ = $jQ('
').appendTo(pJ);
iJ.append('
');
if (pO.typNm) {iJ.append('
'+pO.typNm+'
');}
if (pO.abt) iJ.append('
'+MAP_UTIL.trimToLength(pO.abt, 140)+'
');
return pJ;
}
}
var createHotelDetailHTM = function(hO, isLbl) {
if (isLbl) {
var pJ = $jQ('
');
pJ.append('
'+hO.nm+'
');
if (hO.st) pJ.append('
');
return pJ;
} else {
var pJ = $jQ('
');
if (hO.img) pJ.append('
');
var iJ = $jQ('
').appendTo(pJ);
iJ.append('
');
if (hO.st) iJ.append('
');
if (hO.desc) iJ.append('
'+MAP_UTIL.trimToLength(hO.desc, 140)+'
');
return pJ;
}
}
this.renderPackage = function(pO, dtO, opts) {
if (!pO || !dtO) return;
opts = $jQ.extend(true, {}, {incItnDays:true, showRouteInfo:false, hideMrkrs:false, rmvMrkr:false, clrOthrMrkrs:false, lineOpts:{quadratic:true}}, opts || {});
if (opts.clrOthrMrkrs) {
me.clearMarkersWithType('HOTEL'); me.clearMarkersWithType('PLACE');
me.closeInfoBox(false);
}
if (pO.cCnt == 1) {
for (var i=0;i
'+cfg.itnDys: '');
var mrkr = me.createCityMarker(ctO.id, ctO, '', {showOnMO:false});
if (opts.ctyClbk) {
$jQ('.ttl a', mrkr.m_contentJ).click(function() {
opts.ctyClbk(cky, ctO); return false;
});
}
}
// also create a hidden city marker
if (opts.hideMrkrs) {me.showHideMarker(me.getMarkerById('CITY', ctO.id), false);}
else if (opts.rmvMrkr) {me.removeMarker(me.getMarkerById('CITY', ctO.id));}
else {var mrkr = me.getMarkerById('CITY', ctO.id);}
}
if (!opts.hideMrkrs && !opts.rmvMrkr) me.autoZoomVisibleMarkers(11);
} else {
var lastCity = null;
$jQ.each(pO.cKys, function(i, cky) {
var cfg = pO.ctCfg[cky], ctO = dtO.cities[cfg.id];
var mrkr = me.getMarkerById('CITY', ctO.id);
if (opts.hideMrkrs) {me.showHideMarker(mrkr, false);}
else if (opts.rmvMrkr) {me.removeMarker(mrkr);}
else {
ctO.staticLabel = ctO.nm + (opts.incItnDays ? '
'+cfg.itnDys: '');
mrkr = me.createCityMarker(ctO.id, ctO, '', {showOnMO:false});
if (opts.ctyClbk) {
$jQ('.ttl a', mrkr.m_contentJ).click(function() {
opts.ctyClbk(cky, ctO); return false;
});
}
}
if (lastCity) {
var lnId = lastCity.id+'-'+ctO.id, rtO = opts.showRouteInfo && dtO.rts ? dtO.rts[lnId]:null;
var lnLbl = rtO ? rtO.dD+'
'+rtO.tmD: null;
if (opts.hideMrkrs || opts.rmvMrkr) {me.clearPolylines(lnId);}
else {me.createCustomPolyline(lnId, null, [lastCity, ctO], $jQ.extend({}, {label:lnLbl}, opts.lineOpts));}
}
lastCity = ctO;
});
if (!opts.hideMrkrs && !opts.rmvMrkr) me.autoZoomVisibleMarkers(11);
}
}
this.createCityMarker = function(id, cO, singleLetterRep, opts) {
if (!cO.lt || !cO.ln || cO.lt <= -200 || cO.ln <= -200) return null;
cO.latLng = new google.maps.LatLng(cO.lt, cO.ln);
opts = $jQ.extend({}, {hide:false, showFIcon:true, showOnMO:true, showLblOnMO:true}, opts || {});
MAP_UTIL.highestZIndexCities++;
cO.zIndexVal = MAP_UTIL.highestZIndexCities; cO.zoomLevel = MAP_UTIL.cityClickZoomLevel;
var iconUrl = cityHlMarkerIcon(singleLetterRep);
var dIconUrl = cityMarkerIcon(singleLetterRep);
var iconObj = getMapMarkerIcon(iconUrl);
var dIconObj = getMapMarkerIcon(dIconUrl);
var mrkr = createMarker('CITY', id, cO.nm, cO.nm, cO, iconObj, dIconObj, null, opts);
mrkr.m_contentJ = opts.contentJ ? opts.contentJ: (cO.m_contentJ ?cO.m_contentJ: createCityDetailHTM(cO, false));
mrkr.m_labelJ = opts.labelJ ? opts.labelJ: createCityDetailHTM(cO, true);
return mrkr;
}
this.createPlaceMarker = function(id, pO, singleLetterRep, opts) {
if (!pO.lt || !pO.ln || pO.lt <= -200 || pO.ln <= -200) return null;
pO.latLng = new google.maps.LatLng(pO.lt, pO.ln);
opts = $jQ.extend({}, {hide:false, showFIcon:true, showOnMO:true, showLblOnMO:true}, opts || {});
MAP_UTIL.highestZIndexPlaces++;
pO.zIndexVal = MAP_UTIL.highestZIndexPlaces; pO.zoomLevel = MAP_UTIL.placeClickZoomLevel;
var iconUrl = placeHlMarkerIcon(singleLetterRep, pO);
var dIconUrl = placeMarkerIcon(singleLetterRep);
var iconObj = getMapMarkerIcon(iconUrl);
var dIconObj = getMapMarkerIcon(dIconUrl);
var miniIconObj = getMapMarkerIcon(placeMiniMarkerIcon(singleLetterRep, pO));
var mrkr = createMarker('PLACE', id, pO.nm, pO.nm, pO, iconObj, dIconObj, miniIconObj, opts);
mrkr.m_contentJ = opts.contentJ ? opts.contentJ: createPlaceDetailHTM(pO, false);
mrkr.m_labelJ = opts.labelJ ? opts.labelJ: createPlaceDetailHTM(pO, true);
return mrkr;
}
this.createHotelMarker = function(id, hO, singleLetterRep, opts) {
if (!hO.lt || !hO.ln || hO.lt <= -200 || hO.ln <= -200) return null;
hO.latLng = new google.maps.LatLng(hO.lt, hO.ln);
opts = $jQ.extend({}, {hide:false, showFIcon:true, showOnMO:true, showLblOnMO:true}, opts || {});
MAP_UTIL.highestZIndexHotels++;
hO.zIndexVal = MAP_UTIL.highestZIndexHotels; hO.zoomLevel = MAP_UTIL.hotelClickZoomLevel;
var iconUrl = hotelHlMarkerIcon(singleLetterRep, hO);
var dIconUrl = hotelMarkerIcon(singleLetterRep);
var iconObj = getMapMarkerIcon(iconUrl);
var dIconObj = getMapMarkerIcon(dIconUrl);
var miniIconObj = getMapMarkerIcon(hotelMiniMarkerIcon(singleLetterRep, hO));
var mrkr = createMarker('HOTEL', id, hO.nm, hO.nm, hO, iconObj, dIconObj, miniIconObj, opts);
mrkr.m_contentJ = opts.contentJ ? opts.contentJ: createHotelDetailHTM(hO, false);
mrkr.m_labelJ = opts.labelJ ? opts.labelJ: createHotelDetailHTM(hO, true);
if (me.oms) {me.oms.addMarker(mrkr);}
return mrkr;
}
this.createCustomMarker = function(id, obj, singleLetterRep, opts) {
if (!obj.lt || !obj.ln || obj.lt <= -200 || obj.ln <= -200) return null;
obj.latLng = new google.maps.LatLng(obj.lt, obj.ln);
opts = $jQ.extend({}, {plTyp:'CUSTOM', hide:false, showFIcon:true, showOnMO:true, showLblOnMO:true, clkClbk:null}, opts || {});
MAP_UTIL.highestZIndexPlaces++;
obj.zIndexVal = MAP_UTIL.highestZIndexPlaces; obj.zoomLevel = MAP_UTIL.placeClickZoomLevel;
var iconUrl = placeHlMarkerIcon(singleLetterRep, obj);
var dIconUrl = placeMarkerIcon(singleLetterRep);
var iconObj = getMapMarkerIcon(iconUrl, obj);
var dIconObj = getMapMarkerIcon(dIconUrl, obj);
var miniIconObj = getMapMarkerIcon(placeMiniMarkerIcon(singleLetterRep, obj));
var mrkr = createMarker(opts.plTyp, id, obj.nm, obj.nm, obj, iconObj, dIconObj, miniIconObj, opts);
mrkr.m_contentJ = obj.content;
mrkr.m_labelJ = obj.label;
return mrkr;
}
var createMarker = function(plType, id, name, labelText, obj, iconObj, dIconObj, miniIconObj, opts) {
opts = $jQ.extend({}, {hide:false, showFIcon:true, staticLblCls:'', clkClbk:null}, opts || {});
var mrkr = me.getMarkerById(plType, id);
if (mrkr) me.removeMarker(mrkr);
if (opts.isHTML) {
mrkr = new TFMarker(obj.latLng, me.gmap, opts);
} else {
mrkr = new google.maps.Marker({map: me.gmap, position: obj.latLng, zIndex: obj.zIndexVal});
mrkr.setIcon(opts.showFIcon ? iconObj: dIconObj);
}
if (opts.hide) mrkr.setVisible(false);
mrkr.isHTML = !!opts.isHTML;
mrkr.m_plType = plType;
mrkr.m_id = id;
mrkr.m_nm = name;
mrkr.m_obj = obj; mrkr.m_latLng = obj.latLng;
mrkr.m_label = labelText;
mrkr.m_icon = iconObj; mrkr.m_dIcon = dIconObj; mrkr.m_miniIcon = miniIconObj;
mrkr.opts = opts;
me.markersMap[plType + id] = mrkr;
if (opts.showOnMO) {
var markerMOver = function() {
callMoMarker(mrkr, true, false, opts.showLblOnMO, true);
}
var markerMOut = function() {
callMoMarker(mrkr, false, false, opts.showLblOnMO, true);
}
attachMouseListenersToMarker(mrkr, markerMOver, markerMOut);
}
mrkr.m_clickListener = function(event) {
markerClickListener(mrkr, false, mrkr.opts);
if (opts.isHTML) {cancelEvent(event);}
if (opts.clkClbk) {
opts.clkClbk(obj, mrkr);
}
};
google.maps.event.addListener(mrkr, 'click', mrkr.m_clickListener);
if (obj.staticLabel) {
mrkr.m_labelInfoBox = createBasicInfoBoxLabel(obj.latLng, obj.staticLabel, mrkr.m_clickListener, {clazz:opts.staticLblCls, zIndex:obj.zIndexVal, open:!opts.hide});
}
return mrkr;
}
this.setMarkerStaticLabel = function(mrkr, txt, cls) {
if (!mrkr) return;
if (!mrkr.m_labelInfoBox) {
mrkr.m_labelInfoBox = createBasicInfoBoxLabel(mrkr.m_latLng, txt, mrkr.m_clickListener, {clazz:cls?cls:'', zIndex:mrkr.m_obj.zIndexVal});
} else {
mrkr.m_labelInfoBox.setContent(txt);
if (cls) {mrkr.m_labelInfoBox.setOptions({boxClass:'mapMSLbl ' + cls});}
}
}
this.getMarkerById = function(plTyp, id) {
if (plTyp) {return me.markersMap[plTyp+id];}
var mrkr = me.markersMap['PLACE'+id]; if (mrkr) return mrkr;
mrkr = me.markersMap['HOTEL'+id]; if (mrkr) return mrkr;
return null;
}
this.getMarkerDetailHTM = function(plTyp, id) {
var mrkr = me.getMarkerById(plTyp, id);
if (!mrkr || !mrkr.m_contentJ) return null;
return mrkr.m_contentJ.clone();
}
this.setCenterOnMarkerAndZoom = function(mrkr) {
if (!mrkr) return;
me.gmap.setCenter(mrkr.m_latLng);
MAP_UTIL.smoothZoom(me.gmap, mrkr.m_plType == 'HOTEL' ? MAP_UTIL.hotelClickZoomLevel: MAP_UTIL.placeClickZoomLevel, me.gmap.getZoom());
}
this.setMarkerIcon = function(mrkr, showFIcon) {
if (!mrkr) return;
mrkr.opts.showFIcon = showFIcon;
mrkr.setIcon(showFIcon ? mrkr.m_icon: mrkr.m_dIcon);
}
this.removeMarker = function(mrkr) {
if (!mrkr) return;
if (me.oms) {me.oms.removeMarker(mrkr);}
mrkr.setMap(null);
if(mrkr.m_labelInfoBox) {
mrkr.m_labelInfoBox.close();
}
delete me.markersMap[mrkr.m_plType+mrkr.m_id];
}
this.showHideMarkers = function(shw, type, mrkrs) {
if (!me.markersMap) return;
$jQ.each(me.markersMap, function(key, mrkr) {
if (!mrkr) return;
if (type && type != mrkr.m_plType) return;
if (mrkrs && mrkrs.length > 0 && $jQ.inArray(mrkr, mrkrs) == -1) return;
mrkr.setVisible(shw);
if (mrkr.m_labelInfoBox) mrkr.m_labelInfoBox.setVisible(shw);
});
}
this.showHideMarker = function(mrkr, shw) {
if (!mrkr) return;
mrkr.setVisible(shw);
if (mrkr.m_labelInfoBox) mrkr.m_labelInfoBox.setVisible(shw);
}
this.clearMarkersWithType = function(type) {
clearMarkersWithType(type);
}
var clearMarkersWithType = function(plType) {
if (me.markersMap) {
$jQ.each(me.markersMap, function(key, marker){
if(marker) {
if (!plType || (marker.m_plType && marker.m_plType == plType)) {
if (me.oms) {me.oms.removeMarker(marker);}
marker.setMap(null);
if(marker.m_labelInfoBox) {
marker.m_labelInfoBox.close();
}
marker = null;
delete me.markersMap[key];
}
}
});
}
}
var attachMouseListenersToMarker = function(marker, markerMOver, markerMOut){
marker.m_markerMoutDisabled = false;
// This will be set as true later by the infobox to disable the mouseout on the markerOrClusterer
var markerMoListener = function(event) {
if (markerSingleBoxMouseover(marker.m_id, markerMOut)) {
markerMOver();
}
};
google.maps.event.addListener(marker, 'mouseover', markerMoListener);
marker.m_markerMoListener = markerMoListener;
var markerMoutListener = function(event) {
if (marker.isHTML) markerMOut();
else markerSingleBoxMouseout(marker, markerMOut);
};
google.maps.event.addListener(marker, 'mouseout', markerMoutListener);
marker.m_markerMoutListener = markerMoutListener;
}
var createBasicInfoBoxLabel = function(latLng, content, clickListener, opts) {
opts = $jQ.extend({}, {width:70, ofsWd:null, ofsHt:null, clazz:'', open:true, zIndex:1, pane:"overlayLayer"}, opts || {});
var contentJQ = $jQ('').append(content);
if (clickListener) contentJQ.click(clickListener);
var pixelOffset = new google.maps.Size(opts.ofsWd ? opts.ofsWd: (-1 * opts.width / 2), opts.ofsHt ? opts.ofsHt: 1);
var myOptions = {content: contentJQ,
boxClass:'mapMSLbl ' + opts.clazz, boxStyle:{width:opts.width+"px"}, zIndex:opts.zIndex,
disableAutoPan:true, pixelOffset:pixelOffset, position:latLng, closeBoxURL: "",
isHidden:false, pane:opts.pane, enableEventPropagation:true
};
var ibLabel = new InfoBox(myOptions);
ibLabel.m_positionFixed = true;
if (opts.open) ibLabel.open(me.gmap);
return ibLabel;
}
var createMoCustomInfoBoxLabel = function(latLng, content, id, markerOrClusterer, cluster, opts) {
opts = $jQ.extend({}, {width:220, isLbl:false, isOnClk:false, allowMOOnCnt:false}, opts || {});
var contentJQ = $jQ('
').append(content) ;
if (opts.allowMOOnCnt) {
contentJQ.mouseover(function() {
// Disable mouse out on the marker now.
markerOrClusterer.m_markerMoutDisabled = true;
markerOrClusterer.m_markerMoListener(cluster);
});
contentJQ.mouseout(function() {
// Enable mouse out on the marker now.
markerOrClusterer.m_markerMoutDisabled = false;
markerOrClusterer.m_markerMoutListener(cluster);
});
}
var myOptions = {content: contentJQ,
boxClass: opts.isLbl ? 'mapInfoBoxLbl': 'mapInfoBox', disableAutoPan:opts.isLbl,
zIndex: google.maps.Marker.MAX_ZINDEX + 1, alignBottom:!opts.isLbl, infoBoxClearance:opts.isLbl?null:new google.maps.Size(15,50),
pixelOffset:opts.isLbl?new google.maps.Size(-68, 10): new google.maps.Size(-140, -45), position: latLng, closeBoxURL:"",
pane:"floatPane", enableEventPropagation:true, maxWidth:opts.width
};
var ibLabel = new InfoBox(myOptions);
ibLabel.m_positionFixed = false;
ibLabel.m_id = '' + id;
return ibLabel;
}
this.createCustomPolyline = function(lineId, path, objA, opts) {
me.clearPolylines(lineId);
if (objA && objA.length > 0) {
path = [];
for (var i=0;i
2) {lblLatLng = opts.path[Math.floor(opts.path.length/2)];}
else {lblLatLng = google.maps.geometry.spherical.interpolate(path[0], path[1], 0.5);}
pLn.label = createBasicInfoBoxLabel(lblLatLng, opts.label, null, opts.labelOpts);
}
pLn.setMap(me.gmap);
return pLn;
}
this.clearPolylines = function(id) {
if (!me.polylineMap) return;
if (id && !me.polylineMap[id]) return;
$jQ.each(me.polylineMap, function(key, line){
if (!line) return;
if (!id || key == id) {
if (line.label) {line.label.close();}
line.setMap(null); line = null;
delete me.polylineMap[key];
}
});
}
this.getPolylineById = function(id) {
return me.polylineMap[id];
}
function getGeodesicLinePoints(lineStart, lineEnd, n, factor) {
if (!n) n = 32;
var locs = [], startLat = lineStart.lat(), startLong = lineStart.lng(), endLat = lineEnd.lat(), endLong = lineEnd.lng();
if (!factor) factor = 5;
for (var k = 0; k <= n; k++) {
var percent = k / n, zeroOffset = (endLong - startLong) / factor, peakOffset = zeroOffset / 2, dist = zeroOffset * percent - zeroOffset;
var latitude = (endLat - startLat) * percent + startLat, longitude = (endLong - startLong) * percent + startLong;
var latitudeDifference = -Math.pow(dist + peakOffset, 2) + Math.pow(peakOffset, 2);
latitude = latitudeDifference + latitude;
zeroOffset = (endLat - startLat) / factor; peakOffset = zeroOffset / 2;
dist = zeroOffset * percent - zeroOffset;
var longitudeDifference = -Math.pow(dist + peakOffset, 2) + Math.pow(peakOffset, 2);
if (startLong < endLong) longitude = longitudeDifference + longitude;
else longitude = longitude - longitudeDifference;
locs.push(new google.maps.LatLng(latitude, longitude))
}
return locs
}
this.getDistanceBtwPoints = function(lt1, ln1, lt2, ln2) {
return google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(lt1, ln1), new google.maps.LatLng(lt2, ln2));
}
var plotFromToDrivingDirections = function(lineId, sLatLng, dLatLngArr, opts) {
opts = $jQ.extend({}, {strokeColor:"blue", strokeOpacity:0.35, strokeWeight:4, roadPath:true, animate:false}, opts || {});
var from = sLatLng, len = dLatLngArr.length, to = dLatLngArr[len-1], comment = null;
var waypointsArr = [];
if (len > 1) {
for (var i = 0; i < len-1; i++) {
waypointsArr.push({location:dLatLngArr[i], stopover:false});
}
}
var roadPathRequest = {origin:from, destination:to, provideRouteAlternatives:false, travelMode:google.maps.TravelMode.DRIVING, unitSystem:google.maps.UnitSystem.METRIC};
if (waypointsArr.length > 0) {roadPathRequest.waypoints = waypointsArr;}
me.directionsService.route(roadPathRequest, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
if (opts.animate) {
// Needs to be handled manually.
var mpLn = new google.maps.Polyline(opts);
if (lineId) {
me.polylineMap[lineId] = mpLn;
}
mpLn.setMap(me.gmap);
// First Route. First leg
var myRoute = result.routes[0].legs[0];
var overAllArr = [], polylineHead = null;
if (myRoute.steps && myRoute.steps.length > 0) {
var latLngArr = myRoute.steps[0].path;
if (latLngArr && latLngArr.length > 1) {
// We need to pick the start point of the first step.
mpLn.getPath().push(latLngArr[0]);
polylineHead = new google.maps.Marker({map:me.gmap, position:latLngArr[0], icon:getPolylineHeadMarkerIcon(polylineHeadMarkerIcon())});
}
for (var stepsIndex = 0; stepsIndex < myRoute.steps.length; stepsIndex++){
var latLngArr = myRoute.steps[stepsIndex].path;
for(var i = 0; i < latLngArr.length - 1; i++){
overAllArr.push(latLngArr[i]);
}
}
// Algorithm 2
// We need to render each [jumpSize]th point.
// jumpSize = Minimum 1, Maximum 100
var jumpSize = 1;
if (overAllArr.length > 100) {
jumpSize = Math.floor(overAllArr.length / 100) ;
}
if (jumpSize < 1) {jumpSize = 1;}
var pawStepSize = overAllArr.length / 10;
if(pawStepSize == 0) {pawStepSize = 1;}
var currentPawStep = pawStepSize;
// Total 3 sec?
var delay = (3000 * jumpSize) / overAllArr.length ;
updatePolyline2(mpLn, polylineHead, overAllArr, comment, 0, jumpSize, currentPawStep, pawStepSize, delay);
}
} else {
// Let the DirectionRenderer Handle this.
clearPkgDrivingDirections();
me.pkgDrivingDirections = new google.maps.DirectionsRenderer();
me.pkgDrivingDirections.suppressMarkers = true;
me.pkgDrivingDirections.polylineOptions = opts;
me.pkgDrivingDirections.setMap(me.gmap);
me.pkgDrivingDirections.setDirections(result);
}
} else {
plotFlightPath(lineId, from, dLatLngArr[0], opts);
for (var index = 0; index < dLatLngArr.length - 1 ; index++){
plotFlightPath(lineId + index, dLatLngArr[index], dLatLngArr[index+1], opts);
}
}
});
}
function plotFlightPath(lineId, from, to, opts) {
opts = $jQ.extend({}, {strokeColor:"blue", strokeOpacity:0.35, strokeWeight:4, geodesic:true, quadratic:true, animate:false}, opts || {});
if (opts.animate) {
var mpLn = new google.maps.Polyline(opts);
if (lineId) {
me.polylineMap[lineId] = mpLn;
}
mpLn.setMap(me.gmap);
mpLn.getPath().push(from);
var polylineHead = new google.maps.Marker({map:me.gmap, position:from, icon:getPolylineHeadMarkerIcon(polylineHeadMarkerIcon())});
var pathArr = getGeodesicLinePoints(from, to, 24, 8);
var jumpSize = 1;
if (pathArr.length > 100) {
jumpSize = Math.floor(pathArr.length / 100) ;
}
if (jumpSize < 1) {jumpSize = 1;}
var pawStepSize = pathArr.length / 10;
if(pawStepSize == 0) {pawStepSize = 1;}
var currentPawStep = pawStepSize;
// Total 3 sec?
var delay = (3000 * jumpSize) / pathArr.length ;
updatePolyline2(mpLn, polylineHead, pathArr, null, 0, jumpSize, currentPawStep, pawStepSize, delay);
} else {
me.createCustomPolyline(lineId, [from, to], null, opts);
}
}
// Algorithm 2
// Used for large latLong numbers
function updatePolyline2(pLn, pLnHd, latLngArr, labelText, index, jumpSize, currentPawStep, pawStepSize, delay) {
if (index >= latLngArr.length) {
setTimeout(function() {
google.maps.event.trigger(me.gmap, 'plotComplete');
pLnHd.setMap(null);
}, 1000);
return;
} else {
var delayThisTime = delay;
var latLng = latLngArr[index];
if (latLng) {
pLnHd.setPosition(latLngArr[index]);
pLn.getPath().push(latLngArr[index]);
}
if (labelText && index >= (latLngArr.length / 2) && !polyline.m_labelInfoBox) {
var backgroundColor = "#FBD263", fontColor = "#444";
pLn.m_labelInfoBox = createCityLabel(labelText, latLng.lat(), latLng.lng(), backgroundColor, fontColor, 150, new google.maps.Size(10, 10), null);
delayThisTime = 3000;
}
index = index + jumpSize;
setTimeout(function(){updatePolyline2(pLn, pLnHd, latLngArr, labelText, index, jumpSize, currentPawStep, pawStepSize, delay);}, delayThisTime);
return;
}
}
this.placeAtoB = function(cityId, aId, bId, show) {
var fireEvents = true;
var ctMrkr = me.getMarkerById('CITY', cityId);
var aMrkr = me.getMarkerById(null, aId), bMrkr = me.getMarkerById(null, bId), aMrkrReal = true, bMrkrReal = true;
if (!aMrkr) {aMrkrReal = false, aMrkr = ctMrkr;}
if (!bMrkr) {bMrkrReal = false, bMrkr = ctMrkr;}
var polylineId = aId + '_' + bId;
if (aMrkr && bMrkr && aMrkr.m_latLng.lat() != bMrkr.m_latLng.lat() && aMrkr.m_latLng.lng() != bMrkr.m_latLng.lng()) {
if (aMrkrReal) {
aMrkr.keepVisible = true; highlightSingleMarker(aMrkr, true, true);
}
if (bMrkrReal) {
bMrkr.keepVisible = true; highlightSingleMarker(bMrkr, true, true);
}
if (show) {
var markersArr = [aMrkr, bMrkr];
if (true) { // (!me.checkMarkersOnMapAndFarApart(markersArr)) {
if (me.isCurrentViewportMatchesMapProps(me.currentMapProps)) {
autoZoomMarkers(markersArr);
} else {
me.moveToMapViewProps(me.currentMapProps);
}
}
google.maps.event.addListenerOnce(me.gmap, 'idle', function(event) {
if (fireEvents) {startEvent();}
try {
var destLatLngArr = [bMrkr.m_latLng];
plotFromToDrivingDirections(polylineId, aMrkr.m_latLng, destLatLngArr, {animate:true});
} finally {
google.maps.event.addListenerOnce(me.gmap, 'plotComplete', function(event) {
if (fireEvents) {
if (aMrkrReal) {highlightSingleMarker(aMrkr, false, false);}
if (bMrkrReal) {highlightSingleMarker(bMrkr, false, false);}
endEvent();
}
});
}
});
setTimeout(function() {
google.maps.event.trigger(me.gmap, 'idle');
}, 4000);
} else {
clearPolyline(polylineId);
}
} else {
if (fireEvents) {
try {startEvent();} finally {endEvent();}
}
}
}
this.travelAtoB = function(cityIdA, cityIdB, opts) {
opts = $jQ.extend({}, {isFlight:false}, opts || {});
var fireEvents = true;
var cityAMrkr = me.getMarkerById('CITY', cityIdA), cityBMrkr = me.getMarkerById('CITY', cityIdB);
if (cityAMrkr && cityBMrkr) {
me.showHideMarker(cityAMrkr, true); me.showHideMarker(cityBMrkr, true);
// 1. Dont zoom out.Just Pan to both Cities
var markersArr = [cityAMrkr, cityBMrkr];
autoZoomMarkers(markersArr);
google.maps.event.addListenerOnce(me.gmap, 'idle', function(event) {
if (fireEvents) {startEvent();}
try {
// Plot the directions
var destCitiesLatLng = [cityBMrkr.m_latLng], lineId = cityIdA + '_' + cityIdB;
if (opts.isFlight) {
plotFlightPath(lineId, cityAMrkr.m_latLng, cityBMrkr.m_latLng, {animate:true});
} else {
plotFromToDrivingDirections(lineId, cityAMrkr.m_latLng, destCitiesLatLng, {animate:true});
}
} finally {
google.maps.event.addListenerOnce(me.gmap, 'plotComplete', function(event) {
markerClickListener(cityBMrkr);
if (fireEvents) {endEvent();}
});
}
});
}
}
this.clkMarker = function(mrkr) {
if (!mrkr) return;
callMoMarker(mrkr, true, true, false);
}
this.moMarker = function(mrkr, isMo) {
if (!mrkr) return;
callMoMarker(mrkr, isMo, false, mrkr.opts.showLblOnMO);
}
function callMoMarker(marker, isMo, isClk, isShwLbl, isEvCall) {
if (isMo) {
if (marker && marker.m_contentJ) {
if (isHoverBoxOpenOnClick() && !isClk) return;
var divHtml = isShwLbl ? marker.m_labelJ: (!isClk && marker.m_labelJ ? marker.m_labelJ: marker.m_contentJ);
if (isClk || (!isClk && marker.m_labelJ)) {
marker.infoBoxMo = createMoCustomInfoBoxLabel(marker.m_latLng, createAutoflowYJQDiv(divHtml), marker.m_id, marker, null, {width:350, isLbl:!!isShwLbl, isOnClk:!!isClk});
openHoverBox(marker.infoBoxMo, marker, isClk);
}
highlightSingleMarker(marker, true, true);
return marker.infoBoxMo;
}
} else {
if (isHoverBoxOpenOnClick() && !isClk) return;
if (marker.infoBoxMo) clearHoverBox(marker.infoBoxMo);
marker.infoBoxMo = null;
if (isEvCall && marker.keepVisible) return;
highlightSingleMarker(marker, false, true);
}
return null;
}
var cancelEvent = function(e) {
if (!e) return;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
}
this.clickPlace = function(pId) {
if (pId) {
var mrkr = me.getMarkerById('PLACE', pId);
if (mrkr) {markerClickListener(mrkr, true, {zoomMrkr:true});}
} else {
markerUnClickListener();
}
}
this.clickHotel = function(htl) {
if (htl) {
var mrkr = null;
if ($jQ.isNumeric(htl)) {
mrkr = me.getMarkerById('HOTEL', htl);
} else {
mrkr = me.createHotelMarker(htl.id, htl, htl.st, {});
}
if (mrkr) {markerClickListener(mrkr, true, {zoomMrkr:true});}
} else {
markerUnClickListener();
}
}
this.clickCity = function(cId) {
if (cId) {
var mrkr = me.getMarkerById('CITY', cId);
if (mrkr) {markerClickListener(mrkr, true, {zoomMrkr:true});}
} else {
markerUnClickListener();
}
}
this.clickCustomMrkr = function(cId) {
if (cId) {
var mrkr = me.getMarkerById('CUSTOM', cId);
if (mrkr) {markerClickListener(mrkr, true, {zoomMrkr:true});}
} else {
markerUnClickListener();
}
}
this.panToMarker = function(mrkr) {
if (!mrkr) return;
var centerLatLngDummy = new google.maps.LatLng(mrkr.m_latLng.lat()-0.00001, mrkr.m_latLng.lng()-0.00001);
me.gmap.panTo(centerLatLngDummy);
me.gmap.panTo(mrkr.m_latLng);
}
this.moveMarker = function(mrkr, lt, ln, opts) {
if (!mrkr) return;
opts = $jQ.extend({}, {animate:true, delay:1000, isPan:true}, opts || {});
var fPos = new google.maps.LatLng(lt, ln), cPos = mrkr.getPosition();
if (!opts.animate || (cPos.lat() == lt && cPos.lng() == ln)) {
mrkr.setPosition(fPos); mrkr.m_latLng = fPos;
if (opts.isPan) me.panToMarker(mrkr);
return;
}
var numStps = opts.delay/10, dLt = (lt - cPos.lat())/numStps, dLn = (ln - cPos.lng())/numStps;
var stpCnt = 0;
var changeMrkrPos = function() {
mrkr.setPosition(new google.maps.LatLng(cPos.lat()+dLt, cPos.lng()+dLn));
cPos = mrkr.getPosition(); mrkr.m_latLng = cPos;
if (opts.isPan) me.panToMarker(mrkr);
if (stpCnt < numStps) {
stpCnt++; setTimeout(changeMrkrPos, 10);
}
};
changeMrkrPos();
}
this.updateMarkerCanvasProp = function(mrkr, props) {
if (!mrkr) return;
var icon = mrkr.m_icon, iconUrl = mrkr.m_icon.url, width = Math.max(icon.width, icon.height);
mrkr.setOptions({icon:{url:CanvasIcon.makeIcon({url:iconUrl, width:width, height:width}).setCanvasProps(props).getUrl(), anchor:new google.maps.Point(width/2, width/2)}});
}
var markerClickListener = function(marker, fireEvents, opts) {
opts = $jQ.extend({}, {zoomMrkr:false}, opts || {});
if (opts.zoomMrkr) {
try {
me.panToMarker(marker);
var currentZoom = me.gmap.getZoom();
if (marker.m_obj.zoomLevel != currentZoom){
MAP_UTIL.smoothZoom(me.gmap, marker.m_obj.zoomLevel, currentZoom);
} else {
MAP_UTIL.setZoom(me.gmap, marker.m_obj.zoomLevel);
}
} finally {
}
}
if (fireEvents) {logEvent('markerClickListener');}
try {
if (fireEvents) {startEvent();}
// call once the map stabilizes
callMoMarker(marker, true, true, false);
} finally {
if (fireEvents) {endEvent();}
}
}
var markerUnClickListener = function() {
clearHoverBox();
}
var markerSingleBoxMouseover = function(boxId, newMoutFn, newMoutFnParam) {
if (hoverState.timer > 0) {clearTimeout(hoverState.timer);hoverState.timer = 0;}
if (hoverState.boxId) {
if (hoverState.boxId != boxId) {
if (hoverState.moutFn && hoverState.moutFnParam) {hoverState.moutFn(hoverState.moutFnParam);}
} else {
return false;
}
}
hoverState.moutFn = newMoutFn;
hoverState.moutFnParam = newMoutFnParam;
return true;
}
var markerSingleBoxMouseout = function(marker, moutFn, moutFnParam) {
if (!marker.m_markerMoutDisabled) {
hoverState.timer = setTimeout(function() {moutFn(moutFnParam);}, hoverState.delay);
}
}
function highlightSingleMarker(marker, yes, showLabel) {
// showLabel = false;
if (!marker) {return;}
if (yes) {
// First de-hightlight the marker itself.
if (!marker.keepVisible) {highlightSingleMarker(marker, false, showLabel);}
if (!marker.m_orgVisibility || marker.m_orgVisibility == 'INVISIBLE'){
if (marker.getMap() && !marker.getVisible()) {
marker.setVisible(true);
marker.m_orgVisibility = 'INVISIBLE';
}
}
// If the marker is not spiderfiered
if (!marker._omsData) {
if (marker.isHTML) {if (marker.opts.hoverText) marker.setText(marker.opts.hoverText);}
else {
marker.setIcon(marker.m_icon);
}
}
//marker.setAnimation(google.maps.Animation.BOUNCE);
//setTimeout(function(){marker.setAnimation(null);}, 760);
marker.setZIndex(google.maps.Marker.MAX_ZINDEX - 1);
if (marker.m_labelInfoBox && showLabel) {marker.m_labelInfoBox.open(me.gmap);}
} else {
if (marker.m_orgVisibility && marker.m_orgVisibility == 'INVISIBLE') {marker.setVisible(false);}
marker.m_orgVisibility = null;
if (!marker._omsData) {
if (marker.isHTML) {if (marker.opts.text) marker.setText(marker.opts.text);}
else {
marker.setIcon(marker.opts.showFIcon ? marker.m_icon: marker.m_dIcon);
}
}
//marker.setAnimation(null);
marker.setZIndex(marker.m_obj.zIndexVal);
if (marker.m_labelInfoBox && !showLabel) {marker.m_labelInfoBox.close();}
}
}
function openHoverBox(infoBox, marker, isOnClk) {
if (hoverState.box) {
if (isOnClk && hoverState.boxMarker) {highlightSingleMarker(hoverState.boxMarker, false, true);}
clearHoverBox(hoverState.box);
}
hoverState.box = infoBox; hoverState.onClk = isOnClk;
hoverState.boxId = marker._id; hoverState.boxMarker = marker;
if (hoverState.box) {
hoverState.box.open(me.gmap);
if (isOnClk) {
google.maps.event.addListener(me.gmap, "click", function() {
highlightSingleMarker(marker, false, true);
clearHoverBox(infoBox);
});
}
}
}
this.closeInfoBox = function(onClk) {
if (!hoverState.box || (onClk && !hoverState.onClk)) return;
if (hoverState.boxMarker) highlightSingleMarker(hoverState.boxMarker, false, true);
clearHoverBox(hoverState.box);
}
function clearHoverBox(infoBoxCurrent) {
if (infoBoxCurrent) infoBoxCurrent.close();
if (hoverState.box) hoverState.box.close();
hoverState.box = null; hoverState.boxId = null; hoverState.boxMarker = null;
}
function isHoverBoxOpenOnClick() {
return (hoverState.box && hoverState.onClk);
}
function createAutoflowYJQDiv(divJQ) {
return divJQ;
}
// ICONS
this.markerIcon3Url = "//cdn.yourholiday.me/static/img/poccom/maps/icons3/";
this.mapIconsUrl = "//cdn.yourholiday.me/static/img/mapicons/ver2/";
this.cityRoundMarkerIconUrl = "//cdn.yourholiday.me/static/img/poccom/maps/utils/";
this.invalidDotIcon = this.markerIcon3Url + 'maroon-dot-invalid.png';
this.maroonDotIcon = this.markerIcon3Url + 'maroon-dot.png';
this.blueBottomIcon = this.cityRoundMarkerIconUrl + "blue-bottom.png" ;
var cityHlMarkerIcon = function(initial) {
return me.mapIconsUrl + 'red-marker.png';
}
var cityMarkerIcon = function(initial) {
return me.mapIconsUrl + 'red-marker.png';
}
var placeHlMarkerIcon = function(initial, pO) {
return placeMarkerIcon(initial, pO);
}
var placeMarkerIcon = function(initial, pO) {
// return me.maroonDotIcon;
if (pO && pO.typ == 'GOLF_COURSE') {
return me.markerIcon3Url + 'golf.png';
}
if (pO && pO.typ == 'CAR') {
return '/static/img/icons/maps/car.png';
}
if (pO && pO.typ == 'USER') {
return '/static/img/icons/maps/customer.png';
}
if (!initial || initial == '') {
return me.mapIconsUrl + 'red-marker.png';
} else {
return me.markerIcon3Url + 'red-' + initial + '.png';
}
}
var placeMiniMarkerIcon = function(initial, pO) {
//return me.redDotIcon;
var url = me.invalidDotIcon;
if (me.opts.map.shwPlcsAlwys) {
if(pO && pO.typ == 'GOLF_COURSE') {
url = me.markerIcon3Url + 'golf-dot.png';
} else if(pO && (pO.typ == 'RESTAURANT' || pO.typ == 'PUB')) {
url = me.mapIconsUrl + 'rest_big_dot.png';
} else if(pO && (pO.typ == 'SHOPPING_PLACE')) {
url = me.mapIconsUrl + 'shopping2_big_dot.png';
} else if(pO && pO.typ == 'HOTEL') {
url = me.mapIconsUrl + 'stay_big_dot.png';
} else if(pO && pO.typ == 'THINGS_TO_DO') {
url = me.mapIconsUrl + 'many_big_dot.png';
} else {
url = me.mapIconsUrl + 'see_big_dot.png';
}
}
return url;
}
var hotelMarkerIcon = function(star) {
return me.maroonDotIcon;
}
var hotelHlMarkerIcon = function(star){
if (star == '3' || star == '4' || star == '5') {
return me.mapIconsUrl + star + 'star.png';
} else {
return me.mapIconsUrl + 'bd.png';
}
}
var hotelMiniMarkerIcon = function(star){
return me.blueBottomIcon;
}
var polylineHeadMarkerIcon = function() {
return me.blueBottomIcon;
}
function getMapMarkerIcon(iconUrl, pO) {
var icon = {url:iconUrl, size:null, origin:null, anchor:null};
if (pO && pO.typ == 'CAR') {
icon.anchor = new google.maps.Point(16,28); icon.width = 33; icon.height = 55;
}
return icon;
}
function getPolylineHeadMarkerIcon(iconUrl) {
return new google.maps.MarkerImage(iconUrl, new google.maps.Size(20, 18), null, new google.maps.Point(10, 9));
}
}
function TFMarker(latlng, map, opts) {
var defaults = {};
this.opts = $jQ.extend(true, {}, defaults, opts || {});
this.latlng_ = latlng; this.map_ = map; this.visible_ = true;
this.xOffset = 0; this.yOffset = 0;
// Once the LatLng and text are set, add the overlay to the map. This will
// trigger a call to panes_changed which should in turn call draw.
this.setMap(map);
this.getMarkerHTM = function($div) {
$div.addClass('mapTFM1');
$div.append('');
$div.append('');
}
}
function initTFMarker() {
TFMarker.prototype = new google.maps.OverlayView();
TFMarker.prototype.draw = function() {
var me = this;
var div = this.div_;
if (!div) {
div = this.div_ = document.createElement('DIV');
var $div = $jQ(div).addClass('mapTFMrkr');
if (me.opts.content) {$div.html(me.opts.content);}
else {
me.getMarkerHTM($div); $jQ('.tfm-text', $div).html(me.opts.text);
me.xOffset = 20; me.yOffset = 32;
}
if (me.opts.clazz) {$div.addClass(me.opts.clazz);}
google.maps.event.addDomListener(div, "click", function(event) {
google.maps.event.trigger(me, "click", event);
});
google.maps.event.addDomListener(div, "mouseover", function(event) {
google.maps.event.trigger(me, "mouseover", event);
});
google.maps.event.addDomListener(div, "mouseout", function(event) {
google.maps.event.trigger(me, "mouseout", event);
});
var panes = this.getPanes();
panes.overlayImage.appendChild(div);
}
var point = this.getProjection().fromLatLngToDivPixel(this.latlng_);
if (point) {
div.style.left = (point.x-me.xOffset) + 'px'; div.style.top = (point.y-me.yOffset) + 'px';
}
}
TFMarker.prototype.remove = function() {
if (this.div_) {
this.div_.parentNode.removeChild(this.div_); this.div_ = null;
}
}
TFMarker.prototype.getPosition = function(shw) {
return this.latlng_;
}
TFMarker.prototype.setVisible = function(shw) {
this.visible_ = shw;
if (this.div_) $jQ(this.div_).toggle(shw);
}
TFMarker.prototype.getVisible = function() {
return this.visible_;
}
TFMarker.prototype.setZIndex = function(zI) {
if (this.div_) $jQ(this.div_).css('zIndex', zI);
}
TFMarker.prototype.setText = function(txt) {
if (this.div_) $jQ(this.div_).find('.tfm-text').html(txt);
}
}
function PlayTour(steps, pkgO, tfMap, opt) {
var defaults = {beforeStart:null, afterStop:null};
this.opts = $jQ.extend(true, {}, defaults, opt || {});
var me = this; this.tfMap = tfMap; this.pkgO = pkgO; this.steps = steps; this.stepsA = steps.stpA; this.daysO = steps.daysO; this.pSteps = [];
this.playOpt = {auto:true, tTime:0, sTimer:null, crntPrgsJ:null, prgsWd:0, play:true, tStartTime:null, stpTm:0, tmRemain:0};
this.currentStp = {no:0, pStp:null, stpJ:null};
this.tmFired = false; this.evntFired = true;
this.init = function() {
me.tourCtr = $jQ('');
me.playCtr = $jQ('
').appendTo(me.tourCtr);
me.stepCtr = $jQ('
').appendTo(me.tourCtr);
me.tfMap.setPlacesData(steps.plcA, {hide:true, isAddStaticLabel:true});
me.tfMap.setHotelsData(steps.htlA, {hide:true, isAddStaticLabel:true});
var prevDay = null;
for (var i=0;i
');
$jQ('').click(function() {
if (me.playOpt.sTimer) {clearTimeout(me.playOpt.sTimer);}
me.playOpt.sTimer = null; me.playOpt.play = true; me.playOpt.tStartTime = null; me.playOpt.tmRemain = 0;
me.currentStp = {no:0, pStp:null, stpJ:null};
me.playOpt.crntPrgsJ.stop(true, false).width(0);
me.step(me.currentStp.no);
return false;
}).appendTo(ctrlsCtr);
$jQ('').click(function(e, isP, isPS) {
$jQ(this).toggleClass("pausIc", !me.playOpt.play).toggleClass("playIc", me.playOpt.play);
isP = (isP == undefined) ? !me.playOpt.play: isP;
isPS = (isPS == undefined) ? true: isPS;
if (!isP) {
if (me.playOpt.sTimer) {
clearTimeout(me.playOpt.sTimer);
me.playOpt.tmRemain = me.playOpt.stpTm - ((new Date()).getTime() - me.playOpt.tStartTime);
}
me.playOpt.crntPrgsJ.stop(true, false);
me.playOpt.play = false;
} else {
me.playOpt.play = true;
if (isPS) {me.step(me.currentStp.no);}
else {me.autoNext();}
}
return false;
}).appendTo(ctrlsCtr);
$jQ('').click(function() {
if (me.playOpt.sTimer) {clearTimeout(me.playOpt.sTimer);}
setCurrentPrgsBar(true);
me.currentStp.stpJ.find(".stpNext").click();
return false;
}).appendTo(ctrlsCtr);
var prgsCtr = $jQ('');
me.playOpt.crntPrgsJ = $jQ('
').appendTo($jQ('
').appendTo(prgsCtr));
me.playCtr.append(ctrlsCtr).append(prgsCtr);
me.playOpt.prgsWd = 170;//prgsCtr.css("width");
}
this.start = function() {
if (me.opts.beforeStart) me.opts.beforeStart();
me.attchPlyrCtrls();
me.tfMap.addControlElement('.pTourCtr', me.tourCtr, 'tfMapTour', true);
me.step(me.currentStp.no);
}
this.stop = function() {
if (me.playOpt.sTimer) {clearTimeout(me.playOpt.sTimer);}
me.tfMap.addControlElement('.pTourCtr', me.tourCtr, 'tfMapTour', false);
me.tfMap.clearPolylines();
if (me.pkgO) me.tfMap.renderPackage(me.pkgO.pkgs[0], me.pkgO, {clrOthrMrkrs:true});
if (me.opts.afterStop) me.opts.afterStop();
}
this.step = function(i) {
var pStp = me.pSteps[i];
if (!pStp) {me.stop(); return;}
var stpJ = pStp.getSNode().clone(true);
me.currentStp.stpJ = stpJ; me.currentStp.pStp = pStp;
var currentStpJ = me.stepCtr.find(".pTStp");
currentStpJ.removeClass('highlight');
me.stepCtr.append(stpJ);
setTimeout(function() {
currentStpJ.remove();
stpJ.addClass('highlight');
me.autoNext();
pStp.execute(stpJ);
}, 350);
}
this.autoNext = function() {
if (me.playOpt.auto && me.playOpt.play) {
me.tmFired = false;
var stpTm = me.currentStp.pStp.getStepTime()*1000;
var prgsWd = (getLastChkPtTime() + stpTm) * (me.playOpt.prgsWd/me.playOpt.tTime);
me.playOpt.crntPrgsJ.animate({width:''+prgsWd}, stpTm);
if (me.playOpt.tmRemain > 0) {
stpTm = me.playOpt.tmRemain;
me.playOpt.tmRemain = 0;
}
me.playOpt.tStartTime = (new Date()).getTime();
me.playOpt.stpTm = stpTm;
me.playOpt.sTimer = setTimeout(function() {
me.tmFired = true;
me.clickNext();
}, stpTm);
console.log('------- Set timer for next after ' + stpTm);
} else {
setCurrentPrgsBar(false);
}
}
this.clickNext = function() {
console.log('------- Trying to click next: ' + me.tmFired + '::' + me.evntFired);
if (me.tmFired && me.evntFired) {
me.currentStp.stpJ.find(".stpNext").click();
}
}
this.showAllSteps = function() {
var currentStpJ = me.stepCtr.find(".pTStp");
if (currentStpJ.length > 0) {
currentStpJ.remove();
}
for (var i=0; i
');
me.sNode.append('' + me.stpO.title + '
');
if (me.stpO.txt) me.sNode.append('' + me.stpO.txt + '
');
if (me.hasSubSteps) {
var plCtr = $jQ('');
$jQ.each(me.stpO.plA, function(i, plO) {
var plJ = me.tfMap.getMarkerDetailHTM('PLACE', plO.id)
$jQ(plJ).click(function() {
var liJ = $jQ(this);
liJ.siblings().removeClass("sel");
liJ.addClass("sel"); liJ.parents('.stpsCtr').scrollTop(liJ.position().top);
if (plO.desc) {setTimeout(function() {me.pTour.showMessage(plO.desc);}, 2000);}
me.tfMap.clickPlace(null);
if (i>1 && me.stpO.typ != 'ACTIVITY') {me.tfMap.placeAtoB(me.stpO.cityId, me.stpO.plA[i-2].id, me.stpO.plA[i-1].id, false);}
me.pTour.togglePlay(false);
me.tfMap.cbEvent(function() {
me.pTour.evntFired = false;
me.pTour.togglePlay(true, false);
}, function() {
me.pTour.evntFired = true;
me.pTour.clickNext();
});
if (i>0) {
me.tfMap.placeAtoB(me.stpO.cityId, me.stpO.plA[i-1].id, plO.id, true);
} else {
if (me.stpO.typ == 'ACTIVITY') {
me.tfMap.placeAtoB(me.stpO.cityId, me.stpO.fromId ? me.stpO.fromId: me.stpO.hotelId, plO.id, true);
} else {
me.tfMap.clickPlace(plO.id);
}
}
return false;
});
plCtr.append(plJ);
});
me.sNode.append(plCtr);
} else {
me.sNode.append(me.getPNode());
}
var stpAct = $jQ('
');
if (!me.isFirst()) {
stpAct.append('
');
stpAct.find(".stpPrev").click(function() {
if (me.hasSubSteps) {
var subStepCtr = $jQ(this).closest(".pTStp").find(".tplCtr");
var sIdx = $jQ(".plcMpBox.sel", subStepCtr).index();
if (sIdx > 0) {
$jQ(".plcMpBox", subStepCtr).eq(sIdx-1).click();
return;
}
}
me.pTour.incStep(-1);
});
}
if (!me.isLast() || me.hasSubSteps) {
stpAct.append('
');
stpAct.find(".stpNext").click(function() {
if (me.hasSubSteps) {
var subStepCtr = $jQ(this).closest(".pTStp").find(".tplCtr");
var sIdx = $jQ(".plcMpBox.sel", subStepCtr).index();
if (sIdx < (me.stpO.plA.length-1)) {
$jQ(".plcMpBox", subStepCtr).eq(sIdx+1).click();
if (sIdx != -1) {me.pTour.autoNext();}
return;
}
}
me.pTour.incStep(1);
});
}
if (me.pTour.playOpt.auto) {stpAct.hide();}
me.sNode.append(stpAct);
return me.sNode;
}
this.getPNode = function() {
if (me.pNode) return me.pNode;
me.pNode = null;
switch(me.stpO.typ) {
case 'CITY':
case 'TRANSFER':
me.pNode = me.tfMap.getMarkerDetailHTM('CITY', me.stpO.cityId);
break;
case 'HOTEL':
me.pNode = me.tfMap.getMarkerDetailHTM('HOTEL', me.stpO.hotelId);
break;
case 'ACTIVITY':
me.pNode = me.tfMap.getMarkerDetailHTM('PLACE', me.stpO.placeId);
break;
}
return me.pNode;
}
this.execute = function(stpJ) {
// me.pkgMap.cbEventStarted();
var dayO = me.pTour.daysO[stpO.day];
me.tfMap.clearPolylines();
if (dayO && me.isDayChg) {me.tfMap.setCurrentMapProps(dayO.mapProps); me.tfMap.moveToMapViewProps(dayO.mapProps);}
me.pTour.showMessage(me.stpO.title);
console.log('------ Executing play step: ' + stpO.typ + ':' + me.hasSubSteps);
if (me.hasSubSteps) {stpJ.find(".stpNext").click(); return;}
switch(stpO.typ) {
case 'CITY':
me.tfMap.renderPackage(me.pTour.pkgO.pkgs[0], me.pTour.pkgO, {hideMrkrs:true});
me.tfMap.clickPlace(null);
me.tfMap.clickHotel(null);
me.pTour.togglePlay(false);
me.tfMap.cbEvent(function() {
console.log('------- Called event start:'+stpO.typ);
me.pTour.evntFired = false;
me.pTour.togglePlay(true, false);
}, function() {
console.log('------- Called event end:'+stpO.typ);
me.pTour.evntFired = true;
me.pTour.clickNext();
});
me.tfMap.clickCity(me.stpO.cityId);
break;
case 'HOTEL':
me.tfMap.clickPlace(null);
me.tfMap.clickHotel(null);
me.pTour.togglePlay(false);
me.tfMap.cbEvent(function() {
console.log('------- Called event start:'+stpO.typ);
me.pTour.evntFired = false;
}, function() {
console.log('------- Called event end:'+stpO.typ);
if (me.stpO.arriveId) {
me.tfMap.cbEvent(function() {
console.log('------- Called event start:'+stpO.typ);
me.pTour.evntFired = false;
me.pTour.togglePlay(true, false);
}, function() {
console.log('------- Called event end:'+stpO.typ);
me.pTour.evntFired = true;
me.pTour.clickNext();
});
me.tfMap.placeAtoB(me.stpO.cityId, me.stpO.arriveId, me.stpO.hotelId, true);
} else if (me.stpO.hotelId) {
me.tfMap.cbEvent(function() {
console.log('------- Called event start:'+stpO.typ);
me.pTour.evntFired = false;
me.pTour.togglePlay(true, false);
}, function() {
console.log('------- Called event end:'+stpO.typ);
me.pTour.evntFired = true;
me.pTour.clickNext();
});
me.tfMap.clickHotel(me.stpO.hotelId);
}
});
me.tfMap.clickCity(me.stpO.cityId);
break;
case 'ACTIVITY':
me.tfMap.showHideMarkers(false, 'CITY');
me.tfMap.clickPlace(null);
me.tfMap.clickHotel(null);
me.tfMap.setCurrentMapProps(dayO ? dayO.mapProps: null);
// me.pkgMap.clickCity(me.stpO.cityId);
me.pTour.togglePlay(false);
me.tfMap.cbEvent(function() {
console.log('------- Called event start:'+stpO.typ);
me.pTour.evntFired = false;
me.pTour.togglePlay(true, false);
}, function() {
console.log('------- Called event end:'+stpO.typ);
me.pTour.evntFired = true;
me.pTour.clickNext();
});
me.tfMap.placeAtoB(me.stpO.cityId, me.stpO.fromId ? me.stpO.fromId: me.stpO.hotelId, me.stpO.placeId, true);
// me.pkgMap.clickPlace(me.stpO.placeId);
break;
case 'TRANSFER':
me.tfMap.showHideMarkers(false, 'CITY');
me.tfMap.renderPackage(me.pTour.pkgO.pkgs[0], me.pTour.pkgO, {hideMrkrs:true});
me.tfMap.clickCity(null);
me.tfMap.clickPlace(null);
me.tfMap.clickHotel(null);
me.pTour.togglePlay(false);
me.tfMap.cbEvent(function() {
console.log('------- Called event start:'+stpO.typ);
me.pTour.evntFired = false;
me.pTour.togglePlay(true, false);
}, function() {
console.log('------- Called event end:'+stpO.typ);
me.pTour.evntFired = true;
me.pTour.clickNext();
});
me.tfMap.travelAtoB(me.stpO.sCityId, me.stpO.cityId, {isFlight:me.stpO.isFlight});
break;
case 'END':
me.tfMap.clickCity(null);
me.tfMap.clickPlace(null);
me.tfMap.clickHotel(null);
setTimeout(function() {
me.pTour.showAllSteps();
}, 3000);
case 'START':
if (me.pTour.pkgO) me.tfMap.renderPackage(me.pTour.pkgO.pkgs[0], me.pTour.pkgO, {clrOthrMrkrs:(stpO.typ != 'START')});
break;
}
}
this.isFirst = function() {
return (me.stpNo == 0);
}
this.isLast = function() {
return (me.stpNo == (me.pTour.pSteps.length-1));
}
this.getTotalExecTime = function() {
return me.hasSubSteps ? me.getStepTime()*me.stpO.plA.length: me.getStepTime();
}
this.getStepTime = function() {
return (me.stpO.typ=='TRANSFER'|| me.stpO.typ=='HOTEL'|| me.stpO.typ=='CITY_MUSTSEE' || (me.stpO.typ=='ACTIVITY' && me.hasSubSteps))?8:5;
}
this.getCurrentExecTime = function(stpJ) {
if (!me.hasSubSteps) return 0;
var sIdx = $jQ(".tplCtr .plcMpBox.sel", stpJ).index();
return Math.max(0, sIdx*me.getStepTime());
}
}