/**
 * 파일 업로더 사용자 스크립트.
 * prototype.js 1.5.0 이상
 */

/**
 * 업로더 클래스
 * @author 최창환
 */
var Uploader = Class.create();
Uploader.prototype = {
	/**
	 * @var 플래시 업로더 객체
	 */
	flashObject: null,
	
	/**
	 * 생성자
	 * @param targetDir 업로드 타겟 디렉토리
	 * @param tempKey 업로드 파일의 임시 키
	 * @param userNo 현재 사용자 번호
	 * @param settings 플래시 업로더 설정 정보
	 */
	initialize: function(targetDir, tempKey, userNo, options) {
		/*
		 * 기본 설정 저장
		 */
		this.targetDir = targetDir;
		this.tempKey = tempKey;
		this.userNo = userNo;
		
		/*
		 * 업로더 옵션 저장
		 */
		this.options = Object.extend({
			autostart : true,
			max_count : 10,
			cur_count : 0
		}, options || {});
		
		this.targetId = this.options.target_id;
		
		/*
		 * 업로더 파일 숫자 설정
		 */
		this.maxFiles = this.options.max_count;
		this.currentFiles = this.options.cur_count;
		this.currentQueue = 0;
		
		/*
		 * 플래시 업로더 옵션 저장
		 */
		this.uploaderOptions = {
			upload_url : "/lib/image_upload.php",
			flash_url : "/lib/Uploader/swfupload.swf?rand="+Math.random(),
			
			post_params: options.post_params || { "mode": "upload", "dir": "", "tempKey": 1, "UserNo": -1 },
			file_size_limit : options.file_size_limit || "4 MB",
			file_types : options.file_types || "*.jpg;*.jpeg;*.gif;*.png",
			file_types_description: options.file_types_description || "이미지 파일",
			
			swfupload_loaded_handler : this.onSWFUploadLoaded.bind(this),
			file_dialog_start_handler : this.onFileDialogStart.bind(this),
			file_queued_handler : this.onFileQueued.bind(this),
			file_queue_error_handler : this.onFileQueueError.bind(this),
			file_dialog_complete_handler : this.onFileDialogComplete.bind(this),
			upload_start_handler : this.onUploadStart.bind(this),
			upload_success_handler : this.onUploadSuccess.bind(this),
			upload_complete_handler : this.onUploadComplete.bind(this),
			upload_error_handler : this.onUploadError.bind(this),
			upload_progress_handler : this.onUploadProgress.bind(this),

			button_height: options.button_height || 80,
			button_width: options.button_width || 80,
			button_placeholder_id: options.button_placeholder_id, 
			button_image_url: options.button_image_url,
			button_action : options.button_action || SWFUpload.BUTTON_ACTION.SELECT_FILES,
			button_cursor : options.button_cursor || SWFUpload.CURSOR.HAND,
			button_window_mode : options.button_window_mode || SWFUpload.WINDOW_MODE.WINDOW,
			button_disable : options.button_disable || false,
			debug: options.button_debug || false
		};

		/*
		 * 플래시 객체 생성
		 */
		this.flashObject = new SWFUpload(this.uploaderOptions);
	},
	/**
	 * 업로드 시작
	 */
	startUpload: function() {
		//this.flashObject.startUpload();
		var fnc = this.flashObject.startUpload.bind(this.flashObject);
		fnc();
	},
	/**
	 * 이벤트 핸들러들
	 */
	onSWFUploadLoaded: function() {
		//alert("swf upload loaded");
	},
	onFileDialogStart: function() {
		//alert('file dialog start');
		if (typeof(this.options.onFileDialogStart) == 'function') {
			var fnc = this.options.onFileDialogStart.bind(this);
			fnc();
		}
	},
	onFileQueued: function(file) {
		//alert('file ' + file.name + ' queued');
		if (typeof(this.options.onFileQueued) == 'function') {
			var fnc = this.options.onFileQueued.bind(this);
			fnc(file);
		}
	},
	onFileQueueError: function(file, code, message) {
		//alert('file ' + file.name + ' queue error');
		if (typeof(this.options.onFileQueueError) == 'function') {
			var fnc = this.options.onFileQueueError.bind(this);
			fnc(file, code, message);
		}
	},
	onFileDialogComplete: function(selectedNo, queuedNo, totalQueuedNo) {
		//alert('file dialog complete');
		if (typeof(this.options.onFileDialogComplete) == 'function') {
			var fnc = this.options.onFileDialogComplete.bind(this);
			fnc(selectedNo, queuedNo, totalQueuedNo);
		}
		if (selectedNo == 0) {
			alert('업로드를 취소합니다');
		}
		this.currentQueue = queuedNo;
	},
	onUploadStart: function(file) {
		//alert('file ' + file.name + ' transfer started');
		if (typeof(this.options.onUploadStart) == 'function') {
			var fnc = this.options.onUploadStart.bind(this);
			fnc(file);
		}
		this.currentQueue--;
	},
	onUploadProgress: function(file, currentBytes, totalBytes) {
		window.status = 'file ' + file.name + ' ' + currentBytes + ' / ' + totalBytes;
		if (typeof(this.options.onUploadProgress) == 'function') {
			var fnc = this.options.onUploadProgress.bind(this);
			fnc(file, currentBytes, totalBytes);
		}
	},
	onUploadError: function(file, code, message) {
		//alert('file ' + file.name + ' transfer error');
		if (typeof(this.options.onUploadError) == 'function') {
			var fnc = this.options.onUploadError.bind(this);
			fnc(file, code, message);
		}
		else {
			alert(message);
		}
	},
	onUploadSuccess: function(file, server_data) {
		//alert('file ' + file.name + ' transfer success');
		if (typeof(this.options.onUploadSuccess) == 'function') {
			var fnc = this.options.onUploadSuccess.bind(this);
			fnc(file, server_data);
		}
	},
	onUploadComplete: function(file) {
		//alert('file ' + file.name + 'transfer finished');
		if (typeof(this.options.onUploadComplete) == 'function') {
			var fnc = this.options.onUploadComplete.bind(this);
			fnc(file);
		}
		else {
			if (this.currentQueue == 0) {
				alert('업로드가 완료되었습니다!');
			}
		}
	}
}


