var cluster;
var poly;
var mgr;

var root = "http://Tracksbox.net";
// var root = "http://localhost:8080/Tracksbox-2.0";

var currentTrackId;

var points = [];
var pds = [];
var defaultMapType = G_PHYSICAL_MAP;

function mapExtraInit() {
	map.addMapType(G_SATELLITE_3D_MAP);
	map.addMapType(G_PHYSICAL_MAP);
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl(new GSize(150, 150)));

	// if (showDefaultMapCenter) {
	// map.setCenter(new GLatLng(46.151241, 14.995463), 8, defaultMapType);

	// }
	map.savePosition()
	map.enableGoogleBar();

	var lat = document.getElementById("form2:startLat");
	var lng = document.getElementById("form2:startLng");
	if (lat != null && lng != null) {
		map.setCenter(new GLatLng(lat.value, lng.value), 14, defaultMapType);
	} else {
		map.setCenter(new GLatLng(46.151241, 14.995463), 8, defaultMapType);
	}

	// init marker manager for waypoints
	var mgrOptions = {
		borderPadding : 50,
		trackMarkers : true
	};
	mgr = new MarkerManager(map, mgrOptions);

	// map.hideControls();

	// //'mouseover' listener shows controls
	GEvent.addListener(map, "mouseover", function() {
		map.showControls();
		map.enableGoogleBar();
	});

	// //'mouseout' listener hides controls
	GEvent.addListener(map, "mouseout", function() {
		map.hideControls();
		map.disableGoogleBar();
	});

	GEvent.addListener(map, "click", function() {
		map.enableScrollWheelZoom()
	});

	GEvent.addListener(map, "drag", function() {
		getTracks(getMaxLat(), getMaxLng(), getMinLat(), getMinLng());
	});

	GEvent.addListener(map, "zoomend", function() {
		getTracks(getMaxLat(), getMaxLng(), getMinLat(), getMinLng());
	});

	cluster = new ClusterMarker(map, {
		clusterMarkerTitle : 'Število poti v skupini: %count',
		clusterMarkerClick : openClusterInfoWindow,
		clusterMarkerIcon : clusterIcon
	});

	getTracks(getMaxLat(), getMaxLng(), getMinLat(), getMinLng());

}

function toggleClustering() {
	cluster.clusteringEnabled = !cluster.clusteringEnabled;
	cluster.refresh(true); // true required to force a full update of the
	// markers - otherwise the update would occur next
	// time that the map is zoomed or the active markers
	// change
}

function openClusterInfoWindow(args) {
	var windowHtml = '';
	for ( var i = 0; i < args.clusteredMarkers.length; i++) {

		windowHtml += '<a href=\"gpstrack/' + args.clusteredMarkers[i]['id']
				+ '\" onClick=\"showWayPoints('
				+ args.clusteredMarkers[i]['id'] + ');\">' + (i + 1) + '. '
				+ args.clusteredMarkers[i].getTitle() + '</a><br>';
	}
	/*
	 * for(prop in args.clusteredMarkers[0]){ windowHtmlX += prop+':
	 * '+args.clusteredMarkers[0][prop]+'<br>'; }
	 */
	args.clusterMarker.openInfoWindowHtml(windowHtml);
}

function getMinLat() {
	return map.getBounds().getSouthWest().lat();
}

function getMinLng() {
	return map.getBounds().getSouthWest().lng();
}

function getMaxLat() {
	return map.getBounds().getNorthEast().lat();
}

function getMaxLng() {
	return map.getBounds().getNorthEast().lng();
}

