/*
 * ============================================================================
 *                   The ProQuality Inc.
 *         Rapid Efficent Low cost And Xtreme (RELAX)
 *	           Advanced Solutions Framework (ASF)
 *                  Cristian Teodorescu
 *                      Version 6.0
 * ============================================================================
 * 
 *    Copyright (C) 1999 The ProQuality Inc. Foundation. All rights reserved.
 * 
 * The use of this software in any form is strictly prohibited unless you have 
 * purchased a licence from ProQuality Inc. or you have a software agreement with 
 * ProQuality Inc.
 * 
 * Redistributions of source code must retain copyright statements
 * and notices. Redistributions must also contain a copy of this
 * document.
 *
  THIS SOFTWARE IS PROVIDED BY PROQUALITY AND CONTRIBUTORS ``AS IS'' AND
  ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PROQUALITY OR ITS
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGE.
    
 *
 */
var FocusHandler = {
	registerArray	: 	new Array(),
	focusArray		:	new Array(),
	btnIdArray		:   new Array(),
	btnOrderArray	:	new Array(),
	manualFocusSet	:	false,
	pageReloaded	:	false,
	overrideReturn	:	false,
	lockElement		:	false,
	register		: 	function (formName, focusElem) 
						{
							FocusHandler.registerArray[FocusHandler.registerArray.length]= formName;
							if(focusElem)
							{
								FocusHandler.focusArray[formName] = focusElem;
								FocusHandler.pageReloaded = true;
							}
						},
	lockFocus		:	function()
						{
							FocusHandler.lockElement = true;
						}
}

// Use setFocus method for manually setting focus in the JSP.
// will accept either the actual element or the name of the element.
function setFocus(elem, overrideReturn)
{
	var el = getReferencedElement(elem); //function in toggler.js
	if(el)
	{
		if(ComboBoxHandler.all[el.name]) // for combo box focus
		{
			el = ComboBoxHandler.all[el.name].txtview;
		}
		var form = el.form;
		if(form)
		{
			var index = findElementIndex(form, el);
			findAndSetFocus(form, index, 1);
			FocusHandler.manualFocusSet = true;
			FocusHandler.overrideReturn = overrideReturn ? true : false;
			return true;
		}
	}
	return false;
}

function focusInit ()
{
	for(var i = 0; i < document.forms.length; i++)
	{
		for(var j = 0; j < document.forms[i].elements.length; j++)
		{
			addEvent(document.forms[i].elements[j], "focus", setFocusElement);
		}
	}
	
	if(FocusHandler.overrideReturn || (FocusHandler.manualFocusSet && !FocusHandler.pageReloaded))
	{
		return;
	}
	
	if(FocusHandler.registerArray[0])
	{
		var form = obtainForm(FocusHandler.registerArray[0]) // function in asf.js
		if(form.elements.length > 0)

		{
			var index = 0;
			if(FocusHandler.focusArray[form.name])
			{
				index = findElementIndex(form, FocusHandler.focusArray[form.name]) + 1;
				if(index >= form.elements.length)
				{
					index = 0;
				}
			}
			findAndSetFocus(form, index, 1);
		}
	}
	
	window.scroll(0, 0);
}

function findAndSetFocus(form, startIndex, dir)
{
	var focusElement = findFocusElement(form, startIndex, dir);
	if(focusElement)
	{   
		focusElement.focus();
	}
}

function findFocusElement(form, startIndex, dir)
{
	var counter = 0;
	var numElems = form.elements.length;

	for(var i = startIndex; counter < numElems; )
	{
		var obj = form.elements[i];
		var id = obj.id;
		if(obj.type != "hidden" && !obj.disabled && obj.offsetWidth > 0 && obj.offsetHeight > 0 && id.indexOf("_hidden") == -1)
		{
			if(obj.type == "button")
			{
				if(id.indexOf("_NavBtn") == -1)
				{
					FocusHandler.btnIdArray[id] = obj;
					FocusHandler.btnOrderArray[FocusHandler.btnOrderArray.length] = obj;
				}
			}
			else
			{
				return obj;
			}
		}
		counter++;
		i += dir;
		if(i > form.elements.length - 1)
		{
			i = 0;
		}
		else if(i < 0)
		{
			i = form.elements.length - 1;
		}
	}
	
	if(FocusHandler.btnIdArray['cont'])
	{
		return FocusHandler.btnIdArray['cont'];
	}
	else if(FocusHandler.btnIdArray['add'])
	{
		return FocusHandler.btnIdArray['add'];
	}
	else if(FocusHandler.btnIdArray['ok'])
	{
		return FocusHandler.btnIdArray['ok'];
	}
	else
	{
		if(dir > 0)
		{
			return FocusHandler.btnOrderArray[0];
		}
		else
		{
			return FocusHandler.btnOrderArray[FocusHandler.btnOrderArray.length - 1];
		}
	}
}

function focusElementForMenuEsc()
{
	var form = obtainForm() // function in asf.js
	if(form.elements.length > 0)
	{
		return findFocusElement(form, 0, 1, true);
	}
}
  
function setFocusFromBtm(formName)
{
	var form = obtainForm(formName); // function in asf.js
	if( form.elements.length > 0 )
	{
		findAndSetFocus(form, form.elements.length - 1, -1);
	}
}
  
function setFocusFromTop(formName)
{
	var form = obtainForm(formName) // function in asf.js
	if(form.elements.length > 0)
	{
		findAndSetFocus(form, 0, 1);
	}
}

  
function setFocusNav()
{
	if( document.getElementById( "subNavigationTab" ) )
	{
	    var ELEMENT = 1;
	    
	    var subNav = document.getElementById( "subNavigation" );
	    var subNavFirstItem;
	    for ( var i = 0; i < subNav.childNodes.length; ++i ) {
	      if ( subNav.childNodes[i].nodeType != ELEMENT ) { // First element node is index zero in IE, index one in Nav.
	        continue;
	      } else {
	        subNavFirstItem = subNav.childNodes[i];
	        break;
	      }
	    }
		subNavFirstItem.focus();
	}
}  


/*
function setFocusMenu()
{   
    var udm = document.getElementById( "udm" );
    dbg( "udm.nodeType: " + udm.nodeType );
	if( udm ) 
	{
		udm.focus();
	}
}
*/
  
function findElementIndex(form, elem)
{
	var startIndex = 0;
	var el = getReferencedElement(elem); //function in toggler.js
	for(var i = 0; i < form.elements.length; i++)
	{
		if(form.elements[i] == el)
		{
			startIndex = i;
			break;
		}
	}
	return startIndex;
}

setFocusElement = function(evt)
{
	if(FocusHandler.lockElement)
	{
		return;
	}
	
	evt = (evt) ? evt : ((event) ? event : null);

	if (evt)
	{
		var el = getTargetElement(evt);
		if(el)
		{
			var form = el.form;
			if(form)
			{
				form.focusElement.value = el.name;
			}
		}
	}
}

function setFocusByBrowser(ieTarget, nnTarget) {
// set focus to a different element depending on user's browser type
	if ( navigator.appVersion.toLowerCase().indexOf('msie') >= 0 ) {
		document.getElementById(nnTarget).focus();
	}
	else {
		document.getElementById(ieTarget).focus();
	}
}


