
var gbounds = false;
var gmap_log = false;
var marker_i = 0;
var map = false;
var geocoder = false;
var gmap_cfg = [];
var mm = false;
var mm_markers = [];
var gmarker_zindex = 1; 
var gmarkers = [];
var gcount = [];
var gicons = [];
var gicons_letter_index = [];

var default_icon = new GIcon(G_DEFAULT_ICON);


var icon_letter = new GIcon(G_DEFAULT_ICON);
icon_letter.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon_letter.iconSize = new GSize(20, 34);
icon_letter.shadowSize = new GSize(37, 34);
icon_letter.iconAnchor = new GPoint(9, 34);
icon_letter.infoWindowAnchor = new GPoint(9, 2);

var icon_number = new GIcon(G_DEFAULT_ICON);
icon_number.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon_number.iconSize = new GSize(20, 34);
icon_number.shadowSize = new GSize(37, 34);
icon_number.iconAnchor = new GPoint(9, 34);
icon_number.infoWindowAnchor = new GPoint(9, 2);

function get_zindex_marker(){
	return gmarker_zindex++;
}

function create_marker(cfg){
	
	cfg = $.extend({
		
		type : 'default',
		point : null,
		lat : null,
		lng : null,
		icon : default_icon,
		libicon : null,
		icon_x : 20,
		icon_y : 34,
		icon_pos : "default",
		icon_src : null,
		index : 0,
		popup : false,
		enable_zindex : false,
		icon_zindex : 1,
		popuphtml : null,
		draggable : false,
		ondragend : null
		
	},cfg);
	
	switch(cfg['type']){
		case "iconsrc":
			cfg['icon'] = new GIcon(G_DEFAULT_ICON);
			cfg['icon'].image = cfg['icon_src'];
			
			cfg['icon'].shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
			cfg['icon'].iconSize = new GSize(cfg.icon_x, cfg.icon_y);
			switch(cfg['icon_pos']){
				case "center":
					cfg['icon'].shadowSize = new GSize((cfg.icon_x * 2), cfg.icon_y);
					cfg['icon'].iconAnchor = new GPoint((cfg.icon_x / 2), cfg.icon_y);
					cfg['icon'].infoWindowAnchor = new GPoint(9, 2);
				break;
				default:
					cfg['icon'].shadowSize = new GSize(37, 34);
					cfg['icon'].iconAnchor = new GPoint(9, 34);
					cfg['icon'].infoWindowAnchor = new GPoint(9, 2);
			}				
		
		break;
		case "libicon":
			
			cfg['icon'] = new GIcon(G_DEFAULT_ICON);
			cfg['icon'].image = site_url+"/lib/img/ic/maps/markers/" + cfg['libicon'] + ".png";
			
			cfg['icon'].shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
			cfg['icon'].iconSize = new GSize(cfg.icon_x, cfg.icon_y);
			switch(cfg['icon_pos']){
				case "center":
					cfg['icon'].shadowSize = new GSize((cfg.icon_x / 2), (cfg.icon_y / 2));
					cfg['icon'].iconAnchor = new GPoint((cfg.icon_x / 2), (cfg.icon_y / 2));
					cfg['icon'].infoWindowAnchor = new GPoint((cfg.icon_x / 2), (cfg.icon_y / 2));
				break;
				default:
					cfg['icon'].shadowSize = new GSize(37, 34);
					cfg['icon'].iconAnchor = new GPoint(9, 34);
					cfg['icon'].infoWindowAnchor = new GPoint(9, 2);
			}				
					
			
		break;
		case "letter":
			var letter = String.fromCharCode("A".charCodeAt(0) + cfg['index']);
			cfg['icon'] = new GIcon(icon_letter);
			
			cfg['icon'].image = "http://www.google.com/mapfiles/marker" + letter + ".png";
		break;
		case "number":
			cfg['icon'] = new GIcon(icon_number);
			
			cfg['icon'].image = site_url+"/lib/img/ic/maps/markers/" + cfg['index'] + ".png";
		break;
		default:
			cfg['icon'] = new GIcon(cfg['icon']);
		
	}
	
	markerOptions = { icon:cfg['icon'],draggable:cfg['draggable'] };
	
	if(cfg['enable_zindex']){
		markerOptions.zIndexProcess = function(){
			
			return cfg['icon_zindex'];
		}
	}
	
	
	if(cfg['point']){
		var marker = new GMarker(cfg['point'], markerOptions);
	}else if(cfg['lng'] && cfg['lat']){
		
		var marker = new GMarker(new GLatLng(cfg['lat'],cfg['lng']), markerOptions);
	}else{
		return false;
	}
	
	
	if(cfg['popup']){
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(cfg['popuphtml']);
		});			
	}
	if(cfg['ondragend']){
		var fnondragend = cfg['ondragend'];
		GEvent.addListener(marker, "dragend", function(){
			fnondragend(marker);
		});
	}
	return marker;
}

