var map;
var fireplace_mgr = 0;

var centerLatitude = 46.653207;
var centerLongitude = 8.283691;
var startZoom = 7;
var geocode_zoom = 12;
var map;
var small_ctrl;
var media_marker = null;
var fp_marker = null;
var marker_type;
var mediaIcon;
var kantonIcon;
var active;
var active_marker; // active marker object
var media_type
var markers;
var clicked_marker; // clicked marker object (!= active_marker)
var prevent_marker_click = false;// doppeltes Klicken, doppeltes Content-Laden verhindern

// var fst_uid;
// var fs_ort;
// var fs_detail;
var input_lat;
var input_lng;
var ini_geo_lat;
var ini_geo_lng;
var geo_tagged;

var radio_fp;
var radio_free;
var path	=	'georef_plugin/';

var ev_map_click;
var ev_map_zoomend;

function init_georef_plugin(action, mtype)
{
	media_type = (mtype)?mtype:null;
	
	if(action == 'edit')
	{
		insert_edit_html();
	}
	else
	{
		insert_upload_html();
	}
}

//document.observe('dom:loaded', function() { init(); });

function init_map()
{
	map = new GMap2(document.getElementById("map"),{draggableCursor:"crosshair"});
	small_ctrl	=	new GSmallMapControl();
	map.addControl(small_ctrl);
	map.addControl(new GMapTypeControl());
	map.addMapType(G_PHYSICAL_MAP);
	map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom, G_PHYSICAL_MAP);
	map.enableContinuousZoom();
	geocoder = new GClientGeocoder();
	
	create_mediaicon();
	create_kantonicon();

	ev_map_click	=	GEvent.addListener(map,"click", function(overlay,point) {
		//Nur dann Klick ausführen, wenn das Fenster geschlossen ist
		//und der Klick direkt auf der Karte erfolgte
		if(!radio_fp.attr('checked'))
		{
			if(media_marker == null)
			{
				media_type	=	(media_type) ? media_type : 'photo';
				media_marker = create_media_marker(point, media_type);
				map.addOverlay(media_marker);
			}
		}
	});
	
	ev_map_zoomend	=	GEvent.addListener(map,"zoomend", function() {
		if(fireplace_mgr)
		{
			if(map.getZoom() < 10)
			{
				alert('Achtung, Feuerstellen werden nur bei hoher Vergrösserung angezeigt. Zoomen Sie wieder rein, um die Feuerstellen anzuzeigen.')
				//remove_mgr_markers();
				//radio_fp.attr('checked', '');
			}
		}
	});
}

function create_media_marker(point, type)
{
	media_marker	= new GMarker(point, {icon: get_custom_icon(type, '', false), draggable: true});
	var latlng 		= media_marker.getLatLng();
	geo_tagged		= true;
	
	GEvent.addListener(media_marker, "dragend", function() {
		latlng = media_marker.getLatLng();
		set_input_field_value(latlng);
	});
	
	set_input_field_value(latlng);
	insert_georef_info(geo_tagged, type);

	GEvent.addListener(media_marker, "click", this.remove_media_marker);
	return media_marker;
}

function remove_media_marker()
{
	map.removeOverlay(media_marker);
	media_marker = null;
	set_input_field_value('');
	geo_tagged	=	false;
	insert_georef_info(geo_tagged);
}

// Marker Manager

function load_mgr_markers(action)
{
	$.ajax({
	  	url: path + 'ws.php?querytype=sfc_fireplaces&mediaType=fireplace',
		dataType: 'html',
		beforeSend: insert_loader('#loader'),
	  	success: function(responseText)
		{
			setup_mgr_markers(responseText);
			if(action == 'init')
			{
				var mk	=	json_2_markers(fs_json, true);
				GEvent.trigger(mk[0], 'click');
			}
			remove_loader();
	  	}
	});
}

function setup_mgr_markers(json)
{
	fireplace_mgr = new MarkerManager(map);
	markers	=	json_2_markers(json, 'fireplace', false, 'load');
	fireplace_mgr.addMarkers(markers, markers[0].zoom_min, markers[0].zoom_max);
	fireplace_mgr.refresh();
}

