map = {
	'current_travel_active' : 0,
	'data_obj' : false,
	'test': false,
	'uid2index': Array(),
	'text' : Array(),
	'gps_running': false,
	'me' : {'x' : 0, 'y': 0},
	'first_geolocation' : true,
	'watch_position': 0,
	'markers': Array(),
	'drag_limit': Array(),
	'options': Array(),
	'active_layer' : 0
}
function Googlemap() {
	var _this = this;
	this.map = false;
	this.data_obj = false;
	this.overlays = Array();
	this.overlay_groups = Array();
	this.options = Array();
	this.init = function(x,y,z) {
		this.data_obj = document.getElementById('map_value_data');
		var latlng = new google.maps.LatLng(x,y);
		this.options = {
			zoom: z,
			center: latlng,
			mapTypeId: google.maps.MapTypeId.ROADMAP,
			scrollwheel:false,
			base_domain: 'google.se'
		};
	}
	this.add_overlay_group = function(name,zIndex) {
		this.overlay_groups[name] = new Overlay_Group;
		this.overlay_groups[name].zIndex = zIndex;
		this.overlay_groups[name].parent = this;
		this.overlay_groups[name].name = name;
		return this.overlay_groups[name];
	}
	this.add_overlay = function(id,url,x1,y1,x2,y2) {
		var boundaries = new google.maps.LatLngBounds(new google.maps.LatLng(x1,y1), new google.maps.LatLng(x2,y2));
		this.overlays[id] = new google.maps.GroundOverlay(url, boundaries);
		this.overlays[id].visibility = 'hidden';
		return this.overlays[id];
	}
	this.show_overlay = function(id) {
		this.overlays[id].setMap(this.map)
		this.overlays[id].visibility = 'visible';
	}
	this.hide_overlay = function(id) {
		this.overlays[id].setMap(null)
		this.overlays[id].visibility = 'hidden';
	}
	this.toggle = function(obj) {
		this.map = map.map;
		if(obj.checked) {
			/* greencoast_init_overlays(); */
			this.overlay_groups[obj.name].show();
		}
		else {
			this.overlay_groups[obj.name].hide();
		}
	}
	this.grid = function() {
		cx = this.map.center.lat();
		cy = this.map.center.lng();
		x1 = this.map.getBounds().getSouthWest().lat();
		x2 = this.map.getBounds().getNorthEast().lat();
		y1 = this.map.getBounds().getSouthWest().lng();
		y2 = this.map.getBounds().getNorthEast().lng();

		for(x=x1;x<=x2;x += 0.05) {
			nice_x = Math.round(x*20)/20;
			var coords_h = [
				new google.maps.LatLng(nice_x, y1),
				new google.maps.LatLng(nice_x, y2)
			];
			color = ((nice_x - Math.floor(nice_x)) == 0) ? '#FF0000' : '#FF8000';
			var path_h = new google.maps.Polyline({
				path: coords_h,
				strokeColor: color,
				strokeOpacity: 1.0,
				strokeWeight: 1
			});
			path_h.setMap(this.map);
			myLatlng = new google.maps.LatLng(nice_x,y1);
			marker = new google.maps.Marker({
				position: myLatlng,
				title: '"'+(nice_x)+'"'
			});
			marker.setMap(this.map);
		}
		for(y=y1;y<=y2;y += 0.1) {
			nice_y = Math.round(y*10)/10;
			var coords_v = [
				new google.maps.LatLng(x1, nice_y),
				new google.maps.LatLng(x2, nice_y)
			];
			color = ((nice_y - Math.floor(nice_y)) == 0) ? '#FF0000' : '#FF8000';
			var path_v = new google.maps.Polyline({
				path: coords_v,
				strokeColor: color,
				strokeOpacity: 1.0,
				strokeWeight: 1
			});
			path_v.setMap(this.map);
			myLatlng = new google.maps.LatLng(x2,nice_y);
			marker = new google.maps.Marker({
				position: myLatlng,
				title: '"'+(nice_y)+'"'
			});
			marker.setMap(this.map);
		}
	}
}
function Overlay_Group() {
	var _this = this;
	this.name = false;
	this.parent = false;
	this.overlays = Array();
	this.overlay_id2name = Array();
	this.zIndex = 0;
	this.add_overlay = function(id,url,x1,y1,x2,y2) {
		var boundaries = new google.maps.LatLngBounds(new google.maps.LatLng(x1,y1), new google.maps.LatLng(x2,y2));
		if(!this.overlays[id]) {
			this.overlay_id2name.push(id);
		}
		this.overlays[id] = new google.maps.GroundOverlay(url, boundaries);
		this.overlays[id].visibility = 'hidden';
		this.overlays[id].zIndex = this.zIndex;
		return this.overlays[id];
	}
	this.show = function() {
		for(var i = 0;i< this.overlay_id2name.length;i++) {
			this.show_overlay(this.overlay_id2name[i]);
		}
	}
	this.hide = function() {
		for(var i = 0;i< this.overlay_id2name.length;i++) {
			this.hide_overlay(this.overlay_id2name[i]);
		}
	}
	this.show_overlay = function(id) {
		this.overlays[id].setMap(this.parent.map)
		this.overlays[id].visibility = 'visible';
	}
	this.hide_overlay = function(id) {
		this.overlays[id].setMap(null)
		this.overlays[id].visibility = 'hidden';
	}
	this.set_link = function(url) {
		for(var i = 0;i< this.overlay_id2name.length;i++) {
			google.maps.event.addListener(this.overlays[this.overlay_id2name[i]], "click", function() {
				document.location.href = url;
			});
		}
	}

}
function add_overlay(url,x1,y1,x2,y2) {
	var boundaries = new google.maps.LatLngBounds(new google.maps.LatLng(x1,y1), new google.maps.LatLng(x2,y2));
	var overlay = new google.maps.GroundOverlay(url, boundaries);
	overlay.setMap(map.map)
	return overlay;
}
function toggle_overlay() {

}
function init_google_maps(x,y,z) {
	map['data_obj'] = document.getElementById('map_value_data');
	var latlng = new google.maps.LatLng(x,y);
	map['options'] = {
		zoom: z,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		scrollwheel:false,
		base_domain: 'google.se'
	};
	map_load_values();
	map['map'] = new google.maps.Map(document.getElementById("google_maps_canvas"),map.options);
	map_load_values2();
	// Load dynamic CMS data
	// directions
	map.gdir_service = new google.maps.DirectionsService();
	map.gdir_display = new google.maps.DirectionsRenderer();
	map.gdir_display.setMap(map.map);
	map.gdir_display.setPanel(document.getElementById("map_directions"));
	google.maps.event.addListener(map.gdir_service, "error", map_error);

	map.marker_image = new google.maps.MarkerImage(
		map.icon_image,
		new google.maps.Size(map.marker_width, map.marker_height),
		new google.maps.Point(0,0),
		new google.maps.Point(map.marker_pivot_x, map.marker_pivot_y)
	);

	// place the markers
	markers_num = gm_x.length;
	if(map['encodedPolyline']) {
		map['map'].addOverlay(map['encodedPolyline']);
	}
	c = 0;
	while(c < markers_num && gm_x[c]) {
		var point = new google.maps.LatLng(gm_x[c],gm_y[c]);
		map['markers'][c] = createMarker(point, c);
		c++;
	}
	google.maps.event.addListener(map.map, 'zoom_changed', function() {
		if (map.map.getZoom() < map.min_zoom) map.map.setZoom(map.min_zoom);
	});
	google.maps.event.addListener(map.map,'dragend', function() {
		var bounds = map.map.getBounds();
        var min = bounds.getSouthWest();
        var max = bounds.getNorthEast();
        //  x = lat
		oob = false;
		if(min.lat() < map.drag_limit.min_x) {
			oob = true;
		}
		else if(max.lat() > map.drag_limit.max_z) {
			oob = true;
		}
		if(min.lng() < map.drag_limit.min_y) {
			oob = true;
		}
		else if(max.lng() > map.drag_limit.max_y) {
			oob = true;
		}
		if(oob)  {
			map.map.setCenter(new google.maps.LatLng(map.center_x, map.center_y));
		}

	});
}
function createMarker(point, number) {
	var marker = new google.maps.Marker({
		position: point,
		map: map.map,
		icon: map.marker_image
	});
	marker.value = number;
	var title = gm_title[number];
	var myHtml = '<a href="javascript:load_location_info('+gm_id[number]+','+number+')">'+title+'</a>';
	google.maps.event.addListener(marker, "mouseover", function() {
		map_tooltip(marker, myHtml);
	});
	google.maps.event.addDomListener(marker, "touchstart", function() {
		map_tooltip(marker, myHtml);
	});
	google.maps.event.addListener(marker, "click", function() {
		map_tooltip(marker, myHtml);
	// id = gm_id[number];
	//load_location_info(id, number);
	});
	return marker;
}
function add_marker(uid,title,x,y) {
	if(!map.uid2index[uid]) {
		var point = new google.maps.LatLng(x,y);
		c = gm_x.length;
		map.uid2index[uid] = c;
		gm_x[c] = x;
		gm_y[c] = y;
		gm_title[c] = title;
		gm_id[c] = uid;
		map.markers[c] = createMarker(point, c);
		map.msg += 'marker created: ('+title+")\n";
	}
	else {
		map.msg += 'marker already exists: ('+title+")\n";
	}
}
function mark_position(point) {
	if(map.my_position) {
		map.my_position.setPosition(point);
	}
	else {
		var marker_image = new google.maps.MarkerImage(
			map.base_url+'my-position.png',
			new google.maps.Size(24, 24),
			new google.maps.Point(0,0),
			new google.maps.Point(12, 12)
		);
		map.my_position = new google.maps.Marker({
			position: point,
			map: map.map,
			icon: marker_image
		});
	}
}
function load_nearest() {
	map.msg = '';
	$.ajax({
		type: 'get',
		url: map['base_url']+'feed.php',
		data: {
			'priority': 'near',
			'x': map.x,
			'y': map.y,
			'limit': map.limit,
			'exclude': map.exclude,
			'mode': 'all',
			'output': 'json'
		},
		dataType: 'json',
		success: function(data){
			for(var i = 0;i<data.length;i++) {
				add_marker(data[i].uid,data[i].name,data[i].x,data[i].y);
			}
		}
	});
}

