/**
 * Parsers
 * 
 */
ArenaMap.Parsers = (function($){

	var MAP_MARKER = 'marker',
		MAP_POLY = 'polygon',
		MAP_IMAGE = 'image';

	return {

		/**
		 * RSS parser
		 * 
		 */
		RSS: {
			regArena: /^global\s?arena$/i,
			regImage: /\.(gif|jpg|png)$/i,

			parse:function(rss){
				var items = rss.getElementsByTagName("item");
				var data = {
					markers: []
				};

				for(var i=0; i<items.length; i++) {
					var item = items[i], lat = null, lng = null, polygon = null,
						point = this.getNodeNS(item, 'point', 'georss', 'http://www.georss.org/georss');
						
					if(point) {
						var value = point.firstChild.nodeValue;
						lat = /^\s*([^ ]+)/m.exec(value)[1];
						lng = /([^ ]+)\s*$/m.exec(value)[1];
					} else {
						var poly = this.getNodeNS(item, 'Polygon', 'gml', 'http://www.opengis.net/gml');
						if(poly) {
							polygon = [];
							var value = this.getNodeValue(
								 this.getNodeNS(item, 'posList', 'gml', 'http://www.opengis.net/gml')
							);

							var points = value.split(/\s+/);
							for(var j=0; j<points.length; j+=2) {
								polygon.push({
									'lat': points[j],
									'lng': points[j+1]
								});
							}
						}
					}

					var marker = {
						lat: lat,
						lng: lng,
						coords: polygon || [],
						type: polygon? MAP_POLY : MAP_MARKER,
						label: item.getElementsByTagName("title")[0].firstChild.nodeValue,
						description: item.getElementsByTagName("description")[0].firstChild.nodeValue
					}

					// exceptions, if the title is "global arena" or refers to an image; use an image marker.
					if(this.regArena.test(marker.label)) {
						marker.label = "<img src='static/images/maps/globalarena.gif' width='81' height='15' />";
						marker.type = MAP_IMAGE;
					} else if(this.regImage.test(marker.label)){
						marker.label = "<img src='" + marker.label + "' height='15' />";
						marker.type = MAP_IMAGE;
					}

					data.markers.push(marker);
				}

				return data;
			},

			getNodeValue:function(node) {
				var value = '';
				var childs = node.childNodes;
				for (var i=0; i<childs.length; i++) {
					value += childs[i].nodeValue;
				}
				return this.trim(value);
			},

			getNodeNS:function(parent, name, ns, uri) {
				var node = parent.getElementsByTagName(name)[0],
					nodeNS = parent.getElementsByTagName(ns +':'+ name)[0],
					nodeUri = document.getElementsByTagNameNS && parent.getElementsByTagNameNS(name, uri)[0];

				return node || (nodeNS || nodeUri);
			},

			trim:function(value) {
				return value.replace(/(^\s*)|(\s*$)/mg, '');
			}
		},

		/**
		 * KML parser
		 * 
		 */
		KML: {
			PLACEMARK : /placemark/i,
			FOLDER: /folder/i,
			
			parse:function(doc) {
				var data = { };
				var $doc = $(doc);
				var root = $doc.find('Document > Folder')[0];
				this.parseFolder(root, data, 0);
				console.log(data)
				return data;
			},

			parseFolder:function(folder, data, level) {
				var childs = folder.childNodes;
				
				for(var i=0; i<childs.length; i++) {
					var child = childs.item(i);
					if(child.nodeType != 1) continue;
					
					var name = child.nodeName;
					if(this.PLACEMARK.test(name)) {
						var marker = this.parsePlacemark(child);
						if(!data.markers) {
							data.markers = [];
						}
						marker.parent = data;
						marker.level = level;
						data.markers.push(marker);
					}

					if(this.FOLDER.test(name)) {
						this.parseFolder(child, marker || data, level+1);
					}
				}
			},

			parsePlacemark:function(node) {
				var lat, lng, 
					data = $('coordinates', node).text(),
					coords = this.parseCoordinates(data);

				if(coords.length == 1) {
					lat = coords[0].lat;
					lng = coords[0].lng;
					coords = null;
				}
				
				return {
					label: $('name', node).text(),
					lat: lat,
					lng: lng,
					coords: coords
				}
			},

			parseCoordinates:function(data){
				var coords = [];
				var splitted = data.split(' ');
				for(var i=0; i<splitted.length; i++) {
					var latlng = splitted[i].split(',');
					if(latlng.length >= 2) {
						coords.push({
							lat: parseFloat(latlng[1]),
							lng: parseFloat(latlng[0])
						});
					}
				}
				return coords;
			}
		}
	};


})(jQuery);