var map;
var active_marker;
var cnt = 0;
var finished_loading = false;

function gm_initialize ()
{  
	if (GBrowserIsCompatible())
	{
		// ako je nesto od ovog undefined...
		if( gm_lat == undefined || gm_lng == undefined || gm_zoom == undefined || url_xml == undefined || gm_type == undefined ){
			alert( 'Neispravni podaci za Google Maps' );
			return false;
		}
		
		// kreiraj objekt
		map = new GMap2( document.getElementById("googlemap_canvas"));
		
		// pozicioniranje i zoom
		map.setCenter
		( 
			new GLatLng (gm_lat, gm_lng),
			gm_zoom
		);
		
		// tipovi mape
        map.addMapType( G_NORMAL_MAP );
        map.addMapType( G_SATELLITE_MAP  );
		map.addMapType( G_HYBRID_MAP  );
		map.addMapType( G_PHYSICAL_MAP  );

        map.setMapType( eval(get_map_identifier_by_type()) );

		// pomak po karti
		map.addControl( ( admin == true ) ? new GLargeMapControl() : new GSmallMapControl() );		
		
		if( admin == true )
		{
			// kontrola mape
			map.addControl(new GMenuMapTypeControl() );
			// mali ekran
			map.addControl(new GOverviewMapControl() );
            // google
            map.enableGoogleBar();
			
			// dodaj marker na klik
			GEvent.addListener
			(	
				map,
				"click", function(overlay,latlng)
				{
		      		if (latlng)
		      		{   
		      			addClickMarker( latlng.y, latlng.x );
		      		}
    			}
    		);
    		
    		// postavi long/lat nakon drag-a mape
    		GEvent.addListener
			(	
				map,
				"dragend", function()
				{
		      		obj_center = map.getCenter();
					$( '#gm_lng' ).val( obj_center.x );
					$( '#gm_lat' ).val( obj_center.y );
    			}
    		);
    		
    		// postavi zoom level nakon zoomiranja
    		GEvent.addListener
			(	
				map,
				"zoomend", function()
				{
					$( '#gm_zoom' ).val( map.getZoom() );
    			}
    		);
    		
    		// postavi tipa mape nakon drag-a mape
    		GEvent.addListener
			(	
				map,
				"maptypechanged", function()
				{
		      		obj_type = map.getCurrentMapType();
		      		type_name = obj_type.getName();
					$( '#gm_type' ).val( type_name.toLowerCase() );
    			}
    		);
    		
    		map.enableDragging();
		}
		
		addMarkersFromXML();
	}
}

function get_map_identifier_by_type()
{
    var arr_types = new Array();
    arr_types[ 'map' ]          = 'normal';
    arr_types[ 'satellite' ]    = 'satellite';
    arr_types[ 'hybrid' ]       = 'hybrid';
    arr_types[ 'terrain' ]      = 'physical';
    
    var map_identifier = arr_types[ gm_type ];
    
    return 'G_' + map_identifier.toUpperCase() + '_MAP';
}

function addClickMarker( lng, lat )
{
	var point = new GLatLng(lng, lat);
    map.addOverlay (
    	createMarker( point, '' )
    );
}

function createMarker(point, p_title)
{
	
	
	if( admin == true )
	{
		var marker = new GMarker ( point, 
		{
			draggable: true
		}
		);
	}
	else
	{
		var marker = new GMarker ( point,
		{
			//
		}
		);
	}
	
	// postavi title
	marker.title = p_title;
	

	if( admin == true ) 
	{
		// postavi aktivan
		set_active_marker( marker );
		// prikazi podatke
		show_active_marker_data();
		
		GEvent.addListener
		(
			marker, "click", 
			function()
			{
				set_active_marker( this );
				show_active_marker_data();
	   		}
	   	);
	   	GEvent.addListener
		(
			marker, "dblclick", 
			function()
			{
				remove_point( marker );
	   		}
	   	);
	   	GEvent.addListener
		(
			marker, "dragend", 
			function()
			{
				edit_hidden_field( this );
				set_active_marker( this );
				show_active_marker_data();
	   		}
	   	);
   		marker._identifier = cnt;
   		cnt++;

   		add_hidden_field( marker );
	}
	
	GEvent.addListener
	(
		marker, "mouseover", 
		function()
		{
			if( this.title != '' )
			{
				this.openInfoWindow
				( 
					this.title,
					{ 
						onOpenFn:function()
						{
							/* Google Maps API does not support any way to resize the infoWindow, this is my hack.
							* There is no CSS class to manipulate these divs and the infoWindow.reset method
							* CAN be used to increase the size but not to make it smaller.(min height is about 60px).
							*/
							alert( 'gm' );
							var infoWindowBlocks = YAHOO.util.Selector.query("#googlemap_canvas div div div div");
							for( var c = 0; c < infoWindowBlocks.length; c++ )
							{
								if(infoWindowBlocks[c].style.height === "40px" && infoWindowBlocks[c].style.top === "25px")
								{
									infoWindowBlocks[c].style.height = "5px";
								}
								if(infoWindowBlocks[c].style.top === "65px")
								{
									infoWindowBlocks[c].style.top = "15px"
								}
							}
						}
					}
				);
			}
   		}
   	);
   	GEvent.addListener
	(
		marker, "mouseout", 
		function()
		{
			this.closeInfoWindow();
   		}
   	);
   	
   	return marker;
}

