var __autoComplete = new Array();
var __currentList = new Array();

function createAutoComplete() {
	var inputid = arguments[0];
	var funct_req = arguments[1];
	
	var ac_type = (arguments[2]) ? arguments[2] : 'defalut';
	
	var inp_obj = document.getElementById(inputid);
	
	__autoComplete[inputid] = {'ajax_func_req':funct_req,
								'is_send_request':false,
								'is_show':false,
								'selected_index':-1,
								'item_count':0,
								'last_show':-1,
								'type':ac_type
	};
	
	if(typeof(inp_obj) == 'object') {
		var elem = document.createElement('div');
		elem.setAttribute('id', getAutoCompleteObjectId(inputid));

		elem.className = 'autocomplete';
		elem.style.width = inp_obj.offsetWidth + 'px';
		elem.style.visibility = 'hidden';
		
		var elem2 = document.createElement('br');
		elem2.setAttribute ('style', 'line-height:1px;font-size:1px;height:1px;clear: both;');
		inp_obj.parentNode.insertBefore(elem, inp_obj.nextSibling);
   		inp_obj.parentNode.insertBefore(elem2, inp_obj.nextSibling);
   		
		inp_obj.setAttribute('autocomplete', 'off'); 

		inp_obj.onkeydown = function(e) { 
		
			var keynum;
			
			if(window.event) // IE
		  	{
		  		keynum = event.keyCode;
		  	}
			else if(e.which) // Netscape/Firefox/Opera
		  	{
		  		keynum = e.which;
		  	}
			if ( keynum == 13 ) {
				if(hideAutoCompleteList(inp_obj.id) == true) {
					return false;
				}	
				return true;			
			}
			
			if(keynum == 27) {
				hideAutoCompleteList(inp_obj.id);
				return false;
			} else if(keynum == 40) { 
				autocompleteKeyDown(inp_obj.id);				
				return false;
			} else if(keynum == 38) {
				autocompleteKeyUp(inp_obj.id);
				return false;
			} else if(keynum >= 16 &&  keynum <= 40) {
				return true;
			}
			
			getAutocompleteList(this.id);
			return true;
		};
		
		var docClick = function()
        {
           hideAutoCompleteList(inp_obj.id);
        }

        if (document.addEventListener) {
            document.addEventListener('click', docClick, false);
        } else if (document.attachEvent) {
            document.attachEvent('onclick', docClick, false);
        } 
		
		
	} 
}

function getAutoCompleteObjectId(input_id) {
	return 'ac-'+input_id;
}

function selectItem(input_id, value) {
	if ( __autoComplete[input_id].type == 'word' ) {
		insertAtCaret(input_id, __autoComplete[input_id].cur_pos, value);
	} else {
		document.getElementById(input_id).value = value;
	} 
}

function autocompleteKeyDown(input_id) {
	
	if(__autoComplete[input_id].is_show == false) return false;

	var ac_id = getAutoCompleteObjectId(input_id);
	var auto_obj = document.getElementById(ac_id);
	var hl_item_index = -1;
	
	for (var i=0; i<auto_obj.childNodes.length; i++) {
		if(auto_obj.childNodes[i].className == 'autocomplete_item_highlighted') {
			auto_obj.childNodes[i].className = 'autocomplete_item';
			hl_item_index = i;
			break;
		}
	}
	if(hl_item_index == (auto_obj.childNodes.length-1) ) {
		hl_item_index = -1;
	}
	var item_id = 0;
	if(auto_obj.childNodes[hl_item_index+1] != null) {
		for (var i=hl_item_index+1; i<auto_obj.childNodes.length; i++) {
			if(auto_obj.childNodes[i].className == 'autocomplete_item') {
				item_id = auto_obj.childNodes[i].id;
				item_id = item_id.match(/\d+/);
				item_value = __currentList[item_id];				
				
				item_value = htmlSpecialCharsDecode(item_value);
				selectItem(input_id, item_value);
				
				auto_obj.childNodes[i].className = 'autocomplete_item_highlighted';
				checkScroll(input_id, i );
				break;
			}
		}	
	}
}


