//<![CDATA[

/* Global variables */
var map; /*The map*/
var allMarkers=[]; /* All markers by ID */
var lastmarker; /*Last marker (used for marker creation to determine point etc.)*/

 // === Some cookie parameters ===
var cookiename = "dfmap"; // name for this cookie
var expiredays = 7; // number of days before cookie expiry
/* END Global variables */

// add marker form
function getForm(action, selected, name, desc, markerID, koord) {
	// dirty defauls
	var selected = (selected == null) ? "" : selected;
	var name = (name == null) ? "" : name;
	var desc = (desc == null) ? "" : desc;
	var markerID = (markerID == null) ? 0 : markerID;
	//FIXME
	var koord = (koord == null) ? '00 00.00W 00 00.00S' : koord;

	var x;
	
	var iwform = '<div style="height:280px; width:380px;" >'
			+ '<form id="' +action+ 'Form" onsubmit="processForm(this); return false" action="#">'
			+ '  <input type="hidden" id="action" name="action" type="hidden" value="' +action+ '"\/>'
			+ '  <input type="hidden" id="marker_id" name="marker_id" value="' +markerID+ '" \/>'
			+ '  <table>'
			+ '   <tr>'
			+ '    <td><b>Name:<\/b><\/td>'
			+ '    <td><input name="name" type="text" size="20" value="' +name+ '" \/><\/td>'
			+ '   <\/tr>'
			+ '   <tr>'
			+ '    <td><b>Type:<\/b><\/td>'
			+ '    <td>'
			+ '     <select name="type" size="1">'
	
	for (x in typeNames) {
		if (x == selected) {
			iwform = iwform + '<option value='+x+' selected>' +typeNames[x]+ '</option>';
		} else {
			iwform = iwform + '<option value='+x+'>' +typeNames[x]+ '</option>';
		}
	}

	iwform = iwform
			+ '     </select>'
			+ '    <\/td>'
			+ '   <tr>'
			+ '    <td><b>Koord.:<\/b><\/td>'
			+ '    <td><input name="koord" type="text" size="20" value="' +koord+ '" \/><\/td>'
			+ '   <\/tr>'
			+ '   <\/tr>'
			+ '   <tr>'
			+ '    <td colspan="2"><b>Description:<\/b><\/td>'
			+ '   <\/tr>'
			+ '   <tr>'
			+ '    <td colspan="2"><textarea name="desc" id="desc" rows="5" cols="40" >' +desc+ '<\/textarea><\/br><\/td>'
			+ '   <\/tr>'
			+ '  <\/table>'
			+ '  <input id="submit" name="submit" type="submit" value="Submit" \/>';
	if (action == 'edit') {
		iwform = iwform
			+ '  <input type="submit" value="Delete" onclick="document.getElementById(\'action\').value=\'delete\'" \/>'
			+ '  <input type="button" value="Move" onclick="lastmarker.enableDragging(); return false" \/>';
	}
	iwform = iwform
		+ '<\/form><\/div>';
	return iwform;
}


/* creates standard markers */
function createMarker(point, name, desc, typeID, markerID, creator, cdate, editor, edate, koord) {
	var marker = new GMarker(point, {draggable:true, icon:customIcons[typeID]});
	marker.marker_id = markerID;
	marker.disableDragging();
	markerGroups[typeID].push(marker);
	var html = '<table>'
		+'<tr><td><b>' +name+ '<\/b> (<a href="http://www.elantar.de/dfmap/index.php?marker='+markerID+'">'+markerID+'<\/a>)<\/td><td>['+typeNames[typeID]+']<\/td><\/tr>'
		+'<tr><td><b>Created by:<\/b><\/td><td>' +creator+ '@' +cdate+ '<\/td><\/tr>';
	if (editor && edate) {
		html = html
			+ '<tr><td><b>Last edited by:<\/b><\/td><td>' +editor+ '@' +edate+ '<\/td><\/tr>';
	}
	if (koord && koord != '00 00.00W 00 00.00S') {
		html = html
			+ '<tr><td><b>IG Koord.:<\/b><\/td><td>' +koord+ '<\/td><\/tr>';
	}
	html = html
		+ '<tr><td colspan="2">' +desc+ '<\/td><\/tr>'
		+'<\/table>'
		+'<input type="hidden" id="marker_id" name="marker_id" value="' +markerID+ '" \/>';

	GEvent.addListener(marker, 'click', function() {
		lastmarker=marker;
		marker.openInfoWindowTabsHtml([new GInfoWindowTab('View',html), new GInfoWindowTab('Edit', getForm('edit', typeID, name, desc, markerID, koord))]);
	});
	GEvent.addListener(marker, 'dragstart', function() {
		// save form values on drag
		var form = document.getElementById('editForm');
		marker.fname = form.name.value;
		marker.ftype = form.type.value;

		if (!document.getElementById("desc_ifr")) {
			marker.fdesc = form.desc.value;
		} else {
			marker.fdesc = document.getElementById("desc_ifr").contentDocument.body.innerHTML;
		}
		marker.closeInfoWindow();
	});
	GEvent.addListener(marker, 'dragend', function() {
		marker.openInfoWindowTabsHtml([new GInfoWindowTab('View',html), new GInfoWindowTab('Edit', getForm('edit', typeID, name, desc, markerID, koord))], {selectedTab:1});
	});
	GEvent.addListener(marker, 'infowindowopen', function() {
		// readd form values on open
		var form = document.getElementById('editForm');
		if (marker.fdesc) {
			form.desc.value = marker.fdesc
		}
		if (marker.fname) {
			form.name.value = marker.fname;
		}
		if (marker.ftype) {
			form.type.value = marker.ftype;
		}
		setupTinyMCE();
	});
	map.addOverlay(marker);
	allMarkers[markerID] = marker;
	return marker;
}

