/**
 * Snow board script library
 * @author Yu Chi-su
 */
try {
	if (typeof(Prototype.Version) == "undefined" || Prototype.Version != "1.6.0.2")
		alert("[ERROR] Prototype 1.6.0 required.");
	//if (typeof(Board) != "undefined")
	//	alert("[ERROR] Board.js is already included.");
} catch(e) {}

/**
 * Shift + LClick support
 * @author Yu Chi-su
 */
var openWithNewWindow = false;
function hrefRewrite(e) {
	var ie = Prototype.Browser.IE;
	try {
		var ev = targetObj = null;
		(ie) ? ev = window.event : ev = e;

		openWithNewWindow = false;

		if (ev.shiftKey) {
			(ie) ? targetObj = ev.srcElement : targetObj = ev.target;
			if (targetObj.tagName == "A" && ((targetObj.name == "viewArticleLink" || targetObj.name == "goPageLink" || targetObj.name == "writeLink"))) {
				(ie) ? ev.returnValue = false : ev.cancelBubble = true;
				openWithNewWindow = true;
				eval(targetObj.href.replace(new RegExp("%20", "ig"), " "));
				openWithNewWindow = false;
			}
		}
	} catch(e) {
		//alert("hrefRewrite : " + e.description);
	}
}

// Board action
var BoardAction = {};
BoardAction.view = "view";
BoardAction.viewNotice = "viewNotice";
BoardAction.list = "list";
BoardAction.deleteArticle = "deleteArticle";
BoardAction.modifyArticleForm = "modifyForm";
BoardAction.modifyArticle = "modifyArticle";
BoardAction.writeArticleForm = "writeForm";
BoardAction.writeArticle = "writeArticle";
BoardAction.writeReplyForm = "writeReplyForm";
BoardAction.writeComment = "writeComment";
BoardAction.deleteComment = "deleteComment";
BoardAction.commentList = "commentList";
BoardAction.fileinfo = "fileinfo";
BoardAction.viewImage = "/board/common/viewImage";
BoardAction.recommendArticle = "recommend_article";
BoardAction.uploadFileInfo = NCScriptUtil.getPath() + "fileinfo";
BoardAction.fileUploadForm = "snow2fileupload";

var Board = {};
Object.extend(Board, {
	writeArticleValidator : new ValidationManager(),
	writeCommentValidator : new ValidationManager(),
	searchArticleValidator : new ValidationManager(),
	loginFunction : null,
	maxImageWidth : 480,
	SORT_COLUMN : {
		NONE : 0,
		RECOMMEND : 1,
		COMMENT : 2,
		VIEWCOUNT : 3,
		POSTDATE : 4
	},
	SORT_ORDER : {
		DESC : 1,
		ASC : 2
	},
	enableNavigateInNewWindow : function() {
		Event.observe(document.body, "click", hrefRewrite, false);
	},
	login : function() {
		(this.loginFunction != null) ? this.loginFunction() : Board.showMessage("login function is null");
	},
	showMessage : function(message) {
		alert(message);
	},
	showConfirm : function(message) {
		return confirm(message);
	}
});

var List = {};
Object.extend(List, (function() {
	function _list(parameters) {
		var qry = NCScriptUtil.JSONToQueryString(parameters);
		document.location.href = BoardAction.list + ((qry == "") ? "" : "?") + qry;
	}
	return {
		list : function() {
			var qry = NCScriptUtil.getQueryParams();
			delete qry.queryString;
			delete qry.articleID;
			delete qry.parentArticleID;
			_list(qry);
		},
		page : function(page) {
			var qry = NCScriptUtil.getQueryParams();
			qry.page = page;
			delete qry.articleID;
			_list(qry);
		},
		sort : function(sortOrder, sortColumn) {
			var qry = NCScriptUtil.getQueryParams();
			delete qry.page;
			qry.sortOrder = sortOrder;
			qry.sortColumn = sortColumn;
			_list(qry);
		},
		changeCategory : function(category) {
			var qry = NCScriptUtil.getQueryParams();
			delete qry.page;
			(category == "") ? delete qry.category : qry.category = category;
			_list(qry);
		},
		search : function(searchForm) {
			if (Board.searchArticleValidator.isValid()) {
				var qry = NCScriptUtil.getQueryParams();
				delete qry.page;
				qry.searchCondition = searchForm.searchCondition.value;
				qry.searchKeyword = searchForm.searchKeyword.value;
				_list(qry);
			}
		},
		searchedList : function() {
			var qry = NCScriptUtil.getQueryParams();
			delete qry.articleID;
			_list(qry);
		},
		changeSearchBlock : function(blockNum) {
			var qry = NCScriptUtil.getQueryParams();
			qry.page = 1;
			qry.searchBlock = blockNum;
			_list(qry);
		}
	};
})());