// Second argument represensts the active state of an icon (bool)
function json_2_markers(json, media_type, active, action)
{
	switch(action)
	{	
		case "activate":
			active	=	true;
			break;
		case "deactivate":
			active	=	false;
			break;
		case "load":
			active	=	(active) ? active : false;
			break;
	}
	
	layers		=	eval(json);
	var layer 	= 	layers[0];
	markers		=	[];
	for( var j in layer['places'])
	{
		//document.getElementById('debug').innerHTML += j + ': ' + active + "<br/>";
		var place				=	layer['places'][j];
		
		var fs_lat				=	parseFloat(place['geo_lat']);
		var fs_lng				=	parseFloat(place['geo_lng']);
		var fp_posn 			= 	new GLatLng(parseFloat(place['geo_lat']), parseFloat(place['geo_lng']));
		var fs_ort 				= 	place['fs_ort'];
		var fs_detail 			= 	place['fs_detail'];
		var fkt_name 			= 	place['fkt_name'];
		var fp_title			=	'header=[Schweizer Familie Feuerstelle] body=[<strong>Ort:</strong> ' + fs_ort + ' - ' + fs_detail + '<br/><strong>Kanton:</strong> ' + fkt_name + ']';
		var fp_thumburl			=	place['thumbURL'];
		var fp_mainpageurl		=	place['mainPageURL'];
		
		// Marker-Objekt
		var fp_marker				= 	new GMarker(fp_posn, { title: fp_title, icon: get_custom_icon('fireplace', '', active) });
		fp_marker.posn			=	fp_posn;
		fp_marker.ort			=	fs_ort;
		fp_marker.detail		=	fs_detail;
		fp_marker.tooltip		=	fp_title;
		fp_marker.kanton		=	fkt_name;
		fp_marker.uid			=	place['fst_uid'];
		fp_marker.tooltip		=	fp_title;
		fp_marker.zoom_min		=	layer["zoom"][0];
		fp_marker.zoom_max		=	layer["zoom"][1];
		fp_marker.media_type	=	'fireplace';
		fp_marker.thumburl		=	fp_thumburl;
		fp_marker.mainpageurl	=	fp_mainpageurl;
				
		click	=	GEvent.addListener(fp_marker, "click", function()
		{
			prevent_marker_click	=	set_clicked_marker(this);
			if(!prevent_marker_click)
			{
				prevent_marker_click	=	true;
				set_input_field_value(this.getLatLng());
				go_to_marker(this.getLatLng().lat(), this.getLatLng().lng());
				geo_tagged	=	true;
				toggle_icons('fireplace', this);
				insert_georef_info(geo_tagged, 'fireplace', this);
			}
		});
		
		//fireplace_mgr.addMarker(fp_marker, fp_marker.zoom_min, fp_marker.zoom_max);
		markers.push(fp_marker);
	}
	return markers;
}

function remove_mgr_markers()
{
	fireplace_mgr.clearMarkers();
	fireplace_mgr				=	false;
	active_marker	=	false;
	set_input_field_value('');
	geo_tagged		=	false;
	insert_georef_info(geo_tagged, 'fireplace');
}

function load_single_mgr_marker(fst_uid)
{
	$.ajax({
	  	url: path + 'json.php?querytype=sff_fireplace&fst_uid=' + fst_uid,
		dataType: 'html',
	  	success: function(responseText){
			return responseText;
	  	}
	});
}

