var pId;
var popupCtrl = false;
var popupRowOffset = 1;
var currentPredictiveItemSelected = null; var currentDivId = null; var popupSearchBoxId = null;
var requiredTabIndex = null; var currentEventArgument = null; var currentEventTarget = null; var currentSearchBoxId = null;
var isShadeEnabledAlready = false;
var iPredictiveCallBack = new CallBackObject();
var showingPredictivePanel=true;
var refreshFullTab = false;

function predictiveMouseDown(evt) {
	if (!evt) evt = window.event || window.Event;
	if (evt.button != 2) 
	{
		var foundPredictive = false
		var target = evt.target != null ? evt.target : evt.srcElement;
	
		while (target)
		{
			id = target.id;
			if (id!=null) 
			{
				if (id.indexOf('predictiveDiv') >=0)
				{
					foundPredictive = true 
				}
			}
			target = target.parentNode;
		}
	
		if (!foundPredictive)
		{
			predictiveLostFocus(currentDivId);
		}
	}
}

function iPredictiveDisableShade()
{ if (!isShadeEnabledAlready && !isPopupOpen()) { disableShade(); } }

function isPopupOpen()
{
	if (getElement('popupContainer') != null) 
	{
		if (getElement('popupContainer').style.visibility == "visible" || getElement('popupContainer').style.visibility == "")
		{	
			return true;
		}
		else
		{	
			return false;
		}
	} else { return false; }
}
// key handling functions ************************************************************************
function iPredictiveKeyDown(callType, parentId, eventTarget, divId, searchBoxId, tempPopupSearchBoxId, evt) {
	if (!evt) evt = window.event || window.Event;
	var keyCode = getKeyPressedCode(evt);

	iPredictiveCallBack.AbortCallBack();

	try	{
		var searchBox = getElement(searchBoxId);
		currentEventTarget = eventTarget;
		requiredTabIndex = getElement(searchBoxId).tabIndex+3;
		eventTarget = eventTarget.replace(new RegExp('\\_', 'g'), "$");

		if (keyCode == TAB_KEY) {
			if (currentPredictiveItemSelected != null) {
				if (getElement('predictItem' + currentPredictiveItemSelected)) {
					if (!getElement('predictItem' + currentPredictiveItemSelected).click) {
						getElement('predictItem' + currentPredictiveItemSelected).onclick();
					} else {
						getElement('predictItem' + currentPredictiveItemSelected).click();
					}
				}
			} else {
				if (searchBox.value != '' && showingPredictivePanel == true) {
					if(callType == 'ajaxAndRefreshParent') {
						ajaxAndRefreshParent(parentId, eventTarget, 'SELECT')
					} else if(callType == 'ip_singleSelect') {
						ip_singleSelect(divId, eventTarget, 'SELECT');
					} else {
						//alert('not supported...');
					}
				}
			}
			showingPredictivePanel = false;
		}
	}
	catch(exc) {self.status='JS Error in iPredictiveKeyDown:' + exc;}
}

function iPredictiveKeyUp(eventTarget, divId, searchBoxId, tempPopupSearchBoxId, evt) {
	if (!evt) evt = window.event || window.Event;
	var keyCode = getKeyPressedCode(evt);

	try {
		if (!startMenuVisible) {
			if (keyCode == TAB_KEY) { }
			else if (keyCode == ESCAPE_KEY) { currentDivId = controlId; removePredictions(); }
			else if (keyCode == ENTER_KEY) { popupSearchBoxId = tempPopupSearchBoxId; ip_openSearch(divId, eventTarget, 'OPENPOPUP'); }
			else if (keyCode != LEFT_ARROW_KEY && keyCode != UP_ARROW_KEY && keyCode != RIGHT_ARROW_KEY && keyCode != DOWN_ARROW_KEY) {

				var searchBox = getElement(searchBoxId);
				if (searchBox.value == '') { hideElement('predictiveIframe' + divId); hideElement('predictiveDiv' + divId); }
				else {
					currentEventTarget = eventTarget;
					currentDivId = divId;
					currentSearchBoxId = searchBoxId;
					
					showPredictivePanel();
				}
			}
		}
	}
	catch(exc) { self.status='JS Error in iPredictiveKeyUp' + exc; }
}

