//////////////////////////////////////////////////////////
///		GLOBAL DATA
//////////////////////////////////////////////////////////

var resetPromptKeyCodes = { 46:'Delete', 27:'Escape' }
var setPromptKeyCodes = { 13:'Enter' }
var conditionalPromptResetCodes = { 8:'BackSpace' }
var navigationKeyCodes = {	38:'KeyUp', 40:'KeyDown' 
							// 39:'KeyRight', 37:'KeyLeft'  - it seems there's no need to process these keys
						}
var ignoreKeys = { 39:'KeyRight', 37:'KeyLeft' }
var checkPreviousSymbolKeys = { 32:'Space' }

var promptItems = new Array();
var currentItemIndex = 0;
var storedSenderObj;

var adjustTextareaMenuPlacement = false;

var promptTypes = {'TagUser':0, 'TagPublication':1, 'Organisation':2, 'EducationEstablishment':3, 'Vacancy':5 };

var columnWidth = 6;
var rowHeight = 16;
var symbolHeight = 10;
var additionalOffset = 2;

var vacanciesSearchFocused;
//////////////////////////////////////////////////////////
///		EOF GLOBAL DATA
//////////////////////////////////////////////////////////

function initFontParams(newColumnWidth, newRowHeight, newSymbolHeight, newAdditionalOffset){
	columnWidth = newColumnWidth;
	rowHeight = newRowHeight;
	symbolHeight = newSymbolHeight;
	additionalOffset = newAdditionalOffset;
}

function filterKeys(sender, e){
	formatSenderValue(sender);
	var keyCode = getKeyCode(e);

    if(keyCode == 13 && !isMenuVisible() && vacanciesSearchFocused != undefined)
    {
        document.getElementById(vacanciesSearchFocused).click();
        return false;        
    }

	if (navigationKeyCodes[keyCode])
		return !isMenuVisible();
	if (setPromptKeyCodes[keyCode])
		return false;
	if (checkPreviousSymbolKeys[keyCode]) {
		if (sender.value == "" || sender.value[sender.value.length - 1] == " ")
			return false;
	}

}


function processVacancyPrompt(sender, e){	
	processPrompt(sender, e, promptTypes["Vacancy"]);
}


// main prompt menu function. smth like 'entry point'
function processPrompt(sender, e, promptType){
	var menu = getPromptMenu();
	var keyCode = getKeyCode(e);
	// check if need to be ignored
	if (ignoreKeys[keyCode]) {
		return;
	}
	
	// process reset keys
	if (isMenuVisible() && resetPromptKeyCodes[keyCode]){
		hidePromptMenu(menu);
		moveCursorToTheEndOfLine(sender);
		return;
	}
	
	// process menu navigation commands
	if (isMenuVisible() && navigationKeyCodes[keyCode]){
		processMenuNavigation(keyCode);
		moveCursorToTheEndOfLine(sender);
		return;
	}
	
	// process setting prompt item
	if (setPromptKeyCodes[keyCode])
	{
	    if(isMenuVisible())
	    {
		    setPromptMenuItem(sender);
		    moveCursorToTheEndOfLine(sender);
		    return false;
		}
		return true;
	}
		
	
	// update prompt menu items and reset if needed
	if (getLastWord(sender.value).length > 2){
		showPromptMenu(menu, sender, promptType);
	}
	else {
		hidePromptMenu(menu);
	}
	
	// TODO: check if the following code is necessary
	if (getLastWord(sender.value).length < 3 && conditionalPromptResetCodes[keyCode]){
		hidePromptMenu(menu);
	}
}

//////////////////////////////////////////////////////////
///		PROMPT MENU NAVIGATION METHODS
//////////////////////////////////////////////////////////

function processMenuNavigation(keyCode){
	switch(keyCode){
		case 38: // key up
			currentItemIndex = (currentItemIndex == 0) ? promptItems.length - 1 : currentItemIndex - 1;
			break;
		case 40: // key down
			currentItemIndex = (currentItemIndex == promptItems.length - 1) ? 0 : currentItemIndex + 1;
			break;
	}
	setCurrentItem();
}


function setPromptMenuItem(objSel){
    var menu = getPromptMenu();
    if ( menu.selectedIndex != -1)
    {
      var itemText = menu.options[menu.selectedIndex].text;
	  storedSenderObj.value = itemText;
	  hidePromptMenu(getPromptMenu());
	  storedSenderObj.focus();
      
    }
}


