
/* Copyright © 2007 DIALNET All rights reserved. */

/*
	INTERESUJE NAS TYLKO FUNKCJA showGMap(), opisana dalej...

*/


var map = null;
function sortNumber(a,b)
{
    return a - b
}

if(GBrowserIsCompatible())
{
    var icons = new Array();

    icons['std'] = new GIcon();
    icons['std'].shadow = "http://www.google.com/mapfiles/shadow50.png";
    icons['std'].image = "http://www.google.com/mapfiles/marker.png";
    icons['std'].iconSize = new GSize(20, 34);
    icons['std'].iconAnchor = new GPoint(9, 34);
    icons['std'].shadowSize = new GSize(37, 34);
    icons['std'].infoShadowAnchor = new GPoint(18, 25);
    icons['std'].infoWindowAnchor = new GPoint(9, 13);
    
    icons['num'] = new GIcon();
    icons['num'].shadow = "http://www.google.com/mapfiles/shadow.png";
    icons['num'].image = "http://www.google.com/mapfiles/marker.png";
    icons['num'].iconSize = new GSize(20, 20);
    icons['num'].iconAnchor = new GPoint(10, 10);
    icons['num'].shadowSize = new GSize(35, 35);
    icons['num'].infoShadowAnchor = new GPoint(18, 25);
    icons['num'].infoWindowAnchor = new GPoint(9, 13);
    var arrayW = new Array(); // do wyliczenia mediany
    var arrayL = new Array();
    var autoZoom;
}

function goToMarker( mNo )
{
    if( map == null ) return;
    if( createOffersMarker( mNo, true ))
    {
	/*
		var mPoint = gMapData['markers'][mNo]._marker.getPoint();
		var zoom = getZoomByAccuracy( gMapData['markers'][mNo]['gMapAccuracy']);
		var lat = mPoint.lat()+0.001;
				
		var lng = mPoint.lng();
		//alert(lat+' '+lng);

		mPoint = new GLatLng(lat,lng,true);
		*/
		
        //setTimeout("map.panTo("+mPoint+" )", 100); // wycentrowanie na ofercie...
    }
}


function createOffersMarker( i, showCloud )
{
    var offer = gMapData['markers'][i];
	//alert(offer['icoImg']);
    var marker = null;
    if( !gMapData['markers'] || i >= gMapData['markers'].length ) return; // marker nie istnieje

    if( !gMapData['markers'][i]._marker )
    {
	var point = new GLatLng( offer['gMapW'], offer['gMapL'] );
	if( offer['icoType'] && icons[offer['icoType']] )
	{
	    var icon = new GIcon( icons[offer['icoType']] );
	    //alert( offer['icoImg'] );
	    if( offer['icoImg'] )
	    {
		icon.image = offer['icoImg'];
			//alert(offer['icoImg']);
	    }
	    else if( offer['icoInfix'] && gMapData['icoDir'] && gMapData['icoPrefix'] && gMapData['icoSufix'] )
	    {
		icon.image = gMapData['icoDir']+gMapData['icoPrefix']+offer['icoInfix']+gMapData['icoSufix'];
	    }
	    if( gMapData['icoImgShadow'] && gMapData['icoImgShadow']!='' )
	    {
		icon.shadow = gMapData['icoImgShadow'];
	    }
	}
	else
	{
	    var icon = new GIcon(icons['std']);
	}
	marker = new GMarker(point, icon);
	gMapData['markers'][i]._marker = marker;
    }
    else
    {
	marker = gMapData['markers'][i]._marker;
    }
    var cHTML = '';

    if( offer['html'] && offer['html'] != '' )
    {
	cHTML = offer['html'];
    }
    else if( offer['tplVars'] )
    {
	cHTML = gMapData['tpl'];

	for( tplVar in offer['tplVars'] )
	{
	    cHTML = cHTML.replace('#'+tplVar+'#', offer['tplVars'][tplVar] );
	}
    }

	
	if (cHTML != '')
	{
		cHTML = '<div style="border: 1px solid white; background-color: white">'+cHTML+'</div>';
	}


    if( cHTML && cHTML != '' )
    {

	GEvent.addListener(marker, "click", function()
	{
	    marker.openInfoWindowHtml( cHTML );
	});
    }
    if( showCloud == true && cHTML && cHTML != '' )
    {
	//alert( gMapData['markers'][i]['gMapAccuracy'] );
	map.setZoom( getZoomByAccuracy( gMapData['markers'][i]['gMapAccuracy']));
	marker.openInfoWindowHtml( cHTML );
    }

    return marker;
}