function map_start_close_tooltip(evt) {
	map.close_tooltip = setTimeout(map_do_close_tooltip,300);
	map.evt = evt;
}
function map_cancel_close_tooltip(evt) {
	clearTimeout(map.close_tooltip);
}
function map_do_close_tooltip(evt) {
	if(document.getElementById('map_tooltip')) {
		document.getElementById('map_tooltip').style.display = 'none';
	}
}
function map_tooltip(marker, html) {
	obj_name = 'map_tooltip';
	if(!document.getElementById(obj_name)) {
		embryo = document.createElement('div');
		embryo.id = obj_name;
		embryo.style.position = 'absolute';
		obj = map.map.getDiv().appendChild(embryo);
		obj.onmouseout = map_start_close_tooltip;
		obj.onmouseover = map_cancel_close_tooltip;
		embryo = document.createElement('div');
		child = obj.appendChild(embryo);
	}
	else {
		obj = document.getElementById(obj_name)
		child = obj.children[0];
	}
	obj.style.display = 'block';
	arr = map.map.getProjection().fromLatLngToPoint(marker.getPosition())

	var scale = Math.pow(2, map.map.getZoom());
	var nw = new google.maps.LatLng(
		map.map.getBounds().getNorthEast().lat(),
		map.map.getBounds().getSouthWest().lng()
		);
	var worldCoordinateNW = map.map.getProjection().fromLatLngToPoint(nw);
	var worldCoordinate = map.map.getProjection().fromLatLngToPoint(marker.getPosition());
	var x = Math.floor((worldCoordinate.x - worldCoordinateNW.x) * scale)
	var y = Math.floor((worldCoordinate.y - worldCoordinateNW.y) * scale)

	obj.style.left = (x + map['title_offset_x']) + 'px';
	obj.style.top = (y + map['title_offset_y']) + 'px';
	child.innerHTML = html;
}
function load_location_info(id,index) {
	$.ajaxSetup({
		'xhr':function(){return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();}
	});
	map.toAddress = new google.maps.LatLng(gm_x[index],gm_y[index]);
	$('#googlemaps_location').css('display','block');
	$('#googlemaps_location').animate({
		opacity:1
	},300);
	map.content_id = id;
	if(typeof($('#translate select')[0]) != 'undefined') {
		lang_query = ($('#translate select')[0].value) ? '&lang='+$('#translate select')[0].value : '';
		map.language = lang_str = ($('#translate select')[0].value) ? $('#translate select')[0].value : '';

		load = $('#googlemaps_location').load(map['base_url']+'show_one.php?id='+id+lang_query,function() {
			if((document.getElementById('googlemaps_not_cached'))&&(lang_str)) {
				$('#googlemaps_location div.first').googleTranslate({
					targetLang : lang_str,
					apiKey : map.api_key
				},setTimeout(cache_content,600));
			}
			addthis.toolbox('#addthis_location');
		});
	}
	else {
		load = $('#googlemaps_location').load(map['base_url']+'show_one.php?id='+id);
	}
	if(load == "Object doesn't support this property or method") {
		$('#googlemaps_location').load(map['base_url']+'show_one.php?id='+id);
	}

}
function cache_content() {
	$.ajax({
		type: "POST",
		url: "/googlemaps/cache_content.php",
		data: {
			'content': $('#googlemaps_location div.first').html(),
			'id' : map.content_id,
			'lang' : map.language
		},
		dataType: "json"
	});
}
function get_local_lang() {
	title = $('#googlemaps_location h2').text();
	body = $('#googlemaps_location div.text').text();
	links = new Array();
	$('#googlemaps_location p.map_links a').each(function(i){
		$(this).attr('href');
		$(this).text();
	});
}
function load_travel_info(obj) {
	if(map['current_travel_active']) {
		document.getElementById(map['current_travel_active']).className = 'inactive';
	}
	pobj = obj;
	while(pobj.nodeName != 'DT') {
		pobj = pobj.parentNode;
	}
	while(pobj.nodeName != 'DD') {
		pobj = pobj.nextSibling;
	}
	pobj.className = 'active';
	map['current_travel_active'] = pobj.id
}

