/**
 * comment.js - 댓글
 *
 * @author 최창환
 */

/**
 * @var 효과를 적용할 시간
 */
var custom_duration = 0.3;
if (Prototype.Browser.IE) {
	//alert(1);
	custom_duration = 0;
}
 
/**
 * 댓글창의 정보를 전송하기 전 폼을 가다듬기
 *
 * @param c_id 댓글번호 
 */
function preSubmitCmtBox(c_id) {
	var form = $('frmCmt'+c_id+'_form');
	var text_format = $F(form['text_format']);
	var chkKeyword = $F(form['chkKeyword']);
	var keyword = $F(form['keyword']);

	/*
	 * 스킬이 텍스트 포멧 방식이면 입력된 포멧을 게시물 데이터에 지정하기.
	 */
	if (text_format == 1) {
		var formatType = $$('input:checked[type="radio"][name="format"]').pluck('value');
		
		if (formatType > 0) {
			var formatValue = $F(form['arg1_format'+formatType]);
			if (formatValue.trim() == '') {
				alert('내용을 입력해주세요.');
				form['arg1_format'+formatType].activate();
				return false;
			}
			form.arg1.value = formatValue;
		}
		else {
			alert('공격 종류를 선택해주세요.');
			return false;
		}
	}
	
	if (chkKeyword == 1) {
		if (keyword.trim() != '') {
			
		}
		else {
			alert('단어를 검색해주세요');
			var search_keyword = $('frmCmt'+c_id+'_search_keyword');
			search_keyword.activate();
			return false;
		}
	}

	subMitCmt(c_id);
}

/**
 * 키워드를 찾음
 *
 * @param c_id 댓글번호 
 */
function searchKeyword(c_id) {
	var searchForm = $('frmCmt'+c_id+'_search_keyword');
	var needle = searchForm.value.gsub(/\s+/, ' ');
	var parentCmt = $('zoneCmt'+c_id+'_Content');
	var haystack = parentCmt.innerHTML.trim().stripTags();
	var taggedHaystack = parentCmt.innerHTML.trim();
	var arg1 = $('frmCmt'+c_id+'_arg1');
	
	needle = needle.gsub(/\s+/, '');
	
	if (needle != '') {
		if (haystack.include(needle)) {
			if (taggedHaystack.include(needle)) {
				var form = $('frmCmt'+c_id+'_form');
				form['keyword'].value = needle;
				
				arg1.activate();
				alert('단어를 찾았습니다!\n이제 댓글을 입력하세요!');
				return true;
			}
			else {
				searchForm.activate();
				alert('단어에 또다른 스킬이 겹쳐서 적용되어 있습니다.\n다른 단어를 검색해주세요');
				return false;
			}
		}
		else {
			searchForm.activate();
			alert('찾고자 하는 단어가 없습니다!\n다른 단어를 입력해 주세요!');
			return false;
		}
	}
	else {
		searchForm.activate();
		alert('단어를 입력해주세요.');
		return false;
	}
}

/**
 * 스킬을 선택함.
 *
 * @param c_id 댓글번호
 * @param skill_id 선택한 스킬번호
 * @param imgsrc 스킬 아이콘 번호
 * @param level 스킬 레벨
 * @param name 스킬 이름
 * @param memo 스킬 특성
 * @param form_type 폼 타입
 */