/**
 * 글쓰기 화면에서 사용하는 업로더 객체 생성
 * (reg.php 에서 사용)
 * @author 최창환
 */
function initPostImageUploader(dir, tempKey, userno) {

	var uploader = new Uploader( dir, tempKey, userno, {
		post_params: { "mode": "upload", "dir": dir, "tempKey": tempKey, "UserNo": userno },
		file_size_limit : "4 MB",
		file_types : "*.jpg;*.jpeg;*.gif;*.png",
		file_types_description: "이미지 파일",
		
		/** 
		 * 업로드를 시작한다.
		 */
		onFileDialogComplete: function() {
			this.startUpload();
		},
		/**
		 * 파일을 큐에 등록한다.
		 */
		onFileQueued : function(file) {
			var uploadedFiles = $('uploadedFiles');
			var fileCount = uploadedFiles.childElements().size();
			
			if (fileCount >= 10) {
				alert("더 이상 파일을 추가하실 수 없습니다");
				
				return false;
			}
			
			var index = file.id;
			
			// 목록을 추가한다.
			var listItem = new Element('li');
			uploadedFiles.appendChild(listItem);
			listItem.replace(
			"<li class=\"uploadedFile\" id=\"file-"+index+"\">"
				+ "<img id=\"uploadedThumbnail-" + index + "\" class=\"uploadedThumbnail\" src=\"../images/tbattle/thumbnail_loading.gif\" width=\"64\" height=\"48\" /><br/>"
				+ "<span class=\"uploadedFileInfo\">"
					+ "<span id=\"file-" + index + "-name\">이름 : " + file.name + "</span><br/>"
					+ "<span id=\"file-" + index + "-size\">크기 : " + file.size + " byte </span>"
				+ "</span>"
				+ "<div class=\"uploadedFileControlBox\">"
					+ "<div class=\"UploadProgressBar\" id=\"UploadProgressBar-"+index+"\">"
						+ "<span class=\"UploadProgressBarInside\" id=\"UploadProgressBarInside-"+index+"\"></span>"
						+ "<div class=\"uploadProgressBarIndicator\" id=\"UploadProgressIndicator-"+index+"\">업로드 준비중...</div>"
					+ "</div>"
					+ "<div class=\"uploadedFilePosition\">"
						+ "이미지 정렬:<br/>"
						+ "<input name=\"position\" type=\"radio\" value=\"left\"   id=\"positionForm-" + index + "-left\"   /><label for=\"positionForm-" + index + "-left\">왼쪽</label>"
						+ "<input name=\"position\" type=\"radio\" value=\"center\" id=\"positionForm-" + index + "-center\" checked=\"checked\" /><label for=\"positionForm-" + index + "-center\" >가운데</label>"
						+ "<input name=\"position\" type=\"radio\" value=\"right\"  id=\"positionForm-" + index + "-right\"  /><label for=\"positionForm-" + index + "-right\">오른쪽</label>"
					+ "</div>"
					+ "<div class=\"uploadedFileControl\">"
						+ "<img src=\"../images/0/reg/btn_fileInsert.gif\" width=\"44px\" height=\"20px\" onclick=\"insertImage('" + index + "');return false;\" alt=\"본문에 삽입\"/>"
						+ "<img src=\"../images/0/reg/btn_fileDelete.gif\" width=\"44px\" height=\"20px\" onclick=\"deleteImage('" + index + "', false);return false;\" alt=\"파일 삭제\"/>"
					+ "</div>"
					+ "<div class=\"uploadFail\"><p><strong>업로드 실패!</strong></p><p>파일을 업로드할 수 없습니다.</p></div>"
				+ "</div>"
			+ "</li>");
			listItem = $('file-'+index);
			
			/*var listItem = new Element('li', {'class':'uploadedFile', 'id':'file-'+index}).update(
				"<img id=\"uploadedThumbnail-" + index + "\" class=\"uploadedThumbnail\" src=\"../images/tbattle/thumbnail_loading.gif\" width=\"64\" height=\"48\" /><br/>"
				+ "<span class=\"uploadedFileInfo\">"
					+ "<span id=\"file-" + index + "-name\">이름 : " + file.name + "</span><br/>"
					+ "<span id=\"file-" + index + "-size\">크기 : " + file.size + " byte </span>"
				+ "</span>"
				+ "<div class=\"uploadedFileControlBox\">"
					+ "<div class=\"UploadProgressBar\" id=\"UploadProgressBar-"+index+"\">"
						+ "<span class=\"UploadProgressBarInside\" id=\"UploadProgressBarInside-"+index+"\"></span>"
						+ "<div class=\"uploadProgressBarIndicator\" id=\"UploadProgressIndicator-"+index+"\">업로드 준비중...</div>"
					+ "</div>"
					+ "<div class=\"uploadedFilePosition\">"
						+ "이미지 정렬:<br/>"
						+ "<input name=\"position\" type=\"radio\" value=\"left\"   id=\"positionForm-" + index + "-left\"   /><label for=\"positionForm-" + index + "-left\">왼쪽</label>"
						+ "<input name=\"position\" type=\"radio\" value=\"center\" id=\"positionForm-" + index + "-center\" checked=\"checked\" /><label for=\"positionForm-" + index + "-center\" >가운데</label>"
						+ "<input name=\"position\" type=\"radio\" value=\"right\"  id=\"positionForm-" + index + "-right\"  /><label for=\"positionForm-" + index + "-right\">오른쪽</label>"
					+ "</div>"
					+ "<div class=\"uploadedFileControl\">"
						+ "<img src=\"../images/0/reg/btn_fileInsert.gif\" width=\"44px\" height=\"20px\" onclick=\"insertImage('" + index + "');return false;\" alt=\"본문에 삽입\"/>"
						+ "<img src=\"../images/0/reg/btn_fileDelete.gif\" width=\"44px\" height=\"20px\" onclick=\"deleteImage('" + index + "', false);return false;\" alt=\"파일 삭제\"/>"
					+ "</div>"
					+ "<div class=\"uploadFail\"><p><strong>업로드 실패!</strong></p><p>파일을 업로드할 수 없습니다.</p></div>"
				+ "</div>");
			*/
			listItem.hide();
			listItem.down('div.uploadedFilePosition').hide();
			listItem.down('div.uploadedFileControl').hide();
			listItem.down('div.uploadFail').hide();
			
			Effect.BlindDown(listItem, {duration: 0.3});
		
			updateCount();
		},
		
		/**
		 * 업로드 시작
		 */
		onUploadStart : function (file) {
			Progress = new FileProgress(file.id);
			Progress.start();
		},
		/**
		 * 업로드 진행중
		 */
		onUploadProgress : function (file, bytesLoaded) {
			var index = file.id;
			var percent = Math.ceil((bytesLoaded / file.size) * 100);
		
			Progress.update(percent);
			
			if (percent == 100) {
				Progress.finish();
			}
		},
		/**
		 * 업로드 에러가 발생했을때
		 */
		onUploadError : function (file, code, message) {
			var listItem = $('file-'+file.id);
		
			if (code == -200) {
				message = '서버에서 파일을 거부했습니다.\n이미지 파일이 아니거나 손상된 파일일수 있습니다.';
			}
		
			alert('파일을 업로드 하는 도중 오류가 발생했습니다!\n\n'
				+'파일 : '+file.name + '\n'
				+'크기 : '+file.size + 'byte\n\n'
				+message + '\n');
			
			listItem.remove();
			updateCount();
		},
		/**
		 * 업로드 성공
		 */
		onUploadSuccess : function (file, server_data) {
			var thumbnailElement = $('uploadedThumbnail-'+file.id);
			var listItem = $('file-'+file.id);
			
			thumbnailElement.replace ("<img id=\"uploadedThumbnail-" + file.id + "\" class=\"uploadedThumbnail\" src=\"" + server_data + "\" width=\"64\" height=\"48\" />");
			
			Progress.finish();
			listItem.down('div#UploadProgressBar-'+file.id).hide();
			listItem.down('div#UploadProgressIndicator-'+file.id).hide();
			listItem.down('div.uploadedFilePosition').show();
			listItem.down('div.uploadedFileControl').show();
		},
		/**
		 * 업로드 완료
		 */
		onUploadComplete : function (file) {
			this.startUpload();
			if (this.currentQueue == 0) {
				alert('이미지가 준비되었습니다!\n이제 에디터에 이미지를 삽입할 수 있습니다.');
			}
		},
		
		button_placeholder_id : 'uploaderAction',
		button_image_url : "/images/0/reg/btn_fileUpload.gif",
		button_width : 75,
		button_height : 18,
		button_action : SWFUpload.BUTTON_ACTION.SELECT_FILES,
		debug: false
	});
	
	/*
	 * 서버 파일 추가 및 삭제를 위한 임시키 등록
	 */
	tempKeyValue = tempKey;
	return uploader;
}

