// twGmapInfofenster.js
//
// EBubble.js 
//
//   This Javascript is provided by Mike Williams
//   Blackpool Community Church Javascript Team
//   http://www.commchurch.freeserve.co.uk/   
//   http://econym.googlepages.com/index.htm
//
//   This work is licenced under a Creative Commons Licence
//   http://creativecommons.org/licenses/by/2.0/uk/
//
// Version 0.0  13/07/2007 Initial version
// Version 0.1  14/07/2007 Bugfix: Was failing to apply the position offset.
// Version 0.2  30/07/2007 Bugfix: Wasn't clearingout the old contents.
// Version 0.3  21/09/2007 Added noCloseOnClick parameter
// version 0.4  25/12/2007 Bugfix: Problem with offset
//
// version 0.4.1 03/11/2008 Übersetzung und Anpassung von Thomas Weise 
//                          (http://progtw.de/website/twGmap)


/** Konstruktor */
function EBubble(map, image, size, insize, inset, anchor, noCloseOnClick) {
	// Parameter zum Erstellen des Info-Fensters
	var that = this;
	this.map            = map;             // unsere Google Map
	this.image          = image;           // die URL für das Hintergrundbild
	this.size           = size;            // die Größe dieses Hintergrundbildes
	this.insize         = insize;          // Größe der inneren Area (für den Fensterinhalt)
	this.inset          = inset;           // lnke obere Ecke dieser inneren Area
	this.anchor         = anchor;          // Ankerpunkt (die Spitze die auf den Marker zeigt)
	this.noCloseOnClick = noCloseOnClick;  // true, wenn dieses Info-Fenster nicht wegklickbar sein soll (optional)
	
	// interne Variablen (unter Beachtung des IE ;-) )
	this.visible = false;
	this.ie      = false;
	var agent    = navigator.userAgent.toLowerCase();	
	if ((agent.indexOf("msie") > -1) && (agent.indexOf("opera") < 1)) { 
		this.ie = true; } 
	else {
		this.ie = false;
	}
	
	// erstes div
	this.div1                = document.createElement("div");
	this.div1.style.position = "absolute";
	this.div1.style.display  = "none";
	document.body.appendChild(this.div1);

	// wieder mal IE (kann keine Transparenz)
	if (this.ie && this.image.indexOf(".png")>-1) {
		var loader = "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.image+"', sizingMethod='scale');";
		this.div1.innerHTML = '<div style="height:' +this.size.height+ 'px; width:'+this.size.width+'px; ' +loader+ '" ></div>';
	} else {
		this.div1.innerHTML = '<img src="' + this.image + '" width="' + this.size.width +'" height="' + this.size.height +'">';
	}
	
	// Infofenster schließen, wenn sich die Map verschoben wird
	GEvent.addListener(map, "dragstart", function() {
		that.hide();
	} );
	GEvent.addListener(map, "moveend", function() {
		that.hide();
	} );
	
	// Klicks und 'mousedown's abfangen
	GEvent.addDomListener(this.div1, "click", function() {
		if (!that.noCloseOnClick) {
			that.hide();
		}
		GEvent.trigger(that, "click");
	});
	GEvent.addDomListener(this.div1, "mousedown", function() {
		if (!that.noCloseOnClick) {
			that.hide();
		}
		GEvent.trigger(that, "click");
	});

	// zweites div
	this.div2 = document.createElement("div");
	this.div1.appendChild(this.div2);
	this.div2.style.position = "absolute";
	this.div2.style.left     = this.inset.x + "px"; 
	this.div2.style.top      = this.inset.y + "px";
	this.div2.style.width    = this.insize.width + "px";
	this.div2.style.height   = this.insize.height + "px";
} 
      

/** Funktion openOnMap() */
EBubble.prototype.openOnMap = function(point, html, offset) {
	this.offset = offset||new GPoint(0,0);
	this.point = point;	
	
	//div2.style.backgroundColor = "#0000ff"; 
	this.div2.innerHTML = html;
	
	// Pixel relativ zur Map
	var p = this.map.fromLatLngToDivPixel(point);
	
	// Abstand Map relativ zum Map-Container
	var dragObject = this.map.getPane(G_MAP_MAP_PANE).parentNode;
	var x = p.x + parseInt(dragObject.style.left);
	var y = p.y + parseInt(dragObject.style.top);
	
	// Map-Container relativ zur Seite
	y += this.map.getContainer().offsetTop;
	x += this.map.getContainer().offsetLeft;
	        
	// Offset der gefragten Anker-Position
	y -= this.anchor.y;
	x -= this.anchor.x;
	
	// Offset der speziellen Offset-Position
	y -= this.offset.y;
	x -= this.offset.x;

	// Abstände setzen
	this.div1.style.left = x+"px";
	this.div1.style.top = y+"px";
	      
	// und alles sichtbar machen
	this.visible = true;
	this.show();
}
      
EBubble.prototype.openOnMarker = function(marker, html) {
	var vx = marker.getIcon().iconAnchor.x - marker.getIcon().infoWindowAnchor.x;
	var vy = marker.getIcon().iconAnchor.y - marker.getIcon().infoWindowAnchor.y; 
	this.openOnMap(marker.getPoint(), html, new GPoint(vx, vy));
}
      

EBubble.prototype.show = function() {
	this.div1.style.display="";
	this.div2.style.display="";
	this.visible = true;
}
      
EBubble.prototype.hide = function() {
	this.div1.style.display="none";
	//this.div2.style.display="none";
	this.visible = false;
}
      
EBubble.prototype.isHidden = function() {
	return !this.visible;
}
      
EBubble.prototype.supportsHide = function() {
	return true;
}
      
        