// ------------------------------------------------------------------------
/** MAP HANDLER
 * This javascript class handles methods to initialize, load the map and made
 * the ajax call to retrieve the information that will be printed in the map,
 * 
 */
var NulazMap;


function MapHandler()
{
    this.map = null;
    this.markers = Array();
    this.balloons = Array();
    this.wikiLayer = null;
    this.photoLayer = null;
    
    // Function LOAD
    this.load = function(lat, lon, zoom)
	{
		if (GBrowserIsCompatible()) {
		        
	        this.map = new GMap2(document.getElementById("gmap"));
	        
	        this.map.addControl(new GLargeMapControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(30,120)));
	        this.map.addControl(new GMapTypeControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(30,120)));
	        this.map.enableScrollWheelZoom();
	        this.map.enableDoubleClickZoom();
	        this.map.enableContinuousZoom();
	        this.map.removeMapType(G_HYBRID_MAP);
	        this.map.addMapType(G_PHYSICAL_MAP);
	        
	        this.map.setCenter(new GLatLng(lat, lon), zoom);
	        
	        /*this.wikiLayer = new GLayer("org.wikipedia.en");
          	this.wikiLayer.Visible = true;
          	this.wikiLayer.Added = true;*/
          
         	this.photoLayer = new GLayer("com.panoramio.all");
          	this.photoLayer.Visible = false;
          	this.photoLayer.Added = false;
          	
          	//this.map.addOverlay(this.wikiLayer);
          	

		}
	};
	
	
	
	// Function GET BALLOON
	this.getBalloon = function(i) 
	{
		this.markers[i].openInfoWindowHtml(this.balloons[i]);
		this.map.setCenter(this.markers[i].getLatLng(), 17);
	};
	
		
	// Function GET STREAM
	this.getStream = function(lat, lon, add, acc)
	{	
		NulazMap.map.clearOverlays(); //Clean map
		
		if(acc == 1){
			$('#invalid_acc_msg').show();
			$('#num_results').hide();
		}
		else{
					
			$('#apply_filter').show();
			$("#updates_note").hide();
			$('#num_results_hidden').remove();
			$("#layer_stream").html("<p style='line-height: 20px;' class='loading'>Loading...</p>");
			
			$.get(base_url + "ajax/stream/get_wh_stream", {lat: lat, lon: lon, acc: acc, add: add, st: 0, am: 15, v: "map" }, function(data) 
			{
				var stream_JSON = eval("d="+data);
				var l = stream_JSON.stream.data.length;
				var html = '';
				
				if(l === 0) 
				{
					html = '<p>No items found in this area</p>';
					$('#layer_filter').show();
				} 
				else 
				{ 
					html = '<ol>';
					for(var i=0; i < l; i++)
					{	
						var item = stream_JSON.stream.data[i];
						
						if(item.type == "weather") { item.latitude = lat; item.longitude = lon; item.url = ''; }
						
						if(item.latitude && item.longitude) 
						{
							var balloon = "<div style='width:260px; overflow: hidden;'><h2><img style='margin-top: 3px; margin-right: 3px' class='left' src='"+item.icon+"'>"+item.name+"</h2><p>"+item.description+"</p><br /><p><a href='"+item.url+"'>"+item.url+"</a></p></div>";
							var marker = NulazMap.createMarker(new GLatLng(item.latitude, item.longitude), balloon, i);
							
							NulazMap.balloons[i] = balloon;
							NulazMap.markers[i] = marker;
							    
							NulazMap.map.addOverlay(marker);
							if(item.type == "weather") { marker.openInfoWindowHtml(balloon); }
							html += "<li onclick='NulazMap.getBalloon("+i+")'><img class='icon_src' src='"+item.icon+"' /> <a href='javascript:void(0)'>"+item.name+"</a></li>";
						}
					}
					html += "</ol>";
				}
				$("#id_reload_button").removeClass("button_sending");
				$("#id_reload_button").val("Reload Map");
				$("#layer_stream").html(html);
			});
		}
	};

	// Function CREATE MARKER
	this.createMarker = function(point, balloon, index)
	{
		var icon = new GIcon(G_DEFAULT_ICON);
	    icon.sprite = { image: static_url + "images/web/sprite.png", width:24, height:34, left: 151, top: 34*index };
	    icon.iconSize = new GSize(24,34);
	    
	    var icon_highlight = new GIcon(G_DEFAULT_ICON);
	    icon_highlight.sprite = { image: static_url + "images/web/sprite.png", width:24, height:34, left: 174, top: 34*index };
	    icon_highlight.iconSize = new GSize(24,34);
	    
	    var marker = new GMarker(point, {icon: icon});
	    
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(balloon);
	    });
	    
	    // Switch icon on marker mouseover and mouseout
	    GEvent.addListener(marker, "mouseover", function() {
			//marker.setIcon(icon_highlight);
	    });
	    GEvent.addListener(marker, "mouseout", function() {
	    	//marker.setIcon(icon);
	    });
	    
	    return marker;
	};
}








