/*jslint undef: true, sloppy: true, nomen: true */
/*global document, GOverlay, google */

// ELabels3.js
//
//   2010-06-10  Port to GoogleMaps V3 API by Pat Horton
//
//   This Javascript was originally 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/

function ELabel(map, point, html, classname, pixelOffset, percentOpacity, overlap) {
	this.div_ = null;
	this.map_ = map;
	this.point = point;
	this.html = html;
	this.classname = classname || "";
	this.pixelOffset = pixelOffset || new google.maps.Size(0, 0);
	if (percentOpacity) {
		if (percentOpacity < 0) { percentOpacity = 0; }
		if (percentOpacity > 100) { percentOpacity = 100; }
	}
	this.percentOpacity = percentOpacity;
	this.overlap = overlap || false;
	this.hidden = false;
}

ELabel.prototype = new google.maps.OverlayView();

ELabel.prototype.onAdd = function () {
	var div, panes, z;

	div = document.createElement("div");
	div.style.position = "absolute";
	div.innerHTML = '<div class="' + this.classname + '">' + this.html + '</div>';
	this.div_ = div;

	if (this.percentOpacity) {
		if (typeof (div.style.filter) === 'string') { div.style.filter = 'alpha(opacity:' + this.percentOpacity + ')'; }
		if (typeof (div.style.KHTMLOpacity) === 'string') { div.style.KHTMLOpacity = this.percentOpacity / 100; }
		if (typeof (div.style.MozOpacity) === 'string') { div.style.MozOpacity = this.percentOpacity / 100; }
		if (typeof (div.style.opacity) === 'string') { div.style.opacity = this.percentOpacity / 100; }
	}

	if (this.overlap) {
		z = 1000 * (90 - this.point.lat());
		this.div_.style.zIndex = parseInt(z, 10);
	}

	if (this.hidden) {
		this.hide();
	}

	panes = this.getPanes();
	panes.floatShadow.appendChild(div);
};


ELabel.prototype.onRemove = function () {
	this.div_.parentNode.removeChild(this.div_);
};

ELabel.prototype.draw = function () {
	var h, p, proj;

	proj = this.getProjection();
	p = proj.fromLatLngToDivPixel(this.point);
	h = parseInt(this.div_.clientHeight, 10);
	this.div_.style.left = (p.x + this.pixelOffset.width) + "px";
	this.div_.style.top = (p.y + this.pixelOffset.height - h) + "px";
};

ELabel.prototype.show = function () {
	if (this.div_) {
		this.div_.style.display = "";
		this.draw();
	}
	this.hidden = false;
};

ELabel.prototype.hide = function () {
	if (this.div_) {
		this.div_.style.display = "none";
	}
	this.hidden = true;
};

ELabel.prototype.copy = function () {
	return new ELabel(this.point, this.html, this.classname, this.pixelOffset, this.percentOpacity, this.overlap);
};

ELabel.prototype.isHidden = function () {
	return this.hidden;
};

ELabel.prototype.supportsHide = function () {
	return true;
};

ELabel.prototype.setContents = function (html) {
	this.html = html;
	this.div_.innerHTML = '<div class="' + this.classname + '">' + this.html + '</div>';
	this.redraw(true);
};

ELabel.prototype.setPoint = function (point) {
	this.point = point;
	if (this.overlap) {
		var z = GOverlay.getZIndex(this.point.lat());
		this.div_.style.zIndex = z;
	}
	this.redraw(true);
};

ELabel.prototype.setOpacity = function (percentOpacity) {
	if (percentOpacity) {
		if (percentOpacity < 0) { percentOpacity = 0; }
		if (percentOpacity > 100) { percentOpacity = 100; }
	}
	this.percentOpacity = percentOpacity;
	if (this.percentOpacity) {
		if (typeof (this.div_.style.filter) === 'string') { this.div_.style.filter = 'alpha(opacity:' + this.percentOpacity + ')'; }
		if (typeof (this.div_.style.KHTMLOpacity) === 'string') { this.div_.style.KHTMLOpacity = this.percentOpacity / 100; }
		if (typeof (this.div_.style.MozOpacity) === 'string') { this.div_.style.MozOpacity = this.percentOpacity / 100; }
		if (typeof (this.div_.style.opacity) === 'string') { this.div_.style.opacity = this.percentOpacity / 100; }
	}
};

ELabel.prototype.getPoint = function () {
	return this.point;
};

ELabel.prototype.getHtml = function () {
	return this.html;
};