function add_marker(marker){
	
	map.addOverlay(marker);
	return marker;
	
}

function remove_marker(marker){
	
	if(typeof marker == "object"){
		marker.remove();
	}else if(typeof marker == "string"){
		if(gmarkers[marker]){
			gmarkers[marker].remove();
		}
	}else{
		alert(typeof marker);
	}
	
	
}


function mm_add_markers(m,cfg){
	if(m){
		mm.addMarkers(m,2,17);
	}else{
		mm.addMarkers(mm_markers,17);
	}
	mm.refresh();
	if(typeof(cfg) == "object"){
		if(typeof(cfg.bound) != "undefined"){
			if(typeof(cfg.bound.zoom) != "undefined"){
				var new_zoom_level = map.getBoundsZoomLevel(gbounds);
				if(typeof(cfg.bound.maxzoom) != "undefined" && cfg.bound.maxzoom < new_zoom_level){
					new_zoom_level = cfg.bound.maxzoom;
				}
				map.setZoom(new_zoom_level);
			}
			if(typeof(cfg.bound.center) != "undefined"){
				map.setCenter(gbounds.getCenter());
			}			
		}
	}
}

function get_default_country(){
	if(typeof gmap_cfg['default_cc'] != "undefined"){
		return gmap_cfg['default_cc'];
	}else{
		return null;
	}
}
function initialize_map(cfg){
	if (typeof(GBrowserIsCompatible) != "undefined" && GBrowserIsCompatible()) {	
		cfg = $.extend({
			map_id : "map_canvas",
			lat : 62.512318,
			lng : 16.523438,
			zoom : 4,
			nav_control : false,
			zoom_control : false,
			type_control : false,
			type : "G_NORMAL_MAP",
			geocoder : false,
			default_cc : "Sweden",
			markermanager : false,
			bounds : false,
			onload : false,
			events : {
				click : null,
				dblclick : null,
				mouseover : null,
				mouseout : null,
				mousemove : null,
				dragstart : null,
				drag : null,
				dragend : null,
				load : null,
				
				zoomend : null,
				movestart : null,
				move : null,
				moveend : null
			
			}
		},cfg);
	
		
		map = new GMap2(document.getElementById(cfg['map_id']));
	
		
		if(cfg['nav_control']){
			switch(cfg['nav_control']){
				case "large":
					map.addControl(new GLargeMapControl());
				break;
				case "small":
					map.addControl(new GSmallMapControl());
				break;
				default:
					map.addControl(new GLargeMapControl());
			}
		}
		if(cfg['zoom_control'] && !cfg['nav_control']){
			switch(cfg['zoom_control']){
				case "small":
					map.addControl(new GSmallZoomControl());
				break;
				default:
					map.addControl(new GScaleControl());
				break;
			}
		}
		if(cfg['type_control']){
			map.addControl(new GMapTypeControl());
		}
		if(cfg['geocoder']){
			geocoder = new GClientGeocoder();
		}
		if(cfg['type'] != "G_NORMAL_MAP"){
			switch(cfg['type']){
				case "normal":map.setMapType(G_NORMAL_MAP);break;
				case "satellite":map.setMapType(G_SATELLITE_MAP);break;
				case "hybrid":map.setMapType(G_HYBRID_MAP);break;
				case "physical":
					map.addMapType(G_PHYSICAL_MAP);
					map.setMapType(G_PHYSICAL_MAP);
				break;
			}
		}
		
		map.setCenter(new GLatLng(cfg['lat'],cfg['lng']), cfg['zoom']);
		if(cfg['markermanager']){
			mm = new MarkerManager(map);
		}
	
		if(cfg['bounds']){
			gbounds = new GLatLngBounds();
		}
		
		if(cfg.events){
			$.each(cfg.events,function(i,v){
				if(v){
					GEvent.addListener(map,i,v);				
				}
			});
		}
		
		if(cfg['onload']){
			cfg['onload']();
		}
		
		

		
	}
}

