PageSourceSearch

https://skybay.co.kr/js/map.js?1789032726

js skybay.co.kr collected 2026-09-24 12:27:26 UTC 72,785 bytes, 2,078 lines download raw bytes

1
2var MAP = function(){
3
4	var total_file_size = 0;
5	var $map_form, $map_editor, $board_container;
6	// 아래 배열들은 map_data[board_code][data] 식으로 2차 배열로 사용(원페이지 구성 대응)
7	var map_data = [];
8	var naver_map = [];
9	var markers = [], infowindows = [];		// 네이버 지도용 infowindow 배열
10	var cluster = [];		// 마커 클러스터링 배열
11	var google_cluster_maxzoom = 16;
12	var naver_cluster_maxzoom = 13;
13	var naver_cluster_marker1, naver_cluster_marker2, naver_cluster_marker3, naver_cluster_marker4, naver_cluster_marker5;
14	var isIOS, isSafari, $fr_m_custom, $write_header, m_sticky_container_trigger_top, $toolbarContainer;
15	var target_map, target_marker;		// 글쓰기 화면이나 게시물 본문 등 단일 지도에서 사용
16
17	/***
18	 * 안드로이드앱에서 post글쓰기시 이미지 업로드 완료시 처리
19	 * @param image
20	 */
21
22	/*
23	var $image_list_obj = {};
24	//이미지 임시저장 리스트 추가
25	if(!($image_list_obj.length > 0)) {
26		var image_list_html = $("<ul id='image_list' style='display: none'></ul>");
27		$("body").append(image_list_html);
28		$image_list_obj = image_list_html;
29	}
30
31	var android_que = [];
32	var androidAppPostImageUploadComplete = function(image){
33		if(image.tmp_idx > 0){
34			android_que.push(image);
35			if(image.is_last == "Y") androidAppPostImageUploadAllComplete();
36		}
37	};
38
39	var androidAppPostImageUploadAllComplete = function(){
40		androidAppPostImageInsert(android_que[0]);
41	};
42
43	var androidAppPostImageInsert = function(image){
44		$map_editor.find('#map_body').froalaEditor('image.insert', CDN_UPLOAD_URL+image.url, true);
45		var img = $froala_obj.find('img[src="'+CDN_UPLOAD_URL+image.url+'"]');
46		img.data(image);
47		postAddImage(image.tmp_idx,image.size);
48		android_que.splice(0,1);
49	};
50
51	var postAddImage = function(tmp_idx,size){
52		var uniq_id = makeUniq('image_');
53		var hidden_input = $('<input name="temp_images[]" value="' + tmp_idx + '" type="hidden" />');
54		var li 	= $('<li>').attr('id',uniq_id).data({'item':uniq_id,size:size});
55		li.append(hidden_input);
56		$image_list_obj.append(li);
57	};
58	/**
59	 * 지도 게시물 클릭 시 이벤트 선언
60	 * @param b_code
61	 * @param $obj		글쓰기 화면에서 호출 시 에디터 클래스, 그 외에는 null
62	 * @param api
63	 * @param category_list
64	 */
65	var mapInitWrite = function(b_code, $obj, api, category_list, placeholder_edit){
66		$map_form = $('#map_form');
67		$board_container = $('#board_container');
68		var board_code = b_code;
69		var map_api = api === 'naver' ? 'naver' : 'google';
70		var category_data;
71		var current_position; //같은 컨테이너 클릭시 DB조회 없이 마커만 이동하기위한 변수
72		if(category_list) category_data = categoryList(category_list);
73		if(typeof markers[board_code] === 'undefined') markers[board_code] = [];
74		if(typeof infowindows[board_code] === 'undefined') infowindows[board_code] = [];
75		if($obj){
76			$("body").addClass("write_mode");
77			$map_editor = $obj;
78			if(IE_VERSION < 10){
79				CKEDITOR.replace( 'map_body',{
80					filebrowserImageUploadUrl: '/ajax/post_image_upload.cm?board_code='+b_code
81				});
82			}else{
83        setFroala('#map_form #map_body', {
84          code : board_code,
85          image_upload_url : "/ajax/post_image_upload.cm",
86          file_upload_url : "/ajax/post_file_upload.cm",
87          file_list_obj : $("#file_list"),
88          'placeholderText': placeholder_edit,
89          'image_display' : 'inline',
90          mobile_custom: true
91        });
92			}
93
94			$map_form.find('#delete_cover_image').on('click',function(){
95				deleteCoverImage($map_form);
96			});
97
98			$map_form.find('#upload_cover_image').setUploadImage({
99				url : '/ajax/upload_image.cm',
100				formData : {target : 'post', 'temp' : 'Y', 'param_name' : 'cover_image'}
101			}, function (msg, data,res) {
102				$.each(res.cover_image,function(i,file){
103					if(file.tmp_idx > 0){
104						$map_form.find('#cover_image').val(file.url);
105						$map_form.find('#cover_image_tmp_no').val(file.tmp_idx);
106						$map_form.find('#delete_cover_image').show();
107						$board_container.toggleClass('bg_on',true);
108						$board_container.find('._cover_image').css('background-image',"url("+CDN_UPLOAD_URL+file.url+")");
109						$board_container.find('._cover_image_src').attr('src',CDN_UPLOAD_URL+file.url);
110					}
111				});
112			});
113
114			isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
115			isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
116			$fr_m_custom = $board_container.find('._fr-m-custom');
117			$write_header = $board_container.find('._write_header');
118			m_sticky_container_trigger_top = $fr_m_custom.offset().top - $fr_m_custom.height();
119			$toolbarContainer = $fr_m_custom.find('#toolbarContainer');
120			if(isIOS && isSafari){
121				$write_header.css('position', 'absolute');
122			}
123			var timeoutTime = isIOS && isSafari ? 100 : 10;
124			var resize_time;
125			resizeStickyContainer();
126			$(window).off('scroll.mobile_write resize.mobile_write').on('scroll.mobile_write resize.mobile_write',function(){
127				var s_top = $(this).scrollTop();
128				if(isIOS && isSafari){
129					$write_header.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 0});
130					if(s_top > m_sticky_container_trigger_top){
131						$toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 0});
132					}
133				}
134				if(resize_time) {
135					clearTimeout(resize_time);
136				}
137				resize_time = setTimeout(function() {
138					resizeStickyContainer();
139				}, timeoutTime);
140			});
141
142			$obj.find('._map_search').keypress(function(e){
143				if(e.keyCode == '13'){
144					mapAddressSearch($(this).val(), map_api);
145				}
146			});
147
148			//지도게시판 부제목 반영전까지 해당기능 off / 부제목 기능 추가시 다시 on 시켜야함
149			//$obj.find('#number').on('keydown').check_callnum();
150		}
151
152		if(!IS_MOBILE){
153			$('#map_list_fold_' + board_code).find('._map_container').on('click', function(){
154				if($(this).attr('data-bcode') === board_code){
155					var post_id = $(this).attr('id');
156					var pos_x = parseFloat($('#' + post_id).find('._pos_x_temp').val());
157					var pos_y = parseFloat($('#' + post_id).find('._pos_y_temp').val());
158					if(map_api === 'naver'){
159						if(current_position !== post_id){ //현재 떠있는 팝업과 다른 컨테이너 클릭시에만 DB조회
160							infowindows[board_code][post_id].setContent(getInfoWindowData(board_code, post_id));
161							infowindows[board_code][post_id].open(naver_map[board_code], markers[board_code][post_id]);
162							current_position = post_id;
163						}
164						// 해당 마커를 지도 중심으로 이동
165						naver_map[board_code].setOptions({
166							center: new naver.maps.LatLng(pos_y, pos_x),
167							zoom: naver_cluster_maxzoom + 1
168						});
169						naverMarkCenter(naver_map[board_code]);
170					}else{
171						var get_data = $('#gmap_' + board_code).gmap3({get: {id: post_id}});
172						var info_close = $('#gmap_' + board_code).gmap3({get: {name: "infowindow"}});
173						if(info_close){
174							info_close.close();
175						}
176						var map_data = '';
177						var count = 0;
178						$('#gmap_' + board_code).gmap3({
179							exec: {
180								id: post_id,
181								func: function(data){
182									if(count == 4){
183										map_data = data;
184									}
185									count++;
186								}
187							}
188						});
189						$('#gmap_' + board_code).gmap3({
190							map: {
191								options: {
192									center: [pos_y, pos_x],
193									scaleControl: true,
194									maxZoom: 19,
195									minZoom: 3,
196									zoom: google_cluster_maxzoom + 1,
197									mapTypeControl: false,
198									streetViewControl: false,
199									controlSize: 29
200								}
201							},
202							infowindow: {
203								anchor: get_data,
204								options: {position: [pos_y, pos_x], content: getInfoWindowData(board_code, post_id)}
205							}
206						});
207
208						var map_comment_count = 0;
209						var like_cnt = 0;
210						var read_cnt = 0;
211						var idx_arr = post_id.split('list_');
212						map_comment_count = Math.round($('#' + post_id).find('._comment_count').text());
213						like_cnt = Math.round($('#' + post_id).find('._like_count').text());
214						read_cnt = Math.round($('#' + post_id).find('._read_count').text());
215						$('#list_pop_' + idx_arr[1]).find('._comment_count').text(map_comment_count);
216						$('#list_pop_' + idx_arr[1]).find('._like_count').text(like_cnt);
217						$('#list_pop_' + idx_arr[1]).find('._read_count').text(read_cnt);
218					}
219				}
220			});
221		}
222
223
224
225		document.onkeydown = function(evt) {
226			if(evt.keyCode == 27){
227				$('html').removeClass('fullboard_on');
228				$('body').find('#maps_more').remove();
229				$('body').css('overflow','');
230				location.hash = '';
231				//$map_editor.hide();
232				$('._calendar_modal_back').hide();
233				if($map_form.find('#add_address_ck').val() == 'N'){
234					searchDataClear('close');
235				}
236				$('._cancel').trigger('click');
237			}
238		}
239
240
241	};
242
243	function resizeStickyContainer(){
244		var s_top = $(this).scrollTop();
245		if(isIOS && isSafari){
246			$write_header.css({'-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px'});
247			$fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
248			$fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top);
249			if(s_top > m_sticky_container_trigger_top){
250				$toolbarContainer.css({'-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px'});
251				$map_form.find('#map_body').css('padding-top', '50px');
252			}else{
253				$toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 'auto'});
254				$map_form.find('#map_body').css('padding-top', '');
255			}
256		}else{
257			$fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
258		}
259		if($(window).width() >= 768){
260			if($board_container.hasClass('bg_on'))
261				$board_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 487);
262			else
263				$board_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 180);
264		}
265	}
266
267
268	var deleteCoverImage = function(){
269		$map_form.find('#cover_image').val('');
270		$map_form.find('#cover_image_tmp_no').val('');
271		$board_container.toggleClass('bg_on',false);
272		$board_container.find('._cover_image').css('background-image','none');
273		$board_container.find('._cover_image_src').attr('src','');
274		$map_form.find('#delete_cover_image').hide();
275	};
276
277	var toggleAlarmPopup = function(){
278		$('#alarm_popup').toggleClass('open');
279		if($('#alarm_popup').hasClass('open')){
280			$(window).on('click.alarm_popup',function(event){
281				var $top_closest = $(event.target).closest('a');
282				if($top_closest.attr('id')!='dLabel'){
283					var $closest = $(event.target).closest('ul');
284					if($closest != null && !$closest.hasClass('dropdown-menu')){
285						$('#alarm_popup').removeClass('open');
286						$(window).off('click.alarm_popup');
287						var alarm_group_list = $('#alarm_popup').find("input[type='checkbox']").is(":checked");
288						if(alarm_group_list) $('#dLabel').addClass('active');
289						else $('#dLabel').removeClass('active');
290					}
291				}
292			});
293		}
294	};
295	/**
296	 * 마커 위치 데이터 받아서 map_data 배열에 저장
297	 * @param board_code
298	 * @param keyword
299	 * @param keyword_type
300	 * @param sort
301	 * @param category
302	 */
303	var addMapData = function(board_code, keyword, keyword_type, sort, category){
304		if(typeof map_data[board_code] === 'undefined') map_data[board_code] = [];
305		$.ajax({
306			type : 'post',
307			data : {
308				'board_code': board_code,
309				'search': keyword,
310				'search_mod': keyword_type,
311				'sort': sort,
312				'status': category
313			},
314			url : '/ajax/get_map_data.cm',
315			dataType : 'json',
316			async : false,
317			cache : false,
318			success : function(result){
319				if(result.msg == 'SUCCESS'){
320					var map_data_array = result.map_data_array;
321					for(var key in map_data_array){
322						map_data[board_code].push(JSON.parse(map_data_array[key]));
323					}
324				}
325			}
326		});
327	};
328	/**
329	 *	게시물 수정 중 장소 수정 창을 띄움
330	 * @param map_api		naver, google, null(지도 API 키가 없을 때 수정 불가)
331	 */
332	var mapEditorPop = function(map_api){
333		if(map_api){
334			$map_editor.show();
335			$('._calendar_modal_back').show();
336			if($map_form.find('#pos_x').val() && $map_form.find('#pos_y').val()){
337				setMap($map_form.find('#pos_y').val(), $map_form.find('#pos_x').val(), 'N', null, null, map_api, true, 'Y', $map_form.find('#zoom').val(), getMarkerByColorType($map_form.find('#category_color_type').val()));
338			}else{
339				setMap(37.5666805, 126.9784147, 'N', null, null, map_api, true, 'Y', 17, getMarkerByColorType($map_form.find('#category_color_type').val()));
340			}
341
342			if($map_form.find('#address').val()){
343				$map_editor.find('._map_search').val($map_form.find('#address').val());
344			}
345			if($map_form.find('#sub_address').val()){
346				$map_editor.find('#s_address').val($map_form.find('#sub_address').val());
347			}
348			if($map_form.find('#phone_number').val()){
349				$map_editor.find('#number').val($map_form.find('#phone_number').val());
350			}
351			if($map_form.find('#web_address').val()){
352				$map_editor.find('#h_address').val($map_form.find('#web_address').val());
353			}
354
355			$("body").off('mousedown.map').on('mousedown.map', function(e){
356				var t3 = $(e.target);
357				if(t3.closest('._map_moda_content').length == 0){
358					$map_editor.hide();
359					$('._calendar_modal_back').hide();
360					if($map_form.find('#add_address_ck').val() == 'N'){
361						searchDataClear('back');
362					}
363				}
364			});
365
366			$map_editor.find('._map_editor_close').on('click', function(){
367				$map_editor.hide();
368				$('._calendar_modal_back').hide();
369				if($map_form.find('#add_address_ck').val() == 'N'){
370					searchDataClear('close');
371				}
372			});
373
374			$map_editor.find('._map_adress_add').on('click', function(){
375				if(!$map_editor.find('._map_search').val()){
376					if(map_api === 'google'){
377						alert(LOCALIZE.설명_주소장소를검색해주세요());
378					}else{
379						alert(LOCALIZE.설명_도로명지번을검색해주세요());
380					}
381				}else{
382					if(!$map_form.find('#temp_pos_x').val() || !$map_form.find('#temp_pos_y').val()){
383						alert(LOCALIZE.설명_주소검색버튼을눌러주세요());
384					}else{
385						searchDataAdd();
386					}
387				}
388			});
389			$map_editor.find('#s_address,#number,#h_address').keypress(function(e){
390				if(e.keyCode == '13'){
391					if(!$map_editor.find('._map_search').val()){
392						if(map_api === 'google'){
393							alert(LOCALIZE.설명_주소장소를검색해주세요());
394						}else{
395							alert(LOCALIZE.설명_도로명지번을검색해주세요());
396						}
397					}else{
398						searchDataAdd();
399					}
400				}
401			});
402		}else{
403			alert(LOCALIZE.설명_장소를수정할수없습니다());
404		}
405	};
406	/**
407	 * 장소 검색
408	 * @param val
409	 * @param map_api
410	 * @return {boolean}
411	 */
412	var mapAddressSearch = function(val, map_api){
413		if(val == '') {
414			$map_editor.find('._search_result').hide();
415			if(map_api === 'google'){
416				alert(LOCALIZE.설명_주소장소를검색해주세요());
417			}else{
418				alert(LOCALIZE.설명_도로명지번을검색해주세요());
419			}
420			return false;
421		}
422		$.ajax({
423			type : 'POST',
424			data : {keyword: val, map_api: map_api},
425			url : ('/ajax/map_search.cm'),
426			dataType : 'json',
427			async : true,
428			cache : false,
429			success : function(res){
430				$map_editor.find('._search_list').empty();
431				if(res.msg == 'SUCCESS'){
432					if(res.count > 0){
433						if(typeof res.data.errorMessage !== 'undefined'){
434							// 에러 메시지가 넘어왔을 때
435							var item = $('<li><span class="txt">' + res.data.errorMessage + '</span></li>')
436								.on('click', function(){
437									$map_editor.find('._search_result').hide();
438								});
439							$map_editor.find('._search_list').append(item);
440						}else{
441							$.each(res.data, function(e, _data){
442								var item = $('<li><span class="txt">' + _data.address + '</span></li>').data({
443									lat : _data.lat,
444									lng : _data.lng,
445									address : _data.address
446								})
447									.on('click', function(){
448										$map_editor.find('._map_search').val($(this).data('address'));
449										var tmp = {
450											'lat' : $(this).data('lat'),
451											'lng' : $(this).data('lng'),
452											'address' : $(this).data('address')
453										};
454										$map_editor.find('._search_result').hide();
455										var zoom = $map_form.find('#temp_zoom').val() ? $map_form.find('#temp_zoom').val() : 17;
456										if(map_api === 'google'){
457											var latlng = new google.maps.LatLng($(this).data('lat'), $(this).data('lng'));
458											target_map.setCenter(latlng);
459											target_marker.setPosition(latlng);
460										}else{
461											var latlng = new naver.maps.LatLng($(this).data('lat'), $(this).data('lng'));
462											target_map.setCenter(latlng);
463											target_marker.setPosition(latlng);
464										}
465										$map_form.find('#temp_pos_x').val($(this).data('lng'));
466										$map_form.find('#temp_pos_y').val($(this).data('lat'));
467									});
468								$map_editor.find('._search_list').append(item);
469							});
470						}
471					}else{
472						var item = $('<li><span class="txt">' + LOCALIZE.설명_검색결과가존재하지않습니다() + '</span></li>')
473							.on('click', function(){
474								$map_editor.find('._search_result').hide();
475							});
476						$map_editor.find('._search_list').append(item);
477					}
478					$map_editor.find('._search_result').show();
479				}else{
480					$map_editor.find('._search_result').hide();
481				}
482			}
483		});
484	};
485	/**
486	 * api에 따른 맵 설정
487	 * @param lat
488	 * @param lng
489	 * @param detail
490	 * @param $obj
491	 * @param m_data
492	 * @param map_api
493	 * @param editable 장소 수정 가능 여부
494	 * @param scroll_wheel 스크롤휠로 확대 축소 허용 여부(지도 게시판 설정에서 받아옴)
495	 * @param zoom
496	 * @param marker_url
497	 */
498	var setMap = function(lat,lng,detail,$obj,m_data,map_api,editable,scroll_wheel,zoom,marker_url){
499		if($obj){
500			$obj.find('#_gmap').get(0).innerHTML = '';
501		}else{
502			$map_editor.find('#_gmap').get(0).innerHTML = '';
503		}
504		var _marker_url = marker_url ? marker_url : '//static.imweb.me/vendor/images/marker/marker_red.png';
505		if(map_api === 'naver')
506			setNaverMap(lat,lng,detail,$obj,m_data,editable,scroll_wheel,zoom,_marker_url);
507		else
508			setGoogleMap(lat,lng,detail,$obj,m_data,editable,scroll_wheel,zoom,_marker_url);
509
510	};
511	/**
512	 *
513	 * @param lat
514	 * @param lng
515	 * @param detail
516	 * @param $obj
517	 * @param m_data
518	 * @param editable
519	 * @param scroll_wheel
520	 * @param zoom
521	 * @param marker_url
522	 */
523	var setNaverMap = function(lat,lng,detail,$obj,m_data,editable,scroll_wheel,zoom,marker_url){
524		var latlng = new naver.maps.LatLng(lat,lng);
525
526		var myOptions = {
527			zoom: parseInt(zoom),
528			useStyleMap: true,
529			center: latlng,
530			mapTypeId: naver.maps.MapTypeId.NORMAL,
531			zoomControl: true,
532			mapTypeControl: false,
533			scaleControl: true,
534			disableDoubleClickZoom: true,
535			scrollWheel: scroll_wheel === 'Y'
536		};
537
538		if($obj){
539			target_map = new naver.maps.Map($obj.find('#_gmap').get(0), myOptions);
540		}else{
541			target_map = new naver.maps.Map($map_editor.find('#_gmap').get(0), myOptions);
542		}
543
544		target_marker = new naver.maps.Marker({
545			position: latlng,
546			map: target_map,
547			clickable: true,
548			icon: {
549				url : marker_url,
550				size : new naver.maps.Size(27, 35.5),
551				scaledSize : new naver.maps.Size(27, 35.5)
552			}
553		});
554
555		if(editable){
556			naver.maps.Event.addListener(target_map, 'click', function(event) {
557				// 클릭 시 클릭한 지점으로 마커 및 지도 이동
558				target_map.setCenter(event.latlng);
559				target_marker.setPosition(event.latlng);
560				$map_form.find('#temp_pos_x').val(event.latlng._lng);
561				$map_form.find('#temp_pos_y').val(event.latlng._lat);
562			});
563			naver.maps.Event.addListener(target_map, 'drag', function(event) {
564				// 드래그 중에는 마커만 가운데에 고정
565				target_marker.setPosition(target_map.getCenter());
566			});
567			naver.maps.Event.addListener(target_map, 'dragend', function(event) {
568				// 드래그 종료 시에 값 저장
569				var map_center = target_map.getCenter();
570				target_marker.setPosition(map_center);
571				$map_form.find('#temp_pos_x').val(map_center._lng);
572				$map_form.find('#temp_pos_y').val(map_center._lat);
573				// 드래그 완료된 지점으로 마커 클릭이벤트 새로 연결
574				naver.maps.Event.clearListeners(target_marker, 'click');
575			});
576			naver.maps.Event.addListener(target_map, 'mouseout', function(event){
577				$map_form.find('#temp_zoom').val(target_map.getZoom());
578			});
579			$map_editor.find('._map_adress_add').on('click', function(){
580				$map_form.find('#temp_zoom').val(target_map.getZoom());
581			});
582		}else{
583			if(detail === 'Y'){
584				var info_name = '';
585				var info_phone_number = '';
586				var info_address = '';
587				if(typeof m_data.subject != 'undefined' && m_data.subject != ''){
588					info_name = '<header><div class="box_tit">' + m_data.subject + '</div></header>';
589				}
590				if(typeof m_data.address != 'undefined' && m_data.address != ''){
591					if(typeof m_data.phone_number != 'undefined' && m_data.phone_number != ''){
592						info_phone_number = '<span class="map_tell" style="display: block">' + m_data.phone_number + '</span>';
593						info_address = '<p class="map_adress">' + m_data.address + info_phone_number + '</p>';
594					}else{
595						info_address = '<p class="map_adress">' + m_data.address + '</p>';
596					}
597				}
598
599				if(info_name != '' || info_address != ''){
600					var contentString1 = '<div class="map_info_box">' + info_name + info_address + '</div>';
601					var infowindow = new naver.maps.InfoWindow({
602						content : contentString1
603					});
604					infowindow.open(target_map, target_marker);
605				}
606
607				target_marker.addListener('click', function(){
608					infowindow.open(target_map, target_marker);
609				});
610			}else{
611				target_marker.addListener('click', function(){
612					if(IS_MOBILE){
613						var map_link = m_data.sub_address ? 'https://m.map.naver.com/search2/search.nhn?query=' + m_data.address + '%20' + m_data.sub_address + '&sm=sug&style=v5#/map/1' : 'https://m.map.naver.com/search2/search.nhn?query=' + m_data.address + '&sm=sug&style=v5#/map/1';
614					}else{
615						var map_link = m_data.sub_address ? 'https://map.naver.com/v5/search/' + m_data.address + '%20' + m_data.sub_address : 'https://map.naver.com/v5/search/' + m_data.address;
616					}
617					window.open(map_link);
618				});
619			}
620		}
621	};
622	/**
623	 *
624	 * @param lat
625	 * @param lng
626	 * @param detail
627	 * @param $obj
628	 * @param m_data
629	 * @param editable
630	 * @param scroll_wheel
631	 * @param zoom
632	 * @param marker_url
633	 */
634	var setGoogleMap = function(lat,lng,detail,$obj,m_data,editable,scroll_wheel,zoom,marker_url){
635		var latlng = new google.maps.LatLng(lat,lng);
636
637		var myOptions = {
638			zoom: parseInt(zoom),
639			center: latlng,
640			mapTypeId: 'roadmap',
641			zoomControl: true,
642			mapTypeControl: false,
643			scaleControl: true,
644			streetViewControl: false,
645			rotateControl: false,
646			disableDoubleClickZoom : true,
647			gestureHandling: 'auto',
648			controlSize: 29
649		};
650
651		var styles = [
652			{
653				'stylers': []
654			}
655		];
656
657		if($obj){
658			target_map = new google.maps.Map($obj.find('#_gmap').get(0), myOptions);
659		}else{
660			target_map = new google.maps.Map($map_editor.find('#_gmap').get(0), myOptions);
661		}
662		target_map.setOptions({styles: styles});
663
664		target_marker = new google.maps.Marker({
665			position: latlng,
666			map: target_map,
667			icon: {
668				url: marker_url,
669				size: new google.maps.Size(27, 35.5),
670				scaledSize: new google.maps.Size(27, 35.5)
671			},
672			shadow: null,
673			title: name
674		});
675
676		if(editable){
677			google.maps.event.addListener(target_map, 'click', function(event) {
678				// 클릭 시 클릭한 지점으로 마커 및 지도 이동
679				target_map.setCenter(event.latLng);
680				target_marker.setPosition(event.latLng);
681				$map_form.find('#temp_pos_x').val(event.latLng.lng());
682				$map_form.find('#temp_pos_y').val(event.latLng.lat());
683			});
684			google.maps.event.addListener(target_map, 'drag', function(event) {
685				// 드래그 중에는 마커만 가운데에 고정
686				target_marker.setPosition(target_map.getCenter());
687			});
688			google.maps.event.addListener(target_map, 'dragend', function(event) {
689				// 드래그 종료 시에 값 저장
690				var map_center = target_map.getCenter();
691				target_marker.setPosition(map_center);
692				$map_form.find('#temp_pos_x').val(map_center.lng());
693				$map_form.find('#temp_pos_y').val(map_center.lat());
694				// google 지도 드래그 시 관성 방지
695				target_map.setCenter(map_center);
696				// 드래그 완료된 지점으로 마커 클릭이벤트 새로 연결
697			});
698			google.maps.event.addListener(target_map, 'mouseout', function(event){
699				$map_form.find('#temp_zoom').val(target_map.getZoom());
700			});
701			$map_editor.find('._map_adress_add').on('click', function(){
702				$map_form.find('#temp_zoom').val(target_map.getZoom());
703			});
704		}else{
705			if(detail == 'Y'){
706				var info_name = '';
707				var info_phone_number = '';
708				var info_address = '';
709				if(typeof m_data.subject != 'undefined' && m_data.subject != ''){
710					info_name = '<header><div class="box_tit">' + m_data.subject + '</div></header>';
711				}
712				if(typeof m_data.address != 'undefined' && m_data.address != ''){
713					if(typeof m_data.phone_number != 'undefined' && m_data.phone_number != ''){
714						info_phone_number = '<span class="map_tell" style="display: block">' + m_data.phone_number + '</span>';
715						info_address = '<p class="map_adress">' + m_data.address + info_phone_number + '</p>';
716					}else{
717						info_address = '<p class="map_adress">' + m_data.address + '</p>';
718					}
719				}
720
721				if(info_name != '' || info_address != ''){
722					var contentString1 = '<div class="map_info_box">' + info_name + info_address + '</div>';
723					var infowindow = new google.maps.InfoWindow({
724						content : contentString1
725					});
726					infowindow.open(target_map, target_marker);
727				}
728
729				target_marker.addListener('click', function(){
730					infowindow.open(target_map, target_marker);
731				});
732			}else{
733				target_marker.addListener('click', function(){
734					var map_link = m_data.sub_address ? 'http://www.google.cn/maps/search/' + m_data.address + '%20' + m_data.sub_address : 'http://www.google.cn/maps/search/' + m_data.address;
735					if(LIMIT_API_LIST.indexOf('google_map') === -1){
736						map_link = m_data.sub_address ? 'https://www.google.com/maps/search/' + m_data.address + '%20' + m_data.sub_address : 'https://www.google.com/maps/search/' + m_data.address;
737					}
738					window.open(map_link);
739				});
740			}
741		}
742	};
743
744	/**
745	 * 게시물 수정 중 장소 정보 지우기
746	 * @param map_api		naver, google, null(지도 API 키가 없을 때 주소 등록이 불가능하므로 삭제도 방지)
747	 */
748	var addressDelete = function(map_api){
749		if(map_api)
750			searchDataClear('delete');
751		else
752			alert(LOCALIZE.설명_장소를수정할수없습니다());
753	};
754
755	/**
756	 * 위치 데이터 삭제 또는 초기화
757	 * @param type
758	 */
759	var searchDataClear = function(type){
760		if(type == 'back'){
761			$map_form.find('#temp_pos_x').val('');
762			$map_form.find('#temp_pos_y').val('');
763			$map_form.find('#temp_zoom').val('');
764			$map_editor.find('._map_search').val('');
765			$map_editor.find('#s_address').val('');
766			$map_editor.find('#number').val('');
767			$map_editor.find('#h_address').val('');
768		}else if(type == 'close'){
769			$map_form.find('#temp_pos_x').val('');
770			$map_form.find('#temp_pos_y').val('');
771			$map_form.find('#temp_zoom').val('');
772			$map_editor.find('._map_search').val('');
773			$map_editor.find('#s_address').val('');
774			$map_editor.find('#number').val('');
775			$map_editor.find('#h_address').val('');
776		}else if(type == 'delete'){
777			$map_form.find('#add_address_ck').val('N');
778			$map_form.find('#pos_x').val(126.9784147);
779			$map_form.find('#pos_y').val(37.5666805);
780			$map_form.find('#zoom').val(17);
781			$map_form.find('#temp_pos_x').val('');
782			$map_form.find('#temp_pos_y').val('');
783			$map_form.find('#temp_zoom').val(17);
784			$map_form.find('#phone_number').val('');
785			$map_form.find('#address').val('');
786			$map_form.find('#sub_address').val('');
787			$map_form.find('._add_map').removeClass('on');
788			$map_form.find('._address').text('');
789			$map_form.find('._phone').text('');
790			$map_form.find('._web_address').text('');
791			$map_form.find('#web_address').val('');
792			$map_editor.find('._map_search').val('');
793			$map_editor.find('#s_address').val('');
794			$map_editor.find('#number').val('');
795			$map_editor.find('#h_address').val('');
796		}
797	};
798
799	/**
800	 * 위치 데이터 추가
801	 */
802	var searchDataAdd = function(){
803		$map_form.find('#address').val($map_editor.find('._map_search').val());
804		$map_form.find('#sub_address').val($map_editor.find('#s_address').val());
805		$map_form.find('#phone_number').val($map_editor.find('#number').val());
806		$map_form.find('#web_address').val($map_editor.find('#h_address').val());
807		$map_form.find('._add_map').addClass('on');
808		$map_form.find('._address').text($map_editor.find('._map_search').val()+' '+$map_editor.find('#s_address').val());
809		$map_form.find('._phone').text($map_editor.find('#number').val());
810		$map_form.find('._web_address').text($map_editor.find('#h_address').val());
811		$map_form.find('#add_address_ck').val('Y');
812		if($map_form.find('#temp_pos_x').val() && $map_form.find('#temp_pos_y').val()){
813			$map_form.find('#pos_x').val($map_form.find('#temp_pos_x').val());
814			$map_form.find('#pos_y').val($map_form.find('#temp_pos_y').val());
815		}
816		$map_form.find('#zoom').val($map_form.find('#temp_zoom').val());
817		$map_editor.hide();
818		$('._calendar_modal_back').hide();
819	};
820
821	/**
822	 * 위치 정보 입력 완료
823	 * @param map_api
824	 */
825	var mapSubmit = function(map_api){
826		var address = $map_form.find('input#address').val();
827		if(address != ''){
828			if(IE_VERSION < 10){
829				var body = CKEDITOR.instances.map_body.getData();
830				var plain_text = $(body).text();
831				$map_form.find('#body_input').val(body);
832				$map_form.find('#plain_body_input').val(plain_text);
833				$map_form.submit();
834			}else{
835        if($map_form.find('#map_body').hasClass('fr-code-view')) FroalaEditor('#map_form #map_body').codeView.toggle();
836        var body = FroalaEditor('#map_form #map_body').html.get(true);
837				var plain_text = $(body).text();
838				$map_form.find('#body_input').val(body);
839				$map_form.find('#plain_body_input').val(plain_text);
840				$map_form.submit();
841			}
842		}else{
843			alert(LOCALIZE.설명_주소를입력하세요());
844			mapEditorPop(map_api);
845		}
846	};
847
848	var mapCancel = function(back_url){
849		if(isIOS && isSafari){
850			var s_top = $(this).scrollTop();
851			$write_header.css({'-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': 0});
852			$fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top);
853			$fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top);
854			if(s_top > m_sticky_container_trigger_top){
855				$toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': $write_header.height() + 'px'});
856			}else{
857				$toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 'auto'});
858			}
859		}
860		document.location.href = back_url;
861	};
862
863	/**
864	 *
865	 * @param idx
866	 * @param back_url
867	 * @param board_code
868	 * @param map_api		naver, google, null(지도 API 키가 없을 경우)
869	 * @param scroll_wheel		스크롤휠로 확대 축소 허용 여부
870	 * @param is_ignore		window width 무시 여부
871	 */
872	var getTypeMapView = function(idx,back_url, board_code, map_api, scroll_wheel, is_ignore = true){
873    const check_ww = window.innerWidth;
874    if(check_ww > 767 && !is_ignore) return false;
875		cancelFullScreen();
876		$('html').addClass('fullboard_on');
877		location.hash = '/map'+idx;
878		back_url = back_url+location.hash;
879		var is_update_time = $('._map_view_' + board_code + ' select[name=sort]').val() === 'UPDATE' ? 'Y' : 'N';
880		$.ajax({
881			type		: 'post',
882			data:{'idx':idx,'board_code':board_code,'back_url':back_url, 'update_time':is_update_time},
883			url			: '/ajax/map_more_view.cm',
884			dataType 	: 'json',
885			async       : false,
886			cache       : false,
887			success		: function(result){
888				if(result.msg == 'SUCCESS'){
889					SNS.init(result.sns_init_data);
890					$('[data-toggle="tooltip"]').tooltip();
891					var $html = $(result.html);
892					$('body').append($html);
893					if(IS_ANDROID_APP == 'Y'){
894						var height = 0;
895						var org_height = 0;
896						org_height = $("html,body").height();
897						height = $("html,body").height()+100;
898						$("html,body").css('height',height);
899						$html.scroll(function(){
900							$("html,body").scrollTop($(this).scrollTop());
901						});
902					}else{
903						$('body').css('overflow','hidden');
904					}
905					if(!result.require_login && !result.deny && !result.require_pass){
906						if(map_api){
907							var marker_url = '//static.imweb.me/vendor/images/marker/marker_red.png';
908							var category_list = JSON.parse(result.category_list);
909							if(result.data.category_code){
910								marker_url = getMarkerByCategoryCode(result.data.category_code, category_list);
911							}
912							setMap(result.data.pos_y, result.data.pos_x, 'N', $('#maps_more'), result.data, map_api, false, scroll_wheel, result.data.zoom, marker_url);
913						}else{
914							var map_disable_html = '<div class="widget_map_disable"></div>';
915							$('#_gmap').html(map_disable_html);
916						}
917					}
918					$(window).off('hashchange').on('hashchange',function(){
919						var old_hash_url_tmp;
920						var old_hash_url;
921						var new_hash_url_tmp;
922						var new_hash_url;
923						old_hash_url_tmp = location.hash.split('#');
924						if(old_hash_url_tmp[1]){
925							old_hash_url = old_hash_url_tmp[1].split('map');
926						}
927						new_hash_url_tmp = back_url.split('#');
928						new_hash_url = new_hash_url_tmp[1].split('map');
929						if(!location.hash){
930							$('body').find('#maps_more').remove();
931							$('body').css('overflow','');
932						}else{
933							if(typeof old_hash_url[1] != 'undefined' && old_hash_url[1] != '' && old_hash_url[1] != 'null'){
934								if(old_hash_url[1] != new_hash_url[1]){
935									getTypeMapView(old_hash_url[1], null, board_code, map_api, scroll_wheel);
936								}
937							}
938						}
939					});
940					POST_COMMENT.init(result.data.code);
941					$('body').find('#map_more_close').off('click').on('click',function(){
942						$('html').removeClass('fullboard_on');
943						if(IS_ANDROID_APP == 'Y'){
944							$("html,body").css('height',org_height);
945						}
946						$('body').find('#maps_more').remove();
947						$('body').css('overflow','');
948						location.hash = '';
949					});
950					$('body').addClass('map_view');
951				}else{
952					alert(result.msg);
953				}
954			}
955		});
956	};
957
958	/**
959	 * 전체화면 보기 상태일 때 전체화면 해제
960	 */
961	var cancelFullScreen = function(){
962		if (document.fullscreenElement){
963			document.exitFullscreen();
964		} else if (document.cancelFullScreen) {
965			document.cancelFullScreen();
966		} else if (document.mozCancelFullScreen) {		// FireFox
967			document.mozCancelFullScreen();
968		} else if (document.webkitCancelFullScreen) {		// Chrome
969			document.webkitCancelFullScreen();
970		} else if (document.msExitFullscreen) {		// IE
971			document.msExitFullscreen();
972		}
973	};
974
975	/**
976	 *
977	 * @param board_code
978	 * @param code
979	 * @param return_url
980	 */
981	var deleteMap = function (board_code,code,return_url){
982		if(confirm(LOCALIZE.설명_삭제하시겠습니까())){
983			$.ajax({
984				type		: 'post',
985				data:{'mcode':code,board_code:board_code},
986				url			: '/ajax/deleteMap.cm',
987				dataType 	: 'json',
988				success		: function(result){
989					if(result.msg == 'SUCCESS'){
990						window.location.href = return_url;
991					}else{
992						alert(result.msg);
993					}
994				}
995			});
996		}
997	};
998
999	var mapListToggle = function($obj){
1000		if($obj.hasClass('fold') === true){
1001			$obj.removeClass('fold');
1002		}else{
1003			$obj.addClass('fold');
1004		}
1005	};
1006
1007	var mapSearchToggle = function($obj,type){
1008		if(type == 'show'){
1009			$obj.find('.head_wrap').hide();
1010			$obj.find('.search-wrap').show();
1011		}
1012		if(type == 'hide'){
1013			$obj.find('.head_wrap').show();
1014			$obj.find('.search-wrap').hide();
1015		}
1016	};
1017
1018	var mapListChange = function($obj,type){
1019		if(type=='map'){
1020			$obj.addClass('fold');
1021		}
1022		if(type=='list'){
1023			$obj.removeClass('fold');
1024		}
1025	};
1026
1027	/**
1028	 * 브라우저 위치 정보 받기
1029	 * @param force true일 경우 위치 정보 쿠키가 있어도 갱신
1030	 */
1031	var posCreat = function(force){
1032		if(force || (!getCookie('lng') && !getCookie('lat'))){
1033			var option = {
1034				enableHighAccuracy:false,
1035				timeout : 5000,
1036				maximumAge: 60000
1037			};
1038			var geolocation_timeout;
1039
1040			if(IS_ANDROID_APP == 'Y' && APP_VERSION >= 97000){
1041				window.dozAndroidBridge.getLocationData();
1042			}else{
1043				if(navigator.geolocation){
1044					function success(pos){
1045						clearTimeout(geolocation_timeout);
1046						var crd = pos.coords;
1047						if(getCookie('lat') != crd.latitude && getCookie('lng') != crd.longitude){
1048							setCookie('lat', crd.latitude, 7);
1049							setCookie('lng', crd.longitude, 7);
1050						}
1051					}
1052
1053					function error(err){
1054						clearTimeout(geolocation_timeout);
1055						if(!(!!err)){
1056							err = {};
1057							err.code = 1;
1058						}
1059						switch(err.code){
1060							case 0: //0: '위치 정보 검색에 문제가 있습니다.
1061								$(function(){
1062									alert(LOCALIZE.설명_위치정보검색에문제가있습니다());
1063								});
1064								break;
1065							case 1: //1: '현재 페이지에서 사용자가 위치 정보 검색을 거부했습니다.',
1066								$(function(){
1067									alert(LOCALIZE.설명_위치정보검색을허용해주세요());
1068								});
1069								break;
1070							case 2: //2: '브라우저가 위치정보를 검색하지 못했습니다.
1071								$(function(){
1072									alert(LOCALIZE.설명_위치정보를검색하지못했습니다());
1073								});
1074								break;
1075							case 3: //3: '브라우저의 위치 정보 검색 시간이 초과됐습니다.'
1076								$(function(){
1077									alert(LOCALIZE.설명_위치정보검색시간을초과하였습니다());
1078								});
1079								break;
1080							default:
1081								break;
1082						}
1083					}
1084
1085					geolocation_timeout = setTimeout(error, option.timeout);
1086					navigator.geolocation.getCurrentPosition(success, error, option);
1087				}else{
1088					alert(LOCALIZE.설명_위치검색이지원되지않는브라우져입니다());
1089				}
1090			}
1091		}
1092	};
1093
1094	/**
1095	 * 내 위치 중심으로 이동
1096	 * @param board_code
1097	 * @param map_api
1098	 */
1099	var moveUserPosition = function(board_code, map_api){
1100		posCreat(true);
1101		userPosCreat(board_code, map_api);
1102		var userLat = getCookie('lat');
1103		var userLng = getCookie('lng');
1104		if(map_api === 'naver'){
1105			if(userLng >= 124 && userLng <= 132 && userLat >= 33 && userLat <= 43){
1106				naver_map[board_code].setOptions({center : new naver.maps.LatLng(userLat, userLng)});
1107			}
1108		}else{
1109			var target_map = $('#gmap_' + board_code).gmap3('get');
1110			target_map.setCenter(new google.maps.LatLng(userLat, userLng));
1111		}
1112	};
1113
1114	/**
1115	 * 앱에서 위치정보 전송시 호출
1116	 */
1117	var setAndroidLocationData = function(latitude, longitude){
1118		if(latitude < 0 || longitude < 0){
1119			alert(LOCALIZE.설명_기기의위치정보검색실패());
1120		}else{
1121			if(getCookie('lat') != latitude && getCookie('lng') != longitude){
1122				setCookie('lat', latitude, 7);
1123				setCookie('lng', longitude, 7);
1124			}
1125			//location.reload();
1126		}
1127	};
1128
1129	/**
1130	 * 정보창 내용 생성
1131	 * @param board_code
1132	 * @param post_id
1133	 * @returns {string}
1134	 */
1135	function getInfoWindowData(board_code, post_id){
1136		var data = '';
1137		var idx = post_id.split('list_')[1];
1138		$.ajax({
1139			type : 'post',
1140			data : {'idx' : idx, 'board_code' : board_code},
1141			url : '/ajax/get_map_post_data.cm',
1142			dataType : 'json',
1143			async : false,
1144			cache : false,
1145			success : function(result){
1146				if(result.msg === 'SUCCESS'){
1147					var post_data = result.post_data;
1148					var thumb_data = result.thumb_data;
1149					var board_data = result.board_data;
1150					var $map_view = $('._map_view_' + board_code);
1151					var menu_url = $map_view.find('input[name=menu_url]').val();
1152					var keyword_type = $map_view.find('input[name=keyword_type]').val();
1153					var category = $map_view.find('select[name=category]').val();
1154					var keyword = $map_view.find('input[name=keyword]').val();
1155					var sort = $map_view.find('select[name=sort]').val();
1156					var page = $map_view.find('ul.pagination > li.active > a').text();
1157					var sort_str = sort ? '?sort='+sort : '?sort=TIME';
1158					var category_str = category ? '&category='+category : '';
1159					var keyword_str = keyword ? '&keyword='+keyword : '';
1160					var keyword_type_str = keyword_type ? '&keyword_type='+keyword_type : '';
1161					var page_str = page ? '&page='+page : '';
1162					var back_link = menu_url + sort_str + category_str + keyword_str + keyword_type_str + page_str;
1163					var show_like_cnt_tag = "";
1164					var show_cmt_cnt_tag = "";
1165					var show_read_cnt_tag = "";
1166					var show_account_tag = "";
1167					var close_btn = "";
1168					var like_on = post_data.like_cnt > 0 ? 'on' : '';
1169					var like_btn_possible = result.like_btn_possible;
1170
1171					if(board_data.show_like_cnt === 'Y'){
1172						show_like_cnt_tag = "<span class='comment_num no-padding-x no-pointer'>" +
1173							"<i class='icon-bubble vertical-middle' style='margin-right: 5px'></i>" +
1174							"<em class='_comment_count'>" + post_data.comment_cnt + "</em>" +
1175							"</span>";
1176					}
1177					if(board_data.show_cmt_cnt === 'Y'){
1178						show_cmt_cnt_tag = "<span class='comment_num no-padding-x like_btn " + like_on + "' id='like_btn_" + post_data.code + "'";
1179						if(like_btn_possible){
1180							show_cmt_cnt_tag += " onclick=\"mapClickLike('" + post_data.idx + "', '" + board_data.listing + "', '" + post_data.code + "', '" + result.like_token_key + "', '" + result.like_token + "', false); return false;\"";
1181						}
1182						show_cmt_cnt_tag += ">" +
1183							"<i class='btm bt-heart vertical-middle' style='margin-right: 5px'></i>" +
1184							"<em class='_like_count' id='like_count_" + post_data.code + "'>" + post_data.like_cnt + "</em>" +
1185							"</span>";
1186					}
1187					if(board_data.show_hit_cnt === 'Y'){
1188						show_read_cnt_tag = "<span class='comment_num no-padding-x'>" +
1189							"<i class='icon-eye vertical-middle' style='margin-right: 5px'></i>" +
1190							"<em class='_read_count'>
1190" + post_data.read_cnt + "</em>" +
1191							"</span>";
1192					}
1193					if(board_data.show_account === 'Y'){
1194						show_account_tag = "<p class='tell'>" + post_data.phone_number + "</p>";
1195					}
1196					var scroll_wheel = board_data.map_scroll_wheel;
1197					var api = board_data.map_api;
1198					// Google 지도는 자체적으로 닫기 버튼 포함
1199					if(api !== 'google'){
1200						close_btn = "<div class='map_contents_close' style='top: 5px; right: 5px;'>" +
1201							"<a href='javascript:;' onclick=\"MAP.infowindowClose('" + api + "', '" + post_id + "', '" + board_code + "')\"><i class='btl bt-times'></i></a>" +
1202							"</div>";
1203					}
1204					if(thumb_data){
1205						data =
1206							"<div style='padding: 9px 15px;'>" +
1207							"<a href='javascript:;' onclick=\"MAP.getTypeMapView('" + idx + "','" + back_link + "', '" + board_code + "', '" + api + "', '" + scroll_wheel + "')\">" +
1208							"<div class='map_container map_container_view map-inner $cover_class _map_container' id='list_pop_" + idx + "'>" +
1209							"<div class='thumb'>" +
1210							"<img src='" + CDN_THUMBNAIL_URL + thumb_data.url + "'>" +
1211							"</div>" +
1212							"<div class='map_contents'>" +
1213							"<div class='head'>" +
1214							"<div class='tit'>" + RemoveTag(post_data.subject) + "</div>" +
1215							"</div>" +
1216							"<div class='p_group'> " +
1217							"<p class='adress'>" + RemoveTag(post_data.address) + "</p>" +
1218							show_account_tag +
1219							"</div>" +
1220							"<div class='btn-gruop btn-group-comment'>" +
1221							show_like_cnt_tag +
1222							show_cmt_cnt_tag +
1223							show_read_cnt_tag +
1224							"</div>" +
1225							close_btn +
1226							"<div class='text-center'><a href='javascript:;'  onclick=\"MAP.getTypeMapView('" + idx + "','" + back_link + "', '" + board_code + "', '" + api + "', '" + scroll_wheel + "')\" class='btn btn-xs bg-brand' style='margin-top:15px; letter-spacing: 0; border-radius: 30px;'>" + LOCALIZE.버튼_상세보기() + "</a></div>" +
1227							"</div>" +
1228							"</div>" +
1229							"</a>" +
1230							"</div>";
1231					}else{
1232						data =
1233							"<a href='javascript:;' onclick=\"MAP.getTypeMapView('" + idx + "','" + back_link + "', '" + board_code + "', '" + api + "', '" + scroll_wheel + "')\">" +
1234							"<div class='map_container  map-inner $cover_class _map_container' id='list_pop_" + idx + "'>" +
1235							"<div class='map_contents'>" +
1236							"<div class='head'>" +
1237							"<div class='tit'>" + RemoveTag(post_data.subject) + "</div>" +
1238							"</div>" +
1239							"<div class='p_group'> " +
1240							"<p class='adress'>" + RemoveTag(post_data.address) + "</p>" +
1241							show_account_tag +
1242							"</div>" +
1243							"<div class='btn-gruop btn-group-comment'>" +
1244							show_like_cnt_tag +
1245							show_cmt_cnt_tag +
1246							show_read_cnt_tag +
1247							"</div>" +
1248							close_btn +
1249							"<div class='text-center'><a href='javascript:;'  onclick=\"MAP.getTypeMapView('" + idx + "','" + back_link + "', '" + board_code + "', '" + api + "', '" + scroll_wheel + "')\" class='btn btn-xs bg-brand' style='margin-top:15px; letter-spacing: 0; border-radius: 30px;'>" + LOCALIZE.버튼_상세보기() + "</a></div>" +
1250							"</div>" +
1251							"</div>" +
1252							"</a>";
1253					}
1254				}
1255			}
1256		});
1257
1258		return data;
1259	}
1260
1261	/**
1262	 * 지도 위에 마커 표시 및 정보창 설정
1263	 * @param board_code
1264	 * @param api
1265	 * @param category_list
1266	 * @param category
1267	 * @param scroll_wheel
1268	 * @param marker_clustering
1269	 * @param is_refresh		마커 새로고침일 경우 지도는 새로 생성하지 않음
1270	 */
1271	var listView = function(board_code,api, category_list, category, scroll_wheel, marker_clustering, is_refresh){
1272		var id = '#gmap_' + board_code;
1273		if(typeof category === 'undefined') category = '';
1274		if(typeof markers[board_code] === 'undefined') markers[board_code] = [];
1275		if(typeof infowindows[board_code] === 'undefined') infowindows[board_code] = [];
1276		if(typeof map_data[board_code] === 'undefined') map_data[board_code] = [];
1277		if(typeof is_refresh == 'undefined') is_refresh = false;
1278		var list_data = [];
1279
1280		$.each(map_data[board_code],function(k,v){
1281			// 카테고리에 해당되고 숨김처리 되지 않은 마커만 표시
1282			if((category === '' || category === v.category_code) && v.is_hide !== 'Y'){
1283				var value_obj = {};
1284				value_obj.category_code = v.category_code;
1285				value_obj.id = 'list_' + v.idx;
1286				value_obj.latLng = [v.pos_y, v.pos_x];
1287
1288				if(api === 'naver'){
1289					list_data[value_obj.id] = value_obj;
1290				}else{
1291					value_obj.options = {
1292						icon: {
1293							url: getMarkerByCategoryCode(v.category_code, category_list),
1294							size: new google.maps.Size(27, 35.5),
1295							scaledSize: new google.maps.Size(27, 35.5)
1296						}
1297					};
1298					list_data.push(value_obj);
1299				}
1300			}
1301		});
1302		if(api === 'naver'){
1303			/* 네이버 지도 설정 시작 */
1304			var myOptions = {
1305				minZoom : 6,
1306				useStyleMap: true,
1307				mapTypeId : naver.maps.MapTypeId.NORMAL,
1308				zoomControl : true,
1309				zoomControlOptions : {
1310					position : naver.maps.Position.RIGHT_TOP
1311				},
1312				mapTypeControl : false,
1313				scaleControl : true,
1314				disableDoubleClickZoom : true,
1315				scrollWheel : scroll_wheel === 'Y'
1316			};
1317
1318			naver_map[board_code] = new naver.maps.Map('gmap_' + board_code, myOptions);
1319
1320			for(var key in list_data){
1321				var context = list_data[key];
1322				var position = new naver.maps.LatLng(context.latLng[0], context.latLng[1]);
1323				var marker_url = getMarkerByCategoryCode(context.category_code, category_list);
1324				var marker = new naver.maps.Marker({
1325					map: naver_map[board_code],
1326					position: position,
1327					clickable: true,
1328					icon: {
1329						url : marker_url,
1330						size : new naver.maps.Size(27, 35.5),
1331						scaledSize : new naver.maps.Size(27, 35.5)
1332					}
1333				});
1334				var contentString = context.data;
1335				var infowindow = new naver.maps.InfoWindow({
1336					content: contentString
1337				});
1338				markers[board_code][context.id] = marker;
1339				infowindows[board_code][context.id] = infowindow;
1340			}
1341
1342			/**
1343			 * 마커 클릭 이벤트 설정
1344			 * @param post_id
1345			 * @return {Function}
1346			 */
1347			function getClickHandler(post_id){
1348				return function(e) {
1349					var marker = markers[board_code][post_id],
1350						infowindow = infowindows[board_code][post_id];
1351
1352					if (infowindow.getMap()) {
1353						infowindow.close();
1354					}else{
1355						infowindow.setContent(getInfoWindowData(board_code, post_id));
1356						infowindow.open(naver_map[board_code], marker);
1357						
1358						
1359						// 해당 마커를 지도 중심으로 이동
1360						naver_map[board_code].setOptions({center: new naver.maps.LatLng(marker.position._lat, marker.position._lng)});
1361						naverMarkCenter(naver_map[board_code]);
1362					}
1363				}
1364			}
1365
1366			var leftBound = null, rightBound = null, topBound = null, bottomBound = null;
1367			for(var key in markers[board_code]){
1368				var marker = markers[board_code][key];
1369				naver.maps.Event.addListener(marker, 'click', getClickHandler(key));
1370				var nowLng = marker.position._lng, nowLat = marker.position._lat;
1371				if(nowLng >= 124 && nowLng <= 132 && nowLat >= 33 && nowLat <= 43){
1372					// 국내 범위 내
1373					if(leftBound === null){
1374						// 첫 실행 시 마커 좌표를 경계로 설정
1375						leftBound = nowLng;
1376						rightBound = nowLng;
1377						topBound = nowLat;
1378						bottomBound = nowLat;
1379					}else{
1380						// 마커가 전부 들어오는 기준으로 경계 설정(국내 한정이므로 음수 구간 생각하지 않아도 됨)
1381						if(leftBound > nowLng){
1382							leftBound = nowLng;
1383						}else if(rightBound < nowLng){
1384							rightBound = nowLng;
1385						}
1386						if(topBound > nowLat){
1387							topBound = nowLat;
1388						}else if(bottomBound < nowLat){
1389							bottomBound = nowLat;
1390						}
1391					}
1392				}
1393			}
1394			if(leftBound !== null){
1395				// 국내에 포함된 마커들로 경계 설정, 마커가 하나도 없을 경우 기본값 서울시청
1396				var bounds = new naver.maps.LatLngBounds(new naver.maps.LatLng(topBound, leftBound), new naver.maps.LatLng(bottomBound, rightBound));
1397				var margin = {top: 10, right: 10, bottom: 10, left: 10};
1398				if(!IS_MOBILE){
1399					// 좌측 map-list가 차지하는 340px 너비의 공간 고려
1400					margin = {top: 10, right: 10, bottom: 10, left: 350};
1401				}
1402				naver_map[board_code].fitBounds(bounds, margin);
1403			}
1404			if(marker_clustering === 'Y'){
1405				naver_cluster_marker1 = {
1406					content : '<div style="cursor:pointer;width:53px;height:53px;line-height:53px;font-size:11px;color:#FFFFFF;text-align:center;font-weight:bold;background:url(//static.imweb.me/vendor/images/markerclusterer/m1.png);background-size:contain;"></div>',
1407					size : naver.maps.Size(53, 53),
1408					anchor : naver.maps.Point(27, 27)
1409				},
1410					naver_cluster_marker2 = {
1411						content : '<div style="cursor:pointer;width:56px;height:56px;line-height:56px;font-size:11px;color:#FFFFFF;text-align:center;font-weight:bold;background:url(//static.imweb.me/vendor/images/markerclusterer/m2.png);background-size:contain;"></div>',
1412						size : naver.maps.Size(56, 56),
1413						anchor : naver.maps.Point(28, 28)
1414					},
1415					naver_cluster_marker3 = {
1416						content : '<div style="cursor:pointer;width:66px;height:66px;line-height:66px;font-size:11px;color:#FFFFFF;text-align:center;font-weight:bold;background:url(//static.imweb.me/vendor/images/markerclusterer/m3.png);background-size:contain;"></div>',
1417						size : naver.maps.Size(66, 66),
1418						anchor : naver.maps.Point(33, 33)
1419					},
1420					naver_cluster_marker4 = {
1421						content : '<div style="cursor:pointer;width:78px;height:78px;line-height:78px;font-size:11px;color:#FFFFFF;text-align:center;font-weight:bold;background:url(//static.imweb.me/vendor/images/markerclusterer/m4.png);background-size:contain;"></div>',
1422						size : naver.maps.Size(78, 78),
1423						anchor : naver.maps.Point(39, 39)
1424					},
1425					naver_cluster_marker5 = {
1426						content : '<div style="cursor:pointer;width:90px;height:90px;line-height:90px;font-size:11px;color:#FFFFFF;text-align:center;font-weight:bold;background:url(//static.imweb.me/vendor/images/markerclusterer/m5.png);background-size:contain;"></div>',
1427						size : naver.maps.Size(90, 90),
1428						anchor : naver.maps.Point(45, 45)
1429					};
1430				naverClustering(board_code);
1431			}
1432			/* 네이버 지도 컨트롤 z-index 100 고정 */
1433			$('#doz_header').css('z-index', 101);
1434			/* 네이버 지도 설정 완료 */
1435		}else{
1436			/* Google 지도 설정 시작 */
1437			if(!is_refresh){
1438				$(id).gmap3({
1439					map : {
1440						options : {
1441							center : [37.5666805, 126.9784147],
1442							maxZoom : 17,
1443							minZoom : 3,
1444							mapTypeControl : false,
1445							scaleControl : true,
1446							streetViewControl : false,
1447							gestureHandling : 'auto',
1448							controlSize : 29
1449						}
1450					},
1451					marker : {
1452						values : list_data,
1453						options : {
1454							draggable : false
1455							/*
1456							icon: {
1457								path: google.maps.FORWARD_CLOSED_ARROW,
1458								fillOpacity: 1,
1459								fillColor: 'black',
1460								strokeOpacity: 0,
1461								scale: 1,
1462								anchor: new google.maps.Point(23.0, 42.0)
1463							}
1464							*/
1465						},
1466						events : {
1467							click : function(marker, event, context){
1468								var map = $(this).gmap3("get"),
1469									infowindow = $(this).gmap3({get : {name : "infowindow"}});
1470								if(infowindow){
1471									infowindow.setContent(getInfoWindowData(board_code, context.
1471id));
1472									infowindow.open(map, marker);
1473								}else{
1474									$(this).gmap3({
1475										infowindow : {
1476											anchor : marker,
1477											options : {content : getInfoWindowData(board_code, context.id)}
1478										}
1479									});
1480								}
1481							}
1482						}
1483					},
1484					autofit : {}
1485				});
1486			}else{
1487				$(id).gmap3({
1488					marker : {
1489						values : list_data,
1490						options : {
1491							draggable : false
1492						},
1493						events : {
1494							click : function(marker, event, context){
1495								var map = $(this).gmap3("get"),
1496									infowindow = $(this).gmap3({get : {name : "infowindow"}});
1497								if(infowindow){
1498									infowindow.setContent(getInfoWindowData(board_code, context.id));
1499									infowindow.open(map, marker);
1500								}else{
1501									$(this).gmap3({
1502										infowindow : {
1503											anchor : marker,
1504											options : {content : getInfoWindowData(board_code, context.id)}
1505										}
1506									});
1507								}
1508
1509
1510								var map_comment_count = 0;
1511								var like_cnt = 0;
1512								var read_cnt = 0;
1513								var idx_arr = context.id.split('list_');
1514								map_comment_count = Math.round($('#' + context.id).find('._comment_count').text());
1515								like_cnt = Math.round($('#' + context.id).find('._like_count').text());
1516								read_cnt = Math.round($('#' + context.id).find('._read_count').text());
1517								$('#list_pop_' + idx_arr[1]).find('._comment_count').text(map_comment_count);
1518								$('#list_pop_' + idx_arr[1]).find('._like_count').text(like_cnt);
1519								$('#list_pop_' + idx_arr[1]).find('._read_count').text(read_cnt);
1520							}
1521						}
1522					},
1523					autofit : {}
1524				});
1525			}
1526			if(marker_clustering === 'Y'){
1527				gmap3Clusterer(id, null, board_code);
1528			}
1529		}
1530
1531		/* Google 지도 설정 완료 */
1532	};
1533
1534	/**
1535	 * 카테고리 코드에 따른 마커 이미지 반환
1536	 * @param category_code
1537	 * @param category_list
1538	 * @return {string}		마커 이미지 url
1539	 */
1540	function getMarkerByCategoryCode(category_code, category_list){
1541		var marker_url = '';
1542		var color_type = '';
1543		if(category_list !== ''){
1544			$.each(category_list, function(k, v){
1545				if(category_code === v.category_code){
1546					color_type = v.color_type;
1547					return false;
1548				}
1549			});
1550		}
1551		marker_url = getMarkerByColorType(color_type);
1552		return marker_url;
1553	}
1554
1555	/**
1556	 * 마커 컬러 타입에 따른 마커 이미지 반환
1557	 * @param color_type
1558	 * @return {string}		마커 이미지 url
1559	 */
1560	function getMarkerByColorType(color_type){
1561		var marker_url = '//static.imweb.me/vendor/images/marker/marker_red.png';
1562		switch(color_type){
1563			case 'marker-color-red':
1564			default:
1565				marker_url = '//static.imweb.me/vendor/images/marker/marker_red.png';
1566				break;
1567			case 'marker-color-pink':
1568				marker_url = '//static.imweb.me/vendor/images/marker/marker_pink.png';
1569				break;
1570			case 'marker-color-orange':
1571				marker_url = '//static.imweb.me/vendor/images/marker/marker_orange.png';
1572				break;
1573			case 'marker-color-yellow':
1574				marker_url = '//static.imweb.me/vendor/images/marker/marker_yellow.png';
1575				break;
1576			case 'marker-color-green':
1577				marker_url = '//static.imweb.me/vendor/images/marker/marker_green.png';
1578				break;
1579			case 'marker-color-mint':
1580				marker_url = '//static.imweb.me/vendor/images/marker/marker_mint.png';
1581				break;
1582			case 'marker-color-blue':
1583				marker_url = '//static.imweb.me/vendor/images/marker/marker_blue.png';
1584				break;
1585			case 'marker-color-violet':
1586				marker_url = '//static.imweb.me/vendor/images/marker/marker_violet.png';
1587				break;
1588			case 'marker-color-gray':
1589				marker_url = '//static.imweb.me/vendor/images/marker/marker_gray.png';
1590				break;
1591			case 'marker-color-darkgray':
1592				marker_url = '//static.imweb.me/vendor/images/marker/marker_darkgray.png';
1593				break;
1594		}
1595		return marker_url;
1596	}
1597
1598	/**
1599	 * 정보창 닫기
1600	 * @param api
1601	 * @param id
1602	 * @param board_code
1603	 */
1604	var infowindowClose = function(api, id, board_code){
1605		if(api === 'google'){
1606			var infowindow = $('#gmap_' + board_code).gmap3({get : {name : "infowindow"}});
1607			if(infowindow){
1608				infowindow.close();
1609			}
1610		}else{
1611			var infowindow = infowindows[board_code][id];
1612			if(infowindow.getMap()) infowindow.close();
1613		}
1614	};
1615
1616	var mapSecretPost = function($obj,type){
1617		if(type == 'pc'){
1618			if($('#secret_input_pc').hasClass('active') === false){
1619				$obj.find('#secret_input_pc').addClass('active');
1620				$obj.find('#secret_input_nomember').addClass('active');
1621				$obj.find('#secret_input_mobile').addClass('active');
1622			}else{
1623				$obj.find('#secret_input_pc').removeClass('active');
1624				$obj.find('#secret_input_nomember').removeClass('active');
1625				$obj.find('#secret_input_mobile').removeClass('active');
1626			}
1627			if($('#secret_input_pc').hasClass('active') === true){
1628				$('#is_secret_input').val('Y');
1629			}else{
1630				$('#is_secret_input').val('N');
1631			}
1632		}
1633		if(type == 'nomember'){
1634			if($('#secret_input_nomember').hasClass('active') === false){
1635				$obj.find('#secret_input_pc').addClass('active');
1636				$obj.find('#secret_input_nomember').addClass('active');
1637				$obj.find('#secret_input_mobile').addClass('active');
1638			}else{
1639				$obj.find('#secret_input_pc').removeClass('active');
1640				$obj.find('#secret_input_nomember').removeClass('active');
1641				$obj.find('#secret_input_mobile').removeClass('active');
1642			}
1643			if($('#secret_input_nomember').hasClass('active') === true){
1644				$('#is_secret_input').val('Y');
1645			}else{
1646				$('#is_secret_input').val('N');
1647			}
1648		}
1649		if(type == 'mobile'){
1650			if($('#secret_input_mobile').hasClass('active') === false){
1651				$obj.find('#secret_input_pc').addClass('active');
1652				$obj.find('#secret_input_nomember').addClass('active');
1653				$obj.find('#secret_input_mobile').addClass('active');
1654			}else{
1655				$obj.find('#secret_input_pc').removeClass('active');
1656				$obj.find('#secret_input_nomember').removeClass('active');
1657				$obj.find('#secret_input_mobile').removeClass('active');
1658			}
1659			if($('#secret_input_mobile').hasClass('active') === true){
1660				$('#is_secret_input').val('Y');
1661			}else{
1662				$('#is_secret_input').val('N');
1663			}
1664		}
1665	};
1666
1667	var postDeleteFile = function(id){
1668		var obj = $('#'+id);
1669		var size = obj.data('size');
1670		total_file_size -= size;
1671		obj.remove();
1672	};
1673
1674	var postAddFile = function(filename,file_code,tmp_idx,size){
1675		var uniq_id = makeUniq('upfile_');
1676		total_file_size += size;
1677		var clear_ico = $('<i class="zmdi zmdi-close"></i>').data({'item':uniq_id,size:size}).click(function(e){
1678			postDeleteFile(uniq_id);
1679		});
1680		var hidden_input = '';
1681		if(file_code.length>0) {
1682			hidden_input = $('<input name="upload_files[]" value="' + file_code + '" type="hidden" />');
1683		}else if(Math.round(tmp_idx) > 0){
1684			hidden_input = $('<input name="temp_files[]" value="' + tmp_idx + '" type="hidden" />');
1685		}
1686		var li 	= $('<li>').attr('id',uniq_id).data({'item':uniq_id,size:size});
1687		// XSS 방지: 파일명은 HTML로 해석되지 않도록 text로 삽입 (KVE-2025-2806)
1688		var $file_name_dom = $('<span></span>');
1689		$file_name_dom.text(filename);
1690		$file_name_dom.append($('<em></em>').text(' ' + GetFileSize(size)));
1691		li.append($file_name_dom);
1692		li.append(clear_ico);
1693		li.append(hidden_input);
1694		$("#file_list").append(li);
1695	};
1696
1697	var userPosCreat = function(board_code, map_api){
1698		var image = '/img/my_location_1x.png';
1699		if(map_api === 'google'){
1700			var id = '#gmap_' + board_code;
1701			var list_data = [];
1702			var value_obj = {};
1703			value_obj.latLng = [getCookie('lat'),getCookie('lng')];
1704			list_data.push(value_obj);
1705			$(id).gmap3({
1706				map : {
1707					options : {
1708						center : [37.5666805, 126.9784147],
1709						scaleControl : true,
1710						maxZoom : 17,
1711						minZoom : 3,
1712						mapTypeControl : false,
1713						streetViewControl : false,
1714						controlSize: 29
1715					}
1716				},
1717				marker : {
1718					values : list_data,
1719					options : {
1720						draggable : false,
1721						icon : image
1722					}
1723				}
1724			});
1725		}else{		// 기본 네이버 지도
1726			var marker = new naver.maps.Marker({
1727				position: new naver.maps.LatLng(getCookie('lat'),getCookie('lng')),
1728				map: naver_map[board_code],
1729				icon: image
1730			});
1731		}
1732	};
1733
1734	/**
1735	 * 게시판 위젯 카테고리 active (위젯 카테고리와 연동시)
1736	 * @param board_code
1737	 * @param category
1738	 */
1739	var activeSubMenu = function(board_code, category) {
1740		var $ul = $('ul.' + board_code);
1741		if ($ul.length > 0) {
1742			$ul.find('li.active').removeClass('active').find('a').removeClass('active');
1743			$ul.find('[href="?category=' + category + '"]').addClass('active').parent('li').addClass('active');
1744		}
1745	}
1746
1747	/**
1748	 * 게시판 페이지/검색/정렬 변경
1749	 * @param menu_url
1750	 * @param board_code
1751	 * @param map_api
1752	 * @param marker_refresh		마커 새로고침 여부, 페이지/정렬 변경 시에 false
1753	 * @param target_page
1754	 * @param target_category
1755	 */
1756	var searchChange = function(menu_url, board_code, map_api, marker_refresh, target_page, target_category){
1757		var $map_view = $('._map_view_' + board_code);
1758		var keyword_type = $map_view.find('input[name=keyword_type]').val();
1759		var category = typeof target_category === 'undefined' ? $map_view.find('select[name=category]').val() : target_category;
1760		var keyword = $map_view.find('input[name=keyword]').val();
1761		var sort = $map_view.find('select[name=sort]').val();
1762		var page = typeof target_page === 'undefined' ? $map_view.find('ul.pagination > li.active > a').text() : target_page;
1763
1764		if(sort === 'STREET'){
1765			if(document.location.protocol !== "https:"){
1766				alert(getLocalizeString('설명_거리순정렬이지원되지않습니다', '', '거리순 정렬이 지원되지 않습니다.'));
1767				sort = 'TIME';
1768			}
1769		}
1770
1771		$.ajax({
1772			type : 'post',
1773			data : {
1774				'board_code': board_code,
1775				'search': keyword,
1776				'search_mod': keyword_type,
1777				'page': page ? page : false,
1778				'sort': sort,
1779				'status': category
1780			},
1781			url : '/ajax/get_map_list.cm',
1782			dataType : 'html',
1783			async : false,
1784			cache : false,
1785			success : function(result){
1786				//메뉴 카테고리 연동시 active
1787				activeSubMenu(board_code, category);
1788				// 지도 게시물 목록 변경
1789				var resultHtml = $('<div>' + result +'</div>');
1790				var mapListHtml = resultHtml.find('.map-list');
1791				$map_view.find('.map-list').replaceWith(mapListHtml);
1792				// 페이지 변경, 정렬 변경 시에는 마커 변동이 없으므로 마커를 재생성 하지 않음
1793				if(marker_refresh){
1794					var category_list = JSON.parse($map_view.find('input[name=json_category_list]').val());
1795					var scroll_wheel = $map_view.find('input[name=scroll_wheel]').val();
1796					var marker_clustering = $map_view.find('input[name=marker_clustering]').val();
1797					// 마커 초기화
1798					clearMap(board_code, map_api, marker_clustering);
1799					// 마커 정보 받아옴
1800					addMapData(board_code, keyword, keyword_type, sort, category);
1801					// 마커 추가
1802					listView(board_code, map_api, category_list, category, scroll_wheel, marker_clustering, true);
1803				}
1804				// 게시물 목록과 정보창 연결
1805				mapInitWrite(board_code, null, map_api, category_list);
1806				// 현재 URL 변경
1807				if(history.replaceState){
1808					//IE 9 이하 URL 변경 안됨
1809					var sort_str = sort ? '?sort='+sort : '?sort=TIME';
1810					var category_str = category ? '&category='+category : '';
1811					var keyword_str = keyword ? '&keyword='+keyword : '';
1812					var keyword_type_str = keyword_type ? '&keyword_type='+keyword_type : '';
1813					var page_str = page ? '&page='+page : '';
1814					var change_url = menu_url + sort_str + category_str + keyword_str + keyword_type_str + page_str;
1815					history.replaceState(null, null, change_url);
1816				}
1817				if(target_page > 1 && $(window).width() < 768){
1818					var $fixed_header = $('#inline_header_mobile').find('._fixed_header_section');
1819					var total_fixed_height = 0;
1820					for(var i = 0; i < $fixed_header.length; i++){
1821						var target = $fixed_header[i].getBoundingClientRect();
1822						total_fixed_height += target.height;
1823					}
1824					window.scrollTo(0, $map_view.offset().top - total_fixed_height);
1825				}
1826				if(sort === 'STREET'){
1827					if(document.location.protocol === "https:"){
1828						posCreat();
1829					}
1830				}
1831				//set token
1832				TOKEN.setListToken();
1833			},
1834			error : function(result){
1835				alert(getLocalizeString('설명_게시물을불러오는데에실패하였습니다', '', '게시물을 불러오는 데에 실패하였습니다.'));
1836			}
1837		});
1838	};
1839
1840	/**
1841	 * 정보창 닫고 마커 초기화
1842	 * @param board_code
1843	 * @param map_api
1844	 * @param marker_clustering
1845	 */
1846	var clearMap = function(board_code, map_api, marker_clustering){
1847		if(map_api === 'naver'){
1848			naver_map[board_code].destroy();
1849		}else{
1850			if(marker_clustering === 'Y'){
1851				cluster[board_code].clearMarkers();
1852				cluster[board_code] = null;
1853			}
1854			var infowindow = $('#gmap_' + board_code).gmap3({get : {name : "infowindow"}});
1855			if(infowindow){
1856				infowindow.close();
1857			}
1858			var gmap_id = '#gmap_' + board_code;
1859			$(gmap_id).gmap3({
1860				clear : {}
1861			});
1862		}
1863		markers[board_code] = [];
1864		infowindows[board_code] = [];
1865		map_data[board_code] = [];
1866	};
1867
1868	/**
1869	 * 설정된 카테고리 생성
1870	 * @param category_list
1871	 * @param str_category
1872	 * @returns {Array}
1873	 */
1874	var categoryList = function(category_list, str_category){
1875		var category_type_list_temp = [];
1876		var category_list_default = {};
1877		category_list_default.key = 0;
1878		category_list_default.value = str_category;
1879		category_list_default.color_type = 'marker-color-red';
1880		category_type_list_temp.push(category_list_default);
1881
1882		if(Array.isArray(category_list)){
1883			$.each(category_list, function(key, val){
1884				var _category_list = {};
1885				var $name = val.name;
1886				var $color = val.color;
1887				_category_list.key = key + 1;
1888				_category_list.value = '<span style="color:' + $color + '">' + RemoveTag($name) + '</span>';
1889				_category_list.color_type = val.color_type ? val.color_type : 'marker-color-red';
1890				category_type_list_temp.push(_category_list);
1891			});
1892		}
1893		return category_type_list_temp;
1894	};
1895
1896	/**
1897	 * 분류 리스트 출력
1898	 * @param $obj
1899	 * @param default_code
1900	 * @param category_data
1901	 */
1902	var categoryTypeSelect = function($obj,default_code,category_data){
1903		$obj.find('._category_type_list').setSelectBox({
1904			option: category_data,
1905			'set' : {
1906				select_custom_cls:'category_select',
1907				custom_cls:'category_dropdown',
1908				width:180
1909			},
1910			'default' : default_code,
1911			change: function (o) {
1912				$('#category_type').val(o.key);
1913				$('#category_color_type').val(category_data[o.key].color_type);
1914			}
1915		});
1916	};
1917
1918	/**
1919	 * 네이버 마커 클러스터링(인접한 마커 묶기)
1920	 * @param board_code
1921	 */
1922	var naverClustering = function(board_code){
1923		var markerArray = [];
1924		for (var key in markers[board_code]){
1925			markerArray.push(markers[board_code][key]);
1926		}
1927		cluster[board_code] = new MarkerClustering({
1928			minClusterSize: 2,
1929			maxZoom: naver_cluster_maxzoom,
1930			map: naver_map[board_code],
1931			markers: markerArray,
1932			disableClickZoom: false,
1933			icons: [naver_cluster_marker1, naver_cluster_marker2, naver_cluster_marker3, naver_cluster_marker4, naver_cluster_marker5],
1934			indexGenerator: [10, 100, 1000, 10000, 100000],
1935			stylingFunction : function(clusterMarker, count){
1936				$(clusterMarker.getElement()).find('div:first-child').text(count);
1937			}
1938		});
1939	};
1940
1941	/**
1942	 * 구글 마커 클러스터링(인접한 마커 묶기)
1943	 * @param map_id		gmap3을 사용하는 map ID
1944	 * @param options
1945	 * @param board_code
1946	 */
1947	var gmap3Clusterer = function(map_id, options, board_code){
1948		var mapObject = $(map_id).gmap3("get");
1949		var mapMarkers = $(map_id).gmap3({get: {name: "marker", all: true}});
1950		var _options = {
1951			imagePath: '//static.imweb.me/vendor/images/markerclusterer/m',
1952			zoomOnClick: true,
1953			maxZoom: google_cluster_maxzoom
1954		};
1955		if(typeof options !== 'undefined') _options = $.extend(_options, options);
1956		cluster[board_code] = new MarkerClusterer(mapObject, mapMarkers, _options);
1957	};
1958
1959	/**
1960	 * 네이버 마커 
1961	 */
1962	var naverMarkCenter = function(naver_map) {
1963		function checkMapListOffset () {
1964			const mapList = document.querySelector('._map-list');
1965			if (!mapList) return false;
1966			return {
1967				width: mapList.offsetWidth,
1968				left: mapList.offsetLeft
1969			};
1970		}
1971
1972		function checkMapWidth() {
1973			var map = document.querySelector('._map');
1974			if (!map) return 0;
1975			return map.offsetWidth;
1976		}
1977
1978		// 리스트가 있을때 리스트를 제외한 영역의 중심으로 이동
1979		if (document.querySelector('body').offsetWidth > 766) {
1980			var listW = checkMapListOffset().width;
1981			var listL = checkMapListOffset().left;
1982			var halfMapWidth = checkMapWidth() / 2;
1983			var mapViewWidth = -1 * ((checkMapWidth() - listW - (listL * 2)) / 2);
1984			mapViewWidth = mapViewWidth - (listW + listL - halfMapWidth);
1985			naver_map.panBy(new naver.maps.Point(mapViewWidth, 0));
1986		}
1987	}
1988
1989	return {
1990		mapInitWrite: function(b_code,$obj,api,category_list,placeholder_edit) {
1991			mapInitWrite(b_code,$obj,api,category_list,placeholder_edit);
1992		},
1993		toggleAlarmPopup : function(){
1994			toggleAlarmPopup();
1995		},
1996		addMapData : function(board_code, keyword, keyword_type, sort, category){
1997			addMapData(board_code, keyword, keyword_type, sort, category);
1998		},
1999		mapEditorPop : function(map_api){
2000			mapEditorPop(map_api);
2001		},
2002		mapAddressSearch : function(val, map_api){
2003			mapAddressSearch(val, map_api);
2004		},
2005		addressDelete : function(map_api){
2006			addressDelete(map_api);
2007		},
2008		submit : function(map_api){
2009			mapSubmit(map_api);
2010		},
2011		mapCancel: function(back_url){
2012			mapCancel(back_url);
2013		},
2014		setMap : function(lat,lng,detail,$obj,m_data,map_api,editable,scroll_wheel,zoom,marker_url){
2015			setMap(lat,lng,detail,$obj,m_data,map_api,editable,scroll_wheel,zoom,marker_url);
2016		},
2017		getTypeMapView : function(idx,back_url, board_code, map_api,scroll_wheel, is_ignore){
2018			getTypeMapView(idx,back_url, board_code, map_api,scroll_wheel, is_ignore);
2019		},
2020		deleteMap : function(board_code,code,return_url){
2021			deleteMap(board_code,code,return_url);
2022		},
2023		mapListToggle : function($obj){
2024			mapListToggle($obj);
2025		},
2026		mapSearchToggle : function($obj,type){
2027			mapSearchToggle($obj,type);
2028		},
2029		mapListChange : function($obj,type){
2030			mapListChange($obj,type);
2031		},
2032		posCreat : function(force){
2033			posCreat(force);
2034		},
2035		posChange : function(){
2036			posCreat(true);
2037		},
2038		moveUserPosition : function(board_code, map_api){
2039			moveUserPosition(board_code, map_api);
2040		},
2041		setAndroidLocationData : function(latitude, longitude){
2042			setAndroidLocationData(latitude, longitude);
2043		},
2044		listView : function(board_code, api, category_list, category, scroll_wheel, marker_clustering, is_refresh){
2045			listView(board_code, api, category_list, category, scroll_wheel, marker_clustering, is_refresh);
2046		},
2047		getMarkerByColorType: function(color_type){
2048			return getMarkerByColorType(color_type);
2049		},
2050		mapSecretPost : function($obj,type){
2051			mapSecretPost($obj,type);
2052		},
2053		addFile : function(filename,file_code,tmp_idx,size){
2054			postAddFile(filename,file_code,tmp_idx,size);
2055		},
2056		infowindowClose:function(api, id, board_code){
2057			infowindowClose(api, id, board_code);
2058		},
2059		userPosCreat:function(board_code, map_api){
2060			userPosCreat(board_code, map_api);
2061		},
2062		searchChange: function(menu_url, board_code, map_api, marker_refresh, target_page, category){
2063			searchChange(menu_url, board_code, map_api, marker_refresh, target_page, category);
2064		},
2065		pageChange: function(menu_url, board_code, map_api, page){
2066			pageChange(menu_url, board_code, map_api, page);
2067		},
2068		deleteCoverImage : function(){
2069			deleteCoverImage();
2070		},
2071		categoryTypeSelect : function($obj,default_code,category_data){
2072			categoryTypeSelect($obj,default_code,category_data);
2073		},
2074		categoryList : function(category_list, str_category){
2075			return categoryList(category_list, str_category);
2076		}
2077	};
2078}();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.