|
// namespacing! |
|
if (!com) { |
|
var com = { }; |
|
if (!com.modestmaps) { |
|
com.modestmaps = { }; |
|
} |
|
} |
|
|
|
(function(MM) { |
|
|
|
MM.Follower = function(map, location, content) { |
|
this.coord = map.locationCoordinate(location); |
|
|
|
this.offset = new MM.Point(0, 0); |
|
this.dimensions = new MM.Point(150, 150); |
|
this.margin = new MM.Point(10, 10); |
|
this.offset = new MM.Point(0, -this.dimensions.y); |
|
|
|
var follower = this; |
|
|
|
var callback = function(m, a) { return follower.draw(m); }; |
|
map.addCallback('drawn', callback); |
|
|
|
this.div = document.createElement('div'); |
|
this.div.style.position = 'absolute'; |
|
this.div.style.width = this.dimensions.x + 'px'; |
|
this.div.style.height = this.dimensions.y + 'px'; |
|
|
|
var shadow = document.createElement('canvas'); |
|
this.div.appendChild(shadow); |
|
if (typeof G_vmlCanvasManager !== 'undefined') shadow = G_vmlCanvasManager.initElement(shadow); |
|
shadow.style.position = 'absolute'; |
|
shadow.style.left = '0px'; |
|
shadow.style.top = '0px'; |
|
shadow.width = this.dimensions.x*2; |
|
shadow.height = this.dimensions.y; |
|
var ctx = shadow.getContext("2d"); |
|
ctx.transform(1, 0, -0.5, 0.5, 75, this.dimensions.y/2); |
|
ctx.fillStyle = "rgba(0,0,0,0.5)"; |
|
this.drawBubblePath(ctx); |
|
ctx.fill(); |
|
|
|
var bubble = document.createElement('canvas'); |
|
this.div.appendChild(bubble); |
|
if (typeof G_vmlCanvasManager !== 'undefined') bubble = G_vmlCanvasManager.initElement(bubble); |
|
bubble.style.position = 'absolute'; |
|
bubble.style.left = '0px'; |
|
bubble.style.top = '0px'; |
|
bubble.width = this.dimensions.x; |
|
bubble.height = this.dimensions.y; |
|
var bubCtx = bubble.getContext('2d'); |
|
bubCtx.strokeStyle = 'black'; |
|
bubCtx.fillStyle = 'white'; |
|
this.drawBubblePath(bubCtx); |
|
bubCtx.fill(); |
|
bubCtx.stroke(); |
|
|
|
var contentDiv = document.createElement('div'); |
|
contentDiv.style.position = 'absolute'; |
|
contentDiv.style.left = '0px'; |
|
contentDiv.style.top = '0px'; |
|
contentDiv.style.overflow = 'hidden'; |
|
contentDiv.style.width = (this.dimensions.x - this.margin.x) + 'px'; |
|
contentDiv.style.height = (this.dimensions.y - this.margin.y - 25) + 'px'; |
|
contentDiv.style.padding = this.margin.y + 'px ' + this.margin.x + 'px ' + this.margin.y + 'px ' + this.margin.x + 'px'; |
|
contentDiv.innerHTML = content; |
|
this.div.appendChild(contentDiv); |
|
|
|
MM.addEvent(contentDiv, 'mousedown', function(e) { |
|
if(!e) e = window.event; |
|
return MM.cancelEvent(e); |
|
}); |
|
|
|
map.parent.appendChild(this.div); |
|
|
|
this.draw(map); |
|
} |
|
|
|
MM.Follower.prototype = { |
|
|
|
div: null, |
|
coord: null, |
|
|
|
offset: null, |
|
dimensions: null, |
|
margin: null, |
|
|
|
draw: function(map) { |
|
try { |
|
var point = map.coordinatePoint(this.coord); |
|
} catch(e) { |
|
console.error(e); |
|
// too soon? |
|
return; |
|
} |
|
|
|
if(point.x + this.dimensions.x + this.offset.x < 0) { |
|
// too far left |
|
this.div.style.display = 'none'; |
|
|
|
} else if(point.y + this.dimensions.y + this.offset.y < 0) { |
|
// too far up |
|
this.div.style.display = 'none'; |
|
|
|
} else if(point.x + this.offset.x > map.dimensions.x) { |
|
// too far right |
|
this.div.style.display = 'none'; |
|
|
|
} else if(point.y + this.offset.y > map.dimensions.y) { |
|
// too far down |
|
this.div.style.display = 'none'; |
|
|
|
} else { |
|
this.div.style.display = 'block'; |
|
MM.moveElement(this.div, { |
|
x: Math.round(point.x + this.offset.x), |
|
y: Math.round(point.y + this.offset.y), |
|
scale: 1, |
|
width: this.dimensions.x, |
|
height: this.dimensions.y |
|
}); |
|
} |
|
}, |
|
|
|
drawBubblePath: function(ctx) { |
|
ctx.beginPath(); |
|
ctx.moveTo(10, this.dimensions.y); |
|
ctx.lineTo(35, this.dimensions.y-25); |
|
ctx.lineTo(this.dimensions.x-10, this.dimensions.y-25); |
|
ctx.quadraticCurveTo(this.dimensions.x, this.dimensions.y-25, this.dimensions.x, this.dimensions.y-35); |
|
ctx.lineTo(this.dimensions.x, 10); |
|
ctx.quadraticCurveTo(this.dimensions.x, 0, this.dimensions.x-10, 0); |
|
ctx.lineTo(10, 0); |
|
ctx.quadraticCurveTo(0, 0, 0, 10); |
|
ctx.lineTo(0, this.dimensions.y-35); |
|
ctx.quadraticCurveTo(0, this.dimensions.y-25, 10, this.dimensions.y-25); |
|
ctx.lineTo(15, this.dimensions.y-25); |
|
ctx.moveTo(10, this.dimensions.y); |
|
} |
|
|
|
}; |
|
|
|
})(com.modestmaps) |