var pmap;
var map;
var ew;
var ew_event;

var ProjectMap	=	function()
{
	this._lat					=	14.6;                              
	this._lng					=	11.25;                             
	this._ini_zoom				=	2;                                 
	this._max_zoom				=	3;                                 
	this._min_zoom				=	1;                                 
	this._map					=	map; // Globale Variable                              
	this._map_el				=	"map";                             
	this._map_rights			=	"©2009 http://english.freemap.jp/";
	this._map_name				=	"Novartis";                        
	this._no_map				=	"No data available";               
	this._ew					=	ew; // Globale Variable                          
	this._markers				=	null;
	this._manager				=	null;
	this._projects				=	projects; // Globales Objekt (eingebunden in index.php head)
	this._project_count;
	this._regions				=	regions; // Globales Objekt (eingebunden in index.php head)
	this._json					=	null;
	this._path					=	"img/";
	this._lang					=	"en";
}

ProjectMap.prototype.init 	=	function()
{	
	//Sprache initialisieren
	this.get_lang();

	// Spezialkarte generieren
	// Copyright-Objekt
	var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, this._map_rights);
	var copyCollection = new GCopyrightCollection("");
	copyCollection.addCopyright(copyright);
	
	// Tiles
	var tilelayers = [new GTileLayer(copyCollection, this._min_zoom, this._max_zoom)];
	tilelayers[0].getTileUrl = function(tile, zoom)
	{
		var f = 'tiles/' + zoom + '-' + tile.x + '-' + tile.y + '.jpg';
		return f;
	}
	tilelayers[0].getOpacity = function() { return 1.0; }
	var myTileLayer = new GTileLayerOverlay(tilelayers[0]);
	
	// Neuer KartenTyp generieren mit Tiles und Copyright-Objekt
	//var novartis_map = new GMapType(tilelayers[0], new GMercatorProjection(3), this._map_name, {errorMessage: this._no_map });
	
	// Google-Maps initialisieren
	map = new GMap2(document.getElementById(this._map_el));
	map.addControl(new TextualZoomControl());
	map.setCenter(new GLatLng(this._lat, this._lng), this._ini_zoom);
	//map.addControl(new GLargeMapControl());
	map.addOverlay(myTileLayer);
	
	this.limit_zoomlevels(this._min_zoom, this._max_zoom);
	
	this._map = map;

	// Listeners initialisieren
	this.init_listeners();
    

	// Marker Manager initialisieren
	this.init_markers();

	
}

ProjectMap.prototype.init_markers = function()
{
	this._manager			=	new MarkerManager(this._map);
	var markers				=	new Array();
	markers[0]				=	new Object();
	markers[0]['type']		=	"regions";
	markers[0]['zoom']		=	new Array(0,1);
	markers[0]['places']	=	this._regions;
	markers[1]				=	new Object();
	markers[1]['type']		=	"projects";
	markers[1]['zoom']		=	new Array(1,3);
	markers[1]['places']	=	this._projects;
	
	// Anzahl Projekte pro Region in Array schreiben
	this._project_count	=	this.count_projects();
	
	// JSON-Daten Projekte und Regionen parsen und in Objekt schreiben
	this._markers	=	this.json_2_markers(markers);
	
	// Marker in MarkerManager schreiben und auf Karte darstellen
	this._manager.addMarkers(this._markers[0], 17, 17);
	this._manager.addMarkers(this._markers[1], 0, 3);
	this._manager.refresh();
}

ProjectMap.prototype.init_listeners	=	 function(marker)
{
	GEvent.addListener(map, "click", function(marker,point)
	{
		if (point && ew)
		{
			ew.hide();
			ew = null;
		}
	});
}

ProjectMap.prototype.get_lang = function()
{
	if(window.location.host == "www.novartisstiftung.org")
	{
		this._lang	=	"de";
	}
	else
	{
		this._lang 	= 	"en";
	}
}

// ====== Restricting the range of Zoom Levels =====
ProjectMap.prototype.limit_zoomlevels	=	 function(min, max)
{
	// Get the list of map types      
    var mt = map.getMapTypes();
    // Overwrite the getMinimumResolution() and getMaximumResolution() methods
    for (var i=0; i<mt.length; i++) {
      mt[i].getMinimumResolution = function() {return min;}
      mt[i].getMaximumResolution = function() {return max;}
    }
}