function html_value(obj) {
	var text;
	if(obj.children.length == 0) {
		text = (obj.textContent) ? obj.textContent : obj.innerHTML;
	}
	else {
		new_obj = obj.children[0].childNodes[1]
		text = (new_obj.textContent) ? new_obj.textContent : new_obj.innerHTML;
	}
	if(!text) {
		text = obj.childNodes[0].innerHTML;
	}
	return text;
}
function debug(obj) {
	nodes = Array();
	nodes.push(obj);
	out = '';
	limit = 20;
	path = '';
	while((limit > 0) && (node = nodes.shift())) {
		out += path + ' ' + node.nodeName + ':'+node.innerHTML+'<br>';
		if(node.childNodes.length > 0) {
			path = node.nodeName;
			for(i=0;i<node.childNodes.length;i++) {
				nodes.push(node.childNodes[i]);
			}
		}
		limit--;
	}
	return out;
}
function googlemaps_close(obj) {
	$('#googlemaps_location').animate(
	{
		opacity:0
	},300,
	function() {
		$(this).css('display','none')
	});
}
function map_dir_form() {
	map.gdir_display.setPanel(document.getElementById("map_directions"));
	obj = document.getElementById('overlay_directions')
	obj.style.display = 'block';
	obj.className = '';
}
function map_gdir_close() {
	map.gdir_display.setPanel(null);
	document.getElementById('overlay_directions').style.display = 'none';
}
function map_gdir_minimize() {
	obj = document.getElementById('overlay_directions');
	obj.className = 'minimized';
	obj.title = map.text.restore;
	if(obj.attachEvent ){
		obj.attachEvent('onclick', map_gdir_restore);
	} else {
		obj.setAttribute('onclick', 'map_gdir_restore()');
	}
}
function map_gdir_restore() {
	document.getElementById('overlay_directions').className = '';
	obj.title = '';
	if(obj.detachEvent){
		obj.detachEvent('onclick', map_gdir_restore);
	} else {
		obj.setAttribute('onclick', '');
	}
}

