var map;
var homeUrl = "http://www.tokyo-explorer.com/load.php?url=http://www.japan-hopper.com";
var userAdded = 1;
var layers = {
 "Ginza Line":
 {"url": "http://n.girasol.googlepages.com/ginzasen.kml",
	"name": "Ginza Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Marunouchi Line":
 {"url": "http://n.girasol.googlepages.com/marunouchi.kml",
	"name": "Marunouchi Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Hibiya Line":
 {"url": "http://n.girasol.googlepages.com/hibiya.kml",
	"name": "Hibiya Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Tozai Line":
 {"url": "http://n.girasol.googlepages.com/tozaisen.kml",
	"name": "Tozai Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Chiyoda Line":
 {"url": "http://n.girasol.googlepages.com/chiyoda.kml",
	"name": "Chiyoda Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Yurakucho Line":
 {"url": "http://n.girasol.googlepages.com/yurakucho.kml",
	"name": "Yurakucho Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Hanzomon Line":
 {"url": "http://n.girasol.googlepages.com/hanzomon.kml",
	"name": "Hanzomon Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Nanboku Line":
 {"url": "http://n.girasol.googlepages.com/nanboku.kml",
	"name": "Nanboku Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Toei Asakusa Line":
 {"url": "http://n.girasol.googlepages.com/asakusa.kml",
	"name": "Toei Asakusa Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Toei Mita Line":
 {"url": "http://n.girasol.googlepages.com/mita.kml",
	"name": "Toei Mita Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Toei Shinjuku Line":
 {"url": "http://n.girasol.googlepages.com/shinjuku.kml",
	"name": "Toei Shinjuku Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759},
 "Toei Oedo Line":
 {"url": "http://n.girasol.googlepages.com/oedo.kml",
	"name": "Toei Oedo Line",
	"zoom": 13,
	"lat": 35.683653,
	"lng": 139.751759}
};

var baseIcon = Array();



var mapFunc = {
	lat: 0,
	lng: 0,
	point: '',
	tabs: '',
	per_page: 5,
	pre_marker: '',
	center_marker: '',
	lastMarker: '',
	labelID: '',

	clearSearch: function() {
		map.clearOverlays();
		$('#post_form').html('');
		$('#search_result0').html('');
		$('#search_result1').html('');
		$('#search_result2').html('');
		$('#search_result3').html('');
		$('#search_result7').html('');
		//$('.q').attr('value','');
		//mapFunc.centerMarker();
	},

	getInfo: function(q,zoom) {
		this.clearSearch();
		if(zoom != "") {map.setZoom(zoom);}
		var baseUrl = homeUrl + "/ws/search.php";

		var bounds = map.getBounds();
		var minx = bounds.getSouthWest().lng();
		var miny = bounds.getSouthWest().lat();
		var maxx = bounds.getNorthEast().lng();
		var maxy = bounds.getNorthEast().lat();

		if(q) {
			// Placemarks
			flag = 0;
			url = baseUrl + "?mode=4&rating=0&tagf=0&edit=0&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy + "&q=" + q;
			kml_url = baseUrl + "?mode=4&f=1&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy + "&q=" + q;

			var sort = $('.sort').attr('value');
			var sort = $("input[@name='sort']:checked").val();
			if(sort == 0) {
				url += "&sort=0";
				kml_url += "&sort=0";
			} else {
				url += "&sort=1";
				kml_url += "&sort=1";
			}

			title = '<h5 style="color:#CC0000;">Users\' Posts <span style="color:#ccc;font-weight:normal;"> | <a href="' + kml_url + '">KML</a></span></h5>';
			mapFunc.searchResults(flag,title);

			// Hotels
			flag = 1;
			url = baseUrl + "?sp=1&mode=4&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy + "&q=" + q;
			kml_url = baseUrl + "?sp=1&mode=0&f=1&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy + "&q=" + q;
			title = '<h5 style="color:#FF6600;">Hotels <span style="color:#ccc;font-weight:normal;"> | <a href="' + kml_url + '">KML</a></span></h5>';
			mapFunc.searchResults(flag,title);

			// Wikipedia
			flag = 2;
			url = baseUrl + "?mode=10&q=" + q;
			title = '<h5>Articles by wikipedia</h5>';
			mapFunc.searchResults(flag,title);

		} else {

			// Placemarks
			flag = 0;
			url = baseUrl + "?mode=4&rating=0&tagf=0&edit=0&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;
			kml_url = baseUrl + "?mode=4&f=1&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;

			var sort = $('.sort').attr('value');
			var sort = $("input[@name='sort']:checked").val();
			if(sort == 0) {
				url += "&sort=0";
				kml_url += "&sort=0";
			} else {
				url += "&sort=1";
				kml_url += "&sort=1";
			}

			title = '<h5 style="color:#CC0000;">Users\' Posts <span style="color:#ccc;font-weight:normal;"> | <a href="' + kml_url + '">KML</a></span></h5>';
			mapFunc.searchResults(flag,title);

			// Hotels
			flag = 1;
			url = baseUrl + "?sp=1&mode=4&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;
			kml_url = baseUrl + "?sp=1&mode=0&f=1&items=" + mapFunc.per_page + "&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;
			title = '<h5 style="color:#FF6600;">Hotels <span style="color:#ccc;font-weight:normal;"> | <a href="' + kml_url + '">KML</a></span></h5>';
			mapFunc.searchResults(flag,title);

			// Wikipedia
			flag = 2;
			url = baseUrl + "?mode=11&minx="+ minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;
			title = '<h5>Articles by wikipedia</h5>';
			mapFunc.searchResults(flag,title);
		}
	},

	searchResults: function(flag, title) {
		if(flag == 3) {
			$('#search_result' + flag).append('<div class="search_result' + flag + '"><div id="List' + flag + '"></div></div>');
			$('#List' + flag).append('<div id="loader' + flag + '"><img src="http://www.japan-hopper.com/images/loader.gif" alt="loadding" align="top" /></div>');
		} else {
			$('#search_result' + flag).append('<div class="search_result' + flag + '"><ol id="List' + flag + '"></ol></div>');
			$('#List' + flag).append('<li id="loader' + flag + '"><img src="http://www.japan-hopper.com/images/loader.gif" alt="loadding" align="top" /></li>');
		}
		$('#List' + flag).before(title);
		$('#List' + flag).after('<input type="hidden" id="page' + flag + '" name="page' + flag + '" value="0" />');
		mapFunc.displayInfo(url, flag, 0);
	},

	displayInfo: function(url, flag, p) {
		var request = GXmlHttp.create();
		request.open("GET", url, true);
		request.setRequestHeader('If-Modified-Since', 'Thu, 01 Jan 1970 00:00:00 GMT');
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				var xmlDoc = request.responseXML;
				if(!xmlDoc || xmlDoc.documentElement == null) {
					$('#loader' + flag).remove();
					$('#List' + flag).after('<div class="notfound">Not Found</div>');
					return false;
				}
				var markers = xmlDoc.documentElement.getElementsByTagName("Placemark");
				var len = Math.min(markers.length, mapFunc.per_page);

				for (var i = 0; i < len; i++) {
					var lng, lat;
					var coordinates = markers[i].getElementsByTagName("coordinates")[0].childNodes[0].data;
					if (coordinates) {
						var c = coordinates.split(",");
						lng = parseFloat(c[0]);
						lat = parseFloat(c[1]);
					} else {
						lng = parseFloat(markers[i].getElementsByTagName("longitude")[0].childNodes[0].data);
						lat = parseFloat(markers[i].getElementsByTagName("latitude")[0].childNodes[0].data);
					}
					var point = new GLatLng(lat, lng);
					//if (!i && flag == 0) map.setCenter(point);

					var id = markers[i].getAttribute("id");
					var names = markers[i].getElementsByTagName("name");
					var name = names.length ? names[0].childNodes[0].data : '';
					var descs = markers[i].getElementsByTagName("description");
					var desc = descs.length ? descs[0].childNodes[0].data : '';

					var marker = new mapFunc.displayMarker(id, point, i, name, desc, flag, p);
					map.addOverlay(marker);
				}

				$('#List' + flag).after('<div id="next' + flag + '" class="next"><a name="next" class="button"><span>More results &raquo;</span></a></div>');
				var page = $('#page' + flag).attr('value');
				page++;
				if(page != 0){
					var prev = page - 1;
					url = url.replace("&page" + flag + "="+ prev, "");
				}
				$('#next' + flag).click(function() {
					$('#next' + flag).remove();
					$('#List' + flag).after('<div id="loader' + flag + '" class="next"><img src="http://www.japan-hopper.com/images/loader.gif" alt="loadding" /></div>');
					var next = url + "&page" + flag + "=" + page;
					mapFunc.displayInfo(next, flag, page);
				});
				$('#page' + flag).attr('value', page);
				$('#loader' + flag).remove();
			}
		}
		request.send(null);
		return false;
	},

	displayMarker: function(id, point, index, name, desc, flag, p) {

		var item_url = name.replace(/^\s+/, "");
		item_url = item_url.replace(/\s+$/, "");
		item_url = item_url.replace(/\s/g, "+");

		if(flag == 0 || flag == 1 || flag == 2 || flag == 7) {
			if(p == 0) {
				var start = 1;
			} else {
				var start = p*mapFunc.per_page+1;
			}
			var marker = new LabeledMarker(point,{
				clickable: true,
				icon: baseIcon[flag],
				labelOffset: new GSize(-16, -16),
				labelText: index+start
			});
		} else {
			var marker = new GMarker(point, baseIcon[flag]);
		}

		var letter = String.fromCharCode("A".charCodeAt(0) + index);
		var msg = name ? '<div>' + (desc ? desc : '') : 'Marker <strong>' + letter + '</strong></div>';
		var tip = '<div class="fukidashi">' + desc + '</div>';
		var li = document.createElement("li");
		li.innerHTML = desc;

		if(flag == 3) {
			$('#List3').append(desc);
		} else {
			$('#List' + flag).append(li);
		}

		var f = function() {
			var opts = { maxWidth : 200 };
			mapFunc.lastMarker = marker;
			//marker.openInfoWindowHtml(msg);
			marker.openInfoWindowHtml(tip,opts);
			li.className = 'here';

			// access log
			var count_url = "map/" + name;
			pageTracker._trackPageview(count_url);
		};
		var g = function() {
			li.className = '';
		}
		GEvent.addListener(marker, "click", f);
		GEvent.addListener(marker, "infowindowclose", g);

		return marker;
	},

	addTag: function(i){
		var getTag = '#tagWord'+i;
		var value = $(getTag).attr('value');
		var newTags = homeUrl + '/ws/tag.php';
		var change = '#tags'+i;
		$(change).load(newTags, { id: i, tag: value });
		$(getTag).attr('value','');
	},

	ratingVote: function(i, value){
		var newRating = homeUrl + '/ws/rate.php';
		var change = '#rating'+i;
		$(change).load(newRating, { id: i, v: value });
	},

	inappropriate: function(id){
		if(window.confirm("Please push \"OK\" if this information is spam.")){
			var target_url = homeUrl + "/ws/notifier.php";
			var post_data = 'id=' + id;
			$.post(target_url, post_data, function() {
				if(map) {
					alert('Thank you!');
					map.closeInfoWindow();
					map.removeOverlay(mapFunc.lastMarker);
				} else {
					alert('Thank you!');
					contentDiv = "#content" + id;
					$(contentDiv).html("");
				}
			});
		}
	}
}

function LabeledMarker(a,b){this.latlng_=a;this.opts_=b;this.labelText_=b.labelText||"";this.labelClass_=b.labelClass||"LabeledMarker_markerLabel";this.labelOffset_=b.labelOffset||new GSize(0,0);this.clickable_=b.clickable||true;this.title_=b.title||"";this.labelVisibility_=true;if(b.draggable){b.draggable=false}GMarker.apply(this,arguments)}


function addGeoXML(kml) {
	if(kml == undefined) {
		var theUrl = document.getElementById("url").value;
	} else {
		var theUrl = kml;
	}
	theUrl = theUrl.replace(/^\s+/, "");
	theUrl = theUrl.replace(/\s+$/, "");
	if (theUrl.indexOf(' ') != -1) {
		alert('Error - that address has a space in it');
	} else {
		var id = "userAdded" + userAdded;
		layers[id] = {};
		layers[id].url = theUrl;
		layers[id].name = "User Layer " + userAdded;

		mapFunc.getInfo();

		addTR(id);
		document.getElementById(id).checked = true;
		toggleGeoXML(id, true);
		userAdded++;
	}
}

function addTR(id) {
	var layerTR = document.createElement("tr");

	var inputTD = document.createElement("td");
	var input = document.createElement("input");
	input.type = "checkbox";
	input.id = id;
	input.onclick = function () { toggleGeoXML(this.id, this.checked) };
	inputTD.appendChild(input);

	var nameTD = document.createElement("td");
	var nameA = document.createElement("a");
	nameA.href = layers[id].url;
	var name = document.createTextNode(layers[id].name);
	nameA.appendChild(name);
	nameTD.appendChild(nameA);

	layerTR.appendChild(inputTD);
	layerTR.appendChild(nameTD);
	document.getElementById("sidebarTBODY").appendChild(layerTR);
}

function toggleGeoXML(id, checked) {
	if (checked) {
		var geoXml = new GGeoXml(layers[id].url);
		layers[id].geoXml = geoXml;

		if (layers[id].zoom) {
			map.setZoom(layers[id].zoom);
		} else {
			//map.setZoom(1);
		}
		if (layers[id].lat && layers[id].lng) {
			map.setCenter(new GLatLng(layers[id].lat, layers[id].lng));
		} else {
			//map.setCenter(new GLatLng(35.71,139.8));
		}
		mapFunc.getInfo();
		map.addOverlay(geoXml);

	} else if (layers[id].geoXml) {
		map.removeOverlay(layers[id].geoXml);
	}
}



$(function() {

	if (GBrowserIsCompatible()) {

		var baseurl = 'http://www.tokyo-explorer.com/wp-content/plugins/lightweight-google-maps/locations.php?format=xml&';
		main();
		onunload = GUnload;

		var geocoder;
		geocoder = new GClientGeocoder();

		for(var layer in layers) {
			addTR(layer, layers[layer].name);
		}

		//document.getElementById(layer).checked = true;
		//toggleGeoXML(layer, true);


		// get parameter
		var kml = "";
		var param = 0;
		var query = location.search.substring(1);
		var pairs = query.split("&");
		for (var i=0; i<pairs.length; i++) {
			var pos = pairs[i].indexOf("=");
			var argname = pairs[i].substring(0,pos).toLowerCase();
			var value = pairs[i].substring(pos+1).toLowerCase();

			if (argname == "kml") {kml = value;}
			if (argname == "lat") {lat = parseFloat(value);param++;}
			if (argname == "lng") {lng = parseFloat(value);param++;}
			if (argname == "zoom") {zoom = parseInt(value);param++;}
			// test http://www.tokyo-explorer.com/map?lat=41.796729&lng=140.75695&zoom=12
		}

		if(param == 3) {
			point = new GLatLng(parseFloat(lat),parseFloat(lng));
			map.setCenter(point, zoom);
		}

		if(kml != "") {
			addGeoXML(kml);
		} else {
			mapFunc.getInfo();
		}


		baseIcon[0] = new GIcon();
		baseIcon[0].image = 'http://www.japan-hopper.com/images/label-red.png';
		baseIcon[0].iconSize = new GSize(32, 32);
		baseIcon[0].iconAnchor = new GPoint(16, 16);
		baseIcon[0].infoWindowAnchor = new GPoint(25, 7);

		baseIcon[1] = new GIcon();
		baseIcon[1].image = 'http://www.japan-hopper.com/images/label-orange.png';
		baseIcon[1].iconSize = new GSize(32, 32);
		baseIcon[1].iconAnchor = new GPoint(16, 16);
		baseIcon[1].infoWindowAnchor = new GPoint(25, 7);

		baseIcon[2] = new GIcon();
		baseIcon[2].image = 'http://www.japan-hopper.com/images/label-green.png';
		baseIcon[2].iconSize = new GSize(32,32);
		baseIcon[2].iconAnchor = new GLatLng(16,16);
		baseIcon[2].infoWindowAnchor = new GLatLng(2,16);

		baseIcon[3] = new GIcon();
		baseIcon[3].image = 'http://www.japan-hopper.com/images/red-pushpin.png';
		baseIcon[3].shadow = 'http://www.japan-hopper.com/images/pushpin_shadow.png';
		baseIcon[3].iconSize = new GSize(32,32);
		baseIcon[3].shadowSize = new GSize(59,32);
		baseIcon[3].iconAnchor = new GLatLng(32,16);
		baseIcon[3].infoWindowAnchor = new GPoint(16,0);

		var center_marker_icon = new GIcon();
		center_marker_icon.image = 'http://www.japan-hopper.com/images/centermarker_standard01.png';
		center_marker_icon.shadow = 'http://www.japan-hopper.com/images/centermarker_standard01_shadow.png';
		center_marker_icon.iconSize = new GSize( 23 , 23 );
		center_marker_icon.shadowSize = new GSize( 29 , 29 );
		center_marker_icon.iconAnchor = new GPoint( 11 , 11 );


		LabeledMarker.prototype=new GMarker(new GLatLng(0,0));
		LabeledMarker.prototype.initialize=function(c){GMarker.prototype.initialize.apply(this,arguments);this.map_=c;this.div_=document.createElement("div");this.div_.className=this.labelClass_;this.div_.innerHTML=this.labelText_;this.div_.style.position="absolute";this.div_.style.cursor="pointer";this.div_.title=this.title_;c.getPane(G_MAP_MARKER_PANE).appendChild(this.div_);if(this.clickable_){function newEventPassthru(a,b){return function(){GEvent.trigger(a,b)}}var d=['click','dblclick','mousedown','mouseup','mouseover','mouseout'];for(var i=0;i<d.length;i++){var e=d[i];GEvent.addDomListener(this.div_,e,newEventPassthru(this,e))}}}
		LabeledMarker.prototype.redraw=function(a){GMarker.prototype.redraw.apply(this,arguments);var p=this.map_.fromLatLngToDivPixel(this.latlng_);var z=GOverlay.getZIndex(this.latlng_.lat());this.div_.style.left=(p.x+this.labelOffset_.width)+"px";this.div_.style.top=(p.y+this.labelOffset_.height)+"px";this.div_.style.zIndex=z}
		LabeledMarker.prototype.remove=function(){GEvent.clearInstanceListeners(this.div_);if(this.div_.outerHTML){this.div_.outerHTML=""}if(this.div_.parentNode){this.div_.parentNode.removeChild(this.div_);}this.div_=null;GMarker.prototype.remove.apply(this,arguments)}
		LabeledMarker.prototype.copy=function(){return new LabeledMarker(this.latlng_,this.opt_opts_)}
		LabeledMarker.prototype.show=function(){GMarker.prototype.show.apply(this,arguments);if(this.labelVisibility_){this.showLabel()}else{this.hideLabel()}}
		LabeledMarker.prototype.hide=function(){GMarker.prototype.hide.apply(this,arguments);this.hideLabel()}
		LabeledMarker.prototype.setLabelVisibility=function(a){this.labelVisibility_=a;if(!this.isHidden()){if(this.labelVisibility_){this.showLabel()}else{this.hideLabel()}}}
		LabeledMarker.prototype.getLabelVisibility=function(){return this.labelVisibility_}
		LabeledMarker.prototype.hideLabel=function(){this.div_.style.visibility='hidden'}
		LabeledMarker.prototype.showLabel=function(){this.div_.style.visibility='visible'}


		$('.searchForm').submit(function() {
			var q = $('.q').attr('value');
			mapFunc.getInfo(q);
			return false;
		});

		$('.searchLocation').submit(function() {
			if(geocoder) {
				var loc = $('.loc').attr('value');

				geocoder.setBaseCountryCode("JP");
				geocoder.getLatLng(loc,function(point) {
					if (!point) {
						alert("Not Found");
					} else {
						map.setCenter(point, 13);
						mapFunc.getInfo();
					}
				});

			}
			return false;
		});

		$('.clear_info').click(function() {
			mapFunc.clearSearch();
		});

	}

});

