
/*
	INTERESUJA NAS WŁASCIWIE TYLKO 2 FUNKCJE:
	showMap() - DANE Z GLOBALI
	findGeoCode( address, infoField ) - DANE Z PARAMETROW
	
	szczegolowy opis dalej...
*/

var map = null;
var geocoder = null;
var tmp = new Array(); tmp['omittedLevels'] = '';
var setVars = new Array();
var marker = null;
var searchRecurrence = 0;
setVars['searchRecurrence'] = 0;
var imNotSleepJet = true;

/*
	tylko do debugowania, wyswietla aktualne wartosci zmiennych
*/
function varDump()
{
    //fSetVars();
    var str = '';
    for( v in setVars )
    {
	str += "setVars['"+ v +"']" + ' => ' + setVars[v] + "\n";
    }
    alert(str);
}

function fSetVars()
{
    setVars['mapPoint']	= map.getCenter();
    setVars['mapBounds']= map.getBounds();
    setVars['mapZoom']	= map.getZoom();
    //setVars['gMapW'] = setVars['mapPoint'].y;
    //setVars['gMapL'] = setVars['mapPoint'].x;
    setVars['gMapW'] = setVars['markerPoint'].y;
    setVars['gMapL'] = setVars['markerPoint'].x;
}

function postalizeMapVars()
{
    fSetVars();
    var post = '&';
    for( v in setVars )
    {
	post += v + '=' + setVars[v] + '&';
    }
    return post;
}

/**
* zwraca wszystkie ustawienia mapki
*/
function getGmapParams()
{
    fSetVars();
    return setVars;
}

function resetMap()
{
    setVars['gMapAccuracy'] = tmp['gMapAccuracy']; 
    setVars['markerPoint'] = setVars['mapPoint'] = tmp['defaultMarkerPoint'];
    map.returnToSavedPosition();
    marker.setPoint( tmp['defaultMarkerPoint']);
    marker.openInfoWindowHtml( info['infoHeader']+info['confirmSet']+info['infoFooter']);
    //getGmapParams();
    fSetVars();
}






/*
	wyswietla mape w DIVie 'mapDiv'
	gdy uzywana samodzielnie nalezy ustawic globale:
	- dymek (info wyskakujace po zlokalizowaniu w dymku) 
		info['infoHeader']
		info['setMarker'] 
		info['infoFooter']
	- wspolrzedne:
		setVars['gMapW']	-	szerokosc geo
		setVars['gMapL']		- dlugosc
		setVars['gMapAccuracy']  - poziom trafnosci 
	
*/
function showMap()
{
    if( imNotSleepJet )
    {
	imNotSleepJet = false;
	setTimeout('showMap()', 500);
	return;
    }
    var infoMsg = info['infoHeader'];
    var point = new GLatLng( setVars['gMapW'], setVars['gMapL'] );
    setVars['mapZoom'] = getZoomByAccuracy( setVars['gMapAccuracy'] );
    map = new GMap2( document.getElementById ? document.getElementById("mapDiv") : document.all.mapDiv );
    map.enableContinuousZoom();
    map.savePosition();
    map.addControl(new GLargeMapControl());
    //map.addControl(new GSmallMapControl());
    map.addControl(new GScaleControl());
    tmp['defaultMarkerPoint'] = setVars['markerPoint']  = setVars['mapPoint'] = point;
    map.setCenter(point, setVars['mapZoom']);
    searchRecurrence=0;
    tmp['omittedLevels']='';
    infoMsg += info['setMarker']+info['infoFooter'];

    //map.openInfoWindowHtml(point, "<div style='background-color:#fff; margin:0px; width:210px; height:65px;'>"+infoMsg+"</div>");
    marker = new GMarker(point, {draggable: true});

    GEvent.addListener(marker, "dragstart", function() {
	    map.closeInfoWindow();
	    });
    
    /* ograniczenia zoomowania */
    /*
    GEvent.addListener(map, "zoomend", function( oldLevel, newLevel ) {
	    if( newLevel > 16 )
	    {
		map.setZoom(16);
	    }
	    else if( newLevel < 8 )
	    {
		map.setZoom(8);
	    }
	    });
	    */

    GEvent.addListener(marker, "dragend", function() {
	    setVars['markerPoint']  = marker.getPoint();

	    if( setVars['gMapAccuracy'] < 7 )
	    {
		setVars['mapZoom'] += 1;
		map.setZoom( setVars['mapZoom'] );
	    }
	    map.panTo( setVars['markerPoint']);
	    setVars['gMapAccuracy'] = 8;
	    setTimeout("fSetVars()",100);
	    //fSetVars();
	    });

    map.addOverlay(marker);
    marker.openInfoWindowHtml("<div style='background-color:#fff; margin:0px; width:210px; height:65px;'>"+infoMsg+"</div>");
    fSetVars();
}