/*
	wyswietla mapke z jednym lub wieloma markerami z danych podanych w globalnej tablicy  `gMapData`   tablice najwygodniej przekazac z tablicy w php  przy pomocy funkcji  json_encode(), zamiast wpisywania jak ponizej w html-u
	
	gMapData = new Array();
	gMapData['mapCenterW'] = ;
	gMapData['mapCenterL'] = ;
	gMapData['accuracy'] = ;
	gMapData['icoImgShadow'] = ;  // opcjonalnie
	gMapData['markers'] = new Array();
		gMapData['markers'][i] = new Array();
			gMapData['markers'][i]['gMapW'] = ;
			gMapData['markers'][i]['gMapL'] = ;
			gMapData['markers'][i]['gMapAccuracy'] = ;
			gMapData['markers'][i]['icoType'] = ; // opcjonalnie, jesli nietypowe, trzeba dopisac do globalnej tablicy ikonek  `icons`  ( linia okolo 17 w tym pliku )
			gMapData['markers'][i]['icoImg'] = ; // opcjonalnie
			gMapData['markers'][i]['html'] = ';
		(...)
		
	jsonem wygladalo by to np tak ( czesc w nawiasach daje funkcja json_encode());
	gMapData = {"mapCenterW":"50.0552........................}
*/
var imNotSleepJet = true;

function showGMap( cSmallControl, cLargeControl, cScale, cType, cSmallZoom )
{

    if( imNotSleepJet )
    {
	imNotSleepJet = false;
	setTimeout( "showGMap( "+cSmallControl+", "+cLargeControl+", "+cScale+", "+cType+", "+cSmallZoom+" )", 500 );
	return;
    }


    if(GBrowserIsCompatible()) 
	{
	var minW = 0; // do wyliczenia prostokata widocznych ofert
	var minL = 0;
	var maxW = 0;
	var maxL = 0;
	var medW = 0;
	var medL = 0;
	arrayW = new Array();
	arrayL = new Array();
	map = new GMap2(  document.getElementById ? document.getElementById("mapDiv") :  document.all.mapDiv );
	
	if( cSmallControl == true )						map.addControl(new GSmallMapControl());
	if( cLargeControl == true || (!cLargeControl && cLargeControl != false))map.addControl(new GLargeMapControl());
	if( cScale == true || (!cScale && cScale != false))			map.addControl(new GScaleControl());
	if( cType == true || (!cType && cType != false) )			map.addControl(new GMapTypeControl());
	if( cSmallZoom == true )						map.addControl(new GSmallZoomControl());


	map.setCenter(new GLatLng( gMapData.mapCenterW, gMapData.mapCenterL), getZoomByAccuracy( gMapData['accuracy']*1) );
	if( gMapData['accuracy'] <= 1 ) map.disableDragging();
    

	mixMarkers();


	for( var i=0; i < gMapData['markers'].length; i++ )
	{
	    offer = gMapData['markers'][i];
	    map.addOverlay( createOffersMarker( i ) );

	    minW = Math.min( minW, offer['gMapW'] );
	    minL = Math.min( minL, offer['gMapL'] );
	    maxW = Math.max( maxW, offer['gMapW'] );
	    maxL = Math.max( maxL, offer['gMapL'] );
	    arrayW[ arrayW.length ] = offer['gMapW'];
	    arrayL[ arrayL.length ] = offer['gMapL'];
	}
	if( arrayW.length > 0 )
	{
	    if( gMapData['accuracy'] > 1 )
	    {
		arrayW = arrayW.sort(sortNumber);
		arrayL = arrayL.sort(sortNumber);
		var medIndex = Math.floor(arrayL.length/2);
		medW = arrayW[ medIndex ];
		medL = arrayL[ medIndex ];
		var medPoint = new GLatLng( medW, medL ); // przewiniecie do przeciec modalnej
		map.panTo( medPoint );
		autoZoom = true;
	    }
	
	    GEvent.addListener( map, "moveend", function()
	    {
		if( !autoZoom ) return;
		autoZoom = false;
		var mapBounds = map.getBounds();
		var halfMapBounds = cropBounds( mapBounds );
		var quarterMapBounds = cropBounds( halfMapBounds );
		var visibleMarkers = 0;
		var visibleInCropBoundsMarkers = 0;
		var visibleInDoubleCropBoundsMarkers = 0;

		for( var i=0; i < gMapData['markers'].length; i++ )
		{
		    var offer = gMapData['markers'][i];
		    var offerPoint = new GLatLng( offer['gMapW'], offer['gMapL']);
		    if( mapBounds.contains( offerPoint )) visibleMarkers++;
		    if( halfMapBounds.contains( offerPoint )) visibleInCropBoundsMarkers++;
		    if( quarterMapBounds.contains( offerPoint )) visibleInDoubleCropBoundsMarkers++;
		}

		if( (visibleMarkers / arrayW.length*100) < 90 )
		{
		    map.zoomOut();
		    //alert('auto zoom out');
		}
		else if( visibleInCropBoundsMarkers >= arrayW.length )
		{
		    map.zoomIn();
		    //alert('auto zoom in');
		    if( visibleInDoubleCropBoundsMarkers >= arrayW.length )
		    {
			map.zoomIn();
			//alert('double auto zoom in');
		    }
		}
	    });
	}
	
	/* ograniczenia zoomowania */
	
	GEvent.addListener(map, "zoomend", function( oldLevel, newLevel )
	{
	    if( newLevel > 18 )
	    {
		map.setZoom(18);
		//if( cDragging == true ) map.enableDragging();
		map.enableDragging();
	    }
	    if( newLevel <= 6 )
	    {
		map.disableDragging();
		map.setZoom(6);
	    }
	    else
	    {
		//if( cDragging == true ) map.enableDragging();
		map.enableDragging();
	    }
	});
    }
}

