function tm_st(){}
tm_st.prototype = new GControl();
tm_st.prototype.initialize = function(map){
	var stcontainer = document.createElement("div");
	var streset = document.createElement("span");
	streset.setAttribute("class", "mapbuttons");
	streset.setAttribute("id", "streset");
	streset.setAttribute("style", "border:1px solid black;");
	streset.appendChild(document.createTextNode("Reset"));  
	stcontainer.appendChild(streset);
	GEvent.addDomListener(streset, "click", function() {$('#wtgooglemap').width(550);$('#wtmapmenu').show();map.checkResize();map.returnToSavedPosition();} );
	map.getContainer().appendChild(stcontainer);
	return stcontainer;
};
tm_st.prototype.getDefaultPosition = function() {  return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(5, 1));};
var map,gmarkerrollover, popup;
var selected_marker, postjsondata;
var current_markers = [];
var map_markers = [];
var postloaded_markers = [];

var tm_mapsearch = function(searchdata){
	//alert(searchdata);
}

function global_map_load(lat,lng,zoom){
	map = new GMap2(document.getElementById("wtgooglemap"),{"backgroundColor" :"#99b3cc", "googleBarOptions" :{"suppressInitialResultSelection" : true ,"onSearchCompleteCallback": tm_mapsearch}});
	map.addControl(new GSmallZoomControl3D());
	map.addControl(new tm_st());
	// request that tabular search results should be suppressed
	gmarkerrollover = document.createElement("div");
	document.getElementById("wtgooglemap").appendChild(gmarkerrollover);
	gmarkerrollover.id = "gmaprollover";
	gmarkerrollover.style.visibility = "hidden";
	
	map.setCenter(new GLatLng(9,48),1);
	//map.setCenter(new GLatLng(13.7, 106.3),3);
	map.savePosition();
	map.setMapType(G_PHYSICAL_MAP);
	//map.enableGoogleBar();
	//map.GMapOptions.googleBarOptions.suppressZoomToBounds = true;
	$("#wtmapcontainer_coverdiv").appendTo($('#wtgooglemap'));
	$("#wtmapcontainer_coverdiv").fadeTo(0 , "0.5");
	
	GEvent.addListener(map, "movestart", function() {
		$("#gmaprollover").fadeOut(200);
	});
	GEvent.addListener(map, "zoomend", function() {
		$("#gmaprollover").fadeOut(200);
	});
	GEvent.addListener(map, "moveend", function() {
		if(map.getZoom() == 1){
			$('#wtgooglemap').animate({"width":550}, 200,function(){map.checkResize();refresh_markers();});
			$('#wtmapmenu').animate({"width":146}, 200);
		}
		else{
			$('#wtmapmenu').animate({"width":0}, 200,function(){$('#wtmapmenu').hide();});
			$('#wtgooglemap').animate({"width":698}, 200,function(){map.checkResize();refresh_markers();});
		}
		
	});
	if(lat != undefined){
		map.setCenter(new GLatLng(parseFloat(lat),parseFloat(lng)),parseInt(zoom));
		map.checkResize();
	}
	else{
		refresh_markers();
	}
}


