/**
 * @author Gido and Michiel Hakvoort
 * @copyright WorthIT
 */

/**
 * GeoRSSLoader loads a GeoRSS file from the given location and renders markers and lines on the provided map
 * 
 * @param map 		: The map to add the markers on
 * @param location  : The location of the GeoRSS file
 * @param options 	: { numEntries	: number of feed entries (default is 10)
 * 						color		: color of the lines in hex style, i.e. #RRGGBB (default is #0000ff) 
 * 						weight		: width of the lines in pixels (default is 5)
 * 						opacity		: given as a number between 0 and 1 (default is 0.5)
 * 						clickable	: whether or not the lines are clickable (default is true)}
 *  
 */

GeoRSSLoader.prototype.map 			= null;
GeoRSSLoader.prototype.location		= null;

GeoRSSLoader.prototype.options = {
	numEntries 	: 10,
	color 		: '#0000ff',
	weight 		: 5,
	opacity 	: 0.5,
	clickable 	: true
};

function GeoRSSLoader(map, location, options) {
	this.map		= map;
	this.location 	= location;
	
	for(key in options) {
		this.options[key] = options[key];
	}
	
	this.loadGeoRSS();
};

GeoRSSLoader.prototype.loadGeoRSS = function() {
	var feed = new google.feeds.Feed(this.location);
	
	feed.setResultFormat(google.feeds.Feed.MIXED_FORMAT);
	feed.setNumEntries(this.options.numEntries);
	
	// temporary store GeoRSSLoader in google.feeds
	google.feeds.geoRSSLoader = this;
	feed.load(this.parseResult);
};

GeoRSSLoader.prototype.parseResult = function(result) {
	var options = google.feeds.geoRSSLoader.options;
	var map 	= google.feeds.geoRSSLoader.map;
		
	if(!result.error) {
		for(var i = 0; i < result.feed.entries.length; i++) {
			var entry = result.feed.entries[i];

			var title 	= entry.title;
			var content = entry.content;
			var author 	= entry.author;

			var pointElem 	= google.feeds.getElementsByTagNameNS(entry.xmlNode, "http://www.georss.org/georss", "point");
			var lineElem 	= google.feeds.getElementsByTagNameNS(entry.xmlNode, "http://www.opengis.net/gml", "posList");

			if(pointElem.length > 0) {
				var points = pointElem[0].firstChild.nodeValue;
				var coordinates = points.split(/\s/g);
				var latlng = new GLatLng(coordinates[0], coordinates[1]);

				var marker = new GMarker(latlng, {title :title, draggable :false});

				var html = '<div class="msiw">'; 
				html += '<div style="font-family:Arial,sans-serif; font-size:12pt; font-weight:bold; margin-top:0.6em; color:#000000;" align="left" dir="ltr" class="msinfotitle">' + title + '</div>';
				html += '<div style="height:0.6em;width:1px;" class="msinfotitlegap"></div>';
				html += '<div style="font-family:Arial,sans-serif; font-size:small; padding-bottom:0.7em; color:#000000;" align="left" dir="ltr" class="description">' + content + '</div>';
				html += '<div style="height:0.6em;width:1px;" class="msinfotitlegap"></div>';
				var route = '<a style="color: blue;" target="_blank" href="http://maps.google.nl/maps?daddr='+coordinates[0]+','+coordinates[1]+'&z=16">Naar routebeschrijving</a>';
				html += '<div style="font-family:Arial,sans-serif; font-size:small; padding-bottom:0.7em; color:#000000;" align="left" dir="ltr" class="description">' + route + '</div></div>';
				
				marker.bindInfoWindowHtml(html);
				
				map.addOverlay(marker);
				
			} else if(lineElem.length > 0) {
				var points = lineElem[0].firstChild.nodeValue;
				var coordinates = points.split(/\s/g);
				
				var latlng = new Array();
				for(var j=0; j<coordinates.length; j+=2) {
					 latlng.push(new GLatLng(coordinates[j], coordinates[j+1]));
				}
				var polyline = new GPolyline(latlng, options.color, options.weight, options.opacity, {clickable:options.clickable});
				
				polyline.infoWindowHtml = '<div class="msiw">';
				polyline.infoWindowHtml += '<div style="font-family:Arial,sans-serif; font-size:12pt; font-weight:bold; margin-top:0.6em; color:#000000;" align="left" dir="ltr" class="msinfotitle">' + title + '</div>';
				polyline.infoWindowHtml += '<div style="height:0.6em;width:1px;" class="msinfotitlegap"></div>';
				polyline.infoWindowHtml += '<div style="font-family:Arial,sans-serif; font-size:small; padding-bottom:0.7em; color:#000000;" align="left" dir="ltr" class="description">' + content + '</div>';
				polyline.infoWindowHtml += '</div>';
				
				map.addOverlay(polyline);
				GEvent.bind(polyline, 'click', polyline, function(latlng) {
					map.openInfoWindowHtml(latlng, this.infoWindowHtml);
				});
			}
		}
	}
	
	// remove GeoRSSLoader from google.feeds
	delete google.feeds.geoRSSLoader;
};
