﻿function AnchorFocus(anchor, event)
{
  var itemElement = anchor.parentNode.parentNode;
  var groupElement = anchor.parentNode.parentNode.parentNode.parentNode.parentNode;
  ComponentArt_Menu_Support.ComponentArt_Menu_GroupMouseOver(groupElement, event);
  ComponentArt_Menu_Support.ComponentArt_Menu_ItemMouseOver(itemElement, event);
}
function AnchorBlur(anchor, event)
{
  var itemElement = anchor.parentNode.parentNode;
  var groupElement = anchor.parentNode.parentNode.parentNode.parentNode.parentNode;
  ComponentArt_Menu_Support.ComponentArt_Menu_ItemMouseOut(itemElement, event);
  ComponentArt_Menu_Support.ComponentArt_Menu_GroupMouseOut(groupElement, event);
}

function AnchorKeyDown(anchor, event, menu, itemStorageIndex)
{
  var item = menu.GetItemByStorageIndex(itemStorageIndex);
  var parentItem = item.get_parentItem();
  var groupOrientation = parentItem ? parentItem.SubGroupOrientation : menu.Orientation;
  var groupIsHorizontal = groupOrientation === 1;
  
  var newFocusItemIndex = null;
  
  if ((event.keyCode === 39 /* right arrow */ && groupIsHorizontal) ||
      (event.keyCode === 40 /* down arrow */ && !groupIsHorizontal))
  {
    // Move to next item in group
    newFocusItemIndex = GetNextSiblingIndex(item, parentItem, menu);
  }
  else if ((event.keyCode === 37 /* left arrow */ && groupIsHorizontal) ||
           (event.keyCode === 38 /* up arrow */  && !groupIsHorizontal))
  {
    // Move to previous item in group
    newFocusItemIndex = GetPrevSiblingIndex(item, parentItem, menu);          
  }
  else if ((event.keyCode === 40 /* down arrow */ && groupIsHorizontal) ||
           (event.keyCode === 39 /* right arrow */ && !groupIsHorizontal))
  {
    // Move to first child item
    newFocusItemIndex = GetFirstChildIndex(item);                    
  }
  else if ((event.keyCode === 38 /* up arrow */ && groupIsHorizontal) ||
           (event.keyCode === 37 /* left arrow */ && !groupIsHorizontal))
  {
    // Move to parent item
    newFocusItemIndex = GetParentIndex(item);
  }
  
  if (newFocusItemIndex !== null)
  {
    document.getElementById(menu.ClientControlId + '_' + newFocusItemIndex + '_anchor').focus();
  }
  
  return true;
}

function GetParentIndex(item)
{
  return (item.ParentIndex >= 0) ? item.ParentIndex : null;
}  
function GetFirstChildIndex(item)
{
  return (item.ChildIndexes && item.ChildIndexes.length > 0) ? item.ChildIndexes[0] : null;
}
function GetNextSiblingIndex(item, parentItem, menu)
{
  var siblingIndexes = parentItem ? parentItem.ChildIndexes : menu.GetRootItemIndexes();
  var itemPosition = FindValueInArray(item.StorageIndex, siblingIndexes);
  var nextSiblingPosition = (itemPosition + 1) % siblingIndexes.length;
  return siblingIndexes[nextSiblingPosition];
}
function GetPrevSiblingIndex(item, parentItem, menu)
{
  var siblingIndexes = parentItem ? parentItem.ChildIndexes : menu.GetRootItemIndexes();
  var itemPosition = FindValueInArray(item.StorageIndex, siblingIndexes);
  var prevSiblingPosition = (itemPosition + siblingIndexes.length - 1) % siblingIndexes.length;
  return siblingIndexes[prevSiblingPosition];
}
function FindValueInArray(value, array)
{
  for (var index = 0; index < array.length; index++)
  {
    if (array[index] === value)
    {
      return index;
    }
  }
  return null;
}