var attachFileList = null;
var Article = new Object();
Object.extend(Article, (function() {
	var isProgressAction = false;
	var frm = null;

	function setWrittenContentForSubmit() {
		try {
			var o = $("editorEditModeTEXT");
			if (o != null && o.checked) {
				frm.content.value = $F("htmlEditorSource");
			} else {
				frm.content.value = EditContent();
			}
		} catch(e) { Board.showMessage(e.description); }
	}

	function setThumbnailForSubmit() {
		if (attachFileList != null) {
			var thumbnailSet = false;
			for ( idx=0; idx < attachFileList.length; ++idx ) {
				var fileinfo = attachFileList[idx];
				if (!thumbnailSet
					&& htmlEditor.document.body.innerHTML.indexOf(fileinfo.id) > -1) {
					try {
						$('thumbnailFileID').value = fileinfo.id;
					} catch(e) {
						Board.showMessage("[ERROR] " + e.description);
					}
					thumbnailSet = true;
				}
			}
		}
	}

	function doWrite(action) {
		if(isProgressAction) return;
		frm = document.getElementById("articleForm");
		setWrittenContentForSubmit();
		//do validate;
		if (!Board.writeArticleValidator.isValid()) return;
		setThumbnailForSubmit();
		frm.action = action;
		frm.submit();
		isProgressAction = true;
	}

	return {
		view : function(articleID, dir) {
			if(articleID == 0) {
				Board.showMessage(((dir == "prev") ? "이전" : "다음") + "글이 없습니다.");
				return;
			}
			var qry = NCScriptUtil.getQueryParams();
			qry.articleID = articleID;
			var link = BoardAction.view + "?" + NCScriptUtil.JSONToQueryString(qry);

			if (openWithNewWindow) {
				var w = window.open(link, "A" + articleID, "");
			} else {
				document.location.href = link;
			}
		},
		remove : function() {
			if (Board.showConfirm('삭제 하시겠습니까?')) {
				var qry = NCScriptUtil.getQueryParams();
				var articleID = qry.articleID;
				delete qry.articleID;
				var qryStr = NCScriptUtil.JSONToQueryString(qry);
				document.location.href = BoardAction.deleteArticle + "?articleID=" + articleID + ((qryStr != "") ? ("&queryString=" + encodeURIComponent(qryStr)) : "");
			}
		},
		write : function() {
			doWrite(BoardAction.writeArticle);
		},
		modify : function() {
			doWrite(BoardAction.modifyArticle);
		},
		reply : function() {
			doWrite(BoardAction.replyArticle);
		},
		recommend : function(articleID, isLogin) {
			if (isLogin)	{
				if (!Board.showConfirm("추천하시겠습니까?")) return;
				var parameters="score=1&articleID=" + articleID;
				new Ajax.Request(BoardAction.recommendArticle, {
						method:'post',
						encoding: 'UTF-8',
						parameters: parameters ,
						onSuccess: function(request) {
							var result = eval(request.responseText);
							if ( result == 0 )
								Board.showMessage("이미 추천하셨습니다. \n한 게시물당 한번씩만 추천 가능합니다.");
							else if ( result == 1 ) {
								Board.showMessage("추천 감사합니다!");
								location.reload();
							}
						},
						onFailure: function() {
							Board.showMessage("오류가 발생하였습니다. ");
						}
					}
				);
			} else {
				if (Board.showConfirm("로그인 후 이용가능합니다.\n로그인 하시겠습니까?"))
					Board.login();
			}
		}
	};
})());