function set_active_marker( marker )
{
	active_marker = marker;
}

function set_active_marker_data()
{
	// pokupi podatke iz input polja i postavi ih kao podatke za trenutno selektiranu tocku
	if( active_marker != null )
	{
		var obj_marker = active_marker;
		obj_marker.title = $( '#point_editor_title' ).val();
	}
	
	edit_hidden_field( obj_marker );
}

function show_active_marker_data( marker )
{
	if( finished_loading == true )
	{
		$( '#point_editor_title' ).slideUp
		(
			'fast',
			function ()
			{
	        	$( this ).val( active_marker.title );
				$( this ).slideDown( 'fast' );
	      	}
		);
	}
	
}

function clear_input()
{
	$( '#point_editor_title' ).val('');
}

function remove_point( marker )
{
	active_marker = null;
	marker.remove();
	remove_hidden_field( marker._identifier );
	clear_input();
}

function add_hidden_field( marker )
{
	var str  = '<input type="hidden"';
	str 	+= ' id="marker_' + marker._identifier + '" ';
	str 	+= ' name="marker_' + marker._identifier + '" ';
	str 	+= ' value="' + marker.title + '|' + marker.getLatLng() + '"';
	str 	+= ' />';
	
	$( "#marker_fields" ).append( str );
}
function remove_hidden_field( marker_id )
{
	$( '#marker_fields > #marker_' + marker_id ).remove();
}
function edit_hidden_field( marker )
{
	remove_hidden_field( marker._identifier );
	add_hidden_field( marker );
}

function addMarkersFromXML ()
{
	var batch = [];
	mgr = new MarkerManager(map); 
	
	var request = GXmlHttp.create();
	request.open('GET', url_xml, true);
	request.onreadystatechange = function()
	{
		if (request.readyState == 4 && request.status == 200) 
		{
			var xmlDoc = request.responseXML;
			
			if( xmlDoc == null ) {
				return false;
			}
			
			var xmlrows = xmlDoc.documentElement.getElementsByTagName("map");
			
			for (var i = 0; i < xmlrows.length; i++)
			{
				var xmlrow = xmlrows[i];
				
				// get coordinates
				var xmlcellLongitude = xmlrow.getElementsByTagName("longitude")[0];
				var xmlcellLatitude = xmlrow.getElementsByTagName("latitude")[0];
				var point = new GLatLng
				( 
					parseFloat( xmlcellLatitude.firstChild.data ), 
					parseFloat( xmlcellLongitude.firstChild.data ) 
				);
				
				//get the title
				var xmlcellTitle = xmlrow.getElementsByTagName("title")[0];
				//alert( xmlcellTitle.firstChild );
				var celltextTitle = ( xmlcellTitle.firstChild != null ) ? xmlcellTitle.firstChild.data : '';

				// create marker
				var marker = createMarker( point, celltextTitle );
				
				if( i+1 == xmlrows.length ){
					finished_loading = true;
				}
				
				batch.push(marker);
			}
			
			mgr.addMarkers(batch, 1);
			mgr.refresh();
		}
	}
	request.send(null);
}

function isset(varname)
{
	if(typeof( window[ varname ] ) != "undefined") return true;
	else return false;
}

function is_form_valid()
{
	// ako je div koji sadrzi hidden polja s podacima tocaka prazan
	if( $( "#marker_fields" ).html() == '' ) {
		//return false;	
	}
	return true;
}

function submit_form()
{
	var submit_valid = false;
	
	if( is_form_valid() == true )
	{
		// postavi trenutni zoom
		$( '#gm_zoom' ).val( map.getZoom() );
		
		// postavi dimenzije
		obj_center = map.getCenter();
		$( '#gm_lng' ).val( obj_center.x );
		$( '#gm_lat' ).val( obj_center.y );
		
		// submitaj
		$('#frm_admin').submit();
		
	}else{
		alert( 'Not valid' );
	}
		
	return false;
}