function validate_content(json_as_txt)
{
	if(json_as_txt.length > 100)
	{
		if(json_as_txt.substring(0, 3) == '[{"')
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
}

function set_clicked_marker(marker)
{
	if(clicked_marker)
	{
		var already_clicked	=	(clicked_marker.uid == marker.uid) ? true : false;
	}
	else
	{
		var already_clicked	=	false;
	}
	clicked_marker		=	marker;
	return already_clicked;
}

function go_to_marker(lat, lng, zoom, maptype)
{
	
	var pt		=	new GLatLng(lat, lng);
	var zoom	=	(zoom) ? zoom : map.getZoom();
	var maptype	=	(maptype) ? maptype : map.getCurrentMapType();
	//(map.getZoom() != 10) ? map.setZoom(10) : "";
	(map.getBounds().containsLatLng(pt)) ? map.panTo(pt) : map.setCenter(pt, zoom, maptype);
}

// GIcons --------------------------------------------

function create_mediaicon()
{
	mediaIcon 			= new GIcon();
	mediaIcon.shadow 	= path + "img/shadow.png";
	mediaIcon.iconSize 	= new GSize(26, 45);
	mediaIcon.shadowSize = new GSize(44, 45);
	mediaIcon.iconAnchor = new GPoint(14, 45);
}

function create_kantonicon()
{
	kantonIcon 			= new GIcon();
	kantonIcon.shadow 	= path + "img/shadow.png";
	kantonIcon.iconSize 	= new GSize(26, 45);
	kantonIcon.shadowSize = new GSize(35, 24);
	kantonIcon.iconAnchor = new GPoint(14, 45);
}

function get_custom_icon(type, detail, active)
{
	var detail	=	detail.toLowerCase();
	var active	=	(active) ? "_active" : "";
	if(type == "kanton")
	{
		return new GIcon( kantonIcon, path + "img/kts/" + detail + ".png");
	}
	else
	{
		return new GIcon( mediaIcon, path + "img/" + type + active + ".png");
	}

}


function toggle_icons(type, marker)
{
	// to change images google maps api setImage doesn't work, because of MarkerManager.
	// Icon change has to be accomplished by removing ad readding markers.
	if(active_marker)
	{
		hide_active_icon(active_marker.media_type, marker);
	}
	else
	{
		show_active_icon(type, marker);
	}
}

function hide_active_icon(type, marker)
{
	switch (type)
	{
		case "fireplace":
			var url	=	path + 'ws.php?mediaType=' + type + '&querytype=sff_fireplace&fst_uid=' + active_marker.uid;
			var mgr	=	fireplace_mgr;
			break;
		case "photo":
			var url	=	path + 'ws.php?mediaType=' + type + '&media_id=' + active_marker.uid;
			var mgr	=	photo_mgr;
			break;
		case "video":
			var url	=	path + 'ws.php?mediaType=' + type + '&media_id=' + active_marker.uid;
			var mgr	=	video_mgr;
			break;
	}
	
	$.ajax({
	  	url: url,
		dataType: 'html',
	  	success: function(responseText)
		{
			if(validate_content(responseText))
			{
				var mks			=	'';
				mks				=	json_2_markers(responseText, type, false, 'deactivate');
				var inactive_marker	= 	mks[0];
				// zurzeit aktiven Marker als inaktiven Marker hinzufuegen
				mgr.addMarker(inactive_marker, inactive_marker.zoom_min, inactive_marker.zoom_max);
				// den bisher aktiven gleichen Marker gleichzeitig entfernen
				mgr.removeMarker(active_marker);
				show_active_icon(clicked_marker.media_type, marker);
			}
		}
	});
}

function show_active_icon(type, marker)
{
	switch (type)
	{
		case "fireplace":
			var url	=	path + 'ws.php?mediaType=' + type + '&querytype=sff_fireplace&fst_uid=' + marker.uid;
			var mgr	=	fireplace_mgr;
			break;
		case "photo":
			var url	=	path + 'ws.php?mediaType=' + type + '&media_id=' + marker.uid;
			var mgr	=	photo_mgr;
			break;
		case "video":
			var url	=	path + 'ws.php?mediaType=' + type + '&media_id=' + marker.uid;
			var mgr	=	video_mgr;
			break;
	}
	
	$.ajax({
	  	url: url,
		dataType: 'html',
	  	success: function(responseText)
		{
			/*alert(transport.responseText);*/
			if(validate_content(responseText))
			{
				var mks			=	'';
				mks				=	json_2_markers(responseText, type, true, 'activate');
				active_marker	= 	mks[0];
				// geklickten Marker als aktiven Marker kennzeichnen
				mgr.addMarker(active_marker, active_marker.zoom_min, active_marker.zoom_max);
				// den bisher inaktiven gleichen Marker entfernen
				mgr.removeMarker(marker);
			}
			prevent_marker_click	=	false;
		}
	});
}


// Geocoding -----------------------------------------

function showAddress(address) {
	address += ', Schweiz';
	geocoder.getLatLng(
		address,
		function(point) {
			if (!point) {
				alert(address + " not found");
			} else {
				map.setCenter(point, geocode_zoom);
				//map.setViewport(GLatLngBounds(sw?, ne?));
				//var marker = new GMarker(point);
				//map.addOverlay(marker);
				//marker.openInfoWindowHtml(address);
			}
		}
	);
}


// Tooltip

function create_fp_marker_info_div(json)
{
	var info		=	eval(json);
	tooltip_div	=	'<div class="fp_marker_tooltip"><div fp_marker_tooltip_header>Schweizer Familie Feuerstelle</div>';
	tooltip_div		+= '<strong>Ort:</strong> ' + info[0]['fs_ort'] + ' - ' + info[0]['fs_detail'] + '<br/><strong>Kanton:</strong> ' + info[0]['fkt_name'];
	return tooltip_div;
}



// Input-Fields lat lng  -------------------------------


function init_input_fields()
{
	input_lat	=	$('#upload_lat');
	input_lng	=	$('#upload_lng');
}

function set_input_field_value(latlng)
{
	if(latlng == "")
	{
		input_lat.attr({ value: '' });
		input_lng.attr({ value: '' });
	}
	else
	{
		$(input_lat).attr({ value: latlng.lat() });
		$(input_lng).attr({ value: latlng.lng() });
	}
}

function get_input_field_value()
{
	return input_lat.attr('value') + '|' + input_lng.attr('value');
}



// DOM Funktionen ------------------------------------------

function insert_edit_html()
{
	$('<div id="georef_map"></div>').prependTo($('.disignBoxFirst'));
	$('#georef_map').load(
		path + 'inc/uploadSharePhoto_map.php?type='+media_type,
		function()
		{
			init_input_fields();
			init_map();
			init_radiobuttons();
			
			if(marker_type)
			{
				// Marker laden
				if(marker_type	==	'fireplace')
				{
					load_mgr_markers('init');
					radio_fp.attr('checked', 'checked');
					var pt		= new GLatLng(ini_geo_lat, ini_geo_lng);
					map.setCenter(pt, 12);
				}
				else
				{
					var pt		= new GLatLng(ini_geo_lat, ini_geo_lng);
					map.addOverlay(create_media_marker(pt, media_type));
					map.setCenter(pt, 11);
				}
			}
			insert_georef_info(geo_tagged, marker_type);
		} 
	);
}

function insert_upload_html()
{
	var el	=	$('.uploadLine').get(2);
	$('<div id="uploadLatLng"></div>').insertAfter(el);
	$("#uploadLatLng").load(path + 'inc/uploadSharePhoto_latlng.php');
	
	
	$('#uploadShareMedia_Map').load(
		path + 'inc/uploadSharePhoto_map.php?type='+media_type,  			//send media_type to template
		function()
		{
			init_input_fields();
			init_map();
			init_radiobuttons();
		} 
	);
}

function insert_onsubmit(main_div)
{
	var frm	=	main_div.down('form');
	frm.setAttribute('onsubmit','store_coordinates(); return false;');
}

function init_radiobuttons()
{
	radio_fp 	= $('#radio_fp');
	radio_free	= $('#radio_free');
	$(radio_fp).bind('click', function()
	{
		if(!fireplace_mgr)
		{
			if(media_marker)
			{
				remove_media_marker();	
			}
			if(map.getZoom() < 11)
			{
				map.setZoom(10);
			}
			load_mgr_markers();
		}
	})
	
	$(radio_free).bind('click', function()
	{
		if(fireplace_mgr)
		{
			remove_mgr_markers();
			set_input_field_value('');
		}
	})
	
}

function insert_georef_info(geo_tagged, marker_type, marker)
{
	var str 	=	"";
	var info_el	=	$('#georef_info');
	
	if(geo_tagged)
	{
		if (marker_type == 'fireplace')
		{
			var ort		=	(marker) ? marker.ort : fs_ort;
			var detail	=	(marker) ? marker.detail : fs_detail;
			
			str			=	'Dieses Foto/Video ist positioniert auf: <br/><b><a id="georef_info_fp" href="" onclick="go_to_marker(active_marker.getLatLng().lat(), active_marker.getLatLng().lng()); return false;"> Feuerstelle ' + ort + ' - ' + detail + '</a></b>.'
		}
		else
		{
			str			=	"Dieses Foto/Video ist frei positioniert.";
		}
		info_el.css("color","green");
	}
	else
	{
		str	=	"Dieses Foto/Video wurde noch nicht positioniert.";
		info_el.css("color","red");
	}
	
	$('#georef_info').html(str);
}


function insert_loader(insert_el)
{
	var insert_el	=	$(insert_el);
	var loader	=	"<span id='loader_img'>&nbsp;&nbsp;<img src='" + path + "img/loader.gif' alt='laden...' style='width: 11px; height: 11px;'/></span>";
	insert_el.append(loader);
}


function remove_loader()
{
	$('#loader').empty();
}



// AJAX-LOADER --------------------------------------

var Loader = function(insert_el)
{
	this._insert_el 	= $('#' + insert_el);
	this._loader_img 	= null;
	this._loader_el		= '<span id="loader_img">&nbsp;&nbsp;<img src="' + path + 'img/loader.gif" alt="" style="width: 11px; height: 11px;"/></span>';
}

Loader.prototype.status_check = function()
{
	if(this._insert_el.html() != '') { return true; } else { return false; };
}

Loader.prototype.insert_loader = function()
{
	if(!this.status_check())
	{
		this._insert_el.append(this._loader_el);
	}
}

Loader.prototype.remove_loader = function()
{
		this._insert_el.empty();
}



// Text Manipulation -----------------------------------

function first_letter_uppercase(str)
{
	return str.substr(0, 1).toUpperCase() + str.substr(1);
}