/* zwraca dwukrotnie miejszy prostokat (powierzchniowo 4X) odpowiadajacy zoomowi o 1 stopien*/
function cropBounds( bounds )
{
    var SWPoint = bounds.getSouthWest();
    var NEPoint = bounds.getNorthEast();

    var xDistance =  ( NEPoint.x - SWPoint.x ) / 4;
    var yDistance =  ( NEPoint.y - SWPoint.y ) / 4;
    var newSWPoint =  new GLatLng( SWPoint.y + yDistance, SWPoint.x + xDistance );
    var newNEPoint =  new GLatLng( NEPoint.y - yDistance, NEPoint.x - xDistance );

    return new GLatLngBounds( newSWPoint, newNEPoint );
}


/* mixuje polozenie markerow wskazujacych na identyczna lokalizacje... */

function mixMarkers()
{
    var change = false;
    for( var i=0; i < gMapData['markers'].length; i++ )
    {
	offerSrc = gMapData['markers'][i];
	for( var j=0; j < gMapData['markers'].length; j++ )
	{
	    if( i==j ) continue;
	    offer = gMapData['markers'][j];
	    if( offerSrc['gMapW'] == offer['gMapW'] && offerSrc['gMapL'] == offer['gMapL'] )
	    {
		if( Math.round(Math.random()) )
		{
		    gMapData['markers'][i]['gMapW'] = gMapData['markers'][i]['gMapW'] * 1 +  0.001;
		}
		else
		{
		    gMapData['markers'][i]['gMapW'] = gMapData['markers'][i]['gMapW'] * 1 -  0.001;
		}
		if( Math.round(Math.random()) )
		{
		    gMapData['markers'][i]['gMapL'] = gMapData['markers'][i]['gMapL'] * 1 +  0.001;
		}
		else
		{
		    gMapData['markers'][i]['gMapL'] = gMapData['markers'][i]['gMapL'] * 1 -  0.001;
		}
		change = true;
	    }
	}
    }
    if( change )
    {
	mixMarkers();
    }
}