ProjectMap.prototype.json_2_markers = 	function(json)
{
	this._json	=	json;
	var all_markers;
	var region_markers	=	[];
	var project_markers	=	[];
	for(var k=0; k < this._json.length; k++)
	{
		var layer_type	=	this._json[k]['type'];
		switch(layer_type)
		{
			case "regions":
				var regions	=	json[k]['places'];
				regions.each( function(i)
				{
					var region = i;
					
					var r_id		=	region['id'];
					var r_lat		=	parseFloat(region['lat']);
					var r_lng		=	parseFloat(region['lng']);
					var r_name		=	region['name'];
					var r_posn		=	new GLatLng(r_lat, r_lng);
					var r_count		=	pmap._project_count[r_id];
					var r_ewindow	=	pmap.get_ewindow_html_region(r_count, r_name);
					if(r_count > 0)
					{
						var r_marker	= 	new GMarker(r_posn, { title: '', icon: pmap.get_custom_icon('region') }); // type = point, area oder region
						GEvent.addListener(r_marker, "click", function(overlay, point) { map.panTo(new GLatLng(r_lat, r_lng)); pmap.open_ewindow(this, pmap.get_ewindow_html_region(r_count, r_name), 'region') });
						region_markers.push(r_marker);
					}

					
				});
				
				// this._manager.addMarkers(project_markers, 0);
				// this._manager.refresh();
			break;
			
			case "projects":
				var projects	=	json[k]['places'];
				projects.each( function(i)
				{
					var project = i;
					
					var p_id			=	project['id'];
					var p_lat			=	parseFloat(project['lat']);
					var p_lng			=	parseFloat(project['lng']);
					var p_title			=	project['title'];
					var p_text			=	project['text'];
					var p_country		=	project['country'];
					var p_place			=	project['place'];
					var p_img			=	project['img'];
					var p_link			=	project['link'];
					var p_region		=	project['region'];
					var p_type			=	project['type'];
					var p_posn			=	new GLatLng(p_lat, p_lng);
					var p_ewindow		=	"";
					
					var p_marker		= 	new GMarker(p_posn, { title: '', icon: pmap.get_custom_icon(p_type) }); // type = point, area oder region
					p_marker.p_title	=	p_title;
					p_marker.p_country	=	p_country;
					p_marker.p_text		=	p_text;
					p_marker.p_img		=	p_img;
					p_marker.p_link		=	p_link;
					p_marker.p_type		=	p_type;
					
					GEvent.addListener(p_marker, "click", function(overlay, point) { map.panTo(new GLatLng(p_lat + 20, p_lng + 20)); pmap.open_ewindow(this, pmap.get_ewindow_html_project(this), '') });
					
					project_markers.push(p_marker);
				});
				
				//pmap._manager.addMarkers(project_markers, "0");
				//pmap._manager.refresh();
			break;	
		}
	}
	all_markers	=	[region_markers, project_markers];
	//this.debug("end json2markers");
	return all_markers;
}

ProjectMap.prototype.count_projects = function()
{
	var count_0	=	0;
	var count_1	=	0;
	var count_2	=	0;
	var count_3 = 	0;
	var count_4 = 	0;
	var count_5 =	0;
	var count_6	=	0;
	
	projects.each( function(p) {
		var region	=	p['region'];
		switch (region) {
			case "0":
		    	count_0++;
			break;
			case "1":
				count_1++;
			break;
			case "2":
				count_2++;
			break;
			case "3":
				count_3++;
			break;
			case "4":
				count_4++;
			break;
			case "5":
				count_5++;
			break;
			case "6":
				count_6++;
			break;
		}
	});
	var p_count	=	 new Array();
	p_count[0]		=	count_0;
	p_count[1]		=	count_1;
	p_count[2]		=	count_2;
	p_count[3]		=	count_3;
	p_count[4]		=	count_4;
	p_count[5]		=	count_5;
	p_count[6]		=	count_6;

	return p_count;
};

