
/*********************************************************************\
*                                                                     *
* egeoxml.js                                         by Mike Williams *
*                                                                     *
* A Google Maps API Extension                                         *
*                                                                     *
* Renders the contents of a My Maps (or similar) KML file             *
*                                                                     *
* Documentation: http://www.econym.demon.co.uk/googlemaps/egeoxml.htm * 
*                                                                     *
\*********************************************************************/

function EGeoXml (myvar, map, url, opts) {
	this.myvar = myvar;
	this.map = map;
	this.url = url;
	if (typeof url == "string") {
    this.urls = [url];
  } else {
    this.urls = url;
  }
  this.opts = opts || {};
  // infowindow styles
  this.titlestyle = this.opts.titlestyle || 'style = "font-family: arial, sans-serif;font-size: medium;font-weight:bold;font-size: 100%;"';
  this.descstyle = this.opts.descstyle || 'style = "font-family: arial, sans-serif;font-size: small;padding-bottom:.7em;"';
  this.directionstyle = this.opts.directionstyle || 'style="font-family: arial, sans-serif;font-size: small;padding-left: 1px;padding-top: 1px;padding-right: 4px;"';
  // sidebar/dropbox functions
  this.sidebarfn = this.opts.sidebarfn || EGeoXml.addSidebar;
  this.dropboxfn = this.opts.dropboxfn || EGeoXml.addDropdown;
  // other useful "global" stuff
  this.omarkers = [];
  this.opolylines = [];
  this.opolygons = [];
  this.groundoverlays = [];
  this.side_bar_html = "";
  this.side_bar_list = [];
  this.styles = []; // associative array
  this.sIndex = 9999999;
}

EGeoXml.prototype.parse = function() {
	var that = this;
	
	this.progress = this.urls.length;
 	for (u = 0;u < this.urls.length; u++) {
		OAjaxRequest(this.urls[u], function (doc, responseCode) {
			that.processing(doc);
		});
	}
}