function selectSkill(c_id, skill_id, imgsrc, level, name, memo, form_type, instant_submit) {
	var form = $('frmCmt'+c_id+'_form');
	form.reset();	
	form['skill_id'].value = skill_id;
	
	/*
	 * 댓글을 작성하지 않고 스킬을 선택하자마자 바로 적용되는 스킬들.
	 */
	if (instant_submit == 1) {
		form['arg1'].value = 'lv' + level + ' ' + name + '(' + skill_id + ')';
		subMitCmt(c_id);
		return false;
	}
	
	/*
	 * 스킬 아이콘 표시
	 */
	var skill_icon = $('frmCmt'+c_id+'_skill_icon');
	var skill_info = $('frmCmt'+c_id+'_skill_info');
	var skill_usage = $('frmCmt'+c_id+'_skill_usage');
	var skill_usage_info = $('skill_usage_'+skill_id);

	skill_icon.writeAttribute({'src' : imgsrc});
	skill_info.update('<b>Lv'+level+'.'+name+'</b><br /><span >'+memo+'</span>');
	skill_usage.update(skill_usage_info.innerHTML);
	
	/*
	 * 스킬 팝업창 가리기
	 */
	var skill_popup = $('skill_popup');
	skill_popup.stopObserving();
	skill_popup.hide();
	skill_popup.remove();
	
	/*
	 * 폼 표시
	 */
	var head_normal = $('frmCmt'+c_id+'_head_normal');
	var head_format = $('frmCmt'+c_id+'_head_format');
	var head_word = $('frmCmt'+c_id+'_head_word');
	
	var form_textarea = $('frmCmt'+c_id+'_form_textarea');
	var form_formats = $('frmCmt'+c_id+'_form_formats');
	
	head_normal.hide();
	head_format.hide();
	head_word.hide();
	form_textarea.hide();
	form_formats.hide();

	if (form_type == 0) {
		head_normal.show();		
		form_textarea.show();
	}
	else if (form_type == 1) {
		head_format.show();
		form_formats.show();
		form['text_format'].value = 1;
	}
	else if (form_type == 2) {
		head_word.show();
		form_textarea.show();
		
		form['chkKeyword'].value = 1;
	}

	/*
	 * 스킬창 가리고 댓글창 보임
	 */
	toggleSkill(c_id, 'cmt');
}

/**
 * 스킬창과 댓글창을 번갈아 표시함
 *
 * @param c_id 댓글 아이디
 * @param type 보여줄 타입 cmt : 댓글창, skill : 스킬창
 */
function toggleSkill(c_id, type) {
	var skill_box = $('frmCmt'+c_id+'_skill_box');
	var cmt_box = $('frmCmt'+c_id+'_cmt_box');
	
	if (type == 'cmt') {
		new Effect.Fade (skill_box, { duration: custom_duration, queue: {scope:'toggleSkill', position: 'first' }});
		new Effect.Appear(cmt_box, { duration: custom_duration, queue: {scope:'toggleSkill', position: 'end' }, afterFinish: function() {
			var form_textarea_wrapper = $('frmCmt'+c_id+'_form_textarea');
			var form_textarea = $('frmCmt'+c_id+'_arg1');
			form_textarea.style.width = form_textarea_wrapper.offsetWidth - (12) + 'px';
		}});
		
	}
	else {
		new Effect.Fade (cmt_box, { duration: custom_duration, queue: {scope:'toggleSkill', position: 'first' }});
		new Effect.Appear(skill_box, { duration: custom_duration, queue: {scope:'toggleSkill', position: 'end' }});
	}
}

/**
 * 댓글창 열기
 *
 * @param ps 댓글달 위치
 * @param a_id 원문글 아이디
 * @param c_id 상위댓글 아이디
 * @param is_skill 스킬사용 여부
 * @param skill_type 스킬을 사용한다면 그 타입은?
 * @param sso_tag SSO 태그
 * @param color 스킬 색깔
 */
