var inputValue = '';

// 숫자를 3자리씩 ',' 찍는 함수 
function numberFormat(number) {
	
	var resultNumber = "";
	
	for (index=number.length-1; index >= 0; index--) {
		splitChar = number.charAt(index);
		resultNumber = splitChar + resultNumber;
		
		if ( index % 3 == number.length % 3 && index != 0) {
			resultNumber = ',' + resultNumber;
		}
		
	}
	return resultNumber;
}

var timeId = null;
var focusObj = null;
// 자동완성 추천 단어 목록의 크기
var size=0;

Event.observe(window, 'load', function() {
	
	initVars();
	// 처음 로드 되었을때 바로 자동완성이 되지 않도록 하기 위해서 값을 넣는다.
	inputValue = $('kwd').value;
	
	timeId = window.setInterval('sendAjax()', 10);
	// 로그인 폼에서 focus가 안맞는 것을 주소로 강제로 맞춤 
	var str_url = window.location.pathname;
	var cnt = -1;
	cnt = str_url.indexOf('/user/');// 회원 관련 페이지들은 검색 포커스 안함
	if (cnt==-1 && focusObj==null){
		$('kwd').focus();
	}
	
	Event.observe('kwd', 'keydown', function(nsEvent) {
		
		// 아무런 문자가 없을 때, 엔터키가 먹었을 때 아무런 동작이 없도록 한다. 
		if ( $('kwd').value == '') {
			clearSuggestWords();
			return;
		}
		
		//$('popup').show();
		var ev = nsEvent? nsEvent : window.event;
		if ( ev.keyCode == Event.KEY_DOWN ) {
			key_down();
		}else if ( ev.keyCode == Event.KEY_UP ) {
			key_up();
		}else if ( ev.keyCode == Event.KEY_ESC 
			|| ev.keyCode == Event.KEY_RETURN )
		{
			clearSuggestWords();
			window.clearInterval(timeId);
			timeId = null;
			return;
		}else {
			if ( timeId == null ) {
				timeId = window.setInterval('sendAjax()', 10);
			}
		}
	});
	
	Event.observe('kwd', 'focus', function(){
		if ( timeId == null ) {
			timeId = window.setInterval('sendAjax()', 10);
		}
	});
	
	// 검색창 이외의 창에 마우스를 클릭했을때 
	Event.observe('kwd', 'blur', function() {
		
		window.clearInterval(timeId);
		timeId = null;
		// 추천 검색어 목록창이 아닌 곳을 클릭하면
		if ( $$('.mouseKeyDown').length == 0 ) {
			clearSuggestWords();
		}
	});
	
});

// 전역으로 사용하는 이벤트와 변수
var completeDiv;
var inputField;
var nameTable;
var nameTableBody;

// 전역변수 초기화
function initVars() {
  inputField = $("kwd");
  nameTable = $("name_table");
  completeDiv = $("popup");
  nameTableBody = $("name_table_body");
}

// 검색어 자동완성 기능을 위해 추천 검색어 목록을 가져온다.
function findWords(e) {
	var ev = e ? e:window.event;
	if ( ev.keyCode == Event.KEY_DOWN 
		|| ev.keyCode == Event.KEY_UP  
		|| ev.keyCode == Event.KEY_RETURN ) 
	{
		if(ev.keyCode == Event.KEY_RETURN){
			
			if ($('w')) {
				$('w').value = ''; //set 통합검색	
			}
		}
		return;
	}
	
  	initVars();
  	sendAjax();
  	
} 


var responseList = [];
var preKwds = '';
var kwds = '';
/**
 * Ajax로 추천 검색어 리스트를 가져온다.
 *
 * @author goodoi 
 */ 
