
var map = null;

var clusterer_zoom_max = 18; // 클러스터링을 몇 레벨까지 적용할지 설정

//-----------------
// 지도 관련 객체
//-----------------
var maps = {
	owner_marker: null,
	center: null,
	zoom: null,
	infowin: null,
	clusterer: null,
	max_zoom_level: 0,
	max_zoom_service: null,
	bounds_changed_listener: null,

	load: function() { // 지도 로드하기
		var me = maps;
		me.center = new google.maps.LatLng(clat, clng);
		me.zoom = czoom;

		var opt = {
			center: me.center,
			zoom:me.zoom,
			scrollwheel: false,
			scaleControl: true,
			overviewMapControl: true,
			mapTypeId: google.maps.MapTypeId.ROADMAP
		}
		map = new google.maps.Map(document.getElementById('map'), opt);
		me.infowin = new google.maps.InfoWindow();
		me.max_zoom_service = new google.maps.MaxZoomService();

		google.maps.event.addListener(map,'click', function(e) {
			me.infowin.close();
		});
		google.maps.event.addListener(map,'dragend', data.load);
		//google.maps.event.addListener(map,'center_changed', data.load); // infowin 오픈 시 루프돈다
		google.maps.event.addListener(map,'zoom_changed', me.zoom_changed);
		me.bounds_changed_listener = google.maps.event.addListener(map,'bounds_changed', me.bounds_changed); // 지도 로드 후 실행됨
	},
	zoom_in: function() {
		var zoom = map.getZoom() + 1;
		map.setZoom(zoom);
	},
	zoom_out: function() {
		var zoom = map.getZoom() - 1;
		if(zoom < 1) zoom = 1;
		map.setZoom(zoom);
	},
	zoom_changed: function(e) { // 지도 줌레벨 변경 시 이벤트 처리
		var me = maps;
		me.max_zoom_service.getMaxZoomAtLatLng(map.getCenter(), function(response) {
			if(response.status != google.maps.MaxZoomStatus.OK) {
			}
			else {
				me.max_zoom_level = response.zoom;
			}
			data.load();
		});
	},
	bounds_changed: function(e) { // 지도 경계 변경 시 이벤트 처리(지도 로드 후 최초 한번 실행됨)
		var me = maps;
		google.maps.event.removeListener(me.bounds_changed_listener);
		me.zoom_changed(e);
	},
	clear: function() { //모든 마커들을 삭제한다.
		var me = maps;
		markers.clear();
		polys.clear();
		//dirs.clear();
		if(me.owner_marker) me.owner_marker.setMap(null);
		if(me.clusterer) me.clusterer.clearMarkers();
	},
	log: function(s) { // 로그 기록하기
		var t = '';
		t += 'center: '+map.getCenter().toString()+'<br>';
		t += 'zoom: '+map.getZoom().toString()+'<br>';
		t += 'max zoom: '+maps.max_zoom_level+'<br>';
		t += 'marker total = '+markers.array.length+'<br>';
		t += 'poly total = '+polys.array.length+'<br>';

		if(s) t += s;

		document.getElementById('log').innerHTML = t;
	},
	show_loading: function() {
		$('#map_loading').show();
	},
	hide_loading: function() {
		$('#map_loading').hide();
	}
}

//------------
// 마커 객체
//------------
var markers = {
	icon_base_dir: 'http://www.travelomap.com/map/img/map/',
	array: new Array(),
	array_dumy: new Array(),
	search_id: '',
	search_latlng: null,
	search_zoom: 0,

	create: function(r) {
		var me = markers;
		var marker_label_style = 'map_label';
		if(r.owner_name == app_owner_name && r.owner_no == app_owner_no) {
			r.hide_label = true;
			marker_label_style = 'map_label_red';
		}

		var point = new google.maps.LatLng(parseFloat(r.x), parseFloat(r.y));
		var icon = r.icon_url ? r.icon_url : me.icon_base_dir + r.icon_name;
		var marker = null;

		//alert(r.icon_url);

		//if(r.category_no == 4890) { // 지명: 라벨만 표시
		if(r.category_no == '4890'
			|| r.category_no == '4930'
			|| r.category_no == '4929'
			|| r.category_no == '4927'
			|| r.category_no == '5006'
			|| r.category_no == '7058'
			|| r.category_no == '7059'
			|| r.category_no == '7060'
			|| r.category_no == '4926'
			|| r.category_no == '4931'
			|| r.category_no == '5002'
			|| r.category_no == '4928') { // 관광 > 지명
			marker = new google.maps.Marker({
				position: point,
				visible: false
			});
			var label = new Label({map:map,x:18,y:-14}, 'map_labels_simple');
			label.bindTo('position', marker, 'position');
			label.set('text',r.name);
			marker.label = label;

			me.array_dumy.push(marker); // 클러스터에서 처리되지 않게 하기 위해 따로 관리
		}
		else {
			if(r.hide_label) { // 마커만 표시
				marker = new google.maps.Marker({
					position: point,
					icon: icon,
					flat: true
				});
			}
			else { // 마커+라벨 표시
				var label_anchor_x = -18;
				var label_anchor_y = 35;
				if(r.parent_name) { // 종속POI (이미지 넓이나 높이가 고정이 아님)
					label_anchor_x = 0;
					label_anchor_y = 0;
				}
				marker = new MarkerWithLabel({
					position: point,
					icon: icon,
					flat: true,
					labelContent: r.name,
					labelAnchor: new google.maps.Point(label_anchor_x, label_anchor_y),
					labelClass: marker_label_style,
					labelStyle: {opacity: 1.0}
				});
			}

			google.maps.event.addListener(marker, 'click', function (e) {
				var url = '/map/v3/infowin.php?owner_name='+r.owner_name+'&owner_no='+r.owner_no+'&show_infowin_dir_menu='+show_infowin_dir_menu;
				//window.open(url);
				//maps.infowin.setContent('<img src="/images/spinner.gif" />');
				//maps.infowin.open(map, marker);
				$.get(url, function(response) {
					var $c = $('<div>'+response+'</div>');
					maps.infowin.setContent($c[0]);
					maps.infowin.open(map, marker);
				});
			});
			marker.id = r.owner_name+':'+r.owner_no;
			if(r.owner_name == app_owner_name && r.owner_no == app_owner_no) {
			}
			else {
				me.array.push(marker);
			}
		}
		return marker;
	},
	clear: function() {
		var me = markers;
		for(var i in me.array) {
			me.array[i].setMap(null);
			if(me.array[i].label) me.array[i].label.setMap(null);
		}
		for(var i in me.array_dumy) {
			me.array_dumy[i].setMap(null);
			if(me.array_dumy[i].label) me.array_dumy[i].label.setMap(null);
		}
		me.array.length = 0;
		me.array_dumy.length = 0;
	}
}