// == creates a draggable marker with an input form ==
function createInputMarker(point) {
	var marker = new GMarker(point,{draggable:true, icon:G_START_ICON});
	var iwform = getForm('add');
	GEvent.addListener(marker, "click", function() {
		lastmarker = marker;
		marker.openInfoWindowHtml(iwform);
	});
	GEvent.addListener(marker, 'dragstart', function() {
		// save form values on drag
		var form = document.getElementById('addForm');
		marker.fname = form.name.value;
		marker.ftype = form.type.value;
		if (!document.getElementById("desc_ifr")) {
			marker.fdesc = form.desc.value;
		} else {
			marker.fdesc = document.getElementById("desc_ifr").contentDocument.body.innerHTML;
		}
		marker.closeInfoWindow();
	});
	GEvent.addListener(marker, 'dragend', function() {
		marker.openInfoWindowHtml(iwform);
	});
	GEvent.addListener(marker, 'infowindowbeforeclose', function() {
		//check if name == NULL and remove overlay
		//FIXME: Gibts nen besseren weg zu prüfen ob das ding noch bleiben soll?
		var form = document.getElementById('addForm');
		if (!form.name.value) {
			map.removeOverlay(marker);
		}
	});
	GEvent.addListener(marker, 'infowindowopen', function() {
		// readd form values on open
		var form = document.getElementById('addForm');
		if (marker.fdesc) {
			form.desc.value = marker.fdesc
		}
		if (marker.fname) {
			form.name.value = marker.fname;
		}
		if (marker.ftype) {
			form.type.value = marker.ftype;
		}
		setupTinyMCE();
	});
	map.addOverlay(marker);
	marker.openInfoWindowHtml(iwform);
	lastmarker=marker;
	return marker;

}