ProjectMap.prototype.get_ewindow_html_region = function(count, name)
{
	var zoomin	=	"";
	zoomin		=	(this._lang == "en") ? "zoom in" : "einzoomen";
	
	var mz		=	"";
	if(count	!=	1)
	{
		var mz	=	(this._lang == "en") ? "s" : "e";
	}
	
	var html	=	"";
	html 		= 	(this._lang == "en") ? ("<p>" + count +" project" + mz + " in " + name + "</p>") : ("<p>" + count +" Projekt" + mz + " in " + name + "</p>");
	html		+=	"<p class='ewindow_more'><a href='' onclick='map.setZoom(2); pmap.close_ewindow(ew); return false;'>&raquo; " + zoomin + "</a>";
	return html;
};

ProjectMap.prototype.get_ewindow_html_project = function(marker_object)
{
	// var project_type	=	"";
	// if(marker_object['p_type'] == "area")
	// {
	// 	project_type	=	(this._lang == "en") ? "Regional project: " : "Regionales Projekt: ";
	// }
	// else
	// {
	// 	project_type	=	(this._lang == "en") ? "Local project: " : "Lokales Projekt: ";
	// }

	var more	=	"";
	more	=	(this._lang == "en") ? "more" : "mehr";
	
	var str			=	'<table border="0" cellpadding="5" cellspacing="0"><tr><td colspan="2"><b>' + marker_object['p_country'] + ': #p_title#</b></td></tr><tr><td><a href="#p_link#"><img width="126" src="#p_img#" /></a></td><td>#p_text#</td></tr><tr><td colspan="2"><p class="ewindow_more"><a href="#p_link#">&raquo; ' + more + '</a></p></td></tr></table>';
	var search_str	=	"";
	
	for(var i in marker_object)
	{
		var search_str	=	eval("/#" + i + "#/g");
		str	=	str.replace(search_str, marker_object[i]);
	}
	return str;
};

ProjectMap.prototype.open_ewindow = function(marker, html, type)
{
	var style	=	"";
	var style	=	(type == "region") ? E_STYLE_1 : E_STYLE_2;
	
	if(ew)
	{
		ew.hide();
		ew = null;
	}

	ew = new EWindow(this._map, style);
	this._map.addOverlay(ew);
	ew.openOnMarker(marker, html);

};

ProjectMap.prototype.close_ewindow = function(ew)
{
	if(ew)
	{
		ew.hide();
		ew = null;
	}
};

ProjectMap.prototype.create_region_icon = function()
{
	region_icon 					= new GIcon();
	region_icon.shadow 				= this._path + "Icon_region_shadow.png";
	region_icon.iconSize 			= new GSize(20, 20);
	region_icon.shadowSize			= new GSize(34, 20);
	region_icon.iconAnchor 			= new GPoint(11, 20);
	region_icon.infoWindowAnchor	= new GPoint(19, -7);
	return region_icon;
};

ProjectMap.prototype.create_project_icon = function(project_type)
{
	project_icon 			= new GIcon();
	
	if(project_type	==	"area")
	{
		project_icon.shadow 			= this._path + "Icon_region_shadow.png";
		project_icon.iconSize 			= new GSize(20, 20);
		project_icon.shadowSize 		= new GSize(34, 20);
		project_icon.iconAnchor 		= new GPoint(11, 10);
		project_icon.infoWindowAnchor	= new GPoint(19, -7);
	}
	else if(project_type ==	"point")
	{
		project_icon.shadow 			= this._path + "Icon_point_shadow.png";
		project_icon.iconSize 			= new GSize(20, 30);
		project_icon.shadowSize 		= new GSize(28, 14);
		project_icon.iconAnchor 		= new GPoint(5, 24);
		project_icon.infoWindowAnchor	= new GPoint(7, -7);
	}
	return project_icon;
};

ProjectMap.prototype.get_custom_icon = function(type)
{
	if(type == "region")
	{
		return new GIcon( pmap.create_region_icon(), this._path + "Icon_region.png");
	}
	else
	{
		return new GIcon( pmap.create_project_icon(type), this._path + "Icon_" + type + ".png");
	}
};

ProjectMap.prototype.debug = function(string)
{
	var ih	= $('debug').innerHTML;
	$('debug').innerHTML	=	ih + "<br/>" + string + "<br/>";
};
