function predictiveKeyDownHandler(evt) {
	if (!evt) evt = window.event || window.Event;
	var keyCode = getKeyPressedCode(evt);

	if (keyCode == UP_ARROW_KEY) {
		if (currentPredictiveItemSelected != null) {
			if (currentPredictiveItemSelected > 1) {
				getElement('predictItem' + currentPredictiveItemSelected).className = '';
				currentPredictiveItemSelected -= 1;
				getElement('predictItem' + currentPredictiveItemSelected).className = 'vHover';
			}
		}
	} else if (keyCode == RIGHT_ARROW_KEY) {
		if (currentPredictiveItemSelected != null) {
			if (!getElement('predictItem' + currentPredictiveItemSelected).click) {
				getElement('predictItem' + currentPredictiveItemSelected).onclick();
			} else {
				getElement('predictItem' + currentPredictiveItemSelected).click();
			}
		}
	} else if (keyCode == DOWN_ARROW_KEY) {
		if (currentPredictiveItemSelected == null) { currentPredictiveItemSelected = 1; }
		else {
			getElement('predictItem' + currentPredictiveItemSelected).className = '';
			currentPredictiveItemSelected += 1;
			if (!getElement('predictItem' + currentPredictiveItemSelected)) { currentPredictiveItemSelected -= 1; }
		}
		getElement('predictItem' + currentPredictiveItemSelected).className = 'vHover';
	} else if (keyCode == ESCAPE_KEY) {
	} else if (keyCode == ENTER_KEY) {
	}
	KeyDownHandler(evt);
}

function showPredictivePanel()
{
	showingPredictivePanel=true;
	iPredictiveCallBack.AbortCallBack();
	iPredictiveCallBack.OnCompleteWithId	= gotPredictivePanel;
	iPredictiveCallBack.OnError				= callBackError;
	iPredictiveCallBack.progress			= false;
	iPredictiveCallBack.setFocus			= false;
	iPredictiveCallBack.id					= currentDivId;
	iPredictiveCallBack.DoCallBack(currentEventTarget, 'PREDICT|' + getElement(currentSearchBoxId).value);
	document.onkeydown = KeyDownHandler;
}

function gotPredictivePanel(divId,responseText, responseXML)
{
	currentDivId = divId;
	getElement('predictiveDiv' + divId).innerHTML = responseText;
	showElement('predictiveDiv' + divId);
	showElement('predictiveIframe' + divId);

	var firstItem = getElement('predictItem1');
	if (firstItem)
	{
		currentPredictiveItemSelected = 1;
		firstItem.className = 'vHover';
		document.onkeydown = predictiveKeyDownHandler;
	}
	else { currentPredictiveItemSelected=null; }
}

function ajaxCommandAndAutoPostback(divId,eventTarget, eventArgument)
{
	doAjaxWithIdWithoutFocus(cboPopupAutoPostback, false, eventTarget, eventArgument,divId);
	refreshCurrentTab();
}

function cboPopupAutoPostback(divId,responseText, responseXML)
{
	document.onkeydown = KeyDownHandler;
	var popupContainer = getElement('verifyContainer');
	popupContainer.innerHTML = '';
	iPredictiveDisableShade();
}

function ajaxPredictivePostback(divId,eventTarget, eventArgument)
{
	document.onkeydown = KeyDownHandler;
	var popupContainer = getElement('verifyContainer');
	popupContainer.innerHTML	= ''; 
	iPredictiveDisableShade();
	refreshCurrentTab();
}