function getSuggestWords() {
	
	if (inputValue != '') {
  	  var url = "/keyword/suggest.php";
	  	new Ajax.Request(url, {
	  		method:'get',
	  		parameters:{'kwd':escape(inputValue)},
	  		onSuccess:function(xmlHttp) {
	  			XML_HTTP  = xmlHttp;
  				preKwds = kwds;
  				var kwd_list = xmlHttp.responseText;
  				if (kwd_list != '') {
  					kwds = kwd_list.split(":");
 	  			}else {
 	  				kwds = '';
 	  			}	
  				viewSuggestWords( kwds );
   	  	}, 
	  		onCreate: function(xmlHttp) {
	  			setTimeout(
	  				function() {
	  					if ([1,2,3].include(xmlHttp.transport.readyState)) {
	  						xmlHttp.transport.abort();
	  						if (preKwds != '') {
  								viewSuggestWords( preKwds );
  							}
  						}
	  				},
	  				500
	  			);
	  		},
	  		onFailure:function(xmlHttp) {
	  			//clearSuggestWords();
	  		}
	  	});
	  		  	
	} else {
		clearSuggestWords();
	} 
}
/**
 * 키워드를 입력받아 Ajax로 추천 검색어를 가져온다.
 * 파이어 폭스 한글 이벤트 처리시 한글을 계속 이어쓰면 이벤트를 발생 시키지 않는 버그를 해결하기 위한 코드임. 
 * 
 * @author goodoi 
 */
function sendAjax() {

	if ( (inputValue != $("kwd").value) && $$('.keyDown').length == 0) {  
		inputField = $("kwd");
    	inputValue = $("kwd").value;
    	getSuggestWords();
    }
    //setTimeout("sendAjax()", 10);
}

// 추천 검색어 목록을 화면에 나타낸다.
function viewSuggestWords(the_names) {
  clearSuggestWords(); 
   
  if (the_names == '' || the_names.length == 0)
	{ 
		clearSuggestWords();
   	return; 
  } 
  
  size = the_names.length;
  
  setOffsets();
  
  $('popup').show();
  for (var i = 0; i < size; i++) {
  	var row, cell, txtNode;
  	suggestData = the_names[i].split("||");
    var suggestWord = suggestData[0].strip();
    
    responseList.push(suggestWord);
    var result_count = suggestData[1];
    
    row = document.createElement("tr");
    row.setAttribute("style", "cursor:hand;");
    row.setAttribute("height", 10);
    cell = document.createElement("td");
    cell.onmouseout = function() {this.className='keyOut'; this.nextSibling.className='keyOut';};
    cell.onmouseover = function() {this.className='mouseKeyDown'; this.nextSibling.className='mouseKeyDown';};
    cell.setAttribute("id", "row_"+i);
    cell.setAttribute("border", "0"); 
    cell.align="left";
    cell.setAttribute("style", "text-align: left; font-size:12px;");
    cell.className ="suggest";
    cell.onclick = function() { populateName(this);}; 
    cell2 = document.createElement("td");
    cell2.onmouseout = function() {this.className='keyOut'; this.previousSibling.className='keyOut';};
    cell2.onmouseover = function() {this.className='mouseKeyDown'; this.previousSibling.className='mouseKeyDown';};
    cell2.setAttribute("id", "result_" + i);
    cell2.align="right";
    cell2.setAttribute("style", "text-align: right;");
    cell2.setAttribute("border", "0");
	cell2.innerHTML = "<span style='font-size:11px; color: #d36200;'>" + numberFormat(result_count)+" 건";
    cell.innerHTML = suggestWord;
    //cell.appendChild(pTag);
    row.appendChild(cell);
    row.appendChild(cell2);
    nameTableBody.appendChild(row);
  } 
  
}

// 화면에 나타낼 추천 검색어 목록의 크기를 정한다.
function setOffsets() {
	var end = inputField.offsetWidth;
	var left = calculateOffsetLeft(inputField);
	var top = calculateOffsetTop(inputField) + inputField.offsetHeight;
	completeDiv.style.border = "";
	completeDiv.style.left = left + "px";
	completeDiv.style.top = top + "px";
	/*	
	if(end>347){
		// firefox와 IE 차이
		if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) {
			width_diff = 36;
		}  else{
			width_diff = 42;
		}
		nameTable.style.width = (end-width_diff) + "px";		
	}else{
		nameTable.style.width = end + "px";
	}
	*/
	nameTable.style.width = end + "px";
}

function calculateOffsetLeft(field) {
	return calculateOffset(field, "offsetLeft");
}

function calculateOffsetTop(field) {
	return calculateOffset(field, "offsetTop");
}