function showCmtBox(ps, ps_result, a_id, c_id, is_skill, skill_type, sso_tag, color, isBestComment){
	/*
		is_skill(스킬이 사용여부) 0:없음 1:있다
		type 1:공격 2:방어 3:나에게
		skill_set : 불러올 스킬세트	
		sso_tag : SSO 태그
	*/
	/*
	 * 1. 이미 열려있는 댓글창이 존재하는지 확인하고 있으면 닫는다.
	 */
	var comment_boxes = $$('.comment_wrapper');
	if (Object.isArray(comment_boxes) && comment_boxes.length > 0) {
		for (var i = 0; i < comment_boxes.length; i++) {
			if (comment_boxes[i].id != 'zoneCmt0') {
				var box_id = ((comment_boxes[i].id).sub('frmCmt', '')).sub('_wrapper', '');;
				
				// 댓글을 달려하는 위치가 같으면.
				if (box_id == c_id) {
					var form = $('frmCmt'+c_id+'_form');
					
					// 현재 공격 모드를 다시 누른거면 그냥 닫고 끝남.
					if (form.skill_type.value == skill_type) {
						hideCmtBox(box_id);
						return false;
					}					
				}
				
				hideCmtBox(box_id);
			}
		}
	}

	/*
	 * 2. 댓글창을 불러온다.
	 */
	if (isBestComment == 1) {
		ps = ps + '_best';
		ps_result = ps_result + '_best';
	}
	var params = "";
	new Ajax.Request("../tbattle/pa_view_cmtbox.php", {
		parameters:{
			'ps': ps,
			'ps_result': ps_result,
			'parent': c_id,
			'article': a_id,
			'use_skill': is_skill,
			'skill_type': skill_type,
			'sso_tag': sso_tag,
			'color': color,
			'isBestComment': isBestComment
		},
		onSuccess: function(transmit) {
			/*
			 * 댓글창을 DOM에 삽입
			 */
			$(ps).show();
			$(ps).update(transmit.responseText);
			var cmt_wrapper = $('frmCmt'+c_id+'_wrapper');

			/*
			 * 스킬창 화면 표시
			 */
			if (is_skill == 1) {
				$('frmCmt'+c_id+'_skill_box').show();
				$('frmCmt'+c_id+'_cmt_box').hide();				
			}
			
			/*
			 * 댓글창 표시
			 */
			new Effect.Appear(cmt_wrapper, {
				duration: custom_duration,
				queue: {position: 'end', scope: 'cmt_box_open'},
				/**
				 * 댓글창이 완전히 표시되었을때
				 */
				afterFinish: function() {
					var btn_close_cmt_box = $('frmCmt'+c_id+'_close_cmt_box');
					var btn_close_skill_box = $('frmCmt'+c_id+'_close_skill_box');
					
					/*
					 * 댓글창 닫기 버튼 이벤트 핸들러 등록
					 */
					if (typeof(btn_close_cmt_box) != 'undefined' || btn_close_cmt_box != null) {
						Event.observe(btn_close_cmt_box, 'click', function(event) {
							hideCmtBox(c_id);
						});
					}
					
					if (is_skill == 1) {
						/*
						 * 스킬창 닫기 버튼 이벤트 핸들러 등록
						 */
						if (typeof(btn_close_skill_box) != 'undefined' || btn_close_skill_box != null) {
							Event.observe(btn_close_skill_box, 'click', function(event) {
								hideCmtBox(c_id);
							});
						}
						
						/*
						 * 단어 검색 폼 이벤트 핸들러 등록
						 */
						var frm_search_keyword = $('frmCmt'+c_id+'_search_keyword');
						Event.observe(frm_search_keyword, 'keydown', function(event) {
							if (event.keyCode == 13) {
								Event.stop(event);
								searchKeyword(c_id);
								return false;
							}
						});
						
						/*
						 * 댓글창 이벤트 핸들러 등록
						 * 댓글창에서 Ctrl+S 매킨토시에서 Command+S 를 누르면 확인 버튼을 클릭해줌.
						 */
						var frm_comment_textarea = $('frmCmt'+c_id+'_arg1');
						Event.observe(frm_comment_textarea, 'keydown', function(e) {
							var k = getKeyCodes(e);

							if ((k.ctrl || k.command) && k.key == 's') {
								Event.stop(e);
								preSubmitCmtBox(c_id);
								return false;
							}
						});
						
						/*
						 * 스킬 아이콘 마우스오버 툴팁 이벤트 핸들러 등록
						 */
						var skill_list = $('frmCmt'+c_id+'_skill_list');
						var skill_icons = skill_list.select('.skill_icon');
						skill_icons.each(function(s) {
							/*
							 * 마우스 올렸을때
							 */
							Event.observe(s, 'mousemove', function(event) {
								var skill_popup = $('skill_popup');
								var skill_icon = s;
								var skill_item = skill_icon.up(0);
								var skill_infos = skill_item.childElements();
								
								if (!skill_popup) {			
									Element.insert(document.getElementsByTagName('body')[0], {bottom: '<div id="skill_popup" style="position:absolute; white-space: nowrap;"></div>'});
									skill_popup = $('skill_popup');
								}
								
								if (!skill_infos) {
									return;
								}
								
								var level = (skill_infos[1]).innerHTML; 
								var name = (skill_infos[0]).innerHTML; 
								var desc = (skill_infos[3]).innerHTML;
								var offset = skill_icon.cumulativeOffset();
								var top = offset.top;
								var left = offset.left - skill_list.cumulativeScrollOffset().left;

								skill_popup.update('<table cellpadding="0" cellspacing="1" border="0" bgcolor="#ffffff">'
									+ '<tr>'
										+ '<td style="border:1px solid #b3b3b3">'
											+ '<table cellpadding="0" cellspacing="0" border="0">'
												+ '<tr height="20">'
													+ '<td background="../images/comment/comment_bg01.gif" style="color:#ff6666; padding:0 5px 0 5px;"><b>' + level + ' ' + name + '</td>'
												+ '</tr>'
												+ '<tr bgcolor="#f9ffea">'
													+ '<td style="padding:0 5px 0 5px; white-space: nowrap;" class="p11 line16 left">' + desc + '</td>'
												+ '</tr>'
											+ '</table>' 
										+ '</td>'
									+ '</tr>'
								+ '</table>'
								+ '<div id="tail" style="width:7px; height:6px; margin-top: -3px; margin-left: 17px"><img src="../images/0/comment/layer_icon.gif"></div>' );
								skill_popup.setStyle({
									'position': 'absolute',
									'top': (top - skill_popup.getHeight()) + 'px',
									'left': left + 'px'
								});
								skill_popup.show();
							});
							/*
							 * 마우스 바깥으로 옮겼을때
							 */
							Event.observe(s, 'mouseout', function(event) {
								var skill_popup = $('skill_popup');
								if (skill_popup != null) {
									skill_popup.hide();
								}
							});
						});
						
						/*
						 * 슬라이더 등록
						 */
						var skill_width = 55;
						var slider_track = $('skill_slider_'+c_id);
						var slider_handle = $('skill_slider_'+c_id+'_handle');
						/**
						 * IE에서는 슬라이더를 사용하지 않음. 스크롤바로 대체. 속도상의 문제 때문
						 * @author 최창환
						 */
						if (Prototype.Browser.IE) {
							var skill_wrapper = $('skill_wrapper_'+c_id);
							slider_track.hide();
							skill_list.setStyle({'width' : skill_icons.length * skill_width + 5 + 'px'});
							skill_wrapper.addClassName('scroll');
						}
						else {
							var slider_max = skill_icons.length - ( parseInt((slider_track.up(0).getWidth() - 30) / skill_width) );
							if (slider_max < 0) {
								slider_max = 0;
							}
							var slider_range = $R(0, slider_max);
														
													
							var slider = new Control.Slider(slider_handle, slider_track, {
								range: slider_range,
								sliderValue: 0,
								onSlide: function(value) {
									var posX = value * skill_width;
									skill_list.setStyle({'left' : '-' + posX + 'px'});
								},
								onChange: function(value) {
									slider.value = Math.round(value);
									skill_list.setStyle({'left' : '-' + slider.value * skill_width + 'px'});
								}
							});
						}
						
						/*
						var btn_left = $('skill_slider_'+c_id+'_btn_left');
						var btn_right = $('skill_slider_'+c_id+'_btn_right');
						
						Event.observe(btn_left, 'click', function(event) {
							slider.setValue(slider.value - 1);
						});
						Event.observe(btn_right, 'click', function(event) {
							slider.setValue(slider.value + 1);
						});
						*/
					}
					
					/*
					 * 이미지 업로더 등록
					 */
					initCmtImgUploader(c_id);
				}
			});
		}
	});

	/*	
	댓글을 작성하면 AJAX update를 ps를 타겟으로 p_view_cmt.php를 호출해주어야함.
	넘겨줄 변수

	arg1, arg2, arg3... : 텍스트 
	text_format : 텍스트포맷(0:일반텍스트, 11:인신 12:성급한일반화 13:논점일탈 14:흑백논리) 
	chkKeyword : 단어설정유무 (단어설정이 있을 경우 1 없으면 0) 
	keyword : 단어 
	skill_id : 사용된 스킬의 id 
	ps, a_id, c_id, is_skill, skill_type, sso_tag, color 이건 일단 다 주시구여

	is_skill, c_id도 주세영
	*/
}