/* Main map function
  called on load of map div
*/
function load() {
	if (GBrowserIsCompatible()) {
		 // ========== Read paramaters that have been passed in ==========

		// Before we go looking for the passed parameters, set some defaults
		// in case there are no patameters
		var lat = 0.00;
		var lng = 0.00;
		var zoom = 2;
		var mID = -1;
		
		// === Look for the cookie (URL parameters should overwrite cookie parameters) ===
		if (document.cookie.length>0) {
			//info cookie
			var cookieStart = document.cookie.indexOf(cookiename+"info=");
			if (cookieStart!=-1) {
				cookieStart += (cookiename+"info").length+1;
				cookieEnd=document.cookie.indexOf(";",cookieStart);
				if (cookieEnd==-1) {
					cookieEnd=document.cookie.length;
				}
				var cookietext = document.cookie.substring(cookieStart,cookieEnd);
				// == split the cookie text and create the variables ==
				bits = cookietext.split("|");
				lat = parseFloat(bits[0]);
				lng = parseFloat(bits[1]);
				zoom = parseInt(bits[2]);
				maptype = parseInt(bits[3]);
			}
		}

		// If there are any parameters at eh end of the URL, they will be in location.search
		// looking something like "?lat=50&lng=-3&zoom=10&marker=1"
		
		// skip the first character, we are not interested in the "?"
		var query = location.search.substring(1);
		
		// split the rest at each "&" character to give a list of "argname=value" pairs
		var pairs = query.split("&");
		for (var i=0; i<pairs.length; i++) {
			// break each pair at the first "=" to obtain the argname and value
			var pos = pairs[i].indexOf("=");
			var argname = pairs[i].substring(0,pos).toLowerCase();
			var value = pairs[i].substring(pos+1).toLowerCase();
			
			// process each possible argname
			if (argname == "lat") {lat = parseFloat(value);}
			if (argname == "lng") {lng = parseFloat(value);}
			if (argname == "zoom") {zoom = parseInt(value);}
			if (argname == "marker") {mID = unescape(value);}
		}

		map = new GMap2(document.getElementById("map"));
		map.enableScrollWheelZoom();
		map.enableContinuousZoom();
		
		// Create the copyright collection
		var copyCollection = new GCopyrightCollection('v');
		var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "0.1");
		copyCollection.addCopyright(copyright);

		// Setup the tile layers
		var tilelayers = new Array();
		tilelayers[0] = new GTileLayer(copyCollection, 2, 6 );
		tilelayers[0].getTileUrl = CustomGetTileUrl
		tilelayers[0].getOpacity = function () {return 1.00;};
		tilelayers[0].isPng = function() {return false;}; 


		// Setup the options for our map layer
		var GMapTypeOptions = new Object();
		GMapTypeOptions.minResolution = 2;
		GMapTypeOptions.maxResolution = 6;
		GMapTypeOptions.errorMessage = "No map data available";
		//
		var custommap = new GMapType(tilelayers, new GMercatorProjection(22), "Darkfall", GMapTypeOptions);
		custommap.getTextColor = function() {return "#000000";};
		map.addMapType(custommap);
		map.setCenter( new GLatLng(lat, lng), zoom, custommap );
		var extLargeMapControl = new ExtLargeMapControl();
		map.addControl(extLargeMapControl);


		GDownloadUrl("lib/genxml.php", function(data, responseCode) {
			// To ensure against HTTP errors that result in null or bad data,
			// always check status code is equal to 200 before processing the data
			if(responseCode == 200) {
				var xml = GXml.parse(data);
				var markers = xml.documentElement.getElementsByTagName("marker");
				for (var i = 0; i < markers.length; i++) {
				    var name = markers[i].getAttribute("name");
				    var desc = markers[i].getAttribute("desc");
				    var typeID = markers[i].getAttribute("type");
				    var markerID = markers[i].getAttribute("id");
				    var creator = markers[i].getAttribute("creator");
					var cdate = markers[i].getAttribute("cdate");
					var editor = markers[i].getAttribute("editor");
					var edate = markers[i].getAttribute("edate");
					var koord = markers[i].getAttribute("igkoord");
				    var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
											parseFloat(markers[i].getAttribute("lng")));
				    var marker = createMarker(point, name, desc, typeID, markerID, creator, cdate, editor, edate, koord);
				}
				// ========= If a marker parameter was passed, open the info window ==========
				if (mID > 0) {
					if (allMarkers[mID]) {
						GEvent.trigger(allMarkers[mID],"click");
					} else {
						alert("Es gibt keinen Marker mit der ID: "+mID+" du Vogel!");
					}
				}
				// ==== if marker type cookie is set, toggle type ===
				if (document.cookie.length>0) {
					//marker cookie
					var cookieStart = document.cookie.indexOf(cookiename+"marker=");
					if (cookieStart!=-1) {
						cookieStart += (cookiename+"marker").length+1;
						cookieEnd=document.cookie.indexOf(";",cookieStart);
						if (cookieEnd==-1) {
							cookieEnd=document.cookie.length;
						}
						var cookietext = document.cookie.substring(cookieStart,cookieEnd);
						// == split the cookie text and create the variables ==
						bits = cookietext.split("|");
						for (var i = 0; i < bits.length; i++) {
							if (bits[i]) {
								type = parseInt(bits[i]);
								toggleGroup(type);
							}
						}
					}
				 }
			} else if(responseCode == -1) {
				alert("Data request timed out. Please try later.");
			} else { 
				alert("Request resulted in error (" +responseCode+ "). Check if XML file is retrievable.");
			}
		});

		GEvent.addListener(map, "click", function(overlay, cpoint){
			// == Listen for map click and add an input marker
			if (!overlay) {
				createInputMarker(cpoint);
			}
		});
		// Make the link again whenever the map changes
		GEvent.addListener(map, 'moveend', makeLink);
		// Make the link the first time when the page opens
		makeLink();
	}
}
/* END Main map function */