function addMarkers(tMarkers) {

	if (tMarkers.length > 0) {
		var i = 0;
		var markers2 = [];
		var trackIds = [];
		try {
			cluster.removeMarkers();
		} catch (e) {
		}
		var j;
		for (j = 0; j < tMarkers.length; j++) {
			// alert(parseFloat(points[i]['startLat']) + ' ' +
			// points[i].startLat + ' i=' + i);
			var Gpoint1 = new GLatLng(tMarkers[j]['startLat'],
					tMarkers[j]['startLng']);
			// alert('p:'+Gpoint1.toUrlValue()+' m:'+eval(mark));
			var trackId = tMarkers[j]['trackId'];
			if (tMarkers[j]['type'] == 4)
				var icon = runIcon;
			else if (tMarkers[j]['type'] == 1)
				var icon = mtbIcon;
			else if (tMarkers[j]['type'] == 0)
				var icon = raceIcon;
			else if (tMarkers[j]['type'] == 6)
				var icon = hikeIcon;
			else if (tMarkers[j]['type'] == 3)
				var icon = xcIcon;
			else if (tMarkers[j]['type'] == 7)
				var icon = trekIcon;
			else
				var icon = drugoIcon;

			var mrk1 = createMarker(trackId, Gpoint1, tMarkers[j]['trackName'],
					icon);
			markers2.push(mrk1);
			i++
		}
		cluster.addMarkers(markers2);
		cluster.refresh(true);

	}
}

function addWayPointMarkers(markersData) {
	var markers = [];
	mgr.clearMarkers();
	var j;
	for (j = 0; j < markersData.length; j++) {

		var Gpoint = new GLatLng(markersData[j]['lat'], markersData[j]['lng']);
		var wayPointId = markersData[j]['wayPointId'];
		 //alert('wp :'+markersData[j]['icon']+' lt'+markersData[j]['lat']+' ln'+markersData[j]['lng']+' id'+markersData[j]['wayPointId']+' typ:'+markersData[j]['type']+"-");

		if (markersData[j]['type'] == "lappoint") {
			var wayPointIcon = new GIcon();
			wayPointIcon.image = "http://media.tracksbox.net/images/"
					+ markersData[j]['icon'] + ".png";
			wayPointIcon.iconSize = new GSize(14, 14);
			wayPointIcon.iconAnchor = new GPoint(7, 7);
			wayPointIcon.infoWindowAnchor = new GPoint(7, 7);
		} else {

			var wayPointIcon = new GIcon();
			wayPointIcon.image = "http://media.tracksbox.net/images/"
					+ markersData[j]['icon'] + ".png";
			wayPointIcon.iconSize = new GSize(19, 27);
			wayPointIcon.iconAnchor = new GPoint(8, 26);
			wayPointIcon.infoWindowAnchor = new GPoint(8, 3);
		}

		var WPmarker = createWayPointMarker(wayPointId, Gpoint,
				markersData[j]['title'], markersData[j]['html'], wayPointIcon);

		markers.push(WPmarker);
	}
	//alert(markersData[0]['lat'] + ' ' + markersData[0]['lng'] + ' j=' + 0);
	mgr.addMarkers(markers, 11);
	mgr.refresh();
}

function addMarker(trackId, Gpoint, title, icon) {
	currentTrackId = trackId;

	var mark = createMarker(trackId, Gpoint, title, icon);
	map.addOverlay(mark, {
		zIndexProcess : getZindex
	});
	return mark;
}

function createMarker(trackId, posn, title, icon, type) {

	var pointLat = posn.lat();
	// alert('lat:'+pointLat);
	var marker = new GMarker(posn, {
		id : trackId,
		title : title,
		icon : icon,
		draggable : true

	}); // zIndexProcess: getZindex(pointLat, trackId)
	// GEvent.addListener(marker, 'dblclick', function(){
	// mgr.removeMarker(marker)
	// }); showEncodedPolyandZoomIn

	if (trackId > 0) {
		GEvent.addListener(marker, 'dblclick', function() {
			showEncodedPolyandZoomIn(trackId);
			showWayPoints(trackId);
		});

		GEvent.addListener(marker, 'click', function() {
			showEncodedPoly(trackId);
			showWayPoints(trackId);
			document.location = root + '/gpstrack/' + trackId;
		});
	}

	return marker;
}

//todo
function getZindex() {
	if (currentTrackId == 0)
		return 100000;
	else
		return 10;
}