/**
 * 파일 업로드 진행 상황을 컨트롤 하는 객체
 * @author 최창환
 */
function FileProgress(index) {
	this.progressBar = $('UploadProgressBar-'+index);
	this.progressBarInside = $('UploadProgressBarInside-'+index);
	this.progressBarIndicator = $('UploadProgressIndicator-'+index);
};

FileProgress.prototype.update = function(value) {
	this.progressBar.removeClassName('waiting');
	this.progressBar.addClassName('processing');
	this.progressBarInside.setStyle({'width':parseInt(value * 118/100)+'px'});
	this.progressBarIndicator.update("업로드중... ("+value+"%)");
};
FileProgress.prototype.start = function() {
	this.progressBar.removeClassName('processing');
	this.progressBar.addClassName('waiting');
	this.progressBarInside.setStyle({width:'0px'});
	this.progressBarIndicator.update("업로드 준비중..."); 
};
FileProgress.prototype.finish = function() {
	this.progressBar.removeClassName('processing');
	this.progressBar.addClassName('waiting');
	this.progressBarInside.setStyle({width:'0px'});
	this.progressBarIndicator.update("업로드를 완료하는중..."); 
};
var Progress;
var tempKeyValue = 0;

/**
 * 글쓰기 화면에서 업로드 가능한 파일의 개수를 표시한다.
 * (reg.php)
 * @author 최창환
 */
