/****************************************************************************************************
* 고속도로 시내도로 CCTV 동영상호출
* @param Icon
* @param points
* @param title
****************************************************************************************************/
function getRoadCctvPop(Icon, points, title) {
	if (detectIOS() || detectSafari()) {
		alert('ios 및 safari에서는 CCTV 서비스가 지원되지 않습니다.');
		return;
	}

	cnt++;

	//같은 마커클릭일 경우 동영상닫기.
	roadCctvClose(points[4]);

	var lon = points[1] + 20;
	var lat = points[0] + 10;

	var position = new daum.maps.LatLng(lat, lon);

	var timestamp = (new Date()).getTime();
	var content = document.createElement('div');
	content.setAttribute("id", points[4]);
	content.setAttribute("class", "roadCctvDiv");

	var output = '<table  width="325" height="240"	cellspacing="0" cellpadding="0" border="0" summary="팝업 상황박스입니다." class="pop_table2">';
	output += '<caption>' + title + 'CCTV동영상</caption>';
	output += '<colgroup><col style="width:12%;"><col style="width:*"></colgroup><thead>';
	output += '<tr>';
	output += '<th><img src="' + CONTEXTROOT + '/images/icon02.png?' + timestamp + '" alt="타이틀 블릿" loading="lazy"/>' + title + '<span><a onclick="roadCctvClose(\'' + points[4] + '\');">'
	output += '<img src="' + CONTEXTROOT + '/images/close_btn2.gif?' + timestamp + '" alt="close_btn2" loading="lazy"></a></span></th>';
	output += '</tr>';
	output += '<tbody>';
	output += '<tr>';
	output += '<td>';
	output += '<div id="mmp-div_' + points[4] + '" style="z-index:0;">';
	output += '<div class="video-placeholder">';
	output += '<p>' + title + ': <span>영상을 로드하는 중</span></p>';
	output += '</div>';
	output += '<video muted autoplay playsinline controls id="' + points[3] + '" width="320" height="240"/>';
	output += '</div>';
	output += '</td>';
	output += '</tr>';
	output += '</tbody>';
	output += '<tfoot>';
	output += '<tr>';  //테이블 푸터 여백 지우면안됨
	output += '<td>';
	output += '</td>';
	output += '</tr>';
	output += '</tfoot>';
	output += '</table>';

	content.innerHTML = output;

	checkMaxWindows();

	roadCctvInfoWindow = new daum.maps.InfoWindow({
		position: position,
		content: content,
		removable: false,
		zIndex: cnt,
	});

	roadCctvInfo.push(roadCctvInfoWindow);
	roadCctvInfoWindow.open(map, Icon);
	roadCctvInfoWindow.myId = points[4];
	roadCctvInfoWindow.streamSession = points[3];

	cctvRoadPlayer(roadCctvInfoWindow.streamSession);

	//인포윈도우 이동
	$(".roadCctvDiv").mouseover(function() {

		var roadCctvDiv = $(this).attr("id");

		var clickInfo = document.getElementById(roadCctvDiv);

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

			if (roadCctvInfo[i].myId == roadCctvDiv) {

				$("#roadCctvDiv").val(roadCctvDiv);

				//infoWindow에 mousedown이벤트를 등록합니다 
				addEventHandle(clickInfo, 'mousedown', onMouseRoadDown);

				//mouseup 이벤트가 일어났을때 mousemove 이벤트를 제거하기 위해
				//document에 mouseup 이벤트를 등록합니다 
				addEventHandle(document, 'mouseup', onMouseRoadUp);
			}
		}
	});
}

/****************************************************************************************************
 * WebRtc 동영상 재생
****************************************************************************************************/
function cctvRoadPlayer(cctvStreamSession) {
	// 고속도로 CCTV는 rtc 서버와 streamSession이 일치하지 않음
	// rtsp 주소에 streamSession 값이 포함되어있는지 판단해서 재생
	let item = sessionList.find(function(element) { return element.f2.indexOf(cctvStreamSession) !== -1 });
	
	if(!item){
		console.log('sessionList에 cctv 정보가 없습니다.');
	}
	
	open_video(item, cctvStreamSession);
}

/****************************************************************************************************
 * CCTV infoWindow 이동 함수(mousedown)
****************************************************************************************************/
function onMouseRoadDown(e) {

	// infoWindow를 드래그 할 때, 내부 텍스트가 영역 선택되는 현상을 막아줍니다.
	if (e.preventDefault) {
		e.preventDefault();
	} else {
		e.returnValue = false;
	}

	var overlayPos = "";

	var proj = map.getProjection() // 지도 객체로 부터 화면픽셀좌표, 지도좌표간 변환을 위한 MapProjection 객체를 얻어옵니다 

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

		if (roadCctvInfo[i].myId == $("#roadCctvDiv").val()) {
			overlayPos = roadCctvInfo[i].getPosition(); //infoWindow의 현재 위치를 가져옵니다
		}
	}

	// 커스텀오버레이에서 마우스 관련 이벤트가 발생해도 지도가 움직이지 않도록 합니다
	daum.maps.event.preventMap();

	// mousedown된 좌표를 설정합니다 
	startX = e.clientX;
	startY = e.clientY;

	// mousedown됐을 때의 infoWindow의 좌표를
	// 지도 컨테이너내 픽셀 좌표로 변환합니다 
	startOverlayPoint = proj.containerPointFromCoords(overlayPos);

	// document에 mousemove 이벤트를 등록합니다 
	addEventHandle(document, 'mousemove', onMouseRoadMove);
}

