/**
 * @author Vitaly
 * @copyright Pikkles Co., Ltd. 2009
 */

var APP = {};

APP = {
	map: null,
	geocoder: null,
	lat: null,
	lng: null,
	zoom: 17,
	controls: {
	},
	draw: {
		poly: null,
		polyPoints: []
	},
	markers: {
	},
	allMarkers: [],
	landmarks: false
};

APP.listing_icons = {
	1: 'restaurants-bars',
	2: 'environment',
	3: 'health-beauty',
	4: 'shopping',
	5: 'travel',
	6: 'living'
};

APP.landmark_icons = {
	1: 'airport',
	2: 'atm',
	3: 'attraction',
	4: 'city-office',
	5: 'embassy',
	6: 'government',
	7: 'hospital',
	8: 'park',
	9: 'police',
	10: 'post-office',
	11: 'school',
	12: 'temple',
	13: 'train'
};

function initMap(config) {
	APP.geocoder = config.geocoder || false;
	APP.lat = config.lat || 35.69106;
	APP.lng = config.lng || 139.7067408;
	APP.zoom = config.zoom || 17;
	// check if there are more then one marker, and if so set zoom level to show all markers
	APP.bounds = new GLatLngBounds();
	var markersCount = 0;
	if (config.markers) {
		for (i in config.markers) {
			markersCount += 1;
			APP.bounds.extend(new GLatLng(config.markers[i].lat, config.markers[i].lng));
		}
	}
	APP.controls.smallmap = config.controls.smallmap || false;
	APP.controls.maptype = config.controls.maptype || false;
	APP.markers = config.markers || false;
	APP.landmarks = config.landmarks || false;
	if (GBrowserIsCompatible()) {
			_mPreferMetric = true;
		// instantiate classes
		APP.map = new GMap2(document.getElementById("map"));
		console.log('Using API version ' + G_API_VERSION);
		// a map needs to be centered before it can be used
		if (markersCount > 1) {
			APP.map.setCenter(APP.bounds.getCenter(), APP.map.getBoundsZoomLevel(APP.bounds));
		} else {
			APP.map.setCenter(new GLatLng(APP.lat, APP.lng), APP.zoom);
		}
		// add controls
		if (APP.geocoder) APP.geocoder = new GClientGeocoder();;
		if (APP.controls.smallmap) APP.map.addControl(new GSmallMapControl());
		if (APP.controls.maptype) APP.map.addControl(new GMapTypeControl());
		if (APP.markers) showListingMarkers(APP.markers);
		if (markersCount <= 1) {
			if (typeof dir_points !== 'undefined' && dir_points) {
				for(var n = 0 ; n < dir_points.length; n++) {
					APP.draw.polyPoints.push(new GLatLng(dir_points[n][0], dir_points[n][1]));
				}
				drawPolyFromPoints(APP.draw.polyPoints);
			};
		}

		if (APP.landmarks && markersCount <= 1) showLandmarksMarkers();
	}
}

function drawPolyFromPoints(points) {
	APP.draw.poly = new GPolyline(points, "blue", 7);
	APP.map.addOverlay(APP.draw.poly);
}

function clearMarkers(markers) {
	for (i in markers) {
		APP.map.removeOverlay(APP.allMarkers[i]);
	}
	APP.allMarkers.length = 0;
}

function createDefaultMarker(point) {
	var icon = new GIcon(G_DEFAULT_ICON);
	var marker = new GMarker(point, icon);
	return marker;
}

function showListingMarkers(markers) {
	for (i in markers) {
		var point = new GLatLng(markers[i].lat,markers[i].lng);
		var marker = createListingMarker(point, markers[i]);
		APP.map.addOverlay(marker);
	}
}

function createListingMarker(point, m) {
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = '/images/map-icons/' + APP.listing_icons[m.type] + '.png';
	icon.shadow = false;
	icon.iconSize = new GSize(48, 60);
	icon.iconAnchor = new GPoint(24, 60);
	icon.infoWindowAnchor = new GPoint(24, 0);
	icon.transparent = '/images/map-icons/imageMap.png';
	icon.imageMap = [0, 0, 48, 0, 48, 60, 0, 60];
	var marker = new GMarker(point, icon);
	if (m.popup) {
		var html = '<div class="left"><img src=' + m.image + ' width="120" height="100" /></div>';
		html += '<div class="right"><h2><a href="' + m.url + '">' + m.title + '</a></h2>';
		html += '<p>Tel: ' + m.phone + '</p></div><div class="clearer">&nbsp;</div>';
		GEvent.addListener(marker, "mouseover", function() {
			marker.openExtInfoWindow(
							APP.map,
							"map_popup",
							html,
							{
								beakOffset: -1,
								paddingX: 10,
								paddingY: 10
							}
						);
			/*marker.openInfoWindowHtml(html);*/
		});
	}
	APP.allMarkers.push(marker);
	return marker;
}

function showLandmarksMarkers() {
	var bounds = APP.map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var getVars = 'ne=' + northEast.toUrlValue() + '&sw=' + southWest.toUrlValue();
	//retrieve the points using Ajax
	var request = GXmlHttp.create();
	request.open('GET', '/services/get-landmarks-client.php?' + getVars, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var jscript = request.responseText;
			var points;
			eval(jscript);
			//create each point from the list
			for (i in points) {
				var point = new GLatLng(points[i].lat,points[i].lng);
				var marker = createLandmarkMarker(point, points[i]);
				APP.map.addOverlay(marker);
			}
		}
	}
	request.send(null);
}

function createLandmarkMarker(point, m) {
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = '/images/map-icons/' + APP.landmark_icons[m.type] + '.png';
	icon.shadow = false;
	icon.iconSize = new GSize(32, 32);
	icon.iconAnchor = new GPoint(16, 32);
	icon.infoWindowAnchor = new GPoint(16, 0);
	icon.transparent = '/images/map-icons/imageMapLandmark.png';
	icon.imageMap = [0, 0, 32, 0, 32, 32, 0, 32];
	var marker = new GMarker(point, icon);
	var html = '<h2>' + m.title + '</h2>';
	GEvent.addListener(marker, "mouseover", function() {
		marker.openExtInfoWindow(
					APP.map,
					"landmark_popup",
					html,
					{
						beakOffset: 1,
						paddingX: 10,
						paddingY: 10
					}
				);
	});
	APP.allMarkers.push(marker);
	return marker;
}