//------------
// 폴리 객체
//------------
var polys = {
	array: new Array(),
	array_dumy: new Array(),
	create: function(r) {
		var me = polys;
		var path = new Array();
		var points = r.point.split('|');
		for(var i in points) {
			var a = points[i].split(',');
			path.push(new google.maps.LatLng(a[0], a[1]));
		}
		var poly = new google.maps.Polyline({
			map: map,
			path: path,
			position: path[0],
			clickable: false,
			strokeColor: '#FF0000',
			strokeOpacity: 1.0,
			strokeWeight: 1,
			fillColor: '#FF0000',
			fillOpacity: 0.0
		});
		me.array.push(poly);

		var marker = new PolyWithLabel({
			map: map,
			position: path[0],
			flat: true,
			visible: false,
			labelContent: r.name,
			labelAnchor: new google.maps.Point(0, 16),
			labelClass: 'map_label_poly',
			labelStyle: {opacity: 1.0}
		});

		google.maps.event.addListener(marker, 'click', function (e) {
			map.setCenter(new google.maps.LatLng(parseFloat(r.lat), parseFloat(r.lng)));
			map.setZoom(parseInt(r.zoom,10));
		});
		me.array_dumy.push(marker); // 클러스터에서 처리되지 않게 하기 위해 따로 관리
	},
	clear: function() {
		var me = polys;
		for(var i in me.array) {
			me.array[i].setMap(null);
			//me.array[i].label.setMap(null);
		}
		for(var i in me.array_dumy) {
			me.array_dumy[i].setMap(null);
		}
		me.array.length = 0;
		me.array_dumy.length = 0;
	}
}

//--------------
// 길찾기 객체
//--------------
var dirs = {
	directionDisplay: null,
	directionsRenderer: null,
	origin: null,
	destination: null,

	init: function() { // 초기화
		var me = dirs;
		me.origin = new google.maps.LatLng(37.7699298, -122.4469157);
		me.destination = new google.maps.LatLng(37.7683909618184, -122.51089453697205);
		me.directionsService = new google.maps.DirectionsService();
		me.directionsRenderer = new google.maps.DirectionsRenderer();
		me.directionsRenderer.setMap(map);
	},
	set: function(fromto,ownm,owno) {
		//--------------------------
		// 길찾기 폼에 입력값 세팅
		//--------------------------
		//alert(fromto+' / '+ownm+' / '+owno);
		location.href = '/hotel/direction/index.php?fromto='+fromto+'&ownm='+ownm+'&owno='+owno;
	},
	route: function() { // 길찾기
		var me = dirs;
		var request = {
			origin: me.origin,
			destination: me.destination,
			travelMode: google.maps.DirectionsTravelMode['DRIVING'] // WALKING, BICYCLING
		};
		me.directionsService.route(request, function(response, status) {
			if(status == google.maps.DirectionsStatus.OK) {
				me.directionsRenderer.setDirections(response);
			}
		});
	},
	clear: function() {
		var me = dirs;
		me.directionsRenderer.setMap(null);
	}
}

//---------------------
// 데이터 로드하기
//---------------------
var data = {
	load: function() {
		maps.show_loading();

		var b = map.getBounds();
		var ne = b.getNorthEast();
		var sw = b.getSouthWest();
		var zoom = map.getZoom();
		var bounds = sw.toUrlValue()+','+map.getCenter().toUrlValue()+','+ne.toUrlValue();

		var url = '/map/v3/json.php?url_no='+app_url_no+'&lang='+lang+'&zoom='+zoom+'&max_zoom='+maps.max_zoom_level+'&bounds='+bounds
		//window.open(url);

		$.get(url, function(response) {
			maps.clear();

			if(response) {
				var xml_markers = response.marker;
				var len = xml_markers ? xml_markers.length : 0;
				var hide_label = (len > show_label_per_marker) ? true : false;
				$(xml_markers).each(function(i,r) {
					r.hide_label = hide_label;
					markers.create(r);
				});
				maps.clusterer = new MarkerClusterer(map, markers.array, {maxZoom:clusterer_zoom_max}); //, {maxZoom: maps.max_zoom_level});

				var xml_polys = response.poly;
				$(xml_polys).each(function(i,r) {
					polys.create(r);
				});
			}
			maps.hide_loading();
		},'json');
	}
}