function refresh_markers(){
	if(map.getZoom() >= 5){
		$("#wtmapcontainer_coverdiv").css({"display":"block","visibility":"visible"});
	}
	
	while(map_markers.length){
		map.removeOverlay(map_markers.pop());
	}
	while(postloaded_markers.length){
		map.removeOverlay(postloaded_markers.pop());
	}
	current_markers = [];
	for(var i = 0; i < jsondata.mapdata.length; i++){
		var point = new GLatLng(jsondata.mapdata[i].lat,jsondata.mapdata[i].lng);
		if(map.getBounds().containsLatLng(point)){
			if(jsondata.mapdata[i].ltype == "country"){
				var marker = tm_create_marker(point, jsondata.mapdata[i]);//"title" :,
				marker.json = jsondata.mapdata[i];
				//current_markers.push(jsondata.mapdata[i]);
				map.addOverlay(marker);
				map_markers.push(marker);
			}
			var mapzoom = map.getZoom();
			if(mapzoom >= 3 && mapzoom < 15 && jsondata.mapdata[i].ltype == "location"){
				current_markers.push(jsondata.mapdata[i]);
			}
		}
	}
	
	current_markers = cluster_markers(current_markers);
	for(var i = 0; i < current_markers.length; i++){
		if(current_markers[i].lat == undefined){
			var point = build_cluster_marker(current_markers[i]);
			var alert_text = "";
			for (var u = 0 ; u < current_markers[i].length;u++){
				alert_text += current_markers[i][u].name+"<br>\r\n";
			}
			var marker = tm_create_marker(point, current_markers[i]);//"title" :,
			marker.cluster_vals = current_markers[i];
			map_markers.push(marker);
			map.addOverlay(marker);
		}
		else{
			var marker = tm_create_marker(new GLatLng(current_markers[i].lat,current_markers[i].lng), current_markers[i]);//"title" :,
			marker.json = current_markers[i];
			map_markers.push(marker);
			map.addOverlay(marker);
		}
	}
	if(map.getZoom() >= 4){
		
		var top = map.fromContainerPixelToLatLng({"x": 0, "y": 20});
		var bottom = map.fromContainerPixelToLatLng({"x": 698, "y": 320});
		if(bottom.x < top.x){
			bottom.x = bottom.x+360;
		}
		var process = function(data){
			postjsondata = eval('('+data+')');
			var current_post_loaded = [];
			for(var i = 0; i < postjsondata.mapdata.length; i++){
				current_post_loaded.push(postjsondata.mapdata[i]);
			}
			current_post_loaded = cluster_markers(current_post_loaded);
			for(var i = 0; i < current_post_loaded.length; i++){
				if(current_post_loaded[i].lat == undefined){
					var point = build_cluster_marker(current_post_loaded[i]);
					var alert_text = "";
					for (var u = 0 ; u < current_post_loaded[i].length;u++){
						alert_text += current_post_loaded[i][u].name+"<br>\r\n";
					}
					//current_post_loaded[i].ltype = "postlocationcluster";
					var marker = tm_create_marker(point, current_post_loaded[i]);//"title" :,
					marker.cluster_vals = current_post_loaded[i];
					postloaded_markers.push(marker);
					map.addOverlay(marker);
				}
				else{
					var marker = tm_create_marker(new GLatLng(current_post_loaded[i].lat,current_post_loaded[i].lng), current_post_loaded[i]);//"title" :,
					marker.json = current_post_loaded[i];
					postloaded_markers.push(marker);
					map.addOverlay(marker);
				}
			}
			//postloaded_markers
			$("#wtmapcontainer_coverdiv").css({"display":"none","visibility":"hidden"});
		}
		GDownloadUrl("/webapp/wcs/stores/ConsumerDirectStorefrontAssetStore/Destination/proxy.jsp?json=global-portal-map&topx="+top.x+"&topy="+top.y+"&bottomx="+bottom.x+"&bottomy="+bottom.y+"&zoom="+map.getZoom(),process);
	}
}

function cluster_markers(markers){
	var clustered = [];
	var used_markers = [];
	while (markers.length) {
		var marker = markers.pop();
		var cluster = [];
		for (var i in markers){
			var marker_div = map.fromLatLngToContainerPixel(new GLatLng(parseFloat(marker.lat),parseFloat(marker.lng)));
			var markers_div = map.fromLatLngToContainerPixel(new GLatLng(parseFloat(markers[i].lat),parseFloat(markers[i].lng)));
			var distance = Math.sqrt(
				Math.pow(Math.abs(marker_div.x - markers_div.x),2)
				+Math.pow(Math.abs(marker_div.y - markers_div.y),2)
				);
			if (distance <= 12) {
				var name_found = false;
				for (var u in used_markers){
					if (used_markers[u] == markers[i].name){
						name_found = true;
						break;
					}
				}
				if(!name_found){
					used_markers.push(markers[i].name);
					cluster.push(markers[i]);
				}
				else{
					
				}
			}
		}
		var name_found = false;
		for (var u in used_markers){
			if (used_markers[u] == marker.name){
				name_found = true;
				break;
			}
		}
		if (cluster.length > 0) {
			cluster.push(marker);
			clustered.push(cluster);
		} else if(!name_found) {
			clustered.push(marker);
		}
	}
	return clustered;
}

function build_cluster_marker(markers){
	var avg_lat = 0; 
	var avg_lng = 0;
	for(var i = 0; i < markers.length; i++){
		avg_lat = parseFloat(avg_lat) +parseFloat(markers[i].lat);
		avg_lng = parseFloat(avg_lng) + parseFloat(markers[i].lng);
	}
	avg_lng = avg_lng / markers.length;
	avg_lat = avg_lat / markers.length;
	return new GLatLng(parseFloat(avg_lat),parseFloat(avg_lng));
}