function createWayPointMarker(wayPointId, Gpoint, title, html, icon) {
	var marker = new GMarker(Gpoint, {
		id : wayPointId,
		title : title,
		icon : icon,
		draggable : false
	});
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowHtml(html);
	});

	return marker;
}

// staro
function addPoly(points, color, size) {
	// alert('lat:' + points[0].lat + ' lng:' + points[0].lng);
	if (points.length > 0) {

		var pts = [];

		for ( var i = 0; i < points.length; i++) {

			pts[i] = new GPoint(parseFloat(points[i].lng),
					parseFloat(points[i].lat));
		}

		var polyline = new GPolyline(pts, color, size, 1.0);
		// polyline.enableEditing({maxVertices:10} );
		// polyline.enableDrawing({maxVertices:1000, fromStart:true} );
		bounds = polyline.getBounds();
		map.clearOverlays();
		map.addOverlay(polyline);
		map.setCenter(new GLatLng(points[0].lat, points[0].lng), map
				.getBoundsZoomLevel(bounds));

		map.setZoom(map.getBoundsZoomLevel(bounds));
		map.setCenter(bounds.getCenter());

	} else
		alert('Poti ni mogoce naloziti');

}

function addPolyEncoded(id, points, levels, weight, zoomFactor, numLevels,
		color, opacity, action) {
	//alert('Encoded id:' + id );

	if (!action)
		var color = getNextPolyColor();

	poly = new GPolyline.fromEncoded( {
		color : color,
		opacity : opacity,
		weight : weight,
		points : points,
		levels : levels,
		zoomFactor : zoomFactor,
		numLevels : numLevels
	});

	// poly.enableEditing({maxVertices:10} );
	// poly.enableDrawing({maxVertices:1000, fromStart:true} );

	var bounds = poly.getBounds();
	// if (action)
	map.clearOverlays();
	map.addOverlay(poly);

	if (action) {
		polyColorSelectedIndex = 0;
		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds),
				defaultMapType);
		// map.setZoom(map.getBoundsZoomLevel(bounds));
		// map.panTo(bounds.getCenter());
		map.savePosition();
	}

	getTracks(getMaxLat(), getMaxLng(), getMinLat(), getMinLng());

	showWayPoints(id);

	var gStartPoint = poly.getVertex(0);
	var gEndPoint = poly.getVertex(poly.getVertexCount() - 1);
	// alert('-'+roundTo3(gStartPoint.lng())+' - e:'+roundTo3(gEndPoint.lat()));
	if (roundTo3(gStartPoint.lat()) === roundTo3(gEndPoint.lat())
			&& roundTo3(gStartPoint.lng()) === roundTo3(gEndPoint.lng())) {
		var semarker = addMarker(0, gStartPoint, 'Začetek in konec poti',
				roundtripIcon);
	} else {

		var emarker = addMarker(0, gEndPoint, 'Konec poti', endIcon);
		var smarker = addMarker(0, gStartPoint, 'Začetek poti', startIcon);
	}

}

// utils
function roundTo3(X) {
	var X1000 = X * 1000;
	var X1000Round = Math.round(X1000);
	var XroundTo3 = X1000Round / 1000;
	return XroundTo3;
}

// ICONS
var runIcon = new GIcon();
runIcon.image = "http://media.tracksbox.net/images/gIcon_run.png";
runIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
runIcon.iconSize = new GSize(25, 29);
runIcon.shadowSize = new GSize(25, 29);
runIcon.iconAnchor = new GPoint(7, 24);
runIcon.infoWindowAnchor = new GPoint(5, 1);

var xcIcon = new GIcon();
xcIcon.image = "http://media.tracksbox.net/images/gIcon_xc.png";
xcIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
xcIcon.iconSize = new GSize(25, 29);
xcIcon.shadowSize = new GSize(25, 29);
xcIcon.iconAnchor = new GPoint(7, 24);
xcIcon.infoWindowAnchor = new GPoint(5, 1);

