var map;
var geocoder;
var newBounds;
var markers;
var marketsSearchNum = 5;
var markerCounter = 0;

var NO_MARKET_LABEL = "";
var NO_RESULT_LABEL = "";
var OWN_POSITION_LABEL = "";
var NO_ADDRESS_FOUND_LABEL = "";
var NO_ADDRESS_ENTRY_LABEL = "";

function createMarker(point, name, address, icon, storePic)
{
	if(storePic != '')
	{
		storePic = '<br /><a href="#" onclick="resizePic(\'storePicId' + markerCounter + '\');"><img class="storeSmall" id="storePicId' + markerCounter + '" src="' + storePic + '" /></a>';
	}
	else
	{
		storePic = ''; 
	}
	
	markerCounter++;
	
	var baseIcon = new GIcon();
	//baseIcon.iconSize = new GSize(/*width*/, /*height*/);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	
	var letteredIcon = new GIcon(baseIcon);

	letteredIcon.image = icon;
	markerOptions = { icon:letteredIcon };
	var marker = new GMarker(point, markerOptions);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindow('<div id="infoWindow"><b>' + name + '</b><br/>' + address + storePic + '</div>');
	});
	return marker;
}

function createMarkerOwn(point, name, address)
{
	var baseIcon = new GIcon();
	baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
	baseIcon.iconSize = new GSize(20, 34);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	
	var letteredIcon = new GIcon(baseIcon);

	letteredIcon.image = "http://www.google.com/mapfiles/marker.png";
	markerOptions = { icon:letteredIcon };
	var marker = new GMarker(point, markerOptions);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml('<div id="infoWindow"><b>' + name + '</b><br/>' + address + '</div>');
	});
	return marker;
}

function load()
{
	if(GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		
		map.enableDoubleClickZoom();
		map.enableScrollWheelZoom();
		
		//map.addControl(new google.maps.LocalSearch(), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,20)));
		
		map.setCenter(new GLatLng(47.8826113, 10.6231307), 8);
		
		geocoder = new GClientGeocoder();
		newBounds= new GLatLngBounds();
		
		createEntrysInit();
	}
}

function Array2D(x,y)
{
	this.items = new Array(x);
	for(var i = 0; i < x; i++)
	{
		this.items[i] = new Array(y);
	}
}

function createEntrys(ownPoint, radius)
{
	var sidebar = document.getElementById('sidebar');
	sidebar.innerHTML = '';
	if(len > 0)
	{
		markers = new Array2D(len, 3);
		
		var maxDistance = radius;
		
		var i = 0;
		var j = 0;
		while(i < len)
		{
			var point = new GLatLng(data.items[i][0], data.items[i][1]);
			var distance = point.distanceFrom(ownPoint)/1000;
			var marker = createMarker(point, data.items[i][2], data.items[i][3], data.items[i][4], data.items[i][5]);
			
			markers.items[j][0] = distance;
			markers.items[j][1] = marker;
			markers.items[j][2] = i;
			j++
			i++;
		}
		
		markers.items.sort(compareDistance);
		
		if(j == 0)
			sidebar.innerHTML = '<div align="center">' + NO_RESULT_LABEL + '</div>';
		if(radius == "auto")
		{
			if(j > marketsSearchNum)
				j = marketsSearchNum;
		}
		else if(radius == "all")
		{
			
		}
		
		i = 0;
		while(i < len)
		{
			var num = markers.items[i][2];
			var entryStr;
			
			if(data.items[num][5] != '')
			{
				entryStr = data.items[num][3] + '<p><img class="storeSmall" src="' + data.items[num][5] + '" /></p>';
			}
			else
			{
				entryStr = data.items[num][3]; 
			}
			
			var sidebarEntry = createSidebarEntry(markers.items[i][1], data.items[num][2], entryStr, markers.items[i][0]);
			map.addOverlay(markers.items[i][1]);
			
			if(i < j)
			{
			    maxDistance = markers.items[i][0];
			
			    if(markers.items[i][0] < radius || radius == "auto" || radius == "all")
			    {
			        sidebar.appendChild(sidebarEntry);
			    }
			}
			i++;
		}
		
		if(radius == "auto" || radius == "all")
		{
			//var maxDistance = markers.items[i-1][0];
			var zoom = 6;
			
			if(maxDistance < "0.5")
				zoom = 15;
			else if(maxDistance < "1")
				zoom = 14;
			else if(maxDistance < "2.5")
				zoom = 13;
			else if(maxDistance < "5")
				zoom = 12;
			else if(maxDistance < "10")
				zoom = 11;
			else if(maxDistance < "25")
				zoom = 10;
			else if(maxDistance < "50")
				zoom = 9;
			else if(maxDistance < "100")
				zoom = 8;
			else if(maxDistance < "200")
				zoom = 7;
			else if(maxDistance < "500")
				zoom = 6;
			else if(maxDistance < "1000")
				zoom = 5;
			else if(maxDistance >= "1000")
				zoom = 4;
			
			map.setCenter(ownPoint, zoom);
			if(maxDistance >= "1000" || radius == "all")
			{
			
			}
			else
			{
				drawCircle(ownPoint, maxDistance+1);
			}
		}
		else
		{
			var zoom = 6;
			
			if(radius == "1")
				zoom = 14;
			else if(radius == "5")
				zoom = 12;
			else if(radius == "10")
				zoom = 11;
			else if(radius == "25")
				zoom = 10;
			else if(radius == "50")
				zoom = 9;
			map.setCenter(ownPoint, zoom);
			drawCircle(ownPoint, radius);
		}
	}
	else
	{
		sidebar.innerHTML = '<div align="center">' + NO_MARKET_LABEL + '</div>';
	}
}