Object.extend(Article, {
	writeForm : function() {
		var link = '';
		var qry = NCScriptUtil.getQueryParams();
		var category = qry.category;

		if (category == undefined) {
			var qry = encodeURIComponent(NCScriptUtil.getQueryString());
			link = BoardAction.writeArticleForm + "?queryString=" + qry;
		} else {
			delete qry.category;
			var qryStr = NCScriptUtil.JSONToQueryString(qry);
			link = BoardAction.writeArticleForm + "?category=" + category + ((qryStr != "") ? ("&queryString=" + encodeURIComponent(qryStr)) : "");
		}
			
		if (openWithNewWindow) {
			var w = window.open(link, "WriteForm", "");
		} else {
			document.location.href = link;
		}
	},
	replyForm : function() {
		var qry = NCScriptUtil.getQueryParams();
		var parentArticleID = qry.articleID;
		delete qry.articleID;
		var qryStr = NCScriptUtil.JSONToQueryString(qry);
		document.location.href = BoardAction.writeReplyForm + "?articleID=" + parentArticleID + "&parentArticleID=" + parentArticleID + ((qryStr != "") ? ("&queryString=" + encodeURIComponent(qryStr)) : "");
	},
	modifyForm : function() {
		var qry = NCScriptUtil.getQueryParams();
		var articleID = qry.articleID;
		delete qry.articleID;
		var qryStr = NCScriptUtil.JSONToQueryString(qry);
		document.location.href = BoardAction.modifyArticleForm + "?articleID=" + articleID + ((qryStr != "") ? ("&queryString=" + encodeURIComponent(qryStr)) : "");
	}
});

var Notice = {};
Object.extend(Notice, {
	view : function(articleID) {
		var qry = NCScriptUtil.getQueryParams();
		qry.articleID = articleID;
		var link = BoardAction.viewNotice + "?" + NCScriptUtil.JSONToQueryString(qry);
		document.location.href = link;
	}
});

var Comment = {};
Object.extend(Comment, {
	_list : function(pageNo, action) {
		var commentLayer = $("pnlComment");

		if (typeof commentLayer == "undefined" || commentLayer == null) {
			alert("[ERROR getComment] Comment display layer not found.");
			return;
		}

		var qry = NCScriptUtil.getQueryParams();
		var parameters = {};
		if(qry.articleID != null) parameters.articleID = qry.articleID;
		if(pageNo != null) parameters.commentPage = pageNo;

		new Ajax.Request(action, {
				method:'post',
				encoding: 'UTF-8',
				parameters: parameters,
				onSuccess: function(request) {
					commentLayer.innerHTML = request.responseText;
				},
				onFailure: function() {
					Board.showMessage("댓글을 조회하는 중 오류가 발생하였습니다.");
				}
			}
		);
	},
	list : function(pageNo) {
		if(pageNo == null || typeof(pageNo) == "undefined")
			pageNo = 1;
		this._list(pageNo, BoardAction.commentList);
	},
	write : function() {
		if (Board.writeCommentValidator.isValid()) {
			var frm = $("writeCommentForm");
			if(frm == null) {
				alert("writeCommentForm not found");
				return;
			}

			var qry = NCScriptUtil.getQueryParams();
			
			if (frm.articleID.value == '') {
			frm.articleID.value = qry.articleID;
			}
			frm.queryString.value = NCScriptUtil.getQueryString();
			var parameters = frm.serialize();
			new Ajax.Request(BoardAction.writeComment, {
					method : "post",
					encoding : "UTF-8",
					parameters : parameters,
					onSuccess : function(transport) {
						try {
							var result = eval("("+transport.responseText+")");
							if (result != null && result.snow2ajaxerror == true) {
								if (result.redirect != null) {
									location.href = result.redirect;
									return;
								}
							}
						} catch(e) {
						}
						Comment.list();
					},
					onFailure: function() {
						Board.showMessage("댓글을 저장하는 중 오류가 발생하였습니다.");
					}
				}
			);
		}
	},
	remove : function(articleID, idx, subidx) {
		if (!Board.showConfirm("댓글을 삭제 하시겠습니까?")) return;

		var parameters = {};
		parameters.articleID = articleID;
		parameters.idx = idx;
		parameters.subidx = subidx;

		new Ajax.Request(BoardAction.deleteComment, {
				method:'post',
				encoding: 'UTF-8',
				parameters: parameters ,
				onSuccess: function(request) {
					Comment.list();
				},
				onFailure: function(request) {
					Board.showMessage("댓글을 삭제하는 중 오류가 발생하였습니다.");
				}
			}
		);
	}
});