var hikeIcon = new GIcon();
hikeIcon.image = "http://media.tracksbox.net/images/gIcon_hike.png";
hikeIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
hikeIcon.iconSize = new GSize(25, 29);
hikeIcon.shadowSize = new GSize(25, 29);
hikeIcon.iconAnchor = new GPoint(7, 24);
hikeIcon.infoWindowAnchor = new GPoint(5, 1);

var mtbIcon = new GIcon();
mtbIcon.image = "http://media.tracksbox.net/images/gIcon_mtb.png";
mtbIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
mtbIcon.iconSize = new GSize(25, 29);
mtbIcon.shadowSize = new GSize(25, 29);
mtbIcon.iconAnchor = new GPoint(7, 24);
mtbIcon.infoWindowAnchor = new GPoint(5, 1);

var raceIcon = new GIcon();
raceIcon.image = "http://media.tracksbox.net/images/gIcon_race.png";
raceIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
raceIcon.iconSize = new GSize(25, 29);
raceIcon.shadowSize = new GSize(25, 29);
raceIcon.iconAnchor = new GPoint(7, 24);
raceIcon.infoWindowAnchor = new GPoint(5, 1);

var trekIcon = new GIcon();
trekIcon.image = "http://media.tracksbox.net/images/gIcon_trek.png";
trekIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
trekIcon.iconSize = new GSize(25, 29);
trekIcon.shadowSize = new GSize(25, 29);
trekIcon.iconAnchor = new GPoint(7, 24);
trekIcon.infoWindowAnchor = new GPoint(5, 1);

var drugoIcon = new GIcon();
drugoIcon.image = "http://media.tracksbox.net/images/gIcon_drugo.png";
drugoIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
drugoIcon.iconSize = new GSize(25, 29);
drugoIcon.shadowSize = new GSize(25, 29);
drugoIcon.iconAnchor = new GPoint(7, 24);
drugoIcon.infoWindowAnchor = new GPoint(5, 1);

var startIcon = new GIcon();
startIcon.image = "http://media.tracksbox.net/images/gIcon_start.png";
startIcon.iconSize = new GSize(12, 12);
startIcon.iconAnchor = new GPoint(6, 6);
startIcon.infoWindowAnchor = new GPoint(6, 6);

var endIcon = new GIcon();
endIcon.image = "http://media.tracksbox.net/images/gIcon_stop.png";
endIcon.iconSize = new GSize(12, 12);
endIcon.iconAnchor = new GPoint(6, 6);
endIcon.infoWindowAnchor = new GPoint(6, 6);

var roundtripIcon = new GIcon();
roundtripIcon.image = "http://media.tracksbox.net/images/gIcon_roundtrip.png";
roundtripIcon.iconSize = new GSize(12, 12);
roundtripIcon.iconAnchor = new GPoint(6, 6);
roundtripIcon.infoWindowAnchor = new GPoint(6, 6);

var clusterIcon = new GIcon();
clusterIcon.image = "http://media.tracksbox.net/images/gIcon_cluster.png";
clusterIcon.iconSize = new GSize(47, 36);
clusterIcon.iconAnchor = new GPoint(37, 32);
clusterIcon.infoWindowAnchor = new GPoint(27, 20);

var peakIcon = new GIcon();
peakIcon.image = "http://media.tracksbox.net/images/gIcon_peak.png";
peakIcon.iconSize = new GSize(12, 12);
peakIcon.iconAnchor = new GPoint(6, 6);
peakIcon.infoWindowAnchor = new GPoint(6, 6);

var polyColors = [ '#B01919', '#0CC916', '#00ff00', '#F0CF13', '#F01397',
		'#13A6F0', '#76F013', '#13F0EC', '#121085', '#121085' ];
var polyColorSelectedIndex = 0;

function getNextPolyColor() {
	var cLenght = polyColors.length;
	polyColorSelectedIndex++;
	if (polyColorSelectedIndex > cLenght)
		polyColorSelectedIndex = 0;

	return polyColors[polyColorSelectedIndex];

}