function predictiveLostFocus(divId) { currentDivId = divId; setTimeout('removePredictions()', 800); }
function removePredictions() {
	var predictiveDiv = getElement('predictiveDiv' + currentDivId);
	var predictiveIframe = getElement('predictiveIframe' + currentDivId);
	if (predictiveDiv) getElement('predictiveDiv' + currentDivId).innerHTML = '';
	if (predictiveIframe) hideElement('predictiveIframe' + currentDivId);
	if (predictiveDiv) hideElement('predictiveDiv' + currentDivId);
}

function focusPredictivePopupField(id)
{
	var input = getElement(id + '_inputPopup');
	if (input) { input.className='highlight'; }
}

// validation function for the predictive control if it required
function iPredictiveControlRequired(s,e)
{
	var hiddenId = s.id.replace(/validator/g,"hasValue");
	var labelId = 'label' + s.id.replace(/_validator/g,"");
	var hidden = getElement(hiddenId);
	var label = getElement(labelId);
	
	if (hidden) {
		if (hidden.value == 'false')
		{
			e.IsValid = false;
			if (label) { label.className='error'; }
		}
		else
		{
			e.IsValid = true;
		}
	}
}

// does an ajax call without processing the response and then calls the parent control refresh function
function ajaxAndRefreshParent(parentId,eventTarget, eventArgument)
{
	pId = parentId;
	
	try
	{
		var el = getElement(eventTarget.replace(new RegExp('\\$', 'g'),"_") + '_input');
		if (el)
		{
			currentEventTarget = getElementFromTabIndex(el.tabIndex+3);
			currentEventTarget = eventTarget;	
			fieldToFocusId = currentEventTarget.id;		
		}

		currentEventTarget = eventTarget;
		doAjaxWithoutFocus(commandSentNowRefreshParent, false, eventTarget, eventArgument);
		document.onkeydown = KeyDownHandler;
		showCombos();
		hideElement('verifyContainer');
		iPredictiveDisableShade();
	}
	catch(err) { alert('JS Error in iPredictiveControl.js (ajaxAndRefreshParent) while calling refresh function [refresh' + parentId + '()]'); }
}

function commandSentNowRefreshParent(divId,responseText, responseXML)
{ 
	if (refreshFullTab) {
		refreshCurrentTab();
	}
	else 
	{
		try
		{
			eval('refresh' + pId + '()');
		}
		catch(Error) { alert("Error calling function [refresh" + pId + "] check it exists in the page"); }
	}
}

function blankResponse(divId,responseText, responseXML){}

// common functions for single and multi select predictive controls ********************************************************
function ip_refreshPopup(divId,eventTarget, eventArgument)
{
	doAjaxWithIdWithoutFocus(ip_refreshPopupComplete, true, eventTarget, eventArgument,divId);
	document.onkeydown = KeyDownHandler;
}

function ip_openSearch(divId,eventTarget, eventArgument)
{
	var popupContainer = getElement('verifyContainer');
	popupContainer.className = 'verifyPopCenter';
	doAjaxWithIdWithoutFocus(ip_openSearchComplete, true, eventTarget, eventArgument,divId);
	document.onkeydown = KeyDownHandler;
}

function ip_openSearchWithFilter(divId,eventTarget, eventArgument)
{
	var popupContainer = getElement('verifyContainer');
	popupContainer.className = 'verifyPopCenter';
	//popupContainer.className = 'verifyPopCenter withAdvSearch';
	doAjaxWithIdWithoutFocus(ip_openSearchComplete, true, eventTarget, eventArgument,divId);
	document.onkeydown = KeyDownHandler;
}

function ip_openSearchComplete(divId,responseText, responseXML)
{
	var popupContainer = getElement('verifyContainer');
	var mainContainer = getElement(divId + 'mainContainer');
	
	popupContainer.style.display='block';
	popupContainer.innerHTML = responseText;
	
	isShadeEnabledAlready=shadeEnabled;
	if (!isShadeEnabledAlready) { enableShade(); }
	
	hideCombos();
	document.onkeydown = predictivePopupKeyDownHandler;
	predictiveSearchOnLoad();
	setFocus(popupSearchBoxId);
}