var Attachment = {};
Object.extend(Attachment, {
	remove : function(fileID) {
		if(Board.showConfirm("첨부파일을 삭제하시겠습니까?")) {
			var parameters = {};
			parameters.fileID = fileID;

			new Ajax.Request("deleteAttachment", {
					method:'post',
					encoding: 'UTF-8',
					parameters: parameters ,
					onSuccess: function(request) {
						try {
							var resultObj = eval("'" + request.responseText + "';");
							AttachmentList.refreshAttachmentList();
						} catch(e) { Board.showMessage(e.description); }
					},
					onFailure: function(request) {
						Board.showMessage("첨부파일을 삭제하는 중 오류가 발생하였습니다.");
					}
				}
			);
		}
	},
	markForDelete : function(fileNo, fileID) {
		if(!Board.showConfirm("선택한 파일을 삭제하시겠습니까?")) return;

		var fileIDObj = document.getElementById("deleteFileIDs");
		var fileNumObj = document.getElementById("deleteFileNums");

		if(fileIDObj == null || fileNumObj == null) {
			alert("object 'deleteFileIDs' or 'deleteFileNums' is not found.");
			return;
		}
		fileIDObj.value += ((fileIDObj.value.length > 0) ? ";" : "") + fileID;
		fileNumObj.value += ((fileNumObj.value.length > 0) ? ";" : "") + fileNo;

		var itemLayer = document.getElementById("attachment_item_" + fileNo);
		if(itemLayer == null) {
			alert("object 'attachment_item_" + fileID + "' is not found.");
			return;
		}
		itemLayer.style.display = "none";
	}
});


var AttachmentList = {};
Object.extend(AttachmentList, (function() {

	var attachedFilesInContent = new Array();

	function addAttachToContentHistory(fileName) {
		attachedFilesInContent.push(fileName);
	}

	function isAttachedFileInContent(fileName) {
		for(var i = 0; i < attachedFilesInContent.length; i++) {
			if (attachedFilesInContent[i].name == fileName || attachedFilesInContent[i].url == fileName) return true;
		}
		return false;
	}

	function getAttachmentList(callback) {
		var tokenObj = document.getElementById('token');
		if(tokenObj == null) {
			alert("token required");
			return;
		}

		new Ajax.Request(BoardAction.uploadFileInfo, {
			method:'post',
			parameters: { token: tokenObj.value },
			onComplete: function(request) {
				try {
					displayAttachmentHTML(request.responseText);
					if(callback != null)
						callback(request.responseText);
				} catch(e) {
					alert("[ERROR in getAttachmentList] " + e.description);
				}
			}
		});
	}

	function displayAttachmentHTML(attachmentList) {
		try {
			var attachmentList = eval(attachmentList);
			var html = "";

			var fileAttachedForArticleList = document.getElementById("fileAttachedForArticleList");
			if (fileAttachedForArticleList != null)
				fileAttachedForArticleList.value = "";

			for(var i = 0; i < attachmentList.length; i++) {
				var attachment = attachmentList[i];

				if(!isAttachedFileInContent(attachment.fileURL)) {
					if (fileAttachedForArticleList != null)
						fileAttachedForArticleList.value += attachment.fileURL + ";"
					html += String.format("<div><a href=\"attachment?fileID={0}\">{1} ({2} bytes)</a>&nbsp;<a href=\"javascript:Attachment.remove('{0}');\">[삭제]</a></div>", attachment.id, attachment.name, attachment.size);
				}
			}

			var attachmentContainer = document.getElementById("attachment_list");
			if(attachmentContainer == null) {
				alert("attachment_list element not found.");
			}
			attachmentContainer.innerHTML = html;
		} catch(e) {
			alert("[ERROR in displayAttachmentHTML] " + e.description);
		}
	}

	return {
		/**
		 * 첨부된 파일 목록을 갱신한다.
		 */
		refreshAttachmentList : function(callback) {
			getAttachmentList(callback);
		},
		/**
		 * 이미지 에디터로 첨부한 이미지를 본문에 추가한다.
		 */
		insertUploadedImageToEditor : function() {
			var token = document.getElementById("token").value;
			new Ajax.Request(BoardAction.fileinfo, {
				method : 'post',
				parameters : 'token=' + token,
				onComplete : function(transport) {
					try {
						// [{id: "", name: "", size: "", fileURL: "", thumbnailURL: ""}]
						var attachFileList = eval(transport.responseText);
						var divAttachment = document.getElementById("attachment_list");

						for (var i = 0; i < attachFileList.length; i++) {
							var fileInfo = attachFileList[i];
							if (/*게시물 첨부파일이 아닌경우 */
								divAttachment.innerHTML.indexOf(fileInfo.name) == -1 &&
								/*이미 첨부된 파일이 아닌경우*/
								!isAttachedFileInContent(fileInfo.name)) {
								// 내용에 이미지 추가.
								insertImage(fileInfo.fileURL);
								// 본문에 첨부한 파일 히스토리를 남긴다.
								addAttachToContentHistory({'name' : fileInfo.name, 'url' : fileInfo.fileURL});
							}
						}
					} catch(e) { alert(e.description); }
				}
			});
		},
		/**
		 * 본문에 첨부된 파일 히스토리 추가.
		 */
		addAttachToContentHistory : function(fileName, fileURL) {
			addAttachToContentHistory({'name' : fileName, 'url' : fileURL});
		}
	}
})());


