/*
// 지도에 마커를 표시합니다
marker.setMap(netk_map.map);
*/
var netk_map = function() {

	this.zoom_use = false;

	this.basic_int = {}; // : 위도,경도,줌 기본값.
	this.basic_road = {}; // : 로드뷰 기본값

	this.map;
	this.mapCenter;
	this.marker = {};
	this.geocoder;
	this.clusterer;

	this.rvResetValue = {} //로드뷰의 초기화 값을 저장할 변수
	this.mapWalker = null;
	this.viewpoint_init = {'pan':0, 'tilt':0, 'zoom':0};

// : 지도불러오기
	this.map_start = function(id, arr) {
		arr['lat'] = arr['lat'] ? arr['lat'] : this.basic_int['lat'];
		arr['lng'] = arr['lng'] ? arr['lng'] : this.basic_int['lng'];
		arr['zoom'] = arr['zoom'] ? arr['zoom'] : this.basic_int['zoom'];
		this.mapContainer = document.getElementById(id); // 지도를 표시할 div 
		map_etc_class.mapCenter = new daum.maps.LatLng(arr['lat'], arr['lng']), // 지도의 중심 좌표

		mapOption = { 
			center: map_etc_class.mapCenter, // 지도의 중심좌표
			keyboardShortcuts: true,
			scrollwheel:true,
			draggable:true,
			level: arr['zoom'] // 지도의 확대 레벨
		};

		// 지도를 표시할 div와  지도 옵션으로  지도를 생성합니다
		this.map = new daum.maps.Map(this.mapContainer, mapOption);
		//this.map.addOverlayMapTypeId(daum.maps.MapTypeId.TRAFFIC); // : 교통정보
		//this.map.addOverlayMapTypeId(daum.maps.MapTypeId.ROADVIEW); // : 로드뷰 도로
		//this.map.addOverlayMapTypeId(daum.maps.MapTypeId.TERRAIN); // : 지형정보

		// 지도 확대 축소를 제어할 수 있는  줌 컨트롤을 생성합니다
		/*
		if(map_etc_class.zoom_use) {
			var zoomControl = new daum.maps.ZoomControl();
			this.map.addControl(zoomControl, daum.maps.ControlPosition.RIGHT);
		}
		*/

		this.geocoder = new daum.maps.services.Geocoder();
	}

// : 로드뷰 불러오기
	this.load_start = function(id, arr) {
		var _arr = {};
		_arr['pan'] = arr['pan'] ? arr['pan'] : map_etc_class.basic_road['pan'];
		_arr['tilt'] = arr['tilt'] ? arr['tilt'] : map_etc_class.basic_road['tilt'];
		_arr['zoom'] = arr['zoom'] ? arr['zoom'] : map_etc_class.basic_road['zoom'];

		try{
			map_etc_class.rvContainer = document.getElementById(id); // 로드뷰를 표시할 div
			map_etc_class.rv = new daum.maps.Roadview(map_etc_class.rvContainer); // 로드뷰 객체 생성
			map_etc_class.rc = new daum.maps.RoadviewClient(); // 좌표를 통한 로드뷰의 panoid를 추출하기 위한 로드뷰 help객체 생성
			
			map_etc_class.viewpoint_changed();
			map_etc_class.rc.getNearestPanoId(map_etc_class.mapCenter, 50, function(panoId) {
				map_etc_class.rv.setPanoId(panoId, map_etc_class.mapCenter);//좌표에 근접한 panoId를 통해 로드뷰를 실행합니다.
				if(_arr.pan) {
					map_etc_class.rv.setViewpoint(_arr);
				}
				//map_etc_class.rvResetValue.panoId = panoId;
			});
		}catch(e){
			alert("크롬을 사용하신다면 도메인앞의 느낌표를 누르시고 Flash항목에 이사이트에서 항상허용을 체크하시면 다음로드뷰가 작동됩니다.");
		}
	}

/*############################################
basic 기능
############################################*/
// : 지도에 마커표시
	this.markerObj= function(key, json) {
		map_etc_class.marker[key] = new daum.maps.Marker({ 
			// 지도 중심좌표에 마커를 생성합니다 
			position: map_etc_class.map.getCenter()
		});
		map_etc_class.marker[key].setMap(map_etc_class.map);
		if(json && json.loadview && map_etc_class.rv) map_etc_class.rv.setViewpoint(map_etc_class.viewpoint_init);
	}



/*############################################
함수모음
############################################*/
	this.get_latlng = function() {
		var center = map_etc_class.map.getCenter();
		lat = center.getLat();
		lng = center.getLng();
		return {lat:lat, lng:lng};
	}

	this.get_zoom = function() {
		return map_etc_class.map.getLevel();
	}

	this.relayout = function() {
		netk_map.map.relayout();
	}

// : 지도등록시 사용
	this.marker_put = function(re, json) {
		var map_input = '';

		if(map_etc_class.marker[0]) map_etc_class.marker[0].setMap(null);
		map_etc_class.markerObj(0, json);
		map_etc_class.marker[0].setPosition(re['latlng']);
		if(map_etc_class.rv) map_etc_class.load_toggle(re['latlng']);
		map_etc_class.map.relayout();

		if($("._map_input")[0]) {
			map_input += '<input type="hidden" name="map_int[]" value="'+re['latlng'].getLat()+'" />';
			map_input += '<input type="hidden" name="map_int[]" value="'+re['latlng'].getLng()+'" />';
			$("._map_input").html(map_input);
		}
	}

// : 주소로 지도이동후 마커찍기
	this.address_move = function(address, json) {
		if(!map_etc_class.geocoder) map_etc_class.geocoder = new daum.maps.services.Geocoder();
		map_etc_class.geocoder.addressSearch(address, function(result, status) {
			// 정상적으로 검색이 완료됐으면 
			if (status === daum.maps.services.Status.OK) {
				netk_map.address_move_marker(result[0].y, result[0].x, json);
			}
		});
	};


	this.address_move_marker = function(lat, lng, json) {
		var coords = new daum.maps.LatLng(lat, lng);
		var _json = {'latLng':coords, 'lat':lat, 'lng':lng};
		var re = netk_map.get_json(_json, lat, lng);
		netk_map.marker_put(re, json);
		netk_map.map.setLevel(3);
		netk_map.map.setCenter(coords);
		/*
		// 인포윈도우로 장소에 대한 설명을 표시합니다
		var infowindow = new daum.maps.InfoWindow({
			content: '<div style="width:150px;text-align:center;padding:6px 0;">우리회사</div>'
		});
		
		infowindow.open(map_etc_class.map, marker);
		*/
	}




/*############################################
이벤트 함수모음
############################################*/
/*
지도 이벤트
*/
// : 이벤트 실행시 값 가져오기
	this.get_json = function(mouseEvent) {
		var result = {};
		
		// 지도 영역정보를 얻어옵니다 
		var bounds = map_etc_class.map.getBounds();

		// 영역정보의 남서쪽 정보를 얻어옵니다 
		var swLatlng = bounds.getSouthWest();
		// 영역정보의 북동쪽 정보를 얻어옵니다 
		var neLatlng = bounds.getNorthEast();

		// 마커의 위치를 지도중심으로 설정합니다 
		//marker.setPosition(map.getCenter()); 
		//marker.setMap(map);

		result['sw'] = swLatlng;
		result['ne'] = neLatlng;
		

		result['level'] = map_etc_class.map.getLevel();
		result['latlng'] = mouseEvent.latLng;

		if($("#roadview")[0] && map_etc_class.rv) {
			map_etc_class.rv.setViewpoint(map_etc_class.viewpoint_init);
		}

		return result;
	}


	this.get_load_json = function(position, panoId) {
		var road_input='';
		/*
		//각 뷰포인트 값을 초기화를 위해 저장해 놓습니다.
		map_etc_class.rvResetValue.pan = viewpoint.pan; //  : 좌우
		map_etc_class.rvResetValue.tilt = viewpoint.tilt; // : 높낮이
		map_etc_class.rvResetValue.zoom = viewpoint.zoom; // : 줌
		*/
		var result = {};

		var viewpoint = map_etc_class.rv.getViewpoint();

		// : 로드뷰 위치 가져오기
		result['vp_pan'] = viewpoint.pan;
		result['vp_tilt'] = viewpoint.tilt;
		result['vp_zoom'] = viewpoint.zoom;

		if($("._map_input")[0]) {
			road_input += '<input type="hidden" name="road_int[pan]" value="'+viewpoint.pan+'" />';
			road_input += '<input type="hidden" name="road_int[tilt]" value="'+viewpoint.tilt+'" />';
			road_input += '<input type="hidden" name="road_int[zoom]" value="'+viewpoint.zoom+'" />';

			$("._road_input").html(road_input);
		}

		return result;
	}


// : 좌표클릭시 지도위치 가져오기
// : lat : 위도, lng : 경도
	this.get_location = function(func) {
		daum.maps.event.addListener(map_etc_class.map, 'click', function(mouseEvent) {
			var re = map_etc_class.get_json(mouseEvent);
			eval(func);
		});
	}


// : 지도 확대 축소시 지도정보 가져오기
	this.zoom_change = function(func) {
		daum.maps.event.addListener(map_etc_class.map, 'zoom_changed', function(mouseEvent) {
			eval(func);
		});
	}


// : 지도 중심좌표가 변경되면 지도 정보가 표출됩니다
	this.center_changed = function(func) {
		daum.maps.event.addListener(map_etc_class.map, 'center_changed', function(mouseEvent) {
			var re = map_etc_class.get_json(mouseEvent);
			eval(func);
		});
	}


// : 영역 변경 이벤트 등록하기
	this.bounds_changed = function(func) {
		daum.maps.event.addListener(map, 'bounds_changed', function(mouseEvent) {
			var re = map_etc_class.get_json(mouseEvent);
			eval(func);
		});
	}


// : 타일로드 이벤트 등록하기
	this.tilesloaded = function(func) {
		daum.maps.event.addListener(map, 'tilesloaded', function(mouseEvent) {
			var re = map_etc_class.get_json(mouseEvent);
			eval(func);
		});
	}

	// : arr [1,5]이면 1이 최소, 5가 최대
	this.zoom_zoomable = function(arr) {
		if(arr[1]>=map_etc_class.map.getLevel())
			map_etc_class.map.setZoomable(false);
		else
			map_etc_class.map.setZoomable(true);
	}


	this.info_window = function(con, lat, lng) {
		var iwContent = con; // 인포윈도우에 표출될 내용으로 HTML 문자열이나 document element가 가능합니다
		var iwPosition = new daum.maps.LatLng(lat, lng); //인포윈도우 표시 위치입니다

		// 마커를 생성합니다
		var marker = new daum.maps.Marker({
			position: iwPosition
		});

		// 인포윈도우를 생성합니다
		var infowindow = new daum.maps.InfoWindow({
			position : iwPosition, 
			content : iwContent 
		});

		// 마커 위에 인포윈도우를 표시합니다. 두번째 파라미터인 marker를 넣어주지 않으면 지도 위에 표시됩니다
		infowindow.open(map_etc_class.map, marker); 
	}

	// : lat : 위도, lng : 경도
	this.cluster_click = function() {
		// 마커 클러스터러에 클릭이벤트를 등록합니다
		// 마커 클러스터러를 생성할 때 disableClickZoom을 true로 설정하지 않은 경우
		// 이벤트 헨들러로 cluster 객체가 넘어오지 않을 수도 있습니다
		var _arr = {};
		daum.maps.event.addListener(map_etc_class.clusterer, 'clusterclick', function(cluster) {
			alert(cluster.getBounds());
		});
	}


	this.cluster_made = function() {
		map_etc_class.clusterer = new daum.maps.MarkerClusterer({
			map: map_etc_class.map, // 마커들을 클러스터로 관리하고 표시할 지도 객체 
			averageCenter: true, // 클러스터에 포함된 마커들의 평균 위치를 클러스터 마커 위치로 설정 
			minLevel: 1, // 클러스터 할 최소 지도 레벨 
		});

		if(func) {
			setTimeout(function(){
				eval(func);
			},100);
		}
	}

	// 데이터를 가져오기 위해 jQuery를 사용합니다
	// 데이터를 가져와 마커를 생성하고 클러스터러 객체에 넘겨줍니다
	this.set_cluster = function(url, kind, func) {
		$.get(url, function(data) {
			data = $.parseJSON(data);
			// 데이터에서 좌표 값을 가지고 마커를 표시합니다
			// 마커 클러스터러로 관리할 마커 객체는 생성할 때 지도 객체를 설정하지 않습니다
			var markers = $(data.positions).map(function(i, position) {
				return new daum.maps.Marker({
					position : new daum.maps.LatLng(position.lat, position.lng)
				});
			});

			// 클러스터러에 마커들을 추가합니다
			map_etc_class.clusterer.addMarkers(markers);
			//map_etc_class.cluster_click();
		});
	}


/*
로드뷰 이벤트
*/
	this.load_init = function(func, position) {
		// 로드뷰 초기화 이벤트
		daum.maps.event.addListener(map_etc_class.rv, 'init', function(panoId) {
			map_etc_class.get_load_json(position, panoId);
			eval(func);
		});
	}


	this.viewpoint_changed = function(func, position) {
		daum.maps.event.addListener(map_etc_class.rv, 'viewpoint_changed', function(panoId){
			map_etc_class.get_load_json(position, panoId);
			eval(func);
		});
	}


	this.load_toggle = function(position) {
		map_etc_class.rc.getNearestPanoId(position, 50, function(panoId) {
			map_etc_class.rv.setPanoId(panoId, position);
		});
	}

	// 지도 확대, 축소 컨트롤에서 확대 버튼을 누르면 호출되어 지도를 확대하는 함수입니다
	this.zoom_control = function(type) {
		if(type=='-') map_etc_class.map.setLevel(map_etc_class.map.getLevel() + 1);
		else map_etc_class.map.setLevel(map_etc_class.map.getLevel() - 1);
	}






	// : 지도 이동 이벤트 핸들러
	this.map_big = function(el, txt) {
		var center = map_etc_class.map.getCenter();
		lat = center.getLat();
		lng = center.getLng();

		el.href = 'http://map.daum.net/link/map/' + encodeURIComponent(txt) + ',' + lat + ',' + lng; //Daum 지도로 보내는 링크
	}

	// : 로드뷰 이동 이벤트 핸들러
	this.load_big = function(el) {
		var panoId = map_etc_class.rv.getPanoId(); //현 로드뷰의 panoId값을 가져옵니다.
		var viewpoint = map_etc_class.rv.getViewpoint(); //현 로드뷰의 viewpoint(pan,tilt,zoom)값을 가져옵니다.
		el.href = 'http://map.daum.net/?panoid='+panoId+'&pan='+viewpoint.pan+'&tilt='+viewpoint.tilt+'&zoom='+viewpoint.zoom; //Daum 지도 로드뷰로 보내는 링크
	}
}

if(map_engine=='daum') {
	var netk_map = new netk_map();
	var class_txt = 'netk_map';
} else {
	var netk_etc_map = new netk_map();
	var class_txt = 'netk_etc_map';
}

var map_etc_class = eval(class_txt);