function ip_refreshPopupComplete(divId,responseText, responseXML)
{
	getElement('verifyContainer').innerHTML = responseText;
	document.onkeydown = predictivePopupKeyDownHandler;
	predictiveSearchOnLoad();
	setFocus(popupSearchBoxId);
}

function ip_redrawMainInterfaceComplete(divId,responseText, responseXML)
{
	var mainContainer = getElement(divId + 'mainContainer');
	iPredictiveDisableShade();
	hideElement('verifyContainer');
	showCombos();
	mainContainer.innerHTML = responseText;
}

// functions for single select predictive control **************************************************************************
function ip_singleCloseSearch(divId,eventTarget, eventArgument)
{
	document.onkeydown = KeyDownHandler;
	
	iPredictiveDisableShade();
	hideElement('verifyContainer');
	showCombos();
	
	var el = getElement(eventTarget.replace(new RegExp('\\$', 'g'),"_") + '_input');
	fieldToFocusId = el.id;
	
	setCurrentFocus();
}

function ip_singleSelect(divId, eventTarget, eventArgument)
{
	var el = getElement(eventTarget.replace(new RegExp('\\$', 'g'),"_") + '_input');
	if (el)
	{
		currentEventTarget = getElementFromTabIndex(el.tabIndex+3);
		if (currentEventTarget == null) { currentEventTarget = eventTarget; }
		fieldToFocusId = currentEventTarget.id;
	}
		
	doAjaxWithId(ip_redrawMainInterfaceComplete, true, eventTarget, eventArgument,divId);
	document.onkeydown = KeyDownHandler;
}

function ip_singleDelete(divId, eventTarget, eventArgument)
{
	var el = getElement(eventTarget.replace(new RegExp('\\$', 'g'),"_") + '_input');
	fieldToFocusId = el.id;
	
	doAjaxWithId(ip_singleDeleteComplete, true, eventTarget, eventArgument,divId);
}

function ip_singleDeleteComplete(divId,responseText, responseXML)
{
	getElement(divId + 'mainContainer').innerHTML = responseText;
}

// functions for multi select predictive control *****************************************************************************
function ip_multiSelectFromDropDown(divId,eventTarget, eventArgument)
{
	var el = getElement(eventTarget.replace(new RegExp('\\$', 'g'),"_") + '_input');
	fieldToFocusId = el.id;
		
	doAjaxWithId(ip_redrawMainInterfaceComplete, true, eventTarget, eventArgument,divId);

	currentEventArgument = eventArgument;
	document.onkeydown = KeyDownHandler;
}

function ip_multiSelect(divId,eventTarget, eventArgument)
{
	doAjaxWithIdWithoutFocus(ip_multiSelectComplete, false, eventTarget, eventArgument,divId);
	rememberScrollPos('tableCon');
}

function ip_multiSelectComplete(divId,responseText, responseXML)
{
	getElement('verifyContainer').innerHTML = responseText;
	setRememberedScrollPos('tableCon');
	document.onkeydown = predictivePopupKeyDownHandler;
	predictiveSearchOnLoad();
	setFocus(popupSearchBoxId);
}

function ip_multiSave(divId,eventTarget, eventArgument)
{
	doAjaxWithIdWithoutFocus(ip_redrawMainInterfaceComplete, true, eventTarget, eventArgument,divId);

	var el = getElement(eventTarget.replace(new RegExp('\\$', 'g'),"_") + '_input');
	
	if (el) { requiredTabIndex = el.tabIndex+3; currentEventTarget = null; }
	else { currentEventTarget = eventTarget; }
	
	currentEventArgument = eventArgument;
	document.onkeydown = KeyDownHandler;
}
function rtrim(stringToTrim) {
    return stringToTrim.replace(/\s+$/, "");
}
// functions for table handling in the popup search grid
function predictiveSearchOnLoad() {
	var table = getElement('predictiveResultTable');
	var alternate = false;

	if (table && table.rows) {
		for (var i = 1; i < table.rows.length; i++) {
			var row = table.rows[i];

			if (row.className == "advSF") {
				popupRowOffset = 2;
			} else {
				if (row.name != 'sel') {
					if (alternate) {
						row.className = this.name;
						row.onmouseout = function() { removeAllSelectedStates(); this.className = this.name; this.id = ""; }
						row.onmouseover = function() { removeAllSelectedStates(); this.className = 'sel'; this.id = "sel"; }
					} else {
						row.className = 'gry ' + this.name;
						row.onmouseout = function() { removeAllSelectedStates(); this.className = 'gry ' + this.name; this.id = ""; }
						row.onmouseover = function() { removeAllSelectedStates(); this.className = 'gry sel'; this.id = "sel"; }
					}
					row.name = rtrim(row.className);
				}
				alternate = !alternate;
			}
		}
	}
}

