<?php
/*=================================================================================================
 * 멀티 업로더 스킨 :: start
 * 현재의 파일이 포함되어져 있는 곳
 * 아래와 같이 게시판 스킨에 포함되어서 사용됨
 * g5/skin/board/basic/write.skin.php 
 * g5/skin/board/gallery/write.skin.php
 *
 * 그누보드에서의 모듈 호출및 저장 관련 함수 포함
**-----------------------------------------------------------------------------------------------*/ 
if (!defined('_GNUBOARD_')) exit;
/*===============================================
 * 멀티 파일 업로더 설정 파일 연결
**---------------------------------------------*/
if( file_exists( G5_PLUGIN_PATH.'/multi_uploader/multi_uploader_config.php' ) ){
	include_once ( G5_PLUGIN_PATH.'/multi_uploader/multi_uploader_config.php' ); 
}


// 웹용 스킨과 모바일 스킨에 사용 안할시 기존 스킨을 사용하게 한다
if($_use_multiuploader === 'No'){ //기존 형태

    if(!G5_IS_MOBILE){ /* 웹일경우 기본 스킨 */ 
?>
        <?php for ($i=0; $is_file && $i<$file_count; $i++) { ?>
        <div class="bo_w_flie write_div">
            <div class="file_wr write_div">
                <label for="bf_file_<?php echo $i+1 ?>" class="lb_icon"><i class="fa fa-folder-open" aria-hidden="true"></i><span class="sound_only"> 파일 #<?php echo $i+1 ?></span></label>
                <input type="file" name="bf_file[]" id="bf_file_<?php echo $i+1 ?>" title="파일첨부 <?php echo $i+1 ?> : 용량 <?php echo $upload_max_filesize ?> 이하만 업로드 가능" class="frm_file ">
            </div>
            <?php if ($is_file_content) { ?>
            <input type="text" name="bf_content[]" value="<?php echo ($w == 'u') ? $file[$i]['bf_content'] : ''; ?>" title="파일 설명을 입력해주세요." class="full_input frm_input" size="50" placeholder="파일 설명을 입력해주세요.">
            <?php } ?>

            <?php if($w == 'u' && $file[$i]['file']) { ?>
            <span class="file_del">
                <input type="checkbox" id="bf_file_del<?php echo $i ?>" name="bf_file_del[<?php echo $i;  ?>]" value="1"> <label for="bf_file_del<?php echo $i ?>"><?php echo $file[$i]['bf_source'].'('.$file[$i]['size'].')';  ?> 파일 삭제</label>
            </span>
            <?php } ?>
        </div>
        <?php } ?>

    <?php } else {  /* 모바일일경우 기본 스킨 */ ?>

        <?php for ($i=0; $is_file && $i<$file_count; $i++) { ?>
        <div class="bo_w_flie write_div">
            <div class="file_wr write_div filebox">
                <input type="text" class="fileName" readonly="readonly" placeholder="파일을 첨부하세요">
                <label for="bf_file_<?php echo $i+1 ?>"><i class="fa fa-download lb_icon" aria-hidden="true"></i><span class="sound_only">파일 #<?php echo $i+1 ?></span><span class="btn_file">파일첨부</span></label>
                <input type="file" name="bf_file[]" id="bf_file_<?php echo $i+1 ?>" title="파일첨부 <?php echo $i+1 ?> : 용량 <?php echo $upload_max_filesize ?> 이하만 업로드 가능" class="frm_file uploadBtn">
            </div>
            <?php if ($is_file_content) { ?>
            <input type="text" name="bf_content[]" value="<?php echo ($w == 'u') ? $file[$i]['bf_content'] : ''; ?>" title="파일 설명을 입력해주세요." class="full_input frm_input" size="50" placeholder="파일 설명을 입력해주세요.">
            <?php } ?>

            <?php if($w == 'u' && $file[$i]['file']) { ?>
            <span class="file_del">
                <input type="checkbox" id="bf_file_del<?php echo $i ?>" name="bf_file_del[<?php echo $i;  ?>]" value="1"> <label for="bf_file_del<?php echo $i ?>"><?php echo $file[$i]['bf_source'].'('.$file[$i]['size'].')';  ?> 파일 삭제</label>
            </span>
            <?php } ?>
        </div>
        <?php } ?>

    <?php } ?>

<?php
} //기존 형태
elseif($_use_multiuploader == 'Yes'){// 멀티 업로더 추가  업로드 갯수와 파일 업로드용량은 관리자 페이지에서 설정할 수 있도록
	
	// 초기화
	unset($_addnum, $_list_thumbnail_num);
	
	// 그누보드에 한해서 빈배열이 특성상 들어갈 수 있다 이것을 해결하기 위해
	$blankData   = [];  // 빈 배열 초기화 
	$blank_where = "bo_table = '{$bo_table}' AND wr_id = '{$wr_id}' AND bf_source ='' AND bf_file = ''";
	$blank_sql   = "SELECT * FROM {$g5['board_file_table']} WHERE $blank_where"; 
	$result      = sql_query($blank_sql); // SQL 실행 후 결과 저장
	$_addnum     = 0;
	while($blank = sql_fetch_array($result)) { // 결과를 반복하여 가져오기
		$blankData[$_addnum] = $blank['bf_no']; // 전체 행을 배열에 저장
		$_addnum++;
	} 
	unset($_addnum); 
    $_list_thumbnail_num     = 0;


?>
<script>
let use_cms = 'gnuboard';// 사용하는 cms
</script>
<link rel="stylesheet" href="<?php echo G5_PLUGIN_URL;?>/multi_uploader/css/style.css?ver=0.12">
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/lang/language.js" title="언어"></script>
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/mime_types.js" title="파일타입"></script>
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/multi_uploader_util.js?ver=1" title="유틸"></script>
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/multi_uploader_helper.js?ver=1" title="헬퍼"></script> 
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/multi_uploader_layout.js?ver=1" title="레이아웃"></script> 
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/multi_uploader_setDataAttribute.js?ver=1" title="데이터 속성 추가"></script>  
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/multi_uploader_dragAction.js?ver=1" title="기능 동작"></script> 
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/multi_uploader_code.js?ver=1" title="기본 기능"></script> 
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/multi_uploader.js?ver=1" title="호출"></script> 
<script src="<?php echo G5_PLUGIN_URL;?>/multi_uploader/js/use_mp3.js?ver=1" title="mp3테스트용"></script>
<style>
.uploader_module{margin:50px 0px 100px 0px;min-width:300px;min-height:250px;}
.file_loader .file_zone{min-height:250px;}
</style>
<script>
	// 관리자에서 파일 업로드 용량과 파일 업로드개수를 변경해야 함
	MARI.file_uploder.code.limitTotalSize   = '<?php echo $file_total_limit;?>';         // 파일 전체 리미트 용량
	MARI.file_uploder.code.limitOneSize     = '<?php echo $file_upload_max_filesize;?>'; // 파일 한개당 리미트 용량 그누보드 설정값을 따름
	MARI.file_uploder.code.limit_upload_num = '<?php echo $board['bo_upload_count'];?>'; // 업로드 최대 갯수 그누보드 설정과 맞춘다
	MARI.file_uploder.code.boardSubject     = '<?php echo $board['bo_subject'];?>';      // 현재 사용중인 곳의 보드 제목
	MARI.file_uploder.code.boardId          = '<?php echo $bo_table;?>';                 // 현재 사용중인 곳의 보드 아이디

	// multi_uploader_code.js 213번줄 부근 [수정용 파일이 있다면 등록 수정용 배열은 ajax등 상황에 맞게 한다 ]에서 아작스로 만들어 불러올 수도 있다
	// 여러개의 글쓰기가 존재할때 어떻게 대처할지
	let modifyFile_Ary =[
		<?php
		function formatFileSize($bytes, $decimals = 2) {
			$sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
			$factor = floor((strlen($bytes) - 1) / 3);
			return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . ' ' . $sizes[$factor];
		}

		$_form_count = 1; // ( form )모듈의 전체 갯수
		$_file_count = $file['count'] ? $file['count'] : '0';
		$_num_plus   = 1;
		$_idx        = 0;
		$_thumb      = 0;
		for ($a=0; $a<$_form_count; $a++) { ?> 
		{
			'board_id'   : '<?php echo $bo_table;?>',
			'content_no' : <?php echo $wr_id ?>,
			'file_count' : <?php echo $file_count ?>,
			'file_blank' : <?php echo json_encode($blankData, JSON_UNESCAPED_UNICODE); ?>,
			'fileuseCnt' : <?php echo $_file_count ?>,
			'file_ary'   : [ <?php 
				
				for ($i=0; $is_file && $i<$file_count; $i++) { 

					// $file에 변수 추가
					if(empty($file[$i]['file'])){// 빈 업로드일 경우
						$file[$i]['is_blank']    = 'blank';
						$file[$i]['isValidFile'] = 'blank'; 
					} else {
						$file[$i]['is_blank']    = 'filled';
					}

					// 게시물 수정과 파일이 있다면
					if($w == 'u' && $file[$i]['file']) {
						$_ext = strtolower(end(explode('.', $file[$i]['file']))); 

						if($file[$i]['bf_list_thumbnail'] == 'Y'){
							$_list_thumbnail_num = $_thumb; // 대표 썸네일 번호를 넘겨줌 
						
						 echo '//   '.$_list_thumbnail_num .'|'. $_thumb.'|'.$file[$i]['bf_list_thumbnail'].'';
						}

						$timestamp = round(microtime(true) * 1000);
						$_dataCode = 'M_'.$a.'_'.$timestamp.'_'.$_num_plus;

						$file_path =  G5_DATA_PATH.'/file/'.$bo_table.'/'.$file[$i]['file'];  

						$file_size = '';
						if (file_exists($file_path)) {
							$file_size1 = filesize($file_path);
							$file_size2 = formatFileSize($file_size1);   // 사람이 읽기 쉬운 형식  
							$data_type  = mime_content_type($file_path); // 파일 타입 (MIME 타입) 
							$file[$i]['isValidFile'] = 'valid';
						} else {
							$file_size1 = '';
							$file_size2 = '';    // 사람이 읽기 쉬운 형식
							$data_type  = 'image/jpeg';    // 파일 타입 (MIME 타입) 
							$file[$i]['isValidFile'] = 'invalid'; 
						} 

						// 파일명을 가지고 해당 파일의 정보를 디비에서 가져온다:: 중간 중간 비어 있을 수 있는 공백( 파일 업로드 ) 때문에 이 작업을 함
						$fileWhere = "bo_table = '{$bo_table}' AND wr_id = '{$wr_id}' AND bf_file = '{$file[$i]['file']}'";
						$fileData  = sql_fetch("SELECT * FROM {$g5['board_file_table']} WHERE $fileWhere");

					?> 
					// 파일
					{ 
						'callAryType'          :  'ModifyAry',
						'dataIcon'             :  './images/file_kind/<?php echo $_ext;?>.gif',
						'dataCode'             :  '<?php echo $_dataCode;?>',
						'dataMakeType'         :  'Modify',
						'dataFileSrc'          :  '<?php echo $file[$i]['path']?>/<?php echo $file[$i]['file']?>',
						'dataFileName'         :  '<?php echo $file[$i]['source']?>',
						'dataFileReName'       :  '<?php echo $file[$i]['source']?>',
						'dataFileOriginalName' :  '<?php echo $file[$i]['source']?>',
						'dataExt'              :  '<?php echo $_ext;?>',
						'dataIdx'              :  '<?php echo $_idx;?>',
						'dataTempIdx'          :  '<?php echo $_idx;?>',
						'dataPicture'          :  '<?php echo $file[$i]['path']?>/<?php echo $file[$i]['file']?>',

					   'dataThumbnail'	   :  '<?php echo $file[$i]['path']?>/<?php echo $file[$i]['file']?>',

						'file_name'            :  '<?php echo $file[$i]['source']?>',
						'dataImgHeight'        :  '<?php echo $fileData['bf_height']?>',
						'dataImgWidth'         :  '<?php echo $fileData['bf_width']?>',
						'file_pic_size'        :  '<?php echo $file[$i]['bf_width']?>*<?php echo $file[$i]['bf_height']?>', 
						'file_size'            :  '<?php echo $file_size2;?>', 
						'file_type2'           :  '<em>JPEG 비트맵 그래픽 파일 ( jpg ) </em>',
						'file_type3'           :  '유형 : <em>JPEG 비트맵 그래픽 파일</em>',
						'lastModified2'        :  '2005년 10월 31일 월요일 오전0시 3분 56초',
						'lastModifiedDate2'    :  '2005-10-31(월) 오전 12:03',
						'lastModified'         :  '2005년 10월 31일 월요일 오전0시 3분 56초',
						'lastModifiedDate'     :  '2023.01.01',
						'name'                 :  '<?php echo $file[$i]['source']?>',
						'size'                 :  '<?php echo $file_size1;?>',
						'dataType'             :  '<?php echo $data_type;?>', 
						'list_thumbnail'       :  '<?php echo $file[$i]['bf_list_thumbnail']?>',

						// 그누보드 한정	
						'gnu_bf_no'            :  '<?php echo $fileData['bf_no'];?>', 
						'gnu_bf_source'        :  '<?php echo $fileData['bf_source'];?>', 
						'gnu_is_blank'         :  '<?php echo $file[$i]['is_blank']?>', 
						'gnu_isValidFile'      :  '<?php echo $file[$i]['isValidFile']?>', 
					}, 	 
					<?php

						$_thumb++;
						$_num_plus++;
						$_idx++;
						}//if($w == 'u' && $file[$i]['file'])

				}//end for
				?>] 
		}, // end a
		<?php } ?> 
	];

 
	/*=============================================================================================
	 * 글 저장 관련 :: 2025-03-23(일)
	**-------------------------------------------------------------------------------------------*/
    // 문서 로드후 서브밋 버튼에 이벤트를 추가한다
    if( use_cms === 'gnuboard') {
        window.addEventListener('load', () =>{
            document.getElementById("fwrite").addEventListener("submit", function(event) {
                event.preventDefault();
                if (document.getElementById("btn_submit").disabled) { 
                    submitActionFileUpload();
                }
            });

        });

        function submitActionFileUpload() {
            event.preventDefault();
            let isUpdate = false;
            let obj_this     = MARI.file_uploder.code; 
            let eq_idx       = obj_this.eq_idx ?? 0;
            let li_obj       = obj_this.li_obj(eq_idx);
            let up_cnt       = li_obj.length;
            let etcDataAry   = []; 
            let dTa_Ary      = MARI.file_uploder.code.dTa_Ary[eq_idx];
            let newFile      = dTa_Ary.new_files.files;     // 새로 올라온 파일
            let modifyFile   = dTa_Ary.modify_files;        // 서버 저장된 파일
            let file_count   = document.querySelector("input[name='file_count']").value; //그누보드 설정 파일업로드 인풋 갯수
            let fileBlankLen = modifyFile_Ary[eq_idx].file_blank.length;
            
            // 파일 이외의 데이터를 담아서 넘긴다
            let resultEtcDataAry = {
                up_cnt: up_cnt + fileBlankLen, // 데이터의 갯수: 실질적인 남은 갯수 + 그누보드 빈공간 인풋 갯수
                up_data: []     // 데이터 보관 배열
            };

            for(let i=0; i<file_count; i++){ // 그누보드 형식을 따라서
                let objType      = obj_this.getMakeType(eq_idx, i); 
                let getListIdx   = obj_this.getListDataAryIdx(eq_idx, i) - 1;      // 데이터 코드에는 1부터 증가이므로 빼준다  
                let getDatas     = obj_this.getFileInfo2(eq_idx, objType, getListIdx, 'All', '195'); // 데이터 
     
                // 순서 이름변경등 변경이 있는지 dataEdit 살필것 2025-03-05(수)
                let makeType     = getDatas?.dataMakeType ?? 'blank';
                let dataEdit     = getDatas?.dataEdit ?? ''; 
                let dataFileName = getDatas?.dataFileName ?? '';
                let aryIdx       = getDatas?.dataTempIdx ?? '';  // 필요한지 추후 확인
                let dataCode     = getDatas?.dataCode ?? '';
                let gnu_bf_no    = getDatas?.gnu_bf_no ?? '';

                // 파일 이름, 파일 생성 타입, 수정 여부, 배열 인덱스, 데이터 코드
                let oneAry = { 
                    fileName : dataFileName,
                    makeType : makeType,
                    dataEdit : dataEdit,
                    aryIdx   : aryIdx,
                    dataCode : dataCode,
                    gnu_bf_no: gnu_bf_no,
                    // 선택된 썸네일의 인덱스 번호 넣을 것
                };

                resultEtcDataAry.up_data.push(oneAry); // 개별 파일 정보를 데이터 보관 배열에 추가 

            }// end for

            // 그누보드 한정::그누보드의 빈 파일이 들어갈 위치에 넣어서 순서를 맞춘다 
            for(let i=0; i<fileBlankLen; i++){  
                // 파일 이름, 파일 생성 타입, 수정 여부, 배열 인덱스, 데이터 코드
                let blankOneAry = { 
                    fileName :  '',
                    makeType :  '',
                    dataEdit :  '',
                    aryIdx   :  '',
                    dataCode :  '',
                    gnu_bf_no:  modifyFile_Ary[eq_idx].file_blank[i],
                    // 선택된 썸네일의 인덱스 번호 넣을 것
                };
                resultEtcDataAry.up_data.splice(modifyFile_Ary[eq_idx].file_blank[i] - 1, 0, blankOneAry);// 개별 파일 정보를 데이터 보관 배열에 추가 
            }
            // 그누보드 한정::그누보드의 빈 파일이 들어갈 위치에 넣어서 순서를 맞춘다

            // 파일 데이터를 담는다
            if(newFile && document.querySelector("input[name='bf_multi_file[]']")){
                fileArray = Array.from(newFile);   // 새로운 파일 데이터를 담음
                let dTs   = new DataTransfer();                       
                fileArray.forEach(file =>{ dTs.items.add(file); });
                if(document.querySelector("input[name='bf_multi_file[]']")){
                    document.querySelector("input[name='bf_multi_file[]']").value = '';        // 큰 의미가 없으므로 비운다
                    document.querySelector("input[name='bf_multi_file[]']").files = dTs.files; // 데이터를 받아 넘긴다   
                }
            }

            // 썸네일 파일 데이터를 담는다
            if(obj_this.thumb_Ary[eq_idx].thumb_new_files && document.querySelector("input[name='thumbnail_file[]']")){
                fileArray = Array.from(obj_this.thumb_Ary[eq_idx].thumb_new_files);   // 새로운 썸네일 파일 데이터를 담음
                let dTs   = new DataTransfer();                       
                fileArray.forEach(file =>{ dTs.items.add(file); });
                if(document.querySelector("input[name='thumbnail_file[]']")){
                    document.querySelector("input[name='thumbnail_file[]']").value = '';        // 큰 의미가 없으므로 비운다
                    document.querySelector("input[name='thumbnail_file[]']").files = dTs.files; // 데이터를 받아 넘긴다   
                }
            }

            // 데이터를 담아서 넘긴다 :: 최종 유효한 데이터 이후 빈 파일은 걷어낸다 단 위에서 파일 중간에 넣어준 빈 파일은 그대로 둔다 1.빈파일 2.빈파일 3.파일 4.빈파일일 경우 3번까지 3개를 보낸단 의미
            resultEtcDataAry.up_data = resultEtcDataAry.up_data.filter(item => item.fileName);
            document.querySelector("input[name='multi_upload_data']").value = JSON.stringify(resultEtcDataAry); 

            // 위의 기능이 무탈하게 수행이 되었다면
            isUpdate = true;
            if(isUpdate === true){ // false
                event.target.submit(); // 폼을 수동으로 제출
            }
        }// end func
    }// 그누보드 저장일 때		
</script>
<input type="hidden" name="file_count" value="<?php echo $file_count;?>"> 
<input type="hidden" name="list_thumbnail" value="<?php echo $_list_thumbnail_num;?>">
<input type="hidden" name="submit_file_list">
<input type="hidden" name="submit_delete_list">
<div style="display:none;">멀티 파일 업로더</div>
<div class="uploader_module"> 
	<div class="file_loader" list_shape ='shape3' use_module ='Y' use-multiple ='Y' multi_select='Y' use-ext ='.jpg,.jpeg,.mp3,.mp4,.webm,.txt,.html,.wmf,.gif,.png,.pdf'>
	<!--// 업로더 출력 -->
    </div>
</div>
<?php
	
} // 멀티 업로더 추가
/*-------------------------------------------------------------------------------------------------
 * 멀티 업로더 스킨 :: end
**===============================================================================================*/
?>