function find_location(cfg){
	cfg = $.extend({
		
		addr : '',
		countrycode : false,
		focusonhit : true,
		onerror : null,
		onnull : null,
		onhit : null
		
	},cfg);

	if(cfg.countrycode){
		geocoder.setBaseCountryCode(cfg.countrycode);
	}
	geocoder.getLocations(cfg.addr, function(resp){
		if(typeof resp == "object" && typeof resp.Status != "undefined" && typeof resp.Status.code != "undefined" && resp.Status.code == 200){
			
			var points = parse_hits(resp.Placemark);
			var p = resp.Placemark[0].Point ? resp.Placemark[0].Point.coordinates : null;
			
			if(points.length && points.length > 0){
				if(cfg.onhit){
					cfg.onhit(points);
				}
				if(cfg.focusonhit && p){
					map.setCenter(new GLatLng(p[1],p[0]));
				}
			}else{
				if(cfg.onnull){
					cfg.onnull(cfg.addr);
				}
			}
			
		}else{
			if(typeof resp != "object"){
				alert("error");
				if(cfg.onerror){
					cfg.onerror(cfg.addr);
				}
				return false;
			}
			if(typeof resp.Status == "undefined"){
			
				if(cfg.onerror){
					cfg.onerror(cfg.addr);
				}			
				return false;
			}
			if(typeof resp.Status.code == "undefined"){

				if(cfg.onerror){
					cfg.onerror(cfg.addr);
				}			
				return false;
			}	
		

			if(cfg.onnull){
				cfg.onnull(cfg.addr);
			}
		}
	
	});

}


function get_distance_between(point1,point2){
	if(point1 == null || point2 == null){
		return false;
	}else{
		point.distanceFrom(point2);
	}
}

function parse_hits(c){
	if (!c) {
		return false;
	}else{
		var ret = [];
		
		$.each(c,function(i,v){

			ret[i] = [];
			ret[i]['address'] = v.address;
			
			if(v.AddressDetails){
				if(v.AddressDetails.Country){
				
					if(v.AddressDetails.Country.AdministrativeArea){
						if(v.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName){
							ret[i]['administrativearea'] = v.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
						}
						if(v.AddressDetails.Country.AdministrativeArea.Locality){
							if(v.AddressDetails.Country.AdministrativeArea.Locality.LocalityName){
								ret[i]['locality'] = v.AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
							}
							if(v.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare && v.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName){
								ret[i]['thoroughfare'] = v.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
							}
							if(v.AddressDetails.Country.AdministrativeArea.Locality.PostalCode && v.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber){
								ret[i]['postalcode'] = v.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
							}	
							if(v.AddressDetails.Country.AdministrativeArea.Locality.PostalCode && v.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber){
								ret[i]['postalcode'] = v.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
							}							
						}
					}
					if(v.AddressDetails.Country.CountryNameCode){
						ret[i]['countrycode'] = v.AddressDetails.Country.CountryNameCode;
					}					
				}
			}
			if(v.Point && v.Point.coordinates){
				ret[i]['lng'] = v.Point.coordinates[0];
				ret[i]['lat'] = v.Point.coordinates[1];
			}
		});
		
		
		return ret;
	}
}