/** 
 * 댓글창 닫기
 */
function hideCmtBox(c_id) {
	/*
	 * 1. 업로더를 제거한다.
	 */
	destroyCmtImgUploader(c_id);

	/* 
	 * 2. 댓글창을 삭제한다.
	 */
	
	var cmt_wrapper = $('frmCmt'+c_id+'_wrapper');
	var cmt_bottom = $('zoneCmt'+c_id+'_Bottom');
	
	if (cmt_bottom == null) {
		cmt_bottom = $('zoneCmt'+c_id+'_Bottom_best');
	}
	
	if (typeof(cmt_wrapper) != 'undefined' && cmt_wrapper != null) {
		/*
		 * 이벤트 핸들러 모두 해제
		 */
		var btn_close_cmt_box = $('frmCmt'+c_id+'_close_cmt_box');
		var btn_close_skill_box = $('frmCmt'+c_id+'_close_skill_box');
		
		if (btn_close_cmt_box != null) {
			btn_close_cmt_box.stopObserving();
		}

		if (btn_close_skill_box != null) {
			btn_close_skill_box.stopObserving();
			
			var skill_icons = cmt_wrapper.select('.skill_icon');
			skill_icons.each(function(s) {
				if (s != null) {
					s.stopObserving();
				}
			})
			
			var skill_popup = $('skill_popup');
			if (skill_popup != null) {
				skill_popup.remove();
			}
		}
		
		var btn_left = $('skill_slider_'+c_id+'_btn_left');
		var btn_right = $('skill_slider_'+c_id+'_btn_right');
		if (btn_left) {
			btn_left.stopObserving();
			btn_right.stopObserving();			
		}
		
		/*
		 * 댓글창 제거 
		 * zoneCmt??_Bottom 을 가리는것은 IE에서 공백이 생기는 버그를 막기 위한것임.
		 */
		cmt_bottom.empty();
		cmt_bottom.hide();
		cmt_wrapper.remove();
	}
}