// call from image editor
function OnImageUploaded() {
	AttachmentList.insertUploadedImageToEditor();
}

/*
//=========================================
// set image to editor (from editor)
function setImageInfo() {
	alert("deprecated setImageInfo()");
	new Ajax.Request(BoardAction.fileinfo, {
		method:'post',
		parameters:'token='+parent.document.all.token.value,
		onComplete: ajax_fileinfo
	});
}

// get attached file info (from editor)
function ajax_fileinfo(request) {
	alert("deprecated ajax_fileinfo");
	attachFileList = eval(request.responseText);
	var thumbnailSet = false;

	var divAttachment = document.getElementById("attachmentList");

	for ( idx=0; idx < attachFileList.length; ++idx ) {
		var fileinfo = attachFileList[idx];

		if (fileinfo.name.indexOf('_t') == -1 &&
			divAttachment.innerHTML.indexOf(fileinfo.name) == -1 &&
			attachmentFiles.indexOf(fileinfo.name) == -1) {
			var html = "<div class='attachment'>"+fileinfo.name+" ("+fileinfo.size+" bytes)</div>";
			divAttachment.innerHTML += html;
			insertImage(fileinfo.fileURL);
		}

		if (!thumbnailSet && htmlEditor.document.body.innerHTML.indexOf(fileinfo.id) > -1) {
			$('thumbnailFileID').value = fileinfo.id;
			thumbnailSet = true;
		}
	}
}
*/

//=========================================

// for attachment, for _upload.jsp
function getUploadUrl() {
	return g_strImageUploadActionPage;
}

/*
// for display uploader attachment files
var attachmentHtmlList = new Array();

// for diff file attached from editor or fileuploader.
var attachmentFiles = "";
function updateAttachmentList(attachmentList) {
	alert("updateAttachmentList");

	attachmentFiles = "";
	var html = new Array();
	var lastUploaded = attachmentList.last();
	addAttachmentList(lastUploaded.id, lastUploaded.name, lastUploaded.size);
	refreshAttachmentList();
}

function addAttachmentList(id, name, size) {
	alert("addAttachmentList");

	var html = String.format("<div><a href=\"attachment?fileID={0}\">{1} ({2} bytes)</a>&nbsp;<a href=\"javascript:Attachment.remove('{0}');\">[삭제]</a></div>", id, name, size);
	attachmentFiles += name;
	attachmentHtmlList.push(html);
}

// call from file uploader or updatepage
function refreshAttachmentList() {
	alert("refreshAttachmentList");
	$("attachment_list").innerHTML = attachmentHtmlList.join('');
}
*/


function setEditorMode(mode) {
	if (mode == "HTML") {
		if (!$F("htmlEditorSource").isValidHTML()) {
			if (!Board.showConfirm("HTML이 잘못되어있을 가능성이 발견되었습니다.\n\n에디터 모드로 전환하면 본문이 손실 될 위험이 있습니다.\n\n에디터모드로 전환 하시겠습니까?")) {
				$("editorEditModeHTML").checked = false;
				return;
			}
		}
		$("editorEditModeTEXT").checked = false;
		$("layerWYSIWYGEditor").style.display = "block";
		$("layerSourceEditor").style.display = "none";
		var s = $("htmlEditorSource");
		if(s.value != "")
			htmlEditor.document.body.innerHTML = s.value;
	} else if (mode == "TEXT") {
		$("editorEditModeHTML").checked = false;
		$("layerWYSIWYGEditor").style.display = "none";
		$("layerSourceEditor").style.display = "block";
		$("htmlEditorSource").value = EditContent();
	}
}

function resizeImage(img) {
	if (img.width > Board.maxImageWidth) {
		img.style.width = Board.maxImageWidth;
		img.width = Board.maxImageWidth;
	}
}

// attached image view
function popView(imgUrl) {
	window.open(BoardAction.viewImage + "?imageUrl="+imgUrl, "popView", "width=400, height=300, scrollbars=yes")
}