//Norgeskart ved bruk av google maps API
//Laget av Anders G. Eriksen - 2006

if (GBrowserIsCompatible()) {
		
		  var sidebar_html = "";
		  var gmarkers = [];
		  var htmls = [];
		  var idx = 0;
		  var resources_url = "resources_xml.php";
		  var add_url = "add_resource.php";
		  var update_url = "update_resource.php";
		  var categories_url = "categories_xml.php";
		  var icon_folder = "http://www.volda.org/images/";
		  var circle;
		  var add_marker_enabled = false;
		  var categories = [];
		  var ajaxActive = false;
		  
		  var output_long = 'long';
		var output_lat = 'lat';
		var output_address = 'location';
		 
		  // create the map
		  var map = new GMap2(document.getElementById("map"));
		  map.addControl(new GLargeMapControl());
		 
		  map.addControl(new GMapTypeControl());
		  map.setCenter(new GLatLng(62.148745501967, 6.080846786499023), 14);
		   map.addControl(new GOverviewMapControl(new GSize(100,100))); 
		   map.setMapType(G_SATELLITE_TYPE);
		   map.enableDoubleClickZoom();
		   map.enableContinuousZoom();
		   
		  
		   GEvent.addListener(map, "moveend", function() {
			  var center = map.getCenter();
			  document.getElementById("message").innerHTML = center.toString();	  
			});	
			
			GEvent.addListener(map, "click", function(overlay,point) {
			
				if (overlay) {
					overlay.openInfoWindowHtml('Henter informasjon...');
					
					 var request = GXmlHttp.create();
					request.open('GET', resources_url + '?id=' + overlay.source_id, true);
					request.onreadystatechange = function() {
							if (request.readyState == 4) {
										
									var infoTabs = new Array(); 
									
									var xmlDoc = request.responseXML;
									var tabs =  xmlDoc.documentElement.getElementsByTagName('tab');
								//	var html = '<div class="infoWindowLabel"><b>' + overlay.label + '</b><div>';
									
									for (var i = 0; i < tabs.length; i++) {
									   infoTabs.push(new GInfoWindowTab(tabs[i].getElementsByTagName('label')[0].firstChild.nodeValue,tabs[i].getElementsByTagName('content')[0].firstChild.nodeValue));
									   
									}
																									
									overlay.openInfoWindowTabsHtml(infoTabs);
							}
					}
					request.send(null);
					
					//if user clicks map then add marker if that's enabled
				} else if (point) {
					
					document.getElementById(output_long).value = point.x;
			 		document.getElementById(output_lat).value = point.y;
					
					if (point) {	
						if (add_marker_enabled) {
						
						//function to add marker at given point
						
						}
					}
				}
			});		
			
			//fetching categories
			function getCategories () {
				
				//if (ajaxActive) {return}
 				 ajaxActive = true;
				showStatus('Laster kategorier...')
				
				 var request = GXmlHttp.create();
					request.open('GET', categories_url, true);
					request.onreadystatechange = function() {
							if (request.readyState == 4) {
								
								var cat_html = ''
								var xmlDoc = request.responseXML;
								
								var cats = xmlDoc.documentElement.getElementsByTagName("category");
				
								//loops through resultts and appends attributes to object res
							   for (var z = 0; z < cats.length; z++) {
								   
								   var cat = new Object();
								   
								  // obtain the attribues of each marker
								  cat.id = cats[z].getAttribute("id");
								  cat.icon = cats[z].getAttribute("icon");
								  cat.icon_shadow = cats[z].getAttribute("icon_shadow");
								  cat.name = cats[z].getAttribute("name");
  								  cat.draggable = cats[z].getAttribute("draggable");
								  
								  categories[cat.id] = cat;
								  
								  //new array for markers of this category
								  gmarkers[cat.id] = new Array();
								  
								  //ikke vis hendelser i liste over "vis i kart"
								  if (cat.id > 0) {
									  
									  cat_html += '<div class="row"><input type="checkbox" name="category_' + cat.id + '" id="category_' + cat.id + '" onclick="toggleMarkers(' + cat.id + ')"/><img src="' + icon_folder + cat.icon + '" border=0> ' + cat.name + '</div>';
									  //lager div som kan holde alle labels
									  cat_html += '<div class="infolabels" id="infolabels' + cat.id + '"></div>';
									  
									
								  }
							   }
							   document.getElementById("categories").innerHTML = cat_html;
							 hideStatus();
							   
							}
					}
					request.send(null);
					
			}
				
					
			
		  //create base icon
		  var BaseIconLarge = new GIcon();
		  BaseIconLarge.iconSize = new GSize(20, 34);
		  BaseIconLarge.shadowSize = new GSize(37, 34);
		  BaseIconLarge.iconAnchor = new GPoint(9, 34);
		  BaseIconLarge.infoWindowAnchor = new GPoint(9, 2);
		  BaseIconLarge.infoShadowAnchor = new GPoint(18, 25);
		  
		  var BaseIconSmall = new GIcon();
		  BaseIconSmall.iconSize = new GSize(12, 20);
		  BaseIconSmall.shadowSize = new GSize(22, 20);
		  BaseIconSmall.iconAnchor = new GPoint(6, 20);
		  BaseIconSmall.infoWindowAnchor = new GPoint(5, 1);
		
		
		function saveResourcePosition(marker) {
		
			query = "marker_id=" + marker.source_id + "&lat=" + marker.getPoint().lat() + "&long=" + marker.getPoint().lng();			
			resultsFunc = function() {
				 if (request.readyState == 4) {
				 	alert(request.responseText); 
				 };
			}
			
			postData (update_url, query, resultsFunc);
		
		}
		
		
		function postData (post_url, query, resultsFunc) {
	
			  request = GXmlHttp.create();
			  request.open('POST', post_url, true);
			  request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			  request.onreadystatechange = resultsFunc;
			  request.send(query);
		} 
		
		  
		  
	// A function to create the marker and set up the event window
      function createMarker(point,cat,label,source_id) {
	  
	    if (categories[cat].icon_shadow == 'mm_20_shadow.png') {
			   var icon = new GIcon(BaseIconSmall);
		   } else {
			   var icon = new GIcon(BaseIconLarge);
		   }
			   
			icon.image = icon_folder + categories[cat].icon;
			icon.shadow = icon_folder + categories[cat].icon_shadow;
			
			if(categories[cat].draggable == '1') {
				var is_draggable = true;
			} else {
				var is_draggable = false;
			}
			
			
			var marker = new GMarker(point, {icon:icon, draggable: is_draggable, title: label});
			
		 map.addOverlay(marker);
		 
		 //marker is draggable, then enable it
		 if(is_draggable) {
			 marker.enableDragging();
		 }
		 
			GEvent.addListener(marker, "drag", function(point){
				document.getElementById("message").value=marker.getPoint().toUrlValue();
			});
			
			GEvent.addListener(marker, "dragend", function(point){
				saveResourcePosition(marker);
			});
		
		marker.source_id = source_id;
		marker.label = label;
		marker.category = cat;
		
       
		
        return marker;
      }
		 // This function picks up the click and opens the corresponding info window
      function myclick(ix) {
        gmarkers[ix].openInfoWindowHtml(htmls[ix]);
      }
	  
	  
	  function toggleMarkers (cat) {
		  
			map.getInfoWindow().hide() 
				
		   if (document.getElementById('category_' + cat).checked==false) { // hide the marker
			  removeMarkers (cat);
			  document.getElementById("infolabels" + cat).innerHTML = "";
		   } else { // show the marker again
			  addMarkers (cat);
		   }
		   
	  }
	  
	  function goto (cat, source_id) {
		  
		  	for (var i=0;i<gmarkers[cat].length;i++) {
				   	if (gmarkers[cat][i].source_id == source_id) {
						map.setCenter(gmarkers[cat][i].getPoint(), 17);
					}
				  
			}
	  }
	  
	  //removing markers of given category (removing both markers and objects)
	  function removeMarkers (cat) {
		  
		  	 for (var i=0;i<gmarkers[cat].length;i++) {
				  map.removeOverlay(gmarkers[cat][i]);
				 }
			 
			 gmarkers[cat] = new Array();
	  }
	  
	  function addMarkers (cat) {
		  
		  readResources(cat);
	   
	  }
	  
	//corrects errors when decoding xml
	function decode(a) {
		var b = "";
		if (a.length > 0) {
		  if (a[0]) {
			if (a[0].firstChild) {
			  b = a[0].firstChild.nodeValue;
			}
		  }
		}
		return b;
	  }
	  
	  
	  function URLEncode(mystring)
		{
			// The Javascript escape and unescape functions do not correspond
			// with what browsers actually do...
			var SAFECHARS = "0123456789" +					// Numeric
							"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
							"abcdefghijklmnopqrstuvwxyz" +
							"-_.!~*'()";					// RFC2396 Mark characters
			var HEX = "0123456789ABCDEF";
		
			var plaintext = mystring;
			var encoded = "";
			for (var i = 0; i < plaintext.length; i++ ) {
				var ch = plaintext.charAt(i);
				if (ch == " ") {
					encoded += "+";				// x-www-urlencoded, rather than %20
				} else if (SAFECHARS.indexOf(ch) != -1) {
					encoded += ch;
				} else {
					var charCode = ch.charCodeAt(0);
					if (charCode > 255) {
						alert( "Unicode Character '" 
								+ ch 
								+ "' cannot be encoded using standard URL encoding.\n" +
								  "(URL encoding only supports 8-bit characters.)\n" +
								  "A space (+) will be substituted." );
						encoded += "+";
					} else {
						encoded += "%";
						encoded += HEX.charAt((charCode >> 4) & 0xF);
						encoded += HEX.charAt(charCode & 0xF);
					}
				}
			} // for
		
			return encoded;
		};
		
		
	  function getSelectedResources() {
		  
		  	 var showCats = [];
			 
			 for (var i=0;i<categories.length;i++) {

				 if (document.getElementById('category_' + categories[i].id).checked) {
					 showCats.push(categories[i].id)
				 }
				 
			 }
			 
			 readResources(showCats);
	  }
			 
			 
	  
      // A function to read the resources to be marked in the map
      function readResources(cat) {
	  showStatus('Laster ' + categories[cat].name + '...');
	  
        var request = GXmlHttp.create();
		
		var url_string = resources_url + '?category=' + cat + '&cache=' + new Date().valueOf();
		
	    request.open("GET", url_string , true);
		
        request.onreadystatechange = function() {
		
		  if (request.readyState == 4) {

			var xmlDoc = request.responseXML;
			//alert (request.responseText);
            // obtain the array of markers and loop through it
            var markers = xmlDoc.documentElement.getElementsByTagName("res");
            
            // hide the info window, otherwise it still stays open where the removed marker used to be
            map.getInfoWindow().hide();
            
				
			var info = "";
			            
			for (var i = 0; i < markers.length; i++) {
              // obtain the attribues of each marker
			  var source_id = parseFloat(markers[i].getAttribute("id"));
              var lat = parseFloat(markers[i].getAttribute("lat"));
              var lng = parseFloat(markers[i].getAttribute("lng"));
			  
			  //endres når kategorier ligger i array
		      var cat = markers[i].getAttribute("category");
			  var label = decode(markers[i].getElementsByTagName("label"));
			 
			  
              var point = new GLatLng(lat,lng);
           	  
              // create the marker
              var marker = createMarker(point,cat,label,source_id);
			  
			  //her kan du endre html
			  info += '<a href="javascript:goto(\''+ cat + '\',\'' + source_id + '\')">'+ label + '</a><br>';
			  
			  gmarkers[cat].push(marker);
             
            }
 				hideStatus();
				
				
							
				document.getElementById("infolabels" + cat).innerHTML = info;
          }
        }
        request.send(null);
      }
	  
	  
		function showStatus(status) {
		
			document.getElementById("message").innerHTML = status;
			document.getElementById("message").style.visibility = 'visible';
			
		} 
		
		function hideStatus() {
			document.getElementById("message").style.visibility = 'hidden';
		}
		
		function onload () {
			
			
			getCategories ();
			
			/*
			getActiveLocations();
			getSelectedResources();
				*/
			
		}
		
		function getInputs(form)
		{
			var str = '?';
			var elem = document.getElementById(form).elements;
			for(var i = 0; i < elem.length; i++)
		{
			if (elem[i].type != 'button') {
				str += elem[i].name + '=' + URLEncode(elem[i].value) + '&';
			}
		}
		 return str;
		}
		
			
		function addResource(addform) {
			
		var cat = document.getElementById("cat").value;
			
			var request = GXmlHttp.create();
			
			var postString = getInputs(addform); //"?cat=" + URLEncode(cat)+ "&info=" + URLEncode(document.getElementById("info").value) +  "&lat=" + URLEncode(document.getElementById("lat").value) + "&long=" + URLEncode(document.getElementById("long").value);
			
			//alert (postString);
			
			request.open("GET", add_url + postString, true);
			
			request.onreadystatechange = function() {
				
				 if (request.readyState == 4) {
				  	
					alert(request.responseText);
					removeMarkers(cat);
					addMarkers(cat);
					
					
			
				  } else {
			
				 }
				}
			request.send(null);	
		
		}
		
		var geo_results = new Array();	
		
		function getGeocodes(geocodes_url,input_streetname,input_streetnum, input_city, output_div, res_page) {
		
			var output_div_html = ''; //the div where the addresses are shown
			 //resultatet
			//clears the result array			
			
			var request = GXmlHttp.create();
			
			var postString = '?streetname=' + URLEncode(document.getElementById(input_streetname).value) + '&streetnum=' + URLEncode(document.getElementById(input_streetnum).value) + '&city=' + URLEncode(document.getElementById(input_city).value) + '&page=' +res_page;
			
			request.open("GET", geocodes_url+postString, true);
			request.onreadystatechange = function() {
			
			  if (request.readyState == 4) {
			  
				var xmlDoc = request.responseXML;
				
				// obtain the array of markers and loop through it
				var results = xmlDoc.documentElement.getElementsByTagName("address");
				
				//loops through resultts and appends attributes to object res
			   for (var z = 0; z < results.length; z++) {
				   
				   var res = new Object();
				   
				  // obtain the attribues of each marker
				  res.lat = parseFloat(results[z].getAttribute("lat"));
				  res.lng = parseFloat(results[z].getAttribute("lng"));
				  res.type = results[z].getAttribute("type");
				  res.streetname = results[z].getAttribute("streetname");
				  res.streetnum = results[z].getAttribute("streetnum");
				  res.postcode = results[z].getAttribute("postcode");
				  res.city = results[z].getAttribute("city");
				  res.county = results[z].getAttribute("county");
				  
				  output_div_html += '<a href="javascript:selectAddress(' + z + ')">' + res.streetname + ' ' + res.streetnum + ' ' + res.city + '<i>' + res.type + '</i></a><br />';
				  
				  geo_results[z] = res;
				 // map.addOverlay(marker);
				}
				// put the assembled sidebar_html contents into the sidebar div
				
				document.getElementById(output_div).innerHTML = output_div_html;
			  }
			}
			
			
			
			request.send(null);
      	}
		
		
		
		function selectAddress(ix) {	

			 document.getElementById(output_long).value = geo_results[ix].lng;
			 document.getElementById(output_lat).value = geo_results[ix].lat;
			 //document.getElementById(output_address).value = geo_results[ix];
			 
			 map.setCenter(new GLatLng(geo_results[ix].lat, geo_results[ix].lng), 17);
		}
			
	
} else {
		  alert("Sorry, the Google Maps API is not compatible with this browser");
		}