function overlay_directions() {
	var from = document.getElementById("city").value;
	$.get(map['base_url']+'fix_address.php?where='+from, function(data) {
		map.fromAddress = data;
		document.getElementById('gdir_a').href = 'javascript:map_gdir_close()';
		var request = {
			origin:map.fromAddress,
			destination:map.toAddress,
			travelMode: google.maps.DirectionsTravelMode.DRIVING
		};
		map.gdir_service.route(request, function(result, status) {
			if (status == google.maps.DirectionsStatus.OK) {
				map.gdir_display.setDirections(result);
			}
			else {
				alert ('status is '+status)
				}
		});
	})
	googlemaps_close();
}

function map_error(){
	gdir = map.gdir_service;
	if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
		alert('Fel #1: Adressen "'+map.fromAddress+"\" kunde inte tolkas. Det kan bero på felstavning eller på att adressen är ny.\nError code: " + gdir.getStatus().code);
	else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
		alert("Fel #2: A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gdir.getStatus().code);
	else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
		alert("Fel #3: The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code);
	else if (gdir.getStatus().code == G_GEO_BAD_KEY)
		alert("Fel #4: Felaktig API-nyckel. \n Error code: " + gdir.getStatus().code);
	else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
		alert("Fel #5: A directions request could not be successfully parsed.\n Error code: " + gdir.getStatus().code);
	else alert("Fel #6: Okänt fel: "+gdir.getStatus().code);
}
function map_init_gps() {
	map_stop_gps();
	map_start_gps();
	google.maps.event.addListener(map.map, 'dragend', function() {
		map.x = map.map.center.lat()
		map.y = map.map.center.lng()
		map.limit = 10
		load_nearest();
		map_start_close_tooltip();
	});
}
function map_center() {
	my_position = new google.maps.LatLng(map.me.x, map.me.y);
	if(map.me.x * map.me.y) {
		map.x = map.me.x;
		map.y = map.me.y;
		map.map.setCenter(my_position);
		load_nearest();
	}
	else {
		map_stop_gps();
		map_start_gps();
	}
}
function map_start_gps() {
	if(navigator.geolocation) {
		map.watch_position = navigator.geolocation.watchPosition(map_gps_success, map_gps_fail,{enableHighAccuracy: true,timeout:2700});
	}
	else {
		map_gps_fail();
	}
}
function map_stop_gps() {
	navigator.geolocation.clearWatch(map.watch_position);
}
function map_gps_success(position) {
	// $('#statusbar').text('position lyckades');
	map.position = position
	if(position.coords.latitude * position.coords.longitude) {
		map.me.x = position.coords.latitude;
		map.me.y = position.coords.longitude;
		my_position = new google.maps.LatLng(map.me.x, map.me.y);
		mark_position(my_position);
		if(map.first_geolocation) {
			map_center();
			map.first_geolocation = false;
		}
	}
}
function map_gps_fail(position) {
	// $('#statusbar').text('Fail '+ position.code);
	// code 1 = användaren svarar nej, code 3 = timeout
	map.position = position
	if(!map.me.x) {
		$.ajax({
			type: 'get',
			url: map['base_url']+'feed.php',
			data: {
				'mode': 'gps_fail',
				'output': 'json'
			},
			dataType: 'json',
			success: function(data){
				if(data.x) {
					map.me.x = map.x = data.x;
					map.me.y = map.y = data.y;
					my_position = new google.maps.LatLng(map.x, map.y)
					map.map.setCenter(my_position);
					mark_position(my_position);
					load_nearest();
				}
			}
		});
	}
}

/* "English" overlays */
function CoordMapType1(tileSize) {
  this.tileSize = tileSize;
}
CoordMapType1.prototype.getTile = function(coord, zoom, ownerDocument) {
  map.active_layer++;
  var div = ownerDocument.createElement('DIV');
  div.className = 'tile layer-1';
  // div.innerHTML = coord;
  div.style.width = this.tileSize.width + 'px';
  div.style.height = this.tileSize.height + 'px';
  div = googlemaps_tile_overlay(div,coord);
  return div;
};
function CoordMapType2(tileSize) {
  this.tileSize = tileSize;
}
CoordMapType2.prototype.getTile = function(coord, zoom, ownerDocument) {
  map.active_layer++;
  var div = ownerDocument.createElement('DIV');
  div.className = 'tile layer-2';
  // div.innerHTML = coord;
  div.style.width = this.tileSize.width + 'px';
  div.style.height = this.tileSize.height + 'px';
  div = googlemaps_tile_overlay(div,coord);
  return div;
};