function processForm(form) {
	// == obtain the data
	var name =  escape(form.name.value);
	var type = form.type.value;
	// Use type as name is name is empty
	if (name == "") {
		name=type;
	}
	// desc_ifr not present if tinymce is not loaded
	if (!document.getElementById("desc_ifr")) {
		desc = escape(form.desc.value);
	} else {
		//FIXME hier knallts irgendwie irgendwann...
		//desc = escape(document.getElementById("desc_ifr").contentDocument.body.innerHTML);
		desc = document.getElementById("desc_ifr").contentDocument.body.innerHTML;
	}
	var action = form.action.value;
	var koord = escape(form.koord.value);
	var id = form.marker_id.value;
	var lat = lastmarker.getPoint().lat();
	var lng = lastmarker.getPoint().lng();
	var baseurl = "lib/save_marker.php";
	if (action == 'edit' && id > 0) {
		var url = "action=" +action+ "&id=" +id+ "&lat=" +lat+ "&lng=" +lng+ "&desc=" +desc+ "&name=" +name+ "&type=" +type+ "&koord=" +koord;
	} else if (action == 'delete' && id > 0) {
		var url = "action=" +action+ "&id=" +id;
	} else {
		var url = "action=" +action+ "&lat=" +lat+ "&lng=" +lng+ "&desc=" +desc+ "&name=" +name+ "&type=" +type+ "&koord=" +koord;
	}
	//alert(url);

	/* ===== send the data to the server (POST)
	If there may be more that 512 bytes of data, then you'll need to use the undocumented POST form of GDownloadUrl 
	*/
	GDownloadUrl(baseurl, function(data, responseCode){
		// To ensure against HTTP errors that result in null or bad data,
		// always check status code is equal to 200 before processing the data
		if(responseCode == 200) {
			map.closeInfoWindow();
			// == remove the input marker and replace it with a completed marker
			lastmarker.hide();
			if (data) {
				// Marker was added/edited
				//FIXME: Doubled code!
				var xml = GXml.parse(data);
				var markers = xml.documentElement.getElementsByTagName("marker");
				if (typeof(markers[0])=="undefined") {
					alert("Error, no marker returned by "+baseurl+"\n"
						+ "POSTURL: "+baseurl+"?"+url+"\n"
						+ "Return:\n"+data
					);
				} else {
					var name = markers[0].getAttribute("name");
					var desc = markers[0].getAttribute("desc");
					var typeID = markers[0].getAttribute("type");
					var markerID = markers[0].getAttribute("id");
					var creator = markers[0].getAttribute("creator");
					var cdate = markers[0].getAttribute("cdate");
					var editor = markers[0].getAttribute("editor");
					var edate = markers[0].getAttribute("edate");
					var koord = markers[0].getAttribute("igkoord");
					var point = new GLatLng(parseFloat(markers[0].getAttribute("lat")),
											parseFloat(markers[0].getAttribute("lng")));
					var marker = createMarker(point, name, desc, typeID, markerID, creator, cdate, editor, edate, koord);
					GEvent.trigger(marker,"click");
				}
			}
		} else if(responseCode == -1) {
			alert("Data request timed out. Please try later.");
		} else { 
			alert("Request resulted in error (" +responseCode+ "). Check if XML file is retrievable.");
		}
		},
		url
	);

}

// === Set the cookie before exiting ===
function saveCookie() {
	maptype = 0;
	for (var i=0;i<map.getMapTypes().length;i++) {
		if (map.getCurrentMapType() == map.getMapTypes()[i]) {
			maptype = i;
		}
	}
	var infocookie = cookiename+"info="+map.getCenter().lat()+"|"+map.getCenter().lng()+"|"+map.getZoom()+"|"+maptype;
	var markercookie = cookiename+"marker="
	for (type in markerGroups) {
		if (markerGroups[type].length > 0) {
			var marker = markerGroups[type][0];
			if (marker.isHidden()) {
				//add hidden marker groups to markercookie
				markercookie += type+"|"
			}
		}
	} 
	if (expiredays) {
		var exdate=new Date();
		exdate.setDate(exdate.getDate()+expiredays);
		infocookie += ";expires="+exdate.toGMTString();
		markercookie += ";expires="+exdate.toGMTString();
	}
	// == write the cookie ==
	document.cookie=infocookie;
	document.cookie=markercookie;
	// == Call GUnload() on exit ==
	GUnload();
}
//]]>