function calculateOffset(field, attr) {
  var offset = 0;
  while(field) {
    offset += field[attr]; 
    field = field.offsetParent;
  }
  return offset;
}

// 마우스를 클릭했을 때 선택한 추천 검색어가 검색창으로 들어간다.
function populateName(cell) {
    inputField.value = cell.firstChild.nodeValue.unescapeHTML();
    clearSuggestWords(); 
    $("frmMain").submit();
    
}

// 추천 검색어 목록을 제거한다.
function clearSuggestWords() {
	$('popup').hide();
  var ind = nameTableBody.childNodes.length;
  for (var i = ind - 1; i >= 0 ; i--) {
       nameTableBody.removeChild(nameTableBody.childNodes[i]);
  }
  completeDiv.style.border = "none";
  
  
  // 저장했던 목록리스트를 비워준다.
  responseList = [];
}

// 검색어 창에 쓴 문
var initData;

// 밑에 쪽 화살표를 눌렀을 때 동작하는 함수
// 각 추천어를 밑으로 내려가면서 선택한다.
function key_down() {
	//selectedKwd는 리스트로 크기가 항상  0 or 1 이다. - 현재 선택되어 있는 추천 키워드
	var kwdList = $$('.keyDown');
	var newRow = null;
	if ( kwdList.length == 0 ) {
		if ( inputField.value ) {
			initData = inputField.value;
		}
		
		newRow = $('row_0');
		if(newRow){
			newRow.className = "keyDown";
		}
		
		// 검색 결과 건수에 표시하기 
		resultCount = $('result_0');
		if (resultCount) {
			resultCount.className = "keyDown";
		}
	}
	else {
	
		var num = getSelectedNum(kwdList);
		disablePrevRow(num);
		
		var rowNum = (Number(num)+1) % size;
		if ( rowNum == 0 ) {
			inputField.value = initData;
			return true;
		}
		
		newRow = $('row_' + rowNum);
		if(newRow){
			newRow.className = "keyDown";
		}
		
		// 검색 결과 건수에 표시하기 
		resultCount = $('result_' + rowNum);
		if (resultCount) {
			resultCount.className = "keyDown";
		}
	}
	
	if(newRow){
		inputField.value = newRow.innerHTML.strip().unescapeHTML();
	}
}

// 위쪽 화살표를 눌렀을 때 동작하는 함수
// 각 추천어를 위로 올라가면서 선택한다.
function key_up() {
	//selectedKwd는 리스트로 크기가 항상  0 or 1 이다. - 현재 선택되어 있는 추천 키워드
	var kwdList = $$('.keyDown');
	var newRow = "";
	if ( kwdList.length == 0 ) {
		// 검색창에 입력한 값을 전역변수에 저장해 놓는다.
		if ( inputField.value ) {
			initData = inputField.value;
		}
		
		rowNum = (Number(size)-1);
		newRow = $( 'row_' + rowNum );
		
		if(newRow){
			newRow.className="keyDown";
		}
		
		resultCount = $( 'result_' + rowNum );
		if (resultCount) {
			resultCount.className = "keyDown";
		}
		
	}	
	else {
	
		var num = getSelectedNum(kwdList);
		disablePrevRow(num);
		
		var rowNum = (Number(num)-1) % size;
		
		if ( rowNum == -1 || (size == 1 && rowNum == 0) ) {
			inputField.value = initData;
			return true;
		}
		
		newRow = $('row_' + rowNum);
		if(newRow){
			newRow.className = "keyDown";
		}
		
		resultCount = $('result_' + rowNum);
		if (resultCount) {
			resultCount.className = "keyDown";
		}
	}
	
	if(newRow){
		inputField.value = newRow.innerHTML.strip().unescapeHTML();
	}
}

// 추천 검색어 목록중에 이전에 선택되었던 추천 검색어의 포커스를 없앤다.
function disablePrevRow(rowNum) {
	$('row_' + rowNum).className = "keyOut";
	$('result_' + rowNum).className = "keyOut";
}

// 추천 키워드중에서 현재 포커스가 있는 줄을 리턴한다.
function getSelectedNum(kwdList) {
	var rowId = kwdList[0].id;
	return rowId.split("_")[1];
}