function tm_create_marker(point, markerjsondata){
	var icon = new GIcon();
	icon.iconSize = new GSize(16, 20);
	icon.iconAnchor = new GPoint(8, 20);
	icon.infoWindowAnchor = new GPoint(12, 0);
	if(markerjsondata.ltype == "country" && markerjsondata.content != undefined && markerjsondata.content == "yes"){
		icon.image = 'http://s3media.pleasetakemeto.com/images/icon/icon-star-shiny.png';
	}
	else if(markerjsondata.ltype == "country"){
		icon.image = 'http://s3media.pleasetakemeto.com/images/icon/icon-star-blue.png';
	}
	else if(markerjsondata.ltype == "location"){
		icon.image = 'http://s3media.pleasetakemeto.com/images/icon/icon-star-orange.png';
	}
	else{
		icon.iconSize = new GSize(29, 20);
		icon.iconAnchor = new GPoint(15, 20);
		icon.infoWindowAnchor = new GPoint(15, 0);
		icon.image = 'http://s3media.pleasetakemeto.com/images/icon/icon-star-group.png';
	}
	var marker = new GMarker(point, {"icon" : icon });//,"title": rollover
	GEvent.addListener(marker, "click",function(){
		$("#gmaprollover").fadeOut("slow");
		//selected_marker = marker;
		tm_popupopen(marker);
		return;
	});
	GEvent.addListener(marker,"mouseover", function(){
		if(marker.cluster_vals == undefined){
			gmarkerrollover.innerHTML = marker.json.name;
		}
		else{
			var alert_text = "";
			for (var u = 0 ; u < marker.cluster_vals.length;u++){
				alert_text += marker.cluster_vals[u].name+"<br>\r\n";
			}
			gmarkerrollover.innerHTML = alert_text;
		}
		var element = document.getElementById('gmaprollover');
		var divcoords = map.fromLatLngToContainerPixel(marker.getPoint());
		var rolloverx=divcoords.x;
		var rollovery=divcoords.y;
		gmarkerrollover.style.visibility="visible";
		gmarkerrollover.style.opacity="1";
		gmarkerrollover.style.MozOpacity="1";
		gmarkerrollover.style.filter= "alpha(opacity=100)";
		gmarkerrollover.style.position= "absolute";
		gmarkerrollover.style.display="block";
		gmarkerrollover.style.border="1px solid black";
		$(element).animate({
			left:(rolloverx+10)+'px',
			top: rollovery+'px'
		},{"duration":200,"queue":false});
		
	});
	return marker;
}
function wrap_markers(cluster){
	var bounds = new GLatLngBounds();
	for(i in cluster){
		var point = new GLatLng(parseFloat(cluster[i].lat), parseFloat(cluster[i].lng));
		bounds.extend(point);
	}
	map.closeInfoWindow();
	map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
}

function tm_popupopen(marker){
	var point = marker.getPoint();
	selected_marker = marker;
	if (marker.cluster_vals != undefined) {
		
		var content = "<strong>Multiple Locations</strong><br><ul>";
		for(i in marker.cluster_vals){
			var looped_json_data = marker.cluster_vals[i];
			var link_end = "";
			if(looped_json_data.content == "yes"){
				var link_end = "/information";
			}
			content+= "<li>» <a href='/world-travel/"+ looped_json_data.url_country+"/"+looped_json_data.url+link_end+"'>"+looped_json_data.name+"</a></li>";
		}
		var content = content+"</ul><br><a href='javascript:void(0);' onClick='wrap_markers(selected_marker.cluster_vals);'>Zoom in for detailed view</a>";
	}
	else{
		var content = "/information";
		if(marker.json.url == marker.json.url_country){
			if(marker.json.content == "yes"){
				var content = "";
			}
			var link = "/world-travel/"+marker.json.url+content;
		}
		else{
			if(marker.json.content == "yes"){
				var content = "/information";
			}
			var link = "/world-travel/"+marker.json.url_country+"/"+marker.json.url+content;
		}
		var content = "<h3><a href='"+link+"'>" + marker.json.name + "</a></h3><br><br><p style='width:220px;'>"+marker.json.desc+" <a href='"+link+"'>read more.</a></p>";
	}
	map.openInfoWindowHtml(selected_marker.getPoint(), content);
}