/*
	znajduje wspolrzedne na podstawie address-u i zapisuje je do globali
	do debugowania mozna w drugim porametrze podac jakas textaree (sam obiekt, bez .value),  wtedy funkcja bedzie do niej wpisywac po czym wyszukuje 
	adres podawac z malejaca dokladnoscia w postaci stringa np: (kraj pelny lub kod)
	wyszynskiego 1, olsztyn, warmińsko-mazurskie, pl
	
	w przypadku gdy funkcja nie znajdzie adresu na poziomie ulicy, rekurencyjnie wyszuka na poziomie miasta itd.
	funkcja jest asynchroniczna, wiec nie da sie pokazac mapy w sposob:
	
	// ZLE:
	findGeoCode('wyszynskiego 1, olsztyn, warmińsko-mazurskie, pl');
	showMap();
	
	zamiast tego funkcja wywoluje dwa callbacki (na sztywnych nazwach, ktore MUSZA BYC ZDEFINIOWANE)
	- w przypadku sukcesu wywolana jest   findGeoCodeSuccess()    w momencie jej wywolania mamy ustawione juz wszystkie niezbedne globale
	// DOBRZE 
	
	function findGeoCodeSuccess()
	{
		showMap(); // zwykle bedzie to tylko tyle, ale gdy nie chcemy z jakiegos powodu wyswietlic mapy mozna tu wpisac cokolwiek, wazne, zeby funkcja (nawet pusta) byla zdefiniowana
	}
	
	findGeoCode('wyszynskiego 1, olsztyn, warmińsko-mazurskie, pl');
	
	- w przypadku bledu szukania wywolywana jest druga funkcjia:  findGeoCodeFalse() wiec trzeba ja rowniez utworzyc np tak:
	function findGeoCodeFalse(errno) 
	{
		alert('DUPA, nr bledu:'+errno);
	}
*/
function findGeoCode( address, infoField )
{
    if( infoField )
    {
	infoField.value += address+"\n";
    }
    geocoder = new GClientGeocoder();

    if(geocoder)
    {
	geocoder.getLocations( address, function(point)
	    {
		var coordinates;
		if ( point.Status.code != 200 )
		{
		    address = address.replace(/^[^,]*,\s*/, '');
		    searchRecurrence ++;
		    if( searchRecurrence  > 5 )
		    {
			findGeoCodeFalse( point.Status.code );
			return;
		    }
		    findGeoCode( address, infoField );
		}
		else 
		{
		    setVars['address'] = address;
		    coordinates = point.Placemark[0].Point.coordinates;
		    setVars['gMapAccuracy'] = tmp['gMapAccuracy'] = point.Placemark[0].AddressDetails.Accuracy;
		    setVars['gMapL'] = coordinates[0];
		    setVars['gMapW'] = coordinates[1];
		    setVars['markerPoint'] = setVars['mapPoint'] =  new GLatLng( coordinates[1], coordinates[0] );
		    findGeoCodeSuccess();
		}
	    }
	);
    }
    else
    {
	alert( info['error'] );
    }
}


