/*
The treatment of onload handlers as an array is necessary, because attachEvent method does not ensure the order of execution. 
*/

window.addOnloadHandler = function(handler) {
	if (!this.onloadHandler) {
		this.onloadHandler = [];
	}
	this.onloadHandler.push(handler);
};

var onlyHandler = function() {
	if (!this.onloadHandler) return;
	for (var i = 0; i < this.onloadHandler.length; i++) {
		this.onloadHandler[i]();
	}
}
if (window.addEventListener) {
	window.addEventListener("load", onlyHandler, false);
} else if (window.attachEvent) {
	window.attachEvent("onload", onlyHandler);
}

window.addOnloadHandler(function() {
	var oContentMap = document.getElementById("Map").contentWindow;
	if (oContentMap == null) {
		oContentMap = Map;
	}
	
	oContentMap.CMap.prototype.addPark = function(park) {
		if (!this.parks) {
			this.parks = [];
		}
		
		var href = config.query.url + "/park/" + park.id + "/";
		
		/*var a_i = this.document.createElement("a");
		a_i.href = href;
		a_i.appendChild( park_img );*/
		
		var park_img = this.document.createElement("img");
		park_img.src = config.icon.directory + config.icon.images[this.parks.length];
		//park_img.className = 'icon';
		for (var property in config.icon.style) {
			park_img.style[property] = config.icon.style[property];
		}
		this.document.getElementById("Layer").appendChild(park_img);
		
		var park_p = this.document.createElement("p");
		if (park.isTentative()) {
			park_p.appendChild(
				this.document.createTextNode(park.getName())
			);
		} else {
			var a_p = this.document.createElement("a");
			a_p.href = href;
			a_p.target = "_blank";
			a_p.appendChild(this.document.createTextNode(park.getName()));
			park_p.appendChild(a_p);
		}
		
		for (var property in config.text.style) {
			park_p.style[property] = config.text.style[property];
		}
		if (this.visibilityBox) park_p.style.display = this.visibilityBox.checked ? '' : 'none';
		
		this.document.getElementById( "Layer" ).appendChild( park_p );
		
		/*var a = this.document.createElement("a");
		a.href = "http://www.yahoo.co.jp";
		a.appendChild( park_img );
		a.appendChild( park_p );
		this.document.getElementById( "Layer" ).appendChild( a );*/
		
		if (!park.isTentative()) park_img.onclick = function() {
			window.open(config.query.url + "/park/" + park.id + "/");
		};
		
		park.img = park_img;
		park.text = park_p;
		this.parks.push(park);
		this.adjustZIndex();
	};
	
	oContentMap.CMap.prototype.adjustZIndex = function() {
		var parks = this.parks;
		if (!parks) return;
		for (var i = 0; i < parks.length; i++) {
			var zIndex = parks.length - i + 50;
			parks[i].img.style.zIndex = zIndex;
			parks[i].text.style.zIndex = zIndex;
		}
	};
	
	oContentMap.CMap.prototype.getFirstPark = function() {
		if (!this.parks || !this.parks[0]) return;
		return this.parks[0];
	};
	
	oContentMap.CMap.prototype.clearParks = function() {
		if (!this.parks) return;
		var layer = this.document.getElementById( "Layer" );
		for (var i = 0; i < this.parks.length; i++) {
			layer.removeChild(this.parks[i].img);
			layer.removeChild(this.parks[i].text);
		}
		this.parks = [];
	};
	
	oContentMap.CMap.prototype.drawParks = function() {
		if (!this.parks) return;
		for (var i = 0; i < this.parks.length; i++) {
			var park = this.parks[i];
			var point = this.GetViewPoint(park.longitude, park.latitude);
			park.img.style.left = point.PixelX - config.icon.center.x;
			park.img.style.top = point.PixelY - config.icon.center.y;
			park.text.style.left = point.PixelX + this.textPositionX();
			park.text.style.top = point.PixelY + this.textPositionY();
		}
	};
	
	oContentMap.CMap.prototype.textPositionX = function() {
		return config.text.position.left;
	};
	
	//for (var b in Prototype.Browser) {
		//alert(b+": "+Prototype.Browser[b]);
		/* IE, Opera, WebKit, Gecko, MobileSafari */
	//}
	oContentMap.CMap.prototype.textPositionY = function() {
		if (Prototype.Browser.IE) {
			return config.text.position.top + 14;
		}
		return config.text.position.top;
	};
	
	oContentMap.CMap.prototype.hideTexts = function() {
		if (!this.parks) this.parks = [];
		for (var i = 0; i < this.parks.length; i++) {
			var park = this.parks[i];
			park.text.style.display = 'none';
		}
	};
	
	oContentMap.CMap.prototype.showTexts = function() {
		if (!this.parks) this.parks = [];
		for (var i = 0; i < this.parks.length; i++) {
			var park = this.parks[i];
			park.text.style.display = '';
		}
	};
	
	oContentMap.CMap.prototype.setTextsVisibility = function(bool) {
		if (!this.parks) return;
		for (var i = 0; i < this.parks.length; i++) {
			this.parks[i].text.style.display = bool ? '' : 'none';
		}
	};
	
	oContentMap.CMap.prototype.OnDraw = function() {
		if (this.drawParks) this.drawParks();
		if (this.onDraw) this.onDraw();
		if (!this.lastLongitude) this.lastLongitude = this.Longitude;
		if (!this.lastLatitude) this.lastLatitude = this.Latitude;
		if (this.lastCount == null) this.lastCount = 100;
		if (this.Longitude == this.lastLongitude && this.Latitude == this.lastLatitude) {
			this.lastCount++;
		} else {
			this.lastCount = 0;
			this.lastLongitude = this.Longitude;
			this.lastLatitude = this.Latitude;
		}
		if (this.lastCount == 10 && this.onFixed) {
			this.onFixed();
		}
	};
	
	oContentMap.CMap.prototype.arrangeParks = function(divId) {
		var parks = this.parks;
		if (!parks || !parks.length) {
			$(divId).update(config.distance.not_found);
			return;
		}
		
		var header = new Element("tr").update();
		header.appendChild(new Element("th").update(config.distance.header[0]));
		header.appendChild(new Element("th").update(config.distance.header[1]));
		header.appendChild(new Element("th").update(config.distance.header[2]));
		header.appendChild(new Element("th", {colspan: 2}).update(config.distance.header[3]));
		
		var thead = new Element("thead");
		thead.update(header);
		
		var tbody = new Element("tbody");
		for (var i = 0; i < parks.length; i++) {
			var tr = new Element("tr");
			tr.appendChild(new Element("th").update(new Element("img", {src: config.icon.directory + config.icon.images[i]})));
			tr.appendChild(new Element("td").update(new Element("a", {href: config.query.url + "/park/" + parks[i].id + "/", target: "_blank"}).update(parks[i].name)));
			tr.appendChild(new Element("td").update(parks[i].prefecture + parks[i].address));
			if (parks[i].distance < config.distance.minimum) {
				tr.appendChild(new Element("td", {colspan: 2}).update(config.distance.near));
			} else {
				tr.appendChild(new Element("td").update(config.distance.approximate + parseInt(parks[i].distance) + config.distance.unit));
				tr.appendChild(new Element("td").update(parks[i].createArrowImg()));
			}
			tbody.appendChild(tr);
		}
		var table = new Element("table");
		table.appendChild(thead);
		table.appendChild(tbody);
		$(divId).update(table);
	};
	
	oContentMap.CMap.prototype.createSlider = function(indicator, track) {
		var oMap = this;
		var onChange = function(value) {
			oMap.Scale = value;
			if (oMap.zoomPrefix) {
				for (var i = 1; i <= 13; i++) {
					$(oMap.zoomPrefix + i).className = (oMap.Scale == i) ? 'current' : '';
				}
				
			}
		};
		
		/*var createDiv = function(id) {
			oMap.document.createElement("div");
			oMap.style.margin = '0px';
		};*/
		
		var map_position = $('Map').cumulativeOffset();
		$('slider').style.position = "absolute";
		$('slider').style.left = (map_position[0] + config.size.width - 25 - 10) + 'px';
		$('slider').style.top = (map_position[1] + 10) + 'px';
		
		var parts = [ track, indicator ];
		for (var i = 0; i < parts.length; i++) {
			var part = $(parts[i]);
			if (!part) continue;
			for (var style in config.slider[parts[i]]) {
				part.style[style] = config.slider[parts[i]][style];
			}
		}
		
		var slider = new Control.Slider(indicator, track, {
			axis: 'vertical',
			range: $R(13, 1),
			sliderValue: config.map.Scale,
			values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].reverse(),
			onSlide: onChange,
			onChange: onChange
		});
		this.slider = slider;
		return slider;
	};
	
	oContentMap.CMap.prototype.setZoom = function(zoom) {
		var oMap = this;
		
		if (oMap.slider) oMap.slider.setValue(zoom);
		else oMap.Scale = zoom;
	};
	
	oContentMap.CMap.prototype.createZooms = function(prefix) {
		var oMap = this;
		oMap.zoomPrefix = prefix;
		
		for (var i = 1; i <= 13; i++) {
			$(prefix + i).href = "#";
			if (oMap.Scale == i) $(prefix + i).className = "current";
			(function() {
				var zoom = i;
				$(prefix + i).onclick = function() {
					oMap.setZoom(zoom);
					for (var j = 1; j <= 13; j++) {
						$(prefix + j).className = '';
					}
					this.className = "current";
					return false;
				};
			})();
		}
	};
	
	oContentMap.CMap.prototype.createZoomIn = function(element) {
		var oMap = this;
		var button = typeof element == "string" ? $(element) : element;
		button.onclick = function() {
			if (oMap.Scale > 1) {
				if (oMap.slider) oMap.slider.setValue(oMap.slider.value - 1);
				else oMap.Scale--;
			}
		}
	};
	
	oContentMap.CMap.prototype.createZoomOut = function(element) {
		var oMap = this;
		var button = typeof element == "string" ? $(element) : element;
		button.onclick = function() {
			if (oMap.Scale < 13) {
				if (oMap.slider) oMap.slider.setValue(oMap.slider.value + 1);
				else oMap.Scale++;
			}
		}
	};
	
	oContentMap.CMap.prototype.createVisibilityCheck = function(element) {
		var oMap = this;
		var box = typeof element == "string" ? $(element) : element;
		if (!box) return;
		box.onclick = function() {
			oMap.setTextsVisibility(this.checked);
		};
		oMap.visibilityBox = box;
		oMap.setTextsVisibility(box.checked);
	};
	
	oContentMap.CMap.prototype.createCursorVisibilityCheck = function(element) {
		var oMap = this;
		var box = typeof element == "string" ? $(element) : element;
		if (!box) return;
		box.onclick = function() {
			oMap.Cursor = this.checked;
		};
		oMap.cursorVisibilityBox = box;
		box.onclick();
	};
	
	window.oMap = oContentMap.CreateMap();
	for (var property in config.map) {
		oMap[property] = config.map[property];
	}
	
	oContentMap.CMap.prototype.createFirstParkFind = function(element) {
		var oMap = this;
		var button = typeof element == "string" ? $(element) : element;
		if (!button) return;
		button.onclick = function() {
			var first = oMap.getFirstPark();
			oMap.Scroll(first.getLongitude(), first.getLatitude());
		};
		oMap.firstParkFindButton = button;
	}
	
	oContentMap.CMap.prototype.setCenterImage = function(url, width, height) {
		this.oImgCenter.src = url;
		if (width) this.oImgCenter.style.width = width + "px";
		if (height) this.oImgCenter.style.height = height + "px";
	};
	
	oMap.AdjustToView();
});


