/*!
**********************************************************************
@file WizardAccessibility1.js

Copyright 2003-2006 Adobe Systems Incorporated.                     
All Rights Reserved.                                                
                                                                    
NOTICE: All information contained herein is the property of Adobe   
Systems Incorporated.                                                                                                                    

***********************************************************************
*/
/**
Button widget
*/
var ePageRef = document.getElementById("container");
var eFullArray;

/*ON THEIR OWN, THEY MEAN SOMETHING*/

var eTAB = 9;//SWITCH FOCUS ONLY
var eSPACE = 32;//SELECT CURRENTLY FOCUSED ELEMENT
var eESCAPE = 27;//MAPPED TO AN ELEMENT OF CURRENT PAGE
var eENTER = 13;//MAPPED TO AN ELEMENT OF CURRENT PAGE

/*ON THEIR OWN, THEY MEAN SOMETHING*/
var eLEFTARROW = 37;//MOVE FOCUS TO PREVIOUS SIMILAR ELEMENT
var eUPARROW = 38;//MOVE FOCUS TO NEXT SIMILAR ELEMENT
var eRIGHTARROW = 39;//MOVE FOCUS TO NEXT SIMILAR ELEMENT
var eDOWNARROW = 40;//MOVE FOCUS TO PREVIOUS SIMILAR ELEMENT

/*ONLY WITH ALT KEY, ALPHABETS MEAN SOMETHING*/
var eALT = 18;

/*THE RANGE OF ALPHABETS MEAN SOMETHING*/
var eA = 65;
var eZ = 90;
var ea = 97;
var ez = 122;

/*INDEX OF CURRENTLY FOCUSED ELEMENT IN OVERALL ARRAY*/
var eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL = 0;
var eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL = eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;

/*INDEX OF CURRENTLY SELECTED ELEMENT IN OVERALL ARRAY*/
var eCURRENT_SELECTED_INDEX_COUNTER_GLOBAL = 0;

function ClearTable()
{
	eFullArray = null;
}

//AddTable
//tableAR should be of the following format
//tableAR = [
//				{element:thisPage.getElementById("uvwxyz"),accesskey:'u',type:'Normal'},
//				{element:thisPage.wizardElement.GetDisplayElement(),accesskey:'v',type:'WizardLower1'}
//			];
//To Be Called Once Per Page

function AddTable(tableAR)
{
	try
	{
		if(!eFullArray)
			eFullArray=new Array();
		for(var i=0;i<tableAR.length;i++)
		{
			eFullArray.push(tableAR[i]);
		}
		if(eFullArray.length>0)
		{
			FocusElementAt(0);
		}
		/*SPECIAL ACCESSIBILITY ID REQUIRED FOR PROPER NAVIGATION DETECTION*/
		for(var i=0;i<eFullArray.length;i++)
		{
			eFullArray[i].element.accessibility_id_global=i;
		}
		/*TRADITIONAL WAY
		for(var i=0;i<eFullArray.length;i++)
		{
			eFullArray[i].element.accessKey=eFullArray[i].accesskey;
			eFullArray[i].element.tabIndex=i;
			eFullArray[i].element.tabOrder=i;
		}*/
	}
	catch(ex)
	{
	}
}

function AddElementToTable(elementAR)
{
	if(!eFullArray)
		eFullArray=new Array();
	eFullArray.push(elementAR);
}

function EventAllowable(eltype,key,control,alt,shift,meta)
{
	if(eltype=="InputField" && (key==eLEFTARROW || key==eUPARROW || key==eRIGHTARROW || key==eDOWNARROW))
		return false;
	else
		return true;
}

function EventAllowableReturnValue(eltype,key,control,alt,shift,meta)
{
	if(eltype=="IFrame" && key==eTAB)
		return false;
	else
		return true;
}

