var valueBeforeInput;
var activeTextBoxName;
var divContainerName;
var bQuickSearch = false;

function startInputMode(iputTag, isQuickSearch) {
	valueBeforeInput = $E(iputTag).value;
	activeTextBoxName = iputTag;
	bQuickSearch = isQuickSearch;
}

function processInput(divcontainer, listBoxTag, url, param, datasourceTag, key){
	divContainerName = divcontainer;
	if(key==38){
		//uparrow
		if(!Element.visible($E(divcontainer))) {
			return;
		}
		var listBox=$E(listBoxTag);
		if(listBox.selectedIndex>0){
			listBox.selectedIndex=listBox.selectedIndex-1;
			showListSelection(listBoxTag,false);
		}
	} else if(key==40) {
		//downarrow
		if(!Element.visible($E(divcontainer))) {
			return;
		}
		var listBox=$E(listBoxTag);
		if(listBox.selectedIndex==-1||((listBox.options.length-1)==listBox.selectedIndex)) {
			listBox.selectedIndex=0;
			showListSelection(listBoxTag, false);
		} else {
			listBox.selectedIndex=listBox.selectedIndex+1;
			showListSelection(listBoxTag, false);
		}
	} else if(key==27) {
		//ESC
		$E(datasourceTag).value="";
		if(Element.visible($E(divcontainer))) {
			Element.hide($E(divcontainer));
		}

	} else {
		var inputValue = $E(datasourceTag).value;
		inputValue = inputValue.strip();
		
		if(inputValue == valueBeforeInput) {
			return;
		} else {
			valueBeforeInput = inputValue;
		}
		if(inputValue =="") {
			Element.hide($E(divcontainer));
			return;
		}
		var	parameter = param + inputValue;
		callServerRequest(divcontainer, listBoxTag, datasourceTag, url, parameter);
	}
}

function callServerRequest(divcontainer, listBox, datasourceTag, url, param) {
	var request = new Ajax.Request(   
		url,   
		{
			"method": "post",
			"parameters": param,
			onSuccess: function (transport) {
				showOptionDataList(transport, divcontainer, listBox, datasourceTag);
			}
		}
	);
}

function showOptionDataList(transport, divcontainer, listBox, datasourceTag) {
	try {
		Element.hide($E(divcontainer));
		var xmlData = transport.responseXML;
		var referenceData = xmlData.getElementsByTagName("reference");
		if((referenceData == null) || (referenceData.length==0)) {
			return;
		}
		//change the container's position
		var sourceInputBox = $E(datasourceTag);
		var displayDiv = $E(divcontainer);
		displayDiv.style.left = findPosX(sourceInputBox);
		displayDiv.style.top = findPosY(sourceInputBox) + 25;
	
		var listbox = $E(listBox); // getting list box
		listbox.options.length = 0;
		if(referenceData.length > 0) {	
			Element.show(displayDiv);
			// determining list box size property
			if (referenceData.length >= 15) {
				listbox.size = 15;
			} else {
				listbox.size = referenceData.length;
			}
			
			for(var i=0; i < referenceData.length; i++) {
				var keyword = referenceData[i].getAttribute("keyword");
				var strVal = "";
				if (keyword.length > 60) {
					strVal = keyword.substring(0, 60) + "...";
				} else {
					strVal = keyword;
				}
				
				var option = new Option(strVal, keyword);
				listbox.options[i] = option;
			}
			if(referenceData.length == 1) {
				listbox.selectedIndex = 0;
			}
		}
	} catch(e) {
		alert('Error while data transfer\n- please try again in few seconds');
	}
}
	   
function selectKeyword(divContainer, listBox){
	var selectListBox = $E(listBox);
	var displayValue = selectListBox.options.item(selectListBox.selectedIndex).value;
	if(bQuickSearch == true) {
		displayValue = '"' + displayValue + '"';
	}
	$E(activeTextBoxName).value = displayValue;
	$E(activeTextBoxName).focus();
	Element.hide($E(divContainer));
}

function showListSelection(selectlist,isHideDiv) {
	var listBox = $E(selectlist);
	listBox.selectedIndex = listBox.selectedIndex;
	var displayValue = listBox.value;
	if(bQuickSearch == true) {
		displayValue = '"' + displayValue + '"';
	}
	$E(activeTextBoxName).value = displayValue;
	$E(activeTextBoxName).focus();
}

function findPosX(obj)  {
	// http://blog.firetree.net/2005/07/04/javascript-find-position/
	var curleft = 0;
	if(obj.offsetParent) {
		while(1) {
			curleft += obj.offsetLeft;
			if(!obj.offsetParent) {
				break;
			}
			obj = obj.offsetParent;
		}
	} else if(obj.x) {
		curleft += obj.x;
	}
	return curleft;
}

function findPosY(obj) {
	// http://blog.firetree.net/2005/07/04/javascript-find-position/
	var curtop = 0;
	
	if(obj.offsetParent) {
		while(1) {
			curtop += obj.offsetTop;
			if(!obj.offsetParent) {
				break;
			}
			obj = obj.offsetParent;
		}
	} else if(obj.y) {
		curtop += obj.y;
	}
	
	return curtop;
}

function $E(elementName) {
	var element = document.getElementById(elementName);
	if(element != null) {
		return element;
	}
	elements = document.getElementsByName(elementName);

	return elements[0];
}

function onInputBlur() {
	document.onclick=onWindowClick;
}

function onWindowClick(e) {
	if((divContainerName!=null) && ($E(divContainerName)!=null) && Element.visible($E(divContainerName))) {
		Element.hide($E(divContainerName));
	}
}

var updater;
function updateProccess(url) {
	updater = new Ajax.PeriodicalUpdater(
		"display",
		url,   
		{
			"method": "post",
			"parameters": "actionMode=monitor",
			frequency: 1,
			onSuccess: function(transport) {
				showMessage(transport);
			},
			onFailure: function(transport) {
				this.stop();
				$("update").disabled = false;
			}
		}
	);
}
function showMessage(transport) {
	try {
		var xmlData = transport.responseXML;
		if(xmlData==null) {
			return;
		}
		var data = xmlData.getElementsByTagName("data");
		if(data == null) {
			return
		}
		var step, status, message;
		try {
			step = data[0].getAttribute("step");
			status = data[0].getAttribute("status");
			message = data[0].getAttribute("message");
		} catch(e) {
			step = data.getAttribute("step");
			status = data.getAttribute("status");
			message = data.getAttribute("message");
		}
		
		Element.hide("backupmsg");
		Element.show("msg");		
		msgDiv = $E("msg");
		msgDiv.innerHTML = message;
		if(step=="3") {
			updater.stop();
			$("update").disabled = false;
		}
		if(status=="-1") {
			updater.stop();
			$("update").disabled = false;
		}
	} catch(e) {
		alert(e.description);
	}	
}
	
function refreshPubInfo(url) {
	if(window.confirm('Are you sure to refresh journal names for references?')){
		$("update").disabled = true;
		Element.hide($E("display"));
		Element.show("backupmsg");
		updateProccess(url);
	}
}