//////////////////////////////////////////////////////////
///		EOF PROMPT MENU NAVIGATION METHODS
//////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////
///		PROMPT MENU HELPER METHODS
//////////////////////////////////////////////////////////
function getPromptMenu(){
	return document.getElementById("promptmenu");
}

function isMenuVisible(){
	return getPromptMenu().style.display == "block";
}

// asynchronious call of web service method
function populateMenuItems(currentValue, promptType)
{
    PromptTool.GetTagPromptItemsArray(currentValue, promptType, buildMenu);
}

function formatSenderValue(sender){
	if (sender.type == "textarea") {
		var currentValue = sender.value;
		var regexp = new RegExp("\\s*,\\s*");
		sender.value = currentValue.replace(/\s*,\s*/g, ", ");
	}
}

function getUpdatedLastWord(currentString, itemValue){
	var lastWord = getLastWord(currentString);
	var replPattern = lastWord;
	return currentString.substr(0, currentString.lastIndexOf(lastWord)) + itemValue;
}

function getLastWord(str){
	var lastSpaceIndex = str.lastIndexOf(", ");
	if (lastSpaceIndex == -1)
		lastSpaceIndex = 0;
	return str.substr(lastSpaceIndex + (lastSpaceIndex == 0 ? 0 : 2));
}

function setCurrentItem(){
	var menu = getPromptMenu();
	// to avoid bag in Opera use setTimeout
	setTimeout( function(){menu.options[currentItemIndex].selected=true;}, 1 );
}

// callback function to bind menu div
function buildMenu(result){
	var menu = getPromptMenu();
	clearPromptMenu(menu);

	promptItems = result;
	
	// do not show menu if there are no items
	//if (promptItems.length == 0){
	if (promptItems.length > 0)
	{
		menu.style.display = "block";
		for (var i=0; i<promptItems.length; i++) 
		{
		    menu.options[i] = createMenuItem(i);
		}
		
		setCurrentItem();
		menu.onclick = new Function ("setPromptMenuItem(this)");

	}
	else {
		hidePromptMenu(getPromptMenu());
	}
	
	
}

// clears menu data
function clearPromptMenu(menu){
    menu.options.length = 0;
}

// create single menu item to be added into menu content div
function createMenuItem(itemIndex){
	var menuItem = new Option(promptItems[itemIndex], itemIndex);
	menuItem.style.marginLeft = menuItem.style.marginRight = "0px";
	return menuItem;
}

function showPromptMenu(menu, sender, promptType){
	storedSenderObj = sender;
	//menu.style.display = "block";
	populateMenuItems(getLastWord(sender.value), promptType); //(sender.value);
	setPromptMenuPosition(menu, sender);
}

function hidePromptMenu(menu){
	currentItemIndex = 0;
	if(menu != null)
	{
	    menu.style.display = "none";
	}
}

function getKeyCode(e){
	var keyId = (window.event) ? event.keyCode : e.which;
	return keyId;
}

// sets menu div position according sender input control
function setPromptMenuPosition(menu, sender){
    var senderPos = getSenderPosition(sender);
    var senderSize = getSenderSize(sender);

	if (sender.type == "text") {
		menu.style.top = senderPos[0] + senderSize[0] + "px";
		menu.style.left = senderPos[1] + "px"; // + senderSize[1];
		menu.style.width = senderSize[1] + "px";
	}
}

function getSenderPosition(sender){
	var currentLeft = currentTop = 0;
	if (sender.offsetParent) {
		do {
			currentLeft += sender.offsetLeft;
			currentTop += sender.offsetTop;
		} while (sender = sender.offsetParent);
	}
	return new Array(currentTop, currentLeft);
}

function getSenderSize(sender){
	var height = width = 0;
	height = sender.offsetHeight;
	width = sender.offsetWidth;

	return new Array(height, width);
}

//////////////////////////////////////////////////////////
///		EOF PROMPT MENU HELPER METHODS
//////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////
///		TEXTAREA HELPER METHODS
//////////////////////////////////////////////////////////

function moveCursorToTheEndOfLine(sender){
	setCaretPosition(sender, sender.value.length);
}

function setCaretPosition(sender, caretPos) {
    var elem = sender;

    if(elem != null) {
        if(elem.createTextRange) {
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        }
        else {
            if(elem.selectionStart) {
                elem.focus();
                elem.setSelectionRange(caretPos, caretPos);
            }
            else
                elem.focus();
        }
    }
}


//////////////////////////////////////////////////////////
///		EOF TEXTAREA HELPER METHODS
//////////////////////////////////////////////////////////