function autocompleteKeyUp(input_id) {

	if(__autoComplete[input_id].is_show == false) return false;

	var ac_id = getAutoCompleteObjectId(input_id);
	var auto_obj = document.getElementById(ac_id);
	var hl_item_index = null;
	
	for (var i=0; i<auto_obj.childNodes.length; i++) {
		if(auto_obj.childNodes[i].className == 'autocomplete_item_highlighted') {
			auto_obj.childNodes[i].className = 'autocomplete_item';
			hl_item_index = i;
			break;
		}
	}
	
	if(hl_item_index == null || hl_item_index == 0) return false;
	
	if(auto_obj.childNodes[hl_item_index-1] == null) {
		return false
	}
	
	var item_id = 0;
	for (var i=hl_item_index-1; i>=0; i--) {
		if(auto_obj.childNodes[i].className == 'autocomplete_item') {
			//var item_value = auto_obj.childNodes[i].innerHTML;
			item_id = auto_obj.childNodes[i].id;
			item_id = item_id.match(/\d+/);
			item_value = __currentList[item_id];
			item_value = htmlSpecialCharsDecode(item_value);
			selectItem(input_id, item_value);
			auto_obj.childNodes[i].className = 'autocomplete_item_highlighted';
			checkScroll(input_id, i );
			break;
		}
	}
	
}

function checkScroll(input_id, elem_id) {
	
	if(__autoComplete[input_id].last_show < (elem_id+1)) {
		__autoComplete[input_id].first_show = elem_id - 6;
		__autoComplete[input_id].last_show = elem_id;
		
	}
	
	if(__autoComplete[input_id].first_show > elem_id) {
		__autoComplete[input_id].first_show = elem_id;
		__autoComplete[input_id].last_show = elem_id + 7;
		 
	}
	
	var auto_obj = document.getElementById(getAutoCompleteObjectId(input_id));
	auto_obj.scrollTop = __autoComplete[input_id].first_show * 15;

}

function getAutocompleteList (input_id) {
	window.setTimeout(function() {sendRequest(input_id)}, 500); 
}

function getCursorPos(input_id) {
	var input_obj = document.getElementById(input_id);
    var scrollPos = input_obj.scrollTop;
    var strPos = 0;
    var br = ((input_obj.selectionStart || input_obj.selectionStart == '0') ? "ff" : (document.selection ? "ie" : false ) );
    if (br == "ie") { input_obj.focus();
        var range = document.selection.createRange();
        range.moveStart ('character', -input_obj.value.length);
        strPos = range.text.length; }
    else if (br == "ff")
        strPos = input_obj.selectionStart;
       
	return strPos;
}

function getCurrentWord(input_id) {
	var cur_pos = getCursorPos(input_id);
	var cur_value = document.getElementById(input_id).value;
	var aWords = cur_value.split(',');
	if ( aWords.length <= 1 ) return cur_value;
	
	var part_first = cur_value.substring(0, cur_pos);
	var part_second = cur_value.substring(cur_pos, cur_value.length);
	
	var aWordsFirst = part_first.split(',');
	var aWordsSecond = part_second.split(',');
	
	var word_first = aWordsFirst[aWordsFirst.length-1];
	var word_second = aWordsSecond[0];
	
	var word = word_first + word_second;
	
	return word;
}

function sendRequest (input_id) {
	    
    var word = getCurrentWord(input_id);
	
	if( __autoComplete[input_id].is_send_request == false ) {
		var inp_obj = document.getElementById(input_id);
		if(inp_obj.value != '') {
			if ( __autoComplete[input_id].type == 'word' ) {
				__autoComplete[input_id].ajax_func_req(input_id, inp_obj.value, getCursorPos(input_id));
			} else {
				__autoComplete[input_id].ajax_func_req(input_id, inp_obj.value);
			}			
			
			__autoComplete[input_id].is_send_request = true;
		} else {
			hideAutoCompleteList(inp_obj.id);
		}
		
	}	
}


function highLightItem(div_obj) {

	auto_obj = div_obj.parentNode;
	
	for (var i=0; i<auto_obj.childNodes.length; ++i) {
		if (auto_obj.childNodes[i].className == 'autocomplete_item_highlighted') {
			auto_obj.childNodes[i].className = 'autocomplete_item';
		}
	}
	
	div_obj.className = 'autocomplete_item_highlighted';	
}