function updateCount() {
	var uploadedFiles = $('uploadedFiles');
	var uploaderInfo = $('uploaderInfo');
	var fileCount = uploadedFiles.childElements().size();
	uploaderInfo.update("※ 개수 제한: (" + fileCount + " / 15), 크기 제한: 2 MB, 파일종류: gif, jpg, png");
}

/**
 * 글쓰기 화면에서 업로드한 파일을 에디터에 삽입한다.
 * (reg.php)
 * @author 최창환
 */
function insertImage(no) {
	var listItem = $('file-' + no);
	var listImageFile = listItem.down('img.uploadedThumbnail').src;
	var listImageFileResized = '';
	
	if (listImageFile.include('resized')) {
		listImageFileResized = listImageFile;
		listImageFile = listImageFile.gsub(".resized.jpg", "");
	}

	var listPosition = new Array();
	listPosition[0] = listItem.down('#positionForm-'+no+'-left');
	listPosition[1] = listItem.down('#positionForm-'+no+'-center');
	listPosition[2] = listItem.down('#positionForm-'+no+'-right');
	
	var listAlign = 'center';
	// 정렬 체크값 가져오기
	for (var counter = 0; counter < listPosition.length; counter++) {
		if (listPosition[counter].checked) {
			listAlign = listPosition[counter].value; 
		}
	}

	// 에디터에 삽입
	var sHTML = '';
	if (listImageFileResized == '') {
		sHTML = "<img src=\"" + listImageFile + "\" border=\"0\" />";
	}
	else {
		sHTML = "<img src=\"" + listImageFileResized + "\" border=\"0\" class=\"resized\" />";
	}
	
	xed.focus();
	xed.rdom.insertHtml(sHTML);
	
}