ePageRef.onkeydown = function()
{
	//debugger;//1
	//alert("pagereal handling");
	event.cancelBubble=true;
	try
	{
		var ekeycode = event.keyCode;
		var econtrolkey = event.ctrlKey;
		var ealtkey = event.altKey;
		var eshiftkey = event.shiftKey;
		var emetakey = event.metaKey;
		
		if(eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].element.onkeydownfunc)
		{
			eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].element.onkeydownfunc(event);
		}
		if(EventAllowableReturnValue(eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].type,ekeycode,econtrolkey,ealtkey,eshiftkey,emetakey)==false)
		{
			//nothing to be done by pageref and return false
			return false;
		}
		if(EventAllowable(eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].type,ekeycode,econtrolkey,ealtkey,eshiftkey,emetakey)==false)
		{
			//nothing to be done by pageref and by default return true
		}
		else
		{
			if(ekeycode==eTAB)
			{
				if(eshiftkey)
				{
					FocusPreviousElement();
				}
				else
				{
					FocusNextElement();
				}
			}
			else if(ekeycode==eSPACE)
			{
				ClickElement(eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].element);
			}
			else if(ekeycode==eENTER)
			{
				var currentPage = gWizardControl.GetCurrentPage();
				ClickElement(currentPage.getDefaultElementForEnterKey());
			}
			else if(ekeycode==eESCAPE)
			{
				var currentPage = gWizardControl.GetCurrentPage();
				ClickElement(currentPage.getDefaultElementForEscapeKey());
			}
			else if(ekeycode==eLEFTARROW || ekeycode==eUPARROW)
			{
				var tempor = GetIndexOfPreviousSimilarElement();
				tempor%=(eFullArray.length);
				if(tempor == eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL)
				{
				}
				else
				{
					eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL=eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
					eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL=tempor;
					FocusElementAt(eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL);
				}
			}
			else if(ekeycode==eRIGHTARROW || ekeycode==eDOWNARROW)
			{
				var tempor = GetIndexOfNextSimilarElement();
				tempor%=(eFullArray.length);
				if(tempor == eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL)
				{
				}
				else
				{
					eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL=eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
					eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL=tempor;
					FocusElementAt(eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL);
				}
			}
			else
			{
				if(ealtkey && (((ekeycode >= eA) && (ekeycode <= eZ)) || ((ekeycode >= ea) && (ekeycode <= ez))))
				{
					for(var i=0;i<eFullArray.length;i++)
					{
						if(eFullArray[i].accesskey.charCodeAt()==ekeycode)
						{
							FocusElementAt(i);
							ClickElement(eFullArray[i].element);
							break;
						}
					}
				}
				else
				{
					//alert("pagerez cant decide what to move now! elementrez would have been called before this and if it could handle, its already done!");
					/*try
					{
						eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].element.fireEvent("onkeydown");
					}
					catch(ex)
					{
					}*/
				}
			}
		}
	}
	catch(ex)
	{
	}
}

function FocusElementAt(i)
{
	try
	{
		if((0 <= eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL) && (eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL < eFullArray.length))
		{
			RemoveFocusForElementAt(eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL);
		}
		RemoveFocusForEverything();
		eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL = eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
		eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL = i;
		var ce = eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].element;
		if(ce.style)
		{
		}
		else
		{
			ce.style={};
		}
		ce.style.border ="1px dotted #999999";
		ce.focus();
		ce.select();
	}
	catch(ex)
	{
	}
}

function FocusNextElement()
{
	RemoveFocusForElementAt(eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL);
	eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL=eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
	eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL++;
	eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL%=(eFullArray.length);
	FocusElementAt(eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL);
}

function FocusPreviousElement()
{
	RemoveFocusForElementAt(eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL);
	eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL=eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
	eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL--;
	eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL%=(eFullArray.length);
	FocusElementAt(eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL);
}

function GetIndexOfPreviousSimilarElement()
{
	try
	{
		var etype = eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].type;
		for(var i=eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL-1;i>=0;i--)
		{
			i%=(eFullArray.length);
			if(eFullArray[i].type==etype)
			{
				return i;
			}
		}
		for(var i=(eFullArray.length)-1;i>=(eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL+1);i--)
		{
			i%=(eFullArray.length);
			if(eFullArray[i].type==etype)
			{
				return i;
			}
		}
		return eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
	}
	catch(ex)
	{
	}
}

function GetIndexOfNextSimilarElement()
{
	try
	{
		var etype = eFullArray[eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL].type;
		for(var i=eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL+1;i<eFullArray.length;i++)
		{
			i%=(eFullArray.length);
			if(eFullArray[i].type==etype)
			{
				return i;
			}
		}
		for(var i=0;i<eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;i++)
		{
			i%=(eFullArray.length);
			if(eFullArray[i].type==etype)
			{
				return i;
			}
		}
		return eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
	}
	catch(ex)
	{
	}
}

function FocusElement(e)
{
	try
	{
		if(e.accessibility_id_global == null)
		{
			alert("accessibility_id_global has not been defined for element e :: "+e.innerHTML+" :: things can go for a toss now, this implies, you have to add e via AddTable!");
		}
		if(e/* && e.onclick*/)
		{
			RemoveFocusForElementAt(eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL);
			eEARLIER_FOCUSED_INDEX_COUNTER_GLOBAL=eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL;
			eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL=e.accessibility_id_global;
			FocusElementAt(eCURRENT_FOCUSED_INDEX_COUNTER_GLOBAL);
		}
	}
	catch(ex)
	{
	}
}

function ClickElement(e)
{
	try
	{
		if(e/* && e.onclick*/)
		{
			FocusElement(e);
			//e.onclick();
			e.fireEvent("onclick");
		}
	}
	catch(ex)
	{
	}
}

function RemoveFocusForElementAt(i)
{
	var ce = eFullArray[i].element;
	if(ce.style)
	{
	}
	else
	{
		ce.style={};
	}
	if(document.selection)
	{
		document.selection.empty();
	}
	ce.style.border ="none";
	ce.blur();
}

function RemoveFocusForEverything()
{
	for(var i=0;i<eFullArray.length;i++)
	{
		RemoveFocusForElementAt(i);
	}
}