function clickOnItem(input_id, item_id, div_obj) {
	
	var value = __currentList[item_id];
	
	value = htmlSpecialCharsDecode(value);
	
	selectItem(input_id, value);
	
	
	if(typeof(document.getElementById(input_id).onblur) == 'function') {
		document.getElementById(input_id).onblur();
	}
	auto_obj = div_obj.parentNode;
	auto_obj.style.visibility = 'hidden';
	
}

function insertAtCaret(areaId, strPos, text) {
    var txtarea = document.getElementById(areaId);
    var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? "ff" : (document.selection ? "ie" : false ) );
    var scrollPos = txtarea.scrollTop;
   
   	
   	var part_first = (txtarea.value).substring(0, strPos);
   	var front = part_first.substring(0, part_first.lastIndexOf(',')+1);
   	if ( front.length > 0 ) front = front + ' ';
   	
	var part_second = (txtarea.value).substring(strPos, txtarea.value.length);
	var back = part_second.substring(part_second.indexOf(','), part_second.length);
	
	txtarea.value=front+text+back;
	
	if (br == "ie") {
    	txtarea.focus();
        var range = document.selection.createRange();
        range.moveStart ('character', -back.length);
        range.moveEnd ('character', -back.length);
        range.select();
    } else if (br == "ff") {
    	txtarea.selectionStart = (front+text).length;
        txtarea.selectionEnd = (front+text).length;
        txtarea.focus();
    }
	    
	__autoComplete[areaId].cur_pos = (front+text).length;
}

function clearList(input_id) {
	var ac_id = getAutoCompleteObjectId(input_id);
	__autoComplete[input_id].is_send_request = false;
	auto_obj = document.getElementById(ac_id);
	auto_obj.innerHTML = '';
	auto_obj.scrollTop = 0;
	__autoComplete[input_id].first_show = 1;
	__autoComplete[input_id].last_show = 7;
	__currentList = new Array();
}

function addItem() {
	var args = arguments[0];
	
	var input_id = args.input_id; 
	var caption = args.text; 
	var type = (args.type) ? args.type : ''; 
	var cur_pos = (args.cur_pos) ? args.cur_pos : 0;	

	__autoComplete[input_id].item_count += 1;
	
	var __item_id = __currentList.length;
	__currentList[__item_id] = caption;
	
	if ( type == 'mod' ) {
		caption += " (Official Record)";
	} 
	
	var ac_id = getAutoCompleteObjectId(input_id);
	auto_obj = document.getElementById(ac_id);
	
	auto_obj.innerHTML += '<div id="ac-item-'+__item_id+'" class="autocomplete_item" onmouseover="highLightItem(this);" onclick="clickOnItem(\''+input_id+'\', \''+__item_id+'\',this);">'+caption+'</div>';
	
	if ( __autoComplete[input_id].type == 'word' ) {
		__autoComplete[input_id].cur_pos = cur_pos;
		
		var pad_offset = cur_pos * 5;
		if ( pad_offset > 330 ) pad_offset = 330;
		else auto_obj.style.margin = '0 0 0 '+pad_offset+'px';
		
		var width = 330 - pad_offset;
		if ( width < 100 ) width = 100;
		
		auto_obj.style.width = width + 'px';
		 
		
	}
	
	
}

function showAutoCompleteList(input_id) {
	__autoComplete[input_id].is_show = true;
	var ac_id = getAutoCompleteObjectId(input_id);
	var inp_obj = document.getElementById(input_id);
	auto_obj = document.getElementById(ac_id);
	auto_obj.style.width = inp_obj.offsetWidth + 'px';
	auto_obj.style.visibility = '';	
}

function hideAutoCompleteList(input_id) {
	if ( __autoComplete[input_id].is_show == false ) return false;
	__autoComplete[input_id].is_show = false;
	var ac_id = getAutoCompleteObjectId(input_id);
	auto_obj = document.getElementById(ac_id);
	auto_obj.style.visibility = 'hidden';
	return true;
}

function htmlSpecialCharsDecode(input_string) {
	input_string = input_string.replace(/&amp;/g, '&');
	input_string = input_string.replace(/&lt;/g, '<');
	input_string = input_string.replace(/&gt;/g, '>');
	input_string = input_string.replace(/&quot;/g, '"');
//	p_string = p_string.replace(/'/g, '&#039;');
	return input_string;
	
}