/****************************************************************************************************
//infoWindow에 mousedown 한 상태에서 
//mousemove 하면 호출되는 핸들러 입니다 
****************************************************************************************************/
function onMouseRoadMove(e) {

	// infoWindow를 드래그 할 때, 내부 텍스트가 영역 선택되는 현상을 막아줍니다.
	if (e.preventDefault) {

		e.preventDefault();

	} else {

		e.returnValue = false;
	}

	var proj = map.getProjection(),// 지도 객체로 부터 화면픽셀좌표, 지도좌표간 변환을 위한 MapProjection 객체를 얻어옵니다 
		deltaX = startX - e.clientX, // mousedown한 픽셀좌표에서 mousemove한 좌표를 빼서 실제로 마우스가 이동된 픽셀좌표를 구합니다 
		deltaY = startY - e.clientY,
		// mousedown됐을 때의 infoWindow의 좌표에 실제로 마우스가 이동된 픽셀좌표를 반영합니다 
		newPoint = new daum.maps.Point(startOverlayPoint.x - deltaX, startOverlayPoint.y - deltaY),
		// 계산된 픽셀 좌표를 지도 컨테이너에 해당하는 지도 좌표로 변경합니다 
		newPos = proj.coordsFromContainerPoint(newPoint);

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

		if (roadCctvInfo[i].myId == $("#roadCctvDiv").val()) {

			roadCctvInfo[i].setPosition(newPos); //선택한 infoWindow 좌표를 설정합니다 
		}
	}
}

/****************************************************************************************************
 * CCTV 인포윈도우 mouseup 
****************************************************************************************************/
function onMouseRoadUp(e) {

	// 등록된 mousemove 이벤트 핸들러를 제거합니다 
	removeEventHandle(document, 'mousemove', onMouseRoadMove);
}

/****************************************************************************************************
 * 바운더리 밖에있는 인포윈도우 체크
****************************************************************************************************/
function roadCctvBound() {

	var len = roadCctvInfo.length;

	if (len > 0) {

		var cctvIdArr = "";

		var proj = map.getProjection();

		// 지도의 영역을 구합니다.
		var bounds = map.getBounds();

		// 지도의 영역을 기준으로 확장된 영역을 구합니다.
		var extBounds = extendBounds(bounds, proj);

		for (var j = 0; j < roadCctvMarker.length; j++) {

			// target이 확장된 영역에 속하는지 판단하고
			if (extBounds.contain(roadCctvMarker[j].getPosition())) {

				if (j == 0) {

					cctvIdArr += roadCctvMarkerId[j];

				} else {

					cctvIdArr += "," + roadCctvMarkerId[j];
				}
			}
		}

		roadCctvBoundClose(cctvIdArr);

	}
}

/****************************************************************************************************
 * CCTV 인포윈도우
 * 바운더리 밖에있는 인포윈도우 닫음
****************************************************************************************************/
function roadCctvBoundClose(cctvIdArr) {
	for (var i = 0; i < roadCctvInfo.length; i++) {
		if (cctvIdArr.indexOf(roadCctvInfo[i].myId) < 0) {
			let activeElement = activeList[roadCctvInfo[i].streamSession];

			if (activeElement && (activeElement.hds7000 || activeElement.videoObj)) {
				closeVideoElement(activeElement);
			} 

			closeRoadCctvInfo(i);
			i--;
		}
	}
}

/****************************************************************************************************
 * CCTV 인포윈도우(선택/전체)닫기
****************************************************************************************************/
function roadCctvClose(divId) {
	var divId = nvl(divId, "");

	for (var i = 0; i < roadCctvInfo.length; i++) {
		if (roadCctvInfo[i]) {
			let activeElement = activeList[roadCctvInfo[i].streamSession];

			if (divId !== "") {
				if (roadCctvInfo[i].myId == divId) {
					if (activeElement && (activeElement.hds7000 || activeElement.videoObj)) {
						closeVideoElement(activeElement);
					}

					closeRoadCctvInfo(i);
					i--;
				}
			} else {
				//전체닫기
				if (activeElement && (activeElement.hds7000 || activeElement.videoObj)) {
					closeVideoElement(activeElement);
				}

				closeRoadCctvInfo(i);
				i--;
			}
		}
	}
}