EGeoXml.prototype.processing = function (doc) {
	try {
		var that = this;
		var xmlDoc = OXml.parse(doc)

		// Read through the Styles
	  var styles = xmlDoc.documentElement.getElementsByTagName("Style");
	  for (var i = 0; i <styles.length; i++) {
	    var styleID = styles[i].getAttribute("id");
	    var icons=styles[i].getElementsByTagName("Icon");

	    // This might not be am icon style
	    if (icons.length > 0) {
	      var href = OXml.value(icons[0].getElementsByTagName("href")[0]);
	      var w = OXml.value(icons[0].getElementsByTagName("width")[0]);
	      var h = OXml.value(icons[0].getElementsByTagName("height")[0]);
	      if (!!href) {
					that.styles["#"+styleID] = new OIcon(href, new OSize(w,h), new OPoint(0,h));
	      }
	    }

			// LineStyle
	    var linestyles = styles[i].getElementsByTagName("LineStyle");
	    if (linestyles.length > 0) {
	      var width = parseInt(OXml.value(linestyles[0].getElementsByTagName("width")[0]));
	
	      if (width < 1) {width = 5;}
	      var color = OXml.value(linestyles[0].getElementsByTagName("color")[0]);
	
	      var aa = color.substr(0,2);
	      var bb = color.substr(2,2);
	      var gg = color.substr(4,2);
	      var rr = color.substr(6,2);
	      color = "#" + rr + gg + bb;
	      var opacity = parseInt(aa,16)/256;
	      if (!that.styles["#"+styleID]) {
	        that.styles["#"+styleID] = {};
	      }
	      that.styles["#"+styleID].color=color;
	      that.styles["#"+styleID].width=width;
	      that.styles["#"+styleID].opacity=opacity;
	    }
	    
	    // PolyStyle
	    var polystyles=styles[i].getElementsByTagName("PolyStyle");
	    if (polystyles.length > 0) {
	      var fill = parseInt(OXml.value(polystyles[0].getElementsByTagName("fill")[0]));
	      var outline = parseInt(OXml.value(polystyles[0].getElementsByTagName("outline")[0]));
	      var color = OXml.value(polystyles[0].getElementsByTagName("color")[0]);
	
	      if (polystyles[0].getElementsByTagName("fill").length == 0) {fill = 1;}
	      if (polystyles[0].getElementsByTagName("outline").length == 0) {outline = 1;}
	
	      var aa = color.substr(0,2);
	      var bb = color.substr(2,2);
	      var gg = color.substr(4,2);
	      var rr = color.substr(6,2);
	      color = "#" + rr + gg + bb;
	      var opacity = parseInt(aa,16)/256;
	      if (!that.styles["#"+styleID]) {
	        that.styles["#"+styleID] = {};
	      }
	      that.styles["#"+styleID].fillcolor=color;
	      that.styles["#"+styleID].fillopacity=opacity;
	      if (!fill) that.styles["#"+styleID].fillopacity = 0; 
	      if (!outline) that.styles["#"+styleID].opacity = 0; 
	    }
	  }
	
	  // Read through the Placemarks
	  var placemarks = xmlDoc.documentElement.getElementsByTagName("Placemark");
	  for (var i = 0; i < placemarks.length; i++) {
	    var name=OXml.value(placemarks[i].getElementsByTagName("name")[0]);
	    var desc=OXml.value(placemarks[i].getElementsByTagName("description")[0]);
	    if (desc.match(/^http:\/\//i)) {
	      desc = '<a href="' + desc + '">' + desc + '</a>';
	    }
	    if (desc.match(/^https:\/\//i)) {
	      desc = '<a href="' + desc + '">' + desc + '</a>';
	    }
	    var style=OXml.value(placemarks[i].getElementsByTagName("styleUrl")[0]);
	    var coords=OXml.value(placemarks[i].getElementsByTagName("coordinates")[0]);
	
	    coords=coords.replace(/\s+/g," "); // tidy the whitespace
	    coords=coords.replace(/^ /,"");    // remove possible leading whitespace
	    coords=coords.replace(/, /,",");   // tidy the commas
			coords=coords.substring(0,coords.length-1);
	
	    var path = coords.split(" ");
	
	    if (path.length > 1) {
	    	var points = [];
	
	      for (var p=0; p < path.length-1;p++) {
	        var bits = path[p].split(",");
	
	        var point = new OPoint(parseFloat(bits[0]),parseFloat(bits[1]));
	        points.push(point);
	      }
	
	      var linestring = placemarks[i].getElementsByTagName("LineString");
	      if (linestring.length) {
	        if (!!that.styles[style]) {
	          var weight = that.styles[style].width; 
	          var color = that.styles[style].color; 
	          var opacity = that.styles[style].opacity; 
	        } else {
	          var weight = 5;
	          var color = "#0000ff";
	          var opacity = 0.45;
	        }
	
	        var param = {color:color, weight:weight, opacity:opacity};
	        that.createPolyline(points,param);
	      }
	    } else {
	    	var bits = path[0].split(",");
	      var point = new OPoint(parseFloat(bits[0]),parseFloat(bits[1]));
	    	that.createMarker(point, name, desc, style);
	    }
	  }
  } catch (e) {}
}

EGeoXml.prototype.createPolyline = function(points,param) {
  var p = new OPolyline (points,param);

  this.map.addOverlay(p);
  this.opolylines.push(p);
}

EGeoXml.prototype.createMarker = function(point,name,desc,style) {
  var icon = new OIcon();
  var myvar = this.myvar;
  var params = this.opts.markeroptions || {};

  if (style) {
    if (!!this.styles[style]) {
      icon = this.styles[style];
    }
  }

  params.icon = icon;
	params.html = "<div>" + desc + "</div>";

  var marker = new OMark(point, params);
  OEvent.addListener(marker, "click", function() {
    marker.openInfoMiniWindow();
  });

  this.map.addOverlay(marker);
  this.omarkers.push(marker);
}