function predictiveArrowUp(evt) {
    if (!evt) evt = window.event || window.Event;
	var table = getElement('predictiveResultTable');

	if (table && table.rows) {
		for (var i = popupRowOffset; i < table.rows.length; i++) {
			var row = table.rows[i];
			if (row.id == 'sel') {
				if (i > popupRowOffset) {
					if (row.id != 'selected') {
						row.id = '';
						row.className = row.name;
					}
					row = table.rows[i - 1];
					row.id = 'sel';
					row.className = row.name+' sel';	
					break;
				} else {
					removeAllSelectedStates();
					setFocus(popupSearchBoxId);
				}
			}
		}
		window.focus();
	}
}

function predictiveArrowDown(evt) {
    if (!evt) evt = window.event || window.Event;
	var table = getElement('predictiveResultTable');
	var found = false;

	if (table && table.rows) {
		for (var i = popupRowOffset; i < table.rows.length; i++) {
			var row = table.rows[i];
			if (row.id == 'sel') {
				found = true;
				if (i < table.rows.length - 1) {
					row.id = '';
					row.className = row.name;
					row = table.rows[i + 1];
					if (row.id != 'selected') {
						row.id = 'sel';
						row.className = row.name + ' sel';	
					}
					break;
				}
			}
		}
		if (!found) {
			removeAllSelectedStates();
			if (table.rows.length > popupRowOffset) {
				var row = table.rows[popupRowOffset];
				row.id = 'sel';
				row.className = row.name + ' sel';
			}
		}
		window.focus();
	}
}

function removeAllSelectedStates() {
	var table = getElement('predictiveResultTable');
	
	if (table && table.rows) {
		for (var i = popupRowOffset; i < table.rows.length; i++) {
			var row = table.rows[i];
			if (row.id != 'selected') {
				row.id = '';
				row.className = row.name;
			}
		}
	}
}

function predictivePopupKeyDownHandler(evt) {
	if (!evt) evt = window.event || window.Event;
	var keyCode = getKeyPressedCode(evt);

	if (keyCode == UP_ARROW_KEY) { predictiveArrowUp(evt); }
	else if (keyCode == DOWN_ARROW_KEY) { predictiveArrowDown(evt); }
	else if (keyCode == CTRL_KEY) { popupCtrl = true; }
	else if (keyCode == ESCAPE_KEY) { ip_singleCloseSearch(currentEventTarget, currentEventTarget, null); }
	else if (keyCode == ENTER_KEY) {
	
		var table = getElement('predictiveResultTable');
		
		if (table && table.rows) {
			for (var i = popupRowOffset; i < table.rows.length; i++) {			
				var row = table.rows[i];
				if(row.id == 'sel') {
					if (!row.click) {
						row.onclick();
					} else {
						row.click();
					}
				}
			}
		}
	} else {
		if (popupCtrl && keyCode == S_KEY) {
			// ctrl + S has been pressed 
			try {
				if (!getElement('saveLink').click) {
					getElement('saveLink').onclick();
				} else {
					getElement('saveLink').click();
				}
			}
			catch(exc) {}
		} else {
			//getElement(popupSearchBoxId).focus();
		}
	}
}