function reloadMap() 
{
	var geocoder = new GClientGeocoder();
	geocoder.getLocations(NulazMap.map.getCenter(), reloadMapCallback);
}


function reloadMapCallback(response)
{
	var add = "";
	if(!response || response.Status.code != 200){
		add = "Unknown address";
	}
	else{
		var place = response.Placemark[0];
		add = place.address;
	}
	
    
    var zoom = NulazMap.map.getZoom();
	var lat = NulazMap.map.getCenter().lat();
	var lon = NulazMap.map.getCenter().lng();

	if(add == ""){
		add = "Unknown address";
	}
	
	var acc = 1;
	if(zoom == 11 || zoom < 16){
		acc = 4;
	}
	else{
		acc = 6;
	}
	
	$("#address").val(add);
	NulazMap.getStream(lat, lon, add, acc);
	$('#button_action').addClass('none');

}


function saveFilterMap()
{
	$('#button_action').removeClass('none');
	
	var filter = new Object;
	$("#layer_filter input[name='filter_map']").each(
    	function() {
    		filter[parseInt(this.id)] = (this.checked) ? 1 : 0;
    });
    
    $.post( base_url + "ajax/stream/set_filter", { filter: $.toJSON(filter) },
	    function(data) {
	        message_JSON = eval("d=" + data);
	        reloadMap();
	        $('#button_action').addClass('none');
    });
    return false;
}




$(document).ready(function() 
{
	NulazMap = new MapHandler();
	
	var lat = $('#wh_latitude').val();
	var lon = $('#wh_longitude').val();
	var add = $('#wh_address').val();
	var acc = $('#wh_accuracy').val();
	var zoom = 14;
	
	if(acc > 8) zoom = 18;
	else if(acc > 7) zoom = 18;
	else if(acc > 6) zoom = 17;
	else if(acc > 5) zoom = 16;
	else if(acc > 4) zoom = 15;
	else if(acc > 3) zoom = 13;
	else if(acc > 2) zoom = 12;
	
	NulazMap.load(lat, lon, zoom);
	
	NulazMap.getStream(lat, lon, add, acc);
	
	
	/*$("input#3").click(function() {
		if(!$("#3").is(":checked")) { NulazMap.wikiLayer.hide(); } else { NulazMap.wikiLayer.show(); };
	});*/
	
	$("input#panoramio").click(function() {
		if(!$("#panoramio").is(":checked")) { NulazMap.photoLayer.hide(); } else { NulazMap.photoLayer.show(); NulazMap.map.addOverlay(NulazMap.photoLayer); };
	});
	
	$("#overlays").draggable();
	$("#layer_title form").submit(function() { $(this).find("#stream_loading").show(); return true; });
	
	$(".toggler a").click(function() 
	{ 
		var layer = $(this).parent().next(); 
		if($(layer).attr("id") == "layer_stream") 
		{
			$("#layer_filter").slideUp("slow");
			$("#toggle_filter a").removeClass('toggle_visible');
			$("#toggle_filter a").addClass('toggle_hidden');
		}
		
		if($(layer).attr("id") == "layer_filter") 
		{
			$("#layer_stream").slideUp("slow");
			$("#toggle_stream a").removeClass('toggle_visible');
			$("#toggle_stream a").addClass('toggle_hidden');
		}
		
		if($(layer).is(':hidden')) {
			
			$(layer).slideDown("slow"); 
			$(this).removeClass('toggle_hidden'); 
			$(this).addClass('toggle_visible'); 
		}
		else { 
			$(layer).slideUp("slow"); 
			$(this).removeClass('toggle_visible'); 
			$(this).addClass('toggle_hidden'); 
		} 
	
	 });
	  

	// Handy functions for filter/stream
	
	
	$(".check_filter_cat").click(function(){
		var cat = this.id;
		if($("a#"+cat).html() == "Select"){
			$("a#"+cat).html('Unselect');
			$("#filter_"+cat).find(":checkbox").attr('checked', true);
		}
		else if($("a#"+cat).html() == "Unselect"){
			$("a#"+cat).html('Select')
			$("#filter_"+cat).find(":checkbox").attr('checked', false);
		}
	});
	
	$("#layer_filter ul").each(function(){
		var selected = 1;
		$("#"+this.id+" input").each(function(){
			if(!this.checked){
				selected = 0;
			}
		});
		if(selected == 1){
			$("#"+this.id+" li.filter_head a").html("Unselect");
		}
	});
		
});

  
