var gmarkers = [];
var bubbles = [];
var addresses = [];
var point_lat = [];
var point_lng = [];
var point_valid = [];
var first_gmap_pop=0;

$(document).ready(function() {
	$.ajax({
		url: "/includes/gmap.php",
		success: function(html){
			$("#gmap-holder").append(html);
			$('#gmap_form').submit(function() {setDirections(this.gmap_from.value, this.gmap_to.value);return false;});
			$('.gmap_dir_clear').click(function() {gdir.clear(); hide("gmap_warn"); hide("gmap_dir_box"); gmap_frame("all"); return false;});

			geocoder = new GClientGeocoder();
			$("body").prepend('<div id="gmap_point_box"></div>');

			$('.gmap_pass_rel').each(function(){geo(this.rel, get_index(this.id), chk_class(this));});
			$('.gmap_pass_inner').each(function(){geo(this.innerHTML, get_index(this.id), chk_class(this));});
		}
	});

	function geo(address, index, chk_class){
		var pass_class;
		if (chk_class) pass_class=" "+chk_class; else pass_class="";
		geocoder.getLatLng(address, function(point) {
			if (point){$("#gmap_point_box").append('<div class="gmap_point'+pass_class+'" id="gmap_point_'+index+'">'+address+'^'+point.lat()+'^'+point.lng()+'</div>');}
			else{$("#gmap_point_box").append('<div class="gmap_point" id="gmap_point_'+index+'">'+address+'</div>');}
		});
	}

	function chk_class(tag){
		var rtn;
		if ($(tag).hasClass("gmap_pass_city")){rtn="gmap_pass_city";}
		if ($(tag).hasClass("gmap_pass_airport")){rtn="gmap_pass_airport";}
		if ($(tag).hasClass("gmap_pass_poi")){rtn="gmap_pass_poi";}
		return rtn;
	}

	function get_index(id){
		var split_id = id.split("_");
		return split_id[2];
	}

	$('.gmap_pop').click(function() {
		var split_id = this.id.split("_");
		var index = split_id[2];
		hide("gmap_warn");
		hide("gmap_dir_box");
		position_pop_box("gmap_box", "rs_box");

		if (first_gmap_pop==0){
			load_gmap();
		}

		if (point_valid[index]==true) gmap_frame(index);

		if (point_valid[index]==true){
			move_gmap(index);
		}else{
			gmap_frame("all");
			if (index) display_error("no_geo", index);
		}

		gdir.clear();

		show("gmap_box");
		if (index) gi("gmap_from").value=addresses[index]; else gi("gmap_from").value="";
		return false;
	});

	function load_gmap(){
		map = new GMap2(gi("gmap"));
		map.disableScrollWheelZoom();
		map.addControl(new GSmallZoomControl3D());
		map.addControl(new GMenuMapTypeControl());
		map.setCenter(new GLatLng(0, 0),2);
		gdir = new GDirections(map, gi("gmap_dir"));
		GEvent.addListener(gdir, "error", display_error);

		$('.gmap_point').each(function() {
			var split_point=this.innerHTML.split("^");
			var split_id=this.id.split("_");
			var index=split_id[2];
			var valid;

			var address = split_point[0];
			var lat=split_point[1];
			var lng=split_point[2];
			if (lat && lng) valid=true; else valid=false;
			var html="<h4 class='gmap_bubble_title'>"+address+"</h4>";
			if (gi("gmap_bubble_"+index))
			{
				html=gi("gmap_bubble_"+index).innerHTML;

				while (html != html.replace("display:none",""))
				{
					html = html.replace("display:none","");
				}

				while (html != html.replace("display: none",""))
				{
					html = html.replace("display: none","");
				}

				while (html != html.replace("display:none;",""))
				{
					html = html.replace("display:none;","");
				}

				while (html != html.replace("display: none;",""))
				{
					html = html.replace("display: none;","");
				}
			}

			addresses[index]=address;
			point_lat[index]=lat;
			point_lng[index]=lng;
			point_valid[index]=valid;
			bubbles[index]=html;

			if ($(this).hasClass("gmap_pass_city")){
				var marker = new GMarker(new GLatLng(lat, lng),{title:address, icon:get_icon("city")});
			}else if ($(this).hasClass("gmap_pass_airport")){
				var marker = new GMarker(new GLatLng(lat, lng),{title:address, icon:get_icon("airport")});
			}else if ($(this).hasClass("gmap_pass_poi")){
				var marker = new GMarker(new GLatLng(lat, lng),{title:address, icon:get_icon("poi")});
			}else{
				var marker = new GMarker(new GLatLng(lat, lng),{title:address, icon:get_icon("marker")});
			}
			gmarkers[index]=marker;


			if (valid){
				GEvent.addListener(marker, 'click', function() {
					gi("gmap_from").value=address;
					marker.openInfoWindowHtml(html);
				});
				map.addOverlay(marker);
			}
		});
		gmap_frame("all");
	}

	function position_pop_box(div, div_rel){
		//var vscroll = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
		//var window_h = ($(window).height()/2)-($("#"+div).height()/2);
		//if ($("#"+div).height()>$(window).height()) window_h=0;
		//gi(div).style.top=(vscroll+window_h)+"px";
		//gi(div).style.left=(document.getElementsByTagName("div")[div_rel].offsetLeft)+($("#"+div_rel).width()/2-$("#"+div).width()/2)+"px";
	}

	function gmap_frame(type) {
		bounds = new GLatLngBounds();
		if (type=="all"){
			for( var i =0; i<point_lat.length; i++) {
				if (point_valid[i]==true) bounds.extend(new GLatLng(point_lat[i], point_lng[i]));
			}
		}else{
			bounds.extend(new GLatLng(point_lat[type], point_lng[type]));
			map.setZoom(14);
		}

		if (type=="all") map.setZoom(map.getBoundsZoomLevel(bounds));
		var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
		var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
		map.setCenter(new GLatLng(clat,clng));
		return false;
	}

	function move_gmap(index) {
		try{gmarkers[index].openInfoWindowHtml(bubbles[index]);}
		catch(e){gmarkers[index] = null;}
		return false;
	}

	function setDirections(fromAddress, toAddress) {
		gdir.load("from: "+fromAddress+" to: "+toAddress);
		gi("gmap_print_link").href="/print?from="+fromAddress+"&to="+toAddress;
		hide("gmap_warn");
		show("gmap_dir_box");
	}

	function display_error(type, index){
		var warn_box="gmap_warn";
		var error1="One of the addresses could not be found, please try a different search.";
		var error2="Please enter a <strong>'from'</strong> and <strong>'to'</strong> destination then try again.";
		var error3="Driving directions failed. It might not be possible to drive this route.";
		if (addresses[index]) var address = addresses[index]; else var address="this address.";
		var error4="Mapping is unavailable for "+address;
		if (type=="no_geo"){
			gi(warn_box).innerHTML=error4;
		}else{
			if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS){gi(warn_box).innerHTML=error1;}
			else if (gdir.getStatus().code == G_GEO_BAD_REQUEST){gi(warn_box).innerHTML=error2;}
			else{gi(warn_box).innerHTML=error3;}
		}
		show("gmap_warn");
		hide("gmap_dir_box");
		gmap_frame("all");
	}

	function get_icon(type){
	  var tiny = new GIcon();
	  tiny.image = "/images/gmap_"+type+".png";
	  tiny.shadow = "/images/gmap_shadow.png";
	  tiny.iconSize = new GSize(20, 34);
	  tiny.shadowSize = new GSize(37, 34);
	  tiny.iconAnchor = new GPoint(9, 34);
	  tiny.infoWindowAnchor = new GPoint(5, 1);
	  return tiny;
	}

	function gi(val){return document.getElementById(val);}
	function show(idLayer) { gi(idLayer).style.display='block'; }
	function hide(idLayer) { gi(idLayer).style.display='none'; }
	function showInline(idLayer) { gi(idLayer).style.display='inline'; }
	function rs_clear(idLayer){ gi(idLayer).innerHTML="";}
	function change(id, newClass) {identity=gi(id); identity.className=newClass;}
	function round( val, precision ) {return parseFloat(parseFloat(val).toFixed(precision));}

	//load_gmap();
});