function createEntrysInit()
{
	var sidebar = document.getElementById('sidebar');
	sidebar.innerHTML = '<div align="center">' + NO_ADDRESS_ENTRY_LABEL + '</div>';
	
	if(len > 0)
	{
		var i = 0;
		while(i < len)
		{
			var point = new GLatLng(data.items[i][0], data.items[i][1]);
			var marker = createMarker(point, data.items[i][2], data.items[i][3], data.items[i][4], data.items[i][5]);
			map.addOverlay(marker);
			i++;
		}
	}
	else
	{
		sidebar.innerHTML = '<div align="center">' + NO_MARKET_LABEL + '</div>';
	}
}

function createSidebarEntry(marker, name, address, distance)
{
	var div = document.createElement('div');
	if(distance)
		var html = '<b>' + name + '</b> (' + distance.toFixed(1) + ' km)<br/>' + address;
	else
		var html = '<b>' + name + '</b><br/>' + address;
	div.innerHTML = html;
	div.id = 'sidebarResult';
	div.style.cursor = 'pointer';
	div.style.marginBottom = '5px';
	//div.style.backgroundColor = '#fff';
	GEvent.addDomListener(div, 'click', function() {
		GEvent.trigger(marker, 'click');
	});
	GEvent.addDomListener(div, 'mouseover', function() {
		//div.style.backgroundColor = '#eee';
	});
	GEvent.addDomListener(div, 'mouseout', function() {
		//div.style.backgroundColor = '#fff';
	});
	return div;
}

function searchLocations()
{
	markerCounter = 0;
	map.clearOverlays();
	
	var radius = document.getElementById('radiusSelect').value;
	var address = document.getElementById('addressInput').value;
	var address = htmlspecialchars(address);
	address = address + ' DE';
	if(address == ' DE')
	{
	    address = '';
	}
	
	geocoder.getLatLng(address, function(point) {
	if(!point)
	{
		var sidebar = document.getElementById('sidebar');
		sidebar.innerHTML = '<div align="center">' + NO_ADDRESS_FOUND_LABEL + '</div>';
	}
	else
	{
		createEntrys(point, radius);
		var marker = createMarkerOwn(point, OWN_POSITION_LABEL, address);
		map.addOverlay(marker);
	}
	});
}

function drawCircle(point, radius) {
	//alert("drawCircle@"+point+" r="+radius); 
	radius = radius;
	var cColor = "#3366ff";
	var cWidth = 5;
	var Cradius = radius;   
	var d2r = Math.PI/180; 
	var r2d = 180/Math.PI; 
	var Clat = (Cradius/6378)*r2d; 
	//alert("point.lat()="+point.lat()+" point.lng()="+point.lng());  
	var Clng = Clat/Math.cos(point.lat()*d2r); 
	var Cpoints = []; 
	for (var i=0; i < 33; i++) { 
		var theta = Math.PI * (i/16); 
		var CPlng = point.lng() + (Clng * Math.cos(theta)); 
		var CPlat = point.lat() + (Clat * Math.sin(theta)); 
		var P = new GLatLng(CPlat,CPlng);
		newBounds.extend(P);
		Cpoints.push(P); 
	}
	//alert("circle@"+point+" color="+cColor+" width="+cWidth+" length="+Cpoints.length);
	map.addOverlay(new GPolyline(Cpoints,cColor,cWidth)); 
}

function compareDistance(x,y)
{
	if(!parseFloat(x[0]))
		res = 1;
	else if(!parseFloat(y[0]))
		res = -1;
	else if(parseFloat(x[0])<parseFloat(y[0]))
		res = -1;
	else if(parseFloat(y[0])<parseFloat(x[0]))
		res = 1;
	else
		res = 0;
	return res;
}

function htmlspecialchars(str)
{
	str = str.replace(/&/g, '&amp;');
	str = str.replace(/</g, '&lt;');
	str = str.replace(/>/g, '&gt;');
	str = str.replace(/"/g, '&quot;');
	str = str.replace(/'/g, '&#039;');
	return str;
}

function checkEnter(e){ //e is event object passed from function invocation
	var characterCode //literal character code will be stored in this variable

	if(e && e.which){ //if which property of event object is supported (NN4)
		e = e;
		characterCode = e.which; //character code is contained in NN4's which property
	}
	else{
		e = event;
		characterCode = e.keyCode; //character code is contained in IE's keyCode property
	}

	if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
		//return false;
		radiusSelect[0].selected = true;
		searchLocations();
	}
	else{
		//return true;
	}
}

function resizePic(picId)
{
	var pic = document.getElementById(picId);
	if(pic.className == 'storeBig')
		pic.className = 'storeSmall';
	else
		pic.className = 'storeBig';
	map.updateInfoWindow(map.getInfoWindow().getTabs());
}