/**
 * 글쓰기 화면에서 업로드한 파일을 삭제한다
 * (reg.php)
 * @author 최창환
 */
function deleteImage(key, linked) {
	var ok = confirm("올린 파일을 삭제하시겠습니까?");
	if (!ok) return false;
	
	if (Object.isUndefined(linked)) linked = false;
	var listItem = $('file-' + key);
	var listImageFile = listItem.down('img.uploadedThumbnail').src;
	var listImageFileNoResize = listImageFile.gsub("&width=64&height=48&method=resize", "");
	var useKey = key;
	var mode = '';
	// 데이터베이스와 연결된 경우
	if (linked) {
		mode = 'unlinkFile';
	}
	// 데이터베이스와 연결되지 않은 경우
	else {
		mode = 'unlinkTempFile';
		useKey = tempKeyValue;
	}
//	alert(mode + "\n" + tempKeyValue + "\n" + listImageFileNoResize);
	var ajax = new Ajax.Request("../lib/image_upload.php", {
		parameters: {
			'mode': mode,
			'key': useKey,
			'path': listImageFileNoResize
		},
		onSuccess: function(response) {
			new Effect.BlindUp(listItem, {
				duration: 0.2, 
				afterFinish: function() {
					listItem.remove();
					updateCount();
				}
			});
		}
	});
}