/**
 * 결과창 닫기
 */
var resultFade = null;
function hideResult(hide, show) {
	if (resultFade != null) {
		window.clearTimeout(resultFade);
	}
	
	hideCmtBox(hide);
	Effect.Appear(('zoneCmt'+show+'_Wrap'), { duration: custom_duration });
}

/**
 * 스킬 시간 보기
 */
function showSkillTime(object, c_id) {
	var showButton = object;
	var skilltime_popup = $('SkillTime');
	
	if (!skilltime_popup) {								
		Element.insert(document.getElementsByTagName('body')[0], {bottom: '<div id="SkillTime"></div>'});
		skilltime_popup = $('SkillTime');
	}
	
	var offset = $(showButton).cumulativeOffset();
	var top = offset.top;
	var left = offset.left;
	
	new Ajax.Updater(skilltime_popup, '../tbattle/pa_view_skilltime.php', {
		parameters: { cmt_id : c_id },
		evalScripts:true,
		onComplete: function(transmit) {
			if (transmit.responseText != '') {
				skilltime_popup.setStyle({
					'position': 'absolute',
					'top': top + 'px',
					'left': left + 'px'
				});
				
				var skilltime_close_btn = $('SkillTime_close_btn');
				skilltime_popup.show();
				
				Event.observe(skilltime_close_btn, 'click', function(event) {
					skilltime_close_btn.stopObserving();
					skilltime_popup.stopObserving();
					skilltime_popup.remove();
				});

				Event.observe(skilltime_popup, 'mouseout', function(event) {
					var mouseY = Event.pointerY(event);
					var mouseX = Event.pointerX(event);
											
					var top = skilltime_popup.cumulativeOffset().top;
					var bottom = top + skilltime_popup.getHeight();
					
					var left = skilltime_popup.cumulativeOffset().left;
					var right = left + skilltime_popup.getWidth();

					if (mouseY > bottom || mouseY < top || mouseX < left || mouseX > right) {
						skilltime_close_btn.stopObserving();
						skilltime_popup.stopObserving();
						skilltime_popup.remove();
					}
				});
				
			}
			else {
				
			}
		}
	});
}

