1874 lines
		
	
	
		
			81 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			1874 lines
		
	
	
		
			81 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <html>
 | |
| <head>
 | |
| <title>ARIA Spreadsheet and Menubar</title>
 | |
| <script type="text/javascript">
 | |
| <!--
 | |
| /* PLEASE NOTE THAT THIS IS PROTOTYPE CODE!  It was created as a proof of concept and is not a well designed or robust implementation!  It is not meant to be a best practice example - please use accordinging!  You have been warned.
 | |
| */
 | |
| // functions for changing style rules
 | |
| 
 | |
| function changeStyleRule(oRule, styleName, styleValue) {
 | |
|   if (oRule.style && oRule.style.setProperty) {
 | |
|       oRule.style.setProperty(styleName, styleValue,"");
 | |
|       //alert(oRule.style.getPropertyValue(styleName));
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| // You must specify a "title" attribute in <style> tag or <link> tag for Mozilla.
 | |
| function pageGetStyleSheet(sID,doc) {
 | |
|   if(!doc)doc=document;
 | |
|   if(!sID)
 | |
|     return doc.styleSheets[0];
 | |
| 
 | |
|   if (doc.all) {
 | |
|     return doc.styleSheets[sID];
 | |
|   } else {
 | |
|     for (var i = 0; i < doc.styleSheets.length; i++) {
 | |
|       var oSS = doc.styleSheets[i];
 | |
|       if (oSS.title == sID) return oSS;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function cssGetRules(oSS){
 | |
|   return (document.all ? oSS.rules : oSS.cssRules);
 | |
| }
 | |
| 
 | |
| 
 | |
| // SIMPLE function to find a particular rule selector
 | |
| function cssGetRule(rulesList, ruleIdent) {
 | |
|   var foundRule = null;
 | |
|   for (var i=0; i < rulesList.length; i++ ) {
 | |
|     var sText = rulesList[i].selectorText;
 | |
|     if (sText != "undefined" && sText != null) {
 | |
|       if (sText.indexOf(ruleIdent) > -1 ) {
 | |
|         foundRule = rulesList[i];
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return foundRule;
 | |
| }
 | |
| 
 | |
| var TOP_SUFFIX = "top";  // the top menu item has an id that is menuID + TOP_SUFFIX
 | |
| var DROP_SUFFIX = "Items"; // the drop menu div has an id that is the menuID + DROP_SUFFIX
 | |
| var SUB_SUFFIX = "sub" // items that have sub menus have "sub" in the id
 | |
| var KEY_UP = 38;
 | |
| var KEY_DOWN = 40;
 | |
| var KEY_LEFT = 37;
 | |
| var KEY_RIGHT = 39;
 | |
| var KEY_ESCAPE = 27;
 | |
| var KEY_M=77;
 | |
| var KEY=F10 = 121;
 | |
| var KEY_SPACE = 32;
 | |
| var KEY_TAB = 9;
 | |
| 
 | |
| 
 | |
| var TEXT_NODE = 3;
 | |
| 
 | |
| Menubar = function(menubarId) {
 | |
|   this.activeIdx = -1;  // index of the active menu
 | |
|   this.dropOpen = false;  // indicates if menu is open (items are visible)
 | |
|   this.itemIdx = -1;  // indicates the index of the active item in an open menu
 | |
|   this.id = menubarId;
 | |
|   this.menus = new Array(); // array of menu Ids
 | |
|   this.menuItems = new Array(); // array of menu items - indexed by menu id
 | |
|   this.subMenus = new Array(); // array of sub menu items - indexed by parend menu id
 | |
|   this.activeSubId = null; // string with id of open sub menu; null if no sub menu open
 | |
|   this.activeSubIndex = -1; // index of active item in sub menu; -1 if no sub menu open
 | |
| 
 | |
| }
 | |
| 
 | |
| /* getters and setters for MenuState object
 | |
| */
 | |
| 
 | |
| Menubar.prototype.setActiveMenuIndex = function(index) {
 | |
|    this.activeIdx = index;
 | |
| }
 | |
| Menubar.prototype.getActiveMenuIndex = function() {
 | |
|   return this.activeIdx;
 | |
| }
 | |
| Menubar.prototype.setActiveOpen = function(isOpen) {
 | |
|   this.dropOpen = isOpen;
 | |
| }
 | |
| Menubar.prototype.isActiveOpen= function() {
 | |
|   return this.dropOpen;
 | |
| }
 | |
| Menubar.prototype.setActiveItemIndex = function(index) {
 | |
|   this.itemIdx = index;
 | |
| }
 | |
| Menubar.prototype.getActiveItemIndex = function() {
 | |
|   return this.itemIdx;
 | |
| }
 | |
| Menubar.prototype.updateAllIndex= function(active, drop, item) {
 | |
|   this.activeIdx = active;
 | |
|   this.dropOpen = drop;
 | |
|   this.itemIdx = item;
 | |
| }
 | |
| Menubar.prototype.getId = function() {
 | |
|   return this.id;
 | |
| }
 | |
| Menubar.prototype.getMenus = function() {
 | |
|   return this.menus; // return array of menu item ids
 | |
| }
 | |
| Menubar.prototype.getMenuItems = function(menuId) {
 | |
|   return this.menuItems[menuId];
 | |
| }
 | |
| /*  Function to add a menu to the menu bar
 | |
|  ** Must be called in menu order!!
 | |
|  ** menuId - id of this menu item
 | |
|  ** items - array of ids for the menu items in this menu
 | |
|  ** returns number of menu items (lenght of menu array)
 | |
|  */
 | |
| Menubar.prototype.addMenu = function(menuId,items) {
 | |
|   this.menus[this.menus.length] = menuId;
 | |
|   this.menuItems[menuId] = items;
 | |
| 
 | |
| }
 | |
| Menubar.prototype.addSubMenu = function(menuId, items) {
 | |
|   this.subMenus[menuId] = items;
 | |
| 
 | |
| }
 | |
| Menubar.prototype.getSubMenuItems = function(itemId) {
 | |
| 
 | |
|   return this.subMenus[itemId];
 | |
| }
 | |
| Menubar.prototype.setActiveSubOpen = function(menuId) {
 | |
|   this.activeSubId = menuId;
 | |
| }
 | |
| Menubar.prototype.getActiveSubOpen = function() {
 | |
|   return this.activeSubId;
 | |
| }
 | |
| Menubar.prototype.setActiveSubIndex= function(index) {
 | |
|   this.activeSubIndex = index;
 | |
| }
 | |
| Menubar.prototype.getActiveSubIndex = function() {
 | |
|   return this.activeSubIndex;
 | |
| }
 | |
| Menubar.prototype.hasSubMenu = function(itemObj) {
 | |
|   var bHasSub = false;
 | |
|   var itemId = itemObj.getAttribute("id");
 | |
|   // see if id contains "sub"
 | |
|   if (itemId.indexOf(SUB_SUFFIX) >  -1) {
 | |
|     bHasSub = true;
 | |
|   }
 | |
|   return bHasSub;
 | |
| }
 | |
| 
 | |
| Menubar.prototype.doMenu = function(event) {
 | |
|   //alert(event.ctrlKey + " : " + event.shiftKey + " : " + event.keyCode);
 | |
|   if (event.ctrlKey && event.altKey && event.keyCode == KEY_M) {
 | |
|     gFocusBeforeMenus = event.target;
 | |
|   //var theMenu = document.getElementById(this.getId());
 | |
|     // set focus to first menu (as long as menus are defined)
 | |
|     if (this.menus.length > 0) {
 | |
| 
 | |
|       if (this.isActiveOpen() ) {
 | |
|         // close any open active items if press menu start key again
 | |
|         var activeIndex = this.getActiveMenuIndex();
 | |
|         var menu = document.getElementById((this.getMenus()[activeIndex] + DROP_SUFFIX));
 | |
|         menu.style.display="none";
 | |
|         this.updateAllIndex(-1,false,-1);
 | |
| 
 | |
|       }
 | |
|     // set focus to the first menu
 | |
|     this.setActiveMenuIndex(0);
 | |
|     gFocusItem = document.getElementById((this.menus[0] + TOP_SUFFIX));
 | |
|     setTimeout("doFocus();",0);
 | |
|     } // end of if menus > 0
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| Menubar.prototype.doNavigation = function(event) {
 | |
|   var bEventContinue = true;  // browser can still use event
 | |
|   var key = event.keyCode;
 | |
|   if ((key >=KEY_LEFT && key <= KEY_DOWN) || key == KEY_ESCAPE) {
 | |
|     var idx = this.getActiveMenuIndex();
 | |
|     if (idx < 0) {
 | |
|       idx = 0;
 | |
|     }
 | |
|     // if subIndex > -1 a submenu is open - up and down movement will occur in it
 | |
|     var subIndex = this.getActiveSubIndex();
 | |
|     var subMenuId = this.getActiveSubOpen();
 | |
|     var menus = this.getMenus();
 | |
|     var menuLen = menus.length;
 | |
|     var activeMenuId = menus[idx];
 | |
|     //var activeMenu = document.getElementById(activeMenuId);
 | |
|     var curDrop = document.getElementById(activeMenuId + DROP_SUFFIX);
 | |
| 
 | |
| 
 | |
|     if (key == KEY_LEFT || key == KEY_RIGHT) {
 | |
| 
 | |
|       var nextIdx = idx;
 | |
|       if (key == KEY_LEFT) { // left
 | |
|         nextIdx = (idx + (menuLen-1)) % menuLen;
 | |
| 
 | |
|       }
 | |
|       else { // right
 | |
|         nextIdx = ((idx + 1) % menuLen);
 | |
|       }
 | |
|       // if drop menu is displayed, close it and open the next one or move into submenu
 | |
|       var bShowNext = this.isActiveOpen();
 | |
|       if (bShowNext) {
 | |
|         // current drop is open, see if it has submenu
 | |
|         if (curDrop) {
 | |
|           if (subMenuId != null) {
 | |
|             // sub menu is open - close it
 | |
|             this.hideSubMenu();
 | |
|             if (key == KEY_LEFT) {
 | |
|               // find parentItem and set focus to it
 | |
|               gFocusItem = document.getElementById(subMenuId);
 | |
|               setTimeout("doFocus();",0);
 | |
|               return false;
 | |
|             }
 | |
|             // if right just close and move to next top level menu (which happens below)
 | |
|           } // end of submenu open
 | |
|           if (key == KEY_RIGHT && subMenuId == null) {
 | |
|             // if right arrow and sub menu is not open- get current item in the drop down and see if it has a sub menu
 | |
|             var itemIdx = this.getActiveItemIndex();
 | |
|             var menuItems = this.getMenuItems(activeMenuId);
 | |
|             var curItemInDrop= document.getElementById(menuItems[itemIdx]);
 | |
|             var bHasSubMenu = this.hasSubMenu(curItemInDrop);
 | |
|             //alert(bHasSubMenu + " " + curItemInDrop.getAttribute("id"));
 | |
|             if (bHasSubMenu == true) {
 | |
|                return this.showSubMenu(event,curItemInDrop.getAttribute("id"));
 | |
| 
 | |
|             }
 | |
|           }
 | |
|           // if haven't returned yet - then close the current drop
 | |
|           curDrop.style.display = "none"; // only one menudrop child per menu
 | |
|           this.setActiveItemIndex(0);
 | |
| 
 | |
|         }
 | |
| 
 | |
|       }
 | |
|       this.setActiveMenuIndex(nextIdx);
 | |
|       var nextMenuId = menus[nextIdx];
 | |
|       gFocusItem=document.getElementById(nextMenuId + TOP_SUFFIX);
 | |
|       if (bShowNext == true) {
 | |
|         var drop = document.getElementById(nextMenuId + DROP_SUFFIX);
 | |
|         if (drop) {
 | |
|           drop.style.display="block";
 | |
|           var menuItems = this.getMenuItems(nextMenuId);
 | |
|           gFocusItem=document.getElementById(menuItems[0]);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       setTimeout("doFocus();",0);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     if (key == KEY_UP || key == KEY_DOWN ) {
 | |
|       var itemIdx = this.getActiveItemIndex();
 | |
|       var bOpen = this.isActiveOpen();
 | |
| 
 | |
|       if (curDrop) {
 | |
|         // first see if sub menu is open
 | |
|         if (subMenuId != null) {
 | |
|           // submenu is open - move within it
 | |
|           var subMenus = this.getSubMenuItems(subMenuId);
 | |
|           var subLen = subMenus.length;
 | |
|           var nextSubIndex =subIndex;
 | |
|           if (key == KEY_DOWN) {
 | |
|             nextSubIndex = (subIndex +1) % subLen;
 | |
|           }
 | |
|           else if (key == KEY_UP) {
 | |
|             nextSubIndex = (subIndex + (subLen - 1)) % subLen;
 | |
|           }
 | |
|           gFocusItem = document.getElementById(subMenus[nextSubIndex]);
 | |
|           this.setActiveSubIndex(nextSubIndex);
 | |
|           setTimeout("doFocus();",0);
 | |
|           return false;
 | |
| 
 | |
|         } // end of if sub menus - back to regular processing
 | |
| 
 | |
|         var menuItems = this.getMenuItems(activeMenuId);
 | |
|         var itemLen = menuItems.length;
 | |
|         var nextItemIdx;
 | |
|         if (!bOpen) { // open and set to the first item
 | |
|           this.showMenu(event, activeMenuId, true);
 | |
|           itemIdx = -1;
 | |
|         }
 | |
|         if (itemIdx == -1) {
 | |
|           nextItemIdx = 0;
 | |
|         }
 | |
|         else if (key == KEY_DOWN ){
 | |
|           nextItemIdx = (itemIdx +1) % itemLen;
 | |
|         }
 | |
|         else { //UP
 | |
|           nextItemIdx = (itemIdx + (itemLen-1)) % itemLen;
 | |
|         }
 | |
| 
 | |
|         this.setActiveItemIndex(nextItemIdx);
 | |
|         gFocusItem=document.getElementById(menuItems[nextItemIdx]);
 | |
|         setTimeout("doFocus();",0);
 | |
|       } // end of id curDrop
 | |
|     } // end of id up/down
 | |
|   // need to prevent propagation of arrow keys
 | |
|   /*  try {
 | |
|       ev.preventDefault();
 | |
|     }
 | |
|     catch (err) {
 | |
|       try {
 | |
|         ev.returnValue=false;
 | |
|       }
 | |
|       catch (errNext) {
 | |
|         ;
 | |
|       }
 | |
|   }*/
 | |
|   bEventContinue = false;
 | |
| 
 | |
|   if (key == KEY_ESCAPE ) {
 | |
|       this.closeMenu(event);
 | |
|       bEventContinue = false;
 | |
|       if (gFocusBeforeMenus) {
 | |
|         gFocusItem  = gFocusBeforeMenus;
 | |
|         setTimeout("doFocus();",0);
 | |
|       }
 | |
|       else {
 | |
|         document.focus();
 | |
|       }
 | |
|   } // end of if KEY_ESCAPE
 | |
|   } // end of if arrow or escape  key
 | |
|   return bEventContinue;
 | |
| }
 | |
| Menubar.prototype.closeMenu = function(event) {
 | |
| // hide the menus
 | |
|     var isOpen = this.isActiveOpen();
 | |
|     var activeIndex = this.getActiveMenuIndex();
 | |
|     if (isOpen && activeIndex != -1) {
 | |
|       // find the index of the active menu and close
 | |
|       this.hideMenu(event);
 | |
|     }
 | |
|     else {
 | |
|       var menus = this.getMenus();
 | |
|       var activeMenuId = menus[activeIndex];
 | |
|       var curDrop = document.getElementById(activeMenuId + DROP_SUFFIX);
 | |
|           if (!isOpen && curDrop) {
 | |
|         // one of the top level menus is active but drop down is not open
 | |
|         gBlurItem = curDrop;
 | |
|         setTimeout("doBlur()",0);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     this.updateAllIndex(-1,false,-1);
 | |
|   }
 | |
| 
 | |
| Menubar.prototype.showMenu = function(event, menuId, bFocusFirst) {
 | |
| 
 | |
|     // get the drop menu
 | |
|     var menu = document.getElementById((menuId + DROP_SUFFIX));
 | |
|     var displayState = "block";
 | |
|     var curIndex = this.findMenuIndex(menuId);
 | |
|     // see if any menu is open
 | |
|     var isOpen = this.isActiveOpen();
 | |
|     if (isOpen) {
 | |
|       // find the index of this menu item and see if it is different than the active one
 | |
|       var activeIndex = this.getActiveMenuIndex();
 | |
| 
 | |
|       if (curIndex != activeIndex && activeIndex != -1 ) {
 | |
|         // close the currently open drop menu
 | |
|         this.hideMenu(event);
 | |
|         // show this one
 | |
|         displayState = "block";
 | |
| 
 | |
|       }
 | |
|       else { // this is the current menu - hide it
 | |
|         displayState = "none";
 | |
|       }
 | |
|     } // end of if menu open
 | |
|     // else is not open - default value of displayState is block -so menu will be shown
 | |
|     // set the activeOpen value
 | |
|     var isOpen = (displayState == "block" ? true : false);
 | |
|     this.setActiveOpen(isOpen);
 | |
|     this.setActiveMenuIndex(curIndex);
 | |
|     // style="display:none" must be set on the drop elements to use the element.style.display syntax
 | |
|     // otherwise need to write cross browser routine to read the effective style (see DHTML book pg 878)
 | |
|     menu.style.display = displayState;
 | |
|     gFocusItem = menu;  // may be over written is need to set focus on specific menu item
 | |
|     if (isOpen && bFocusFirst) {
 | |
|       // set focus to an item in the menu
 | |
|       if (this.getActiveItemIndex() == -1) {
 | |
|         this.setActiveItemIndex(0);  // set to first item
 | |
|       }
 | |
|       var menuItems = this.getMenuItems(menuId);
 | |
|       gFocusItem=document.getElementById(menuItems[this.getActiveItemIndex()]);
 | |
| 
 | |
|     }
 | |
|       setTimeout("doFocus();",0);
 | |
| 
 | |
| }
 | |
| 
 | |
| Menubar.prototype.showSubMenu = function(event, menuId) {
 | |
| // TODO fix to work with mouse - since only supporting keyboard right now - there will not be another drop menu open
 | |
| 
 | |
| // close any open submenus
 | |
|     this.hideSubMenu();
 | |
| 
 | |
|     // get the drop menu
 | |
|     var menu = document.getElementById((menuId + DROP_SUFFIX));
 | |
|     var assocItem = document.getElementById(menuId);
 | |
|     //var container = assocItem.parentNode; // HACK - I know that containing div is parent of menuitem should search for menuitem in parent chain
 | |
|     var displayState = "block";
 | |
| 
 | |
|     this.setActiveSubOpen(menuId);
 | |
|     // will set focus to first item
 | |
|     this.setActiveSubIndex(0);
 | |
|     // position drop menu
 | |
| 
 | |
|       var offTop= assocItem.offsetTop + "px";
 | |
|       var offLeft = assocItem.offsetLeft + assocItem.offsetWidth + "px";
 | |
|       with (menu.style) {
 | |
|         top=offTop;
 | |
|         left=offLeft;
 | |
|         display = displayState;
 | |
|       }
 | |
| 
 | |
|     var subItems =this.getSubMenuItems(menuId);
 | |
|     var first = document.getElementById(subItems[0]);
 | |
|     gFocusItem = first;
 | |
| 
 | |
|     setTimeout("doFocus();",0);
 | |
|     event.stopPropagation();
 | |
|     return false;  // do not  propagate event
 | |
| 
 | |
| }
 | |
| Menubar.prototype.hideSubMenu = function() {
 | |
|   var openId = this.getActiveSubOpen();
 | |
|   if (openId != null) {
 | |
|     var openSub = document.getElementById(openId + DROP_SUFFIX);
 | |
|     openSub.style.display="none";
 | |
|     this.setActiveSubOpen(null);
 | |
|     this.setActiveSubIndex(-1);
 | |
|   }
 | |
| }
 | |
| 
 | |
| Menubar.prototype.hideMenu = function(event) {
 | |
|   var isKey = false;
 | |
|     if (event.keyCode) {
 | |
|       isKey = true;
 | |
|   }
 | |
|   if ((isKey && event.keyCode == 13) || (isKey && event.keyCode == KEY_ESCAPE ) || !isKey) {
 | |
|     var isOpen = this.isActiveOpen();
 | |
|     var activeIndex = this.getActiveMenuIndex();
 | |
|     if (isOpen) {
 | |
|       var menu = document.getElementById((this.getMenus()[activeIndex] + DROP_SUFFIX));
 | |
|       // style="display:none" must be set on the drop elements to use the element.style.display syntax
 | |
|       // otherwise need to write cross browser routine to read the effective style (see DHTML book pg 878)
 | |
|       menu.style.display="none";
 | |
|       this.updateAllIndex(-1,false,-1);
 | |
|       this.hideSubMenu();
 | |
|       //event.cancelBubble = true; // this is not in the DOM but is supported by IE and Mozilla - could use stopPropagation();
 | |
|       gBlurItem = menu;
 | |
|       setTimeout("doBlur();",0);
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
|   }
 | |
| 
 | |
| }
 | |
| 
 | |
| Menubar.prototype.findMenuIndex = function(menuId) {
 | |
|   var menus = this.getMenus();
 | |
|   var menuLen = menus.length;
 | |
|   var idx = -1;
 | |
|   for (var i=0; i < menuLen; i++ ) {
 | |
|     if (menus[i] == menuId) {
 | |
|       idx = i;
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
|   return idx;
 | |
| }
 | |
| Menubar.prototype.clearMenu = function() {
 | |
| }
 | |
| 
 | |
| Menubar.prototype.doAlert = function (event, theElem, alertStr) {
 | |
| // only called when is enter key or mouse click
 | |
|   var isKey = false;
 | |
|     if (event.keyCode) {
 | |
|       isKey = true;
 | |
|   }
 | |
|   if (theElem.getAttribute("aria-disabled") !="true") {
 | |
|       this.hideMenu(event);
 | |
|       gAlertString = alertStr;
 | |
|       setTimeout("delayedAlert(gAlertString);",0);
 | |
| 
 | |
|   }
 | |
|   // always stop propagation of enter key or click
 | |
|   if (event.stopPropagation) {
 | |
|           event.stopPropagation();
 | |
|         }
 | |
|         else {
 | |
|           try {
 | |
|             event.cancelBubble=true;
 | |
|           } catch (e) {
 | |
|             ;
 | |
|           }
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|   return false; // do not propagate
 | |
| }
 | |
| 
 | |
| 
 | |
| Menubar.prototype.focusItem = function(event,menuIndex, itemIndex) {
 | |
| // called from onmouseover of each menu item
 | |
|   // TODO add error handling
 | |
|   this.setActiveItemIndex(itemIndex);
 | |
|   this.setActiveMenuIndex(menuIndex);
 | |
|   //this.setActiveOpen(true);
 | |
|   gFocusItem = event.target;
 | |
|   setTimeout("doFocus();",0);
 | |
| }
 | |
| 
 | |
| Menubar.prototype.doActionTotal = function(event,tableId,key) {
 | |
|   this.hideMenu(event);
 | |
|    doTotals(tableId, key);
 | |
|    // always stop propagation of enter key or click
 | |
|     if (event.stopPropagation) {
 | |
|             event.stopPropagation();
 | |
|           }
 | |
|           else {
 | |
|             try {
 | |
|               event.cancelBubble=true;
 | |
|             } catch (e) {
 | |
|               ;
 | |
|             }
 | |
|       }
 | |
| 
 | |
|   return false;
 | |
| 
 | |
| }
 | |
| Menubar.prototype.doActionColor = function(event,colorScheme) {
 | |
|   this.hideMenu(event);
 | |
|    doColor(colorScheme);
 | |
|    // always stop propagation of enter key or click
 | |
|     if (event.stopPropagation) {
 | |
|             event.stopPropagation();
 | |
|           }
 | |
|           else {
 | |
|             try {
 | |
|               event.cancelBubble=true;
 | |
|             } catch (e) {
 | |
|               ;
 | |
|             }
 | |
|       }
 | |
| 
 | |
|   return false;
 | |
| 
 | |
| }
 | |
| function doAction(event, theElem) {
 | |
| 
 | |
|   var isKey = false;
 | |
|   if (event.keyCode) {
 | |
|     isKey = true;
 | |
|   }
 | |
|   var bDoAction = false;
 | |
|   if ((isKey && event.keyCode == 13) || !isKey) {
 | |
|     if (theElem.getAttribute("aria-disabled") =="true") {
 | |
|       bDoAction = false;
 | |
|     }
 | |
|     else {
 | |
|       bDoAction = true;
 | |
|     }
 | |
|   }
 | |
| 
 | |
| 
 | |
|   return bDoAction;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| var topMenu = new Menubar("menuBar");
 | |
| topMenu.addMenu("edit", new Array("cut","copy", "paste"));
 | |
| topMenu.addMenu("2", new Array("2.1sub", "2.2","2.3","2.4sub"));
 | |
| topMenu.addMenu("3", new Array("3.1", "3.2","3.3sub","3.4"));
 | |
| topMenu.addMenu("four", new Array("4.1", "4.2","4.3","4.4","4.5"));
 | |
| topMenu.addMenu("five", new Array("5.1", "5.2","5.3"));
 | |
| topMenu.addSubMenu("2.1sub", new Array("2.1.1", "2.1.2","2.1.3", "2.1.4", "2.1.5"));
 | |
| topMenu.addSubMenu("2.4sub", new Array("2.4.1", "2.4.2"));
 | |
| topMenu.addSubMenu("3.3sub", new Array("3.3.1", "3.3.2", "3.3.3"));
 | |
| 
 | |
| 
 | |
| 
 | |
| // global vars for storing selection and focus information; indexed by the id of the parent table element
 | |
| var gCurrentRow = new Array();
 | |
| var gCurrentCol = new Array();
 | |
| var gCurrentSelected = new Array();
 | |
| var gCurrentCell = new Array();
 | |
| var gSelectedCells = new Array();
 | |
| var gSelecting = new Array();
 | |
| var gTabCount = new Array();
 | |
| 
 | |
| gCurrentRow ["table2"] = -1;   // 0 based row number
 | |
| gCurrentCol["table2"] = 0;  // 0 based column number
 | |
| gCurrentSelected ["table2"]=null;  // currently selected row object
 | |
| gCurrentCell["table2"] =null; // currently selected cell object
 | |
| gSelectedCells["table2"] = new Array();  // array of currently selected cell objects
 | |
| gSelecting["table2"] = false;  // boolean indicating if currently  in multi-select mode ( quicker than checking for entries in gCurrentSelectedCells
 | |
| gTabCount["table2"] = 0;  // need to know if tabbing into or out of control
 | |
| 
 | |
| 
 | |
| // global to store the item to be focused
 | |
| gFocusItem =null;
 | |
| // global to pass the item needing focus to doBlur() via a setTimeout()
 | |
| var gBlurItem= null;
 | |
| // global to store the alert string so can call alert() via setTimeout()
 | |
| gAlertString = "";
 | |
| 
 | |
| function doFocus() {
 | |
|   try {
 | |
|     if (gFocusItem != null) {
 | |
|       gFocusItem.focus();
 | |
|       gFocusItem=null;
 | |
|     }
 | |
|   } catch (error) {
 | |
|     alert("DEBUG: error in doFocus()");
 | |
|   }
 | |
| }
 | |
| function doBlur() {
 | |
|   try {
 | |
|     if (gBlurItem != null) {
 | |
|       gBlurItem.blur();
 | |
|       gBlurItem=null;
 | |
|     }
 | |
|   } catch (error) {
 | |
|     alert("DEBUG: error in doBlur()");
 | |
|   }
 | |
| }
 | |
| 
 | |
| function delayedAlert() {
 | |
|   alert(gAlertString);
 | |
|   gAlertString = "";
 | |
| }
 | |
| 
 | |
| 
 | |
| function setStyle(theObj, styleName, styleValue, priority) {
 | |
|   var bSuccess = false;
 | |
| 
 | |
|   try {
 | |
|     if (theObj.style && theObj.style.setProperty) {
 | |
|       theObj.style.setProperty(styleName, styleValue,priority);
 | |
|       bSuccess = true;
 | |
|     }
 | |
|   } catch (ex) {
 | |
|     alert('exception caught setting style: ' + ex.message); // cannot do anything try the next method
 | |
|   }
 | |
|   if (!bSuccess) {
 | |
|     try {
 | |
|       theObj.style[styleName] = styleValue;
 | |
|       bSuccess = true;
 | |
|     } catch (exNext) {
 | |
|       alert('exception caught setting direct style: ' + exNext.message); // cannot do anything
 | |
|     }
 | |
|   }
 | |
|   return bSuccess;
 | |
| } // end of setStyle
 | |
| 
 | |
| function findParentElem(evt, parentName) {
 | |
|   var srcElem = null;
 | |
| try {
 | |
|   if (evt.srcElement) {
 | |
|     srcElem = evt.srcElement;
 | |
|   }
 | |
|   else {
 | |
|     srcElem = evt.currentTarget;
 | |
|   }
 | |
| 
 | |
|   if (srcElem != null ) {
 | |
|     // find the source table for the keyup event
 | |
|     var tagName = srcElem.tagName;
 | |
|     if (tagName != parentName) {
 | |
|       // search parent heirarchy
 | |
|       var parNode = srcElem.parentNode;
 | |
|       while (parNode != null) {
 | |
|         if (parNode.type == document.ELEMENT_TYPE) {
 | |
|           if (parNode.tagName.toLowerCase() == parentName) {
 | |
|             srcElem = parNode;
 | |
|             break;
 | |
|           }
 | |
|         }
 | |
|         parNode = parNode.parentNode;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|   }
 | |
| }
 | |
| catch (anyError) {
 | |
|   ; //srcElem = null;
 | |
| }
 | |
|   return srcElem;
 | |
| }
 | |
| 
 | |
| function findParent (srcElem, parentName) {
 | |
| try {
 | |
|   if (srcElem != null ) {
 | |
|     // find the source table for the keyup event
 | |
|     var tagName = srcElem.tagName;
 | |
|     if (tagName != parentName) {
 | |
|       // search parent heirarchy
 | |
|       var parNode = srcElem.parentNode;
 | |
|       while (parNode != null) {
 | |
|         if (parNode.type == document.ELEMENT_TYPE) {
 | |
|           if (parNode.tagName.toLowerCase() == parentName) {
 | |
|             srcElem = parNode;
 | |
|             break;
 | |
|           }
 | |
|         }
 | |
|         parNode = parNode.parentNode;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|   }
 | |
| }
 | |
| catch (anyError) {
 | |
|   ; //srcElem = null;
 | |
| }
 | |
|   return srcElem;
 | |
| }
 | |
| 
 | |
| 
 | |
| function doTableKeys(e) {
 | |
|   var evt = (e != null) ? e : ((event) ? event : null);  // Mozilla will include e parameter
 | |
|   var bDefaultHandler = true;
 | |
|   try {
 | |
|   var testCell = document.getElementById("testCell"); // could cache this test object for better performance
 | |
|   if (!testCell.focus) {
 | |
|   // test cell is the id of a table cell element with a  tabindex="-1".  See if we can set focus to it, if
 | |
|   // not, just return, we can not support arrow keys
 | |
|     //alert('no arrow key support');
 | |
|     return bDefaultHandler;
 | |
|   }
 | |
| 
 | |
|   var srcElem = findParentElem(evt,"table");
 | |
|   //srcElem=document.getElementById(srcElem.getAttribute("id"));
 | |
|   var activeTableId = srcElem.getAttribute("id");
 | |
|   var rows = srcElem.rows;
 | |
|   var key = evt.keyCode;
 | |
|   var bCtrlKey = evt.ctrlKey;
 | |
|   var  currentRow = gCurrentRow[activeTableId];
 | |
|   var currentCol = gCurrentCol[activeTableId];
 | |
|   var nextCell = null;
 | |
| 
 | |
|   if ((key >= KEY_LEFT && key <= KEY_DOWN) && !evt.altKey) {
 | |
|     var nextRow = null;
 | |
|     var nextRowNum = 0;
 | |
|     var nextCol = null;
 | |
|     var nextColNum = 0;
 | |
| 
 | |
| 
 | |
|     if (gSelecting[activeTableId] == true && bCtrlKey == false) {
 | |
|       clearSelected(activeTableId);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     // process arrows
 | |
|     if (key == KEY_DOWN ) { // down
 | |
| 
 | |
|       nextRowNum = currentRow + 1;
 | |
|       if (rows.length > nextRowNum) {
 | |
|       var prevCell = null;
 | |
|         if (currentRow != -1) {
 | |
|           var prevRow = rows[currentRow];
 | |
|           prevCell = prevRow.cells[currentCol];
 | |
|         }
 | |
|         nextRow = rows[nextRowNum];
 | |
|         gCurrentRow[activeTableId]=nextRowNum;
 | |
|         nextCell = nextRow.cells[currentCol];
 | |
|         gCurrentCell[activeTableId] = nextCell;
 | |
|         processMovement(prevCell, nextCell, bCtrlKey, activeTableId);
 | |
| 
 | |
|         gFocusItem = nextCell;
 | |
|         setTimeout("doFocus()", 0);
 | |
| 
 | |
|       }
 | |
|     } // end of down
 | |
|     if (key == KEY_UP) { // up
 | |
|       nextRowNum = currentRow -1;
 | |
|       if (nextRowNum >=0 ) {
 | |
|         var prevCell = null;
 | |
|         if (currentRow != -1) {
 | |
|           var prevRow = rows[currentRow];
 | |
|           prevCell = prevRow.cells[currentCol];
 | |
|         }
 | |
|         nextRow = rows[nextRowNum];
 | |
|         gCurrentRow[activeTableId]=nextRowNum;
 | |
|         nextCell = nextRow.cells[currentCol];
 | |
|         gCurrentCell[activeTableId] = nextCell;
 | |
|         processMovement(prevCell, nextCell, bCtrlKey, activeTableId);
 | |
|         gFocusItem = nextCell;
 | |
|         setTimeout("doFocus()", 0);
 | |
| 
 | |
|       }
 | |
| 
 | |
|     } // end of up
 | |
|     if (key == KEY_LEFT ) { // left
 | |
|       nextColNum = currentCol -1;
 | |
|       var prevCell = null;
 | |
|       if (nextColNum >= 0 && currentRow >= 0) {
 | |
|         nextRow = rows[currentRow];
 | |
|         if (nextRow != null) {
 | |
|           prevCell = nextRow.cells[currentCol];
 | |
|         }
 | |
|         nextCell = nextRow.cells[nextColNum];
 | |
|         gCurrentCol[activeTableId] = nextColNum;
 | |
|         gCurerntCell  = nextCell;
 | |
|         processMovement(prevCell, nextCell, bCtrlKey, activeTableId);
 | |
| 
 | |
|         gFocusItem = nextCell;
 | |
|         setTimeout("doFocus()", 0);
 | |
| 
 | |
|       }
 | |
| 
 | |
|     } // end of if left
 | |
|     if (key == KEY_RIGHT ) { // right
 | |
|       nextColNum = currentCol + 1;
 | |
|       var prevCell = null;
 | |
|       if (currentRow >=0 ) {
 | |
|         nextRow = rows[currentRow];
 | |
|         if (nextRow != null && nextColNum < nextRow.cells.length) {
 | |
|           prevCell = nextRow.cells[currentCol];
 | |
|           nextCell = nextRow.cells[nextColNum];
 | |
|           gCurrentCol[activeTableId] = nextColNum;
 | |
|           gCurrentCell  = nextCell;
 | |
|           processMovement(prevCell, nextCell, bCtrlKey, activeTableId);
 | |
| 
 | |
|           gFocusItem = nextCell;
 | |
|           setTimeout("doFocus()", 0);
 | |
|         }
 | |
|       }
 | |
| 
 | |
| 
 | |
|     } // end of if right
 | |
|     bDefaultHandler = false;
 | |
| 
 | |
|   if (nextCell != null) {
 | |
|     gCurrentCell[activeTableId]= nextCell;
 | |
|   }
 | |
|   } // end of if arrows
 | |
|   else if (key == KEY_SPACE && bCtrlKey) {
 | |
|     var currentCell = gCurrentCell[activeTableId];
 | |
| 
 | |
|     var bSelected = toggleSelection(activeTableId,currentCell);
 | |
|     if (bSelected == "true") {
 | |
|       currentCell.className = "cellFocusSelect";
 | |
|     }
 | |
|     else {
 | |
|       currentCell.className = "cellFocus";
 | |
|     }
 | |
| 
 | |
|   }
 | |
|   else if (key == KEY_ESCAPE) {
 | |
|     // pressing escape when editing a cell will end editng - this is not really what we want since
 | |
|     // it does not allow the escape to clear the input cell field first - I tried that in ignoreArrows() but
 | |
|     // could not get focus back to the cell after the escape.
 | |
|     if (gCurrentCell[activeTableId] != null) {
 | |
|       endEdit(gCurrentCell[activeTableId], false);
 | |
|       gFocusItem = gCurrentCell[activeTableId];
 | |
|     setTimeout("doFocus()",0);
 | |
|     bDefaultHandler = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   else if (key == KEY_TAB && !evt.shiftKey ) {
 | |
|     // table is losing focus set the style of the current cell to cellBlur
 | |
|     gCurrentCell[activeTableId].className = "cellBlur";
 | |
| 
 | |
| 
 | |
|   }
 | |
| 
 | |
|   } // end of try
 | |
|   catch (errorInfo) {
 | |
|     //alert(errorInfo);
 | |
|   }
 | |
|   return bDefaultHandler;
 | |
| }
 | |
| function processMovement(prevCell, nextCell, bCtrlKey, activeTableId) {
 | |
|   if (bCtrlKey == true) {
 | |
|           // leave prev cell in same state
 | |
|           // set style of prevCell to appropriate state
 | |
|           // set style of current cell to cellFocus
 | |
|           if (prevCell != null) {
 | |
|               var prevStyle = "";
 | |
|               if (prevCell.getAttribute("aria-selected") == "true" ) {
 | |
|                 prevStyle = "cellSelect";
 | |
|               }
 | |
|               prevCell.className = prevStyle;
 | |
|           }
 | |
|           nextCell.className = "cellFocus";
 | |
|           gSelecting[activeTableId] = true;
 | |
|         }
 | |
|         else {
 | |
|           //bCtrlKey == false
 | |
|           // clear select on previous cell
 | |
|           // set style of previous cell to empty
 | |
|           // select current cell
 | |
|           // set style of current cell to cellFocusSelect
 | |
|           if (prevCell != null) {
 | |
|             removeSelection(activeTableId, prevCell);
 | |
|             prevCell.className = "";
 | |
|           }
 | |
|             addSelection(activeTableId, nextCell);
 | |
|             nextCell.className="cellFocusSelect";
 | |
|           }
 | |
| }
 | |
| 
 | |
| function addSelection(activeTableId, currentCell) {
 | |
|     var selectedList = gSelectedCells[activeTableId];
 | |
|     var isSelected = currentCell.getAttribute("aria-selected");
 | |
|     if (isSelected != "true") {
 | |
|       // set selected and add to selection list
 | |
|       currentCell.setAttribute("aria-selected", "true");
 | |
|       selectedList[selectedList.length] = currentCell;
 | |
|       gSelectedCells[activeTableId] = selectedList;
 | |
|     }
 | |
| }
 | |
| 
 | |
| function removeSelection(activeTableId, currentCell) {
 | |
|   var selectedList = gSelectedCells[activeTableId];
 | |
|     var isSelected = currentCell.getAttribute("aria-selected");
 | |
|     if (isSelected == "true" ) {
 | |
|       currentCell.removeAttribute("aria-selected");
 | |
|       // remove from list of selected cells
 | |
|       var idx = -1;
 | |
|       for (var j=0; j < selectedList.length; j++) {
 | |
|         if (selectedList[j] == currentCell) {
 | |
|           idx = j;
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|       if (idx <= 0) {
 | |
|         // remove the cell from the selected List
 | |
|         gSelectedCells[activeTableId] = selectedList.splice(idx,1,"");
 | |
|       }
 | |
|     }
 | |
| }
 | |
| function toggleSelection(activeTableId, currentCell) {
 | |
| // toggle selection of the cell
 | |
|   var selectedState = "";
 | |
|   var selectedList = gSelectedCells[activeTableId];
 | |
|   var isSelected = currentCell.getAttribute("aria-selected");
 | |
|     if (isSelected == "true" ) {
 | |
|       removeSelection(activeTableId, currentCell);
 | |
| 
 | |
|     }
 | |
|     else {
 | |
|       addSelection(activeTableId,currentCell);
 | |
|       selectedState = "true"
 | |
|     }
 | |
|     return selectedState; // return current selection state of cell
 | |
| } // end of toggleSelection
 | |
| 
 | |
| function clearSelected(activeTableId) {
 | |
|   // clear the selected cells
 | |
|     gSelecting[activeTableId] = false;
 | |
|     var selectedCells = gSelectedCells[activeTableId];
 | |
|     for (var k=0; k < selectedCells.length; k++) {
 | |
|       selectedCells[k].className = "";
 | |
|       selectedCells[k].setAttribute("aria-selected", "false");
 | |
|     }
 | |
|     gSelectedCells[activeTableId] = new Array();  // just create new, empty array
 | |
| } // end of clearSelected()
 | |
| 
 | |
| function doClick(e,rowNum, colNum) {
 | |
|   /* put the doClick() in each TD element and pass the row and column number because it was the easiest way to figure out what
 | |
|   row and column was clicked in both IE and Mozilla.  Mozilla gives the element with the handler as the currentTarget rather than the
 | |
|   actual element.  For example, with onclick on the TABLE, Mozilla gives the event.currentTarget as the TABLE when click on a cell.
 | |
|   IE gives the event.srcElement as the TD that was clicked on.
 | |
|   Also, could probably determine row and column programmatically if necessary rather than passing rowNum and colNum. Or, pass the element itself!
 | |
|   */
 | |
| 
 | |
|   var evt = (e != null) ? e : ((event) ? event : null);  // Mozilla will include e parameter
 | |
|   var srcElem = findParentElem(evt,"table");
 | |
|   var activeTableId = srcElem.getAttribute("id");
 | |
|   var prevCell = gCurrentCell[activeTableId];
 | |
|   var rows = document.getElementById(activeTableId).rows;
 | |
|   var thisRow = rows[rowNum];
 | |
|   var thisCell = thisRow.cells[colNum];
 | |
|   // update the global variables for the clicked on cell
 | |
|   gCurrentCell[activeTableId] = thisCell;
 | |
|   gCurrentRow[activeTableId] = rowNum;
 | |
|   gCurrentCol[activeTableId] = colNum;
 | |
|   var bCtrlKey = evt.ctrlKey;
 | |
|   var bSameCell = (thisCell == prevCell);
 | |
| 
 | |
|   if (gSelecting[activeTableId] == true && bCtrlKey == false) {
 | |
|     clearSelected(activeTableId);
 | |
|   }
 | |
| 
 | |
|   if (bCtrlKey == false && !bSameCell) {
 | |
|     // remove selection from prev cell
 | |
|     // add this cell to selection
 | |
|     // set state of prev cell to empty
 | |
|     // set state of this cell to focusSelect
 | |
|     if (prevCell != null) {
 | |
|       removeSelection(activeTableId, prevCell);
 | |
|       prevCell.className = "";
 | |
|     }
 | |
|     addSelection(activeTableId, thisCell);
 | |
|     thisCell.className="cellFocusSelect";
 | |
|   }
 | |
|   else if (bCtrlKey == true && !bSameCell) {
 | |
|     // leave prev cell in same selection state
 | |
|     // update style of prev cell based on state
 | |
|     // add this cell to selection
 | |
|     // set this cell style to focusselect
 | |
|     if (prevCell != null) {
 | |
|       var prevStyle = "";
 | |
|       if (prevCell.getAttribute("aria-selected") == "true" ) {
 | |
|         prevStyle = "cellSelect";
 | |
|       }
 | |
|         prevCell.className = prevStyle;
 | |
|     }
 | |
|     addSelection(activeTableId, thisCell);
 | |
|     thisCell.className="cellFocusSelect";
 | |
|     gSelecting[activeTableId] = true;
 | |
|   }
 | |
|   else if (bCtrlKey == true && bSameCell) {
 | |
|     var bSelected = toggleSelection(activeTableId,thisCell);
 | |
|       if (bSelected == "true") {
 | |
|         thisCell.className = "cellFocusSelect";
 | |
|       }
 | |
|       else {
 | |
|         thisCell.className = "cellFocus";
 | |
|       }
 | |
|   }
 | |
|   gFocusItem = thisCell;
 | |
|   setTimeout("doFocus();", 0);
 | |
| 
 | |
| } // end of doClick
 | |
| 
 | |
| 
 | |
| function doEvent(evtTarget, evtName, theEvent) {
 | |
|   if (evtTarget.fireEvent) {
 | |
|     // is IE, need "on" in front of event name
 | |
|     evtName = "on" + evtName;
 | |
|     evtTarget.fireEvent(evtName, theEvent);
 | |
|   }
 | |
|   else {
 | |
|     evtTarget.dispatchEvent(theEvent);
 | |
|   }
 | |
|   return;
 | |
| }
 | |
| 
 | |
| 
 | |
| function doLink(linkId) {
 | |
|   var theLink = document.getElementById(linkId);
 | |
|   var bTryAgain = false;
 | |
|   try {
 | |
|     theLink.click();  // for IE
 | |
|   } catch (clickError) {
 | |
|     bTryAgain = true;
 | |
|   }
 | |
|   if (bTryAgain) {
 | |
|     try {
 | |
|       var mClick = document.createEvent("MouseEvents");
 | |
|       mClick.initEvent("click",true, true);
 | |
|       theLink.dispatchEvent(mClick);
 | |
|     } catch (e) {
 | |
|       alert(e.message); //+ "DEBUG: can't fire event to link element");
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| function doEdit(event, parentCell, colNumber) {
 | |
| // edit a spreadsheet cell.   Find text node of cell and store data.  Create an input field and label and add to cell; set text node value into cell; remove text node;
 | |
|   if (parentCell.getAttribute("aria-readonly") =="true") {
 | |
|     return;
 | |
|   }
 | |
|   if (parentCell.editMode != "true") {
 | |
|     var inputId = "col" + colNumber;
 | |
|     var inputField = document.createElement("input");
 | |
|     setStyle(inputField, "border", "0", "");
 | |
|     inputField.setAttribute("id", inputId);
 | |
|     var dataNode = null;
 | |
|     var editData = "";
 | |
|     if (parentCell.hasChildNodes() ) {
 | |
|       // TODO find parentCells text node - for now just assuming it is first child
 | |
|        dataNode = parentCell.firstChild;
 | |
|        parentCell.removeChild(dataNode);
 | |
|        editData = dataNode.data;
 | |
|     }
 | |
|     parentCell.saveData = editData;
 | |
|     parentCell.appendChild(inputField);
 | |
|     inputField.setAttribute("value",editData);
 | |
|     setStyle(inputField,"width", "100%","");
 | |
|     try {
 | |
|       inputField.addEventListener("blur",checkEdit, true);
 | |
|       inputField.addEventListener("keydown", ignoreArrows,true);  // process arrow key input so it does not  get up to parent table onkeydown
 | |
|     }
 | |
|     catch (ex) { // IE
 | |
|       inputField.attachEvent('blur',checkEdit, true);
 | |
|       inputField.attachEvent('keydown', ignoreArrows, true);
 | |
|     }
 | |
| 
 | |
|     // create label for the cell - use the columnheader as the label
 | |
|     var parentTable = findParent(parentCell, "table");
 | |
|     var colHeader = parentTable.rows[0].cells[colNumber];
 | |
|     inputField.setAttribute("aria-labelledby", colHeader.id);
 | |
| 
 | |
|     parentCell.editMode = "true";
 | |
|     // set focus to the input field
 | |
|     gFocusItem=inputField;
 | |
|     setTimeout("doFocus()", 0);
 | |
|   } // end of if edit
 | |
|   else   {
 | |
|     endEdit(parentCell,true);
 | |
| 
 | |
|     gFocusItem = parentCell;
 | |
|     setTimeout("doFocus()",0);
 | |
| 
 | |
|   } // end of else end edit
 | |
| 
 | |
| 
 | |
| } // end of doEdit()
 | |
| 
 | |
| function endEdit(parentCell, bSave) {
 | |
| // end editing remove input node, remove label node
 | |
| // currently VERY dependent upon the organization of the DOM
 | |
| // cell is in edit mode - store data and leave edit mode
 | |
|   // find the input field
 | |
|   if (parentCell.hasChildNodes() && parentCell.editMode == "true") {
 | |
|     var inputNode = findChildNode(parentCell,"input");
 | |
|     /*var inputNode = parentCell.firstChild;  // TODO should never be null but wrap in a try/catch
 | |
|     var childNodeName = inputNode.nodeName
 | |
|     childNodeName.toLowerCase();
 | |
|     while (childNodeName != "input" && inputNode != null) {
 | |
|         inputNode = inputNode.nextSibling;
 | |
|         childNodeName = inputNode.nodeName.toLowerCase();
 | |
|     }*/
 | |
|     if (inputNode != null) {
 | |
|       var storeData = parentCell.saveData;
 | |
|       if (bSave == true) {
 | |
|         storeData = inputNode.value;
 | |
|       }
 | |
|       // remove event listenters
 | |
|       try {
 | |
|         inputNode.removeEventListener("blur",checkEdit,true);
 | |
|         inputNode.removeEventListener("keydown", ignoreArrows, true);
 | |
|       }
 | |
|       catch (ex) {
 | |
|         inputField.detachEvent('blur',checkEdit, true);
 | |
|         inputField.detachEvent('keydown', ignoreArrows, true);
 | |
|       }
 | |
| 
 | |
|       parentCell.removeChild(inputNode);
 | |
|       var labelNode = findChildNode(parentCell, "label");
 | |
|       if (labelNode != null) {
 | |
|         parentCell.removeChild(labelNode);
 | |
|       }
 | |
|       var newDataNode = document.createTextNode(storeData);
 | |
|       parentCell.appendChild(newDataNode);
 | |
|       parentCell.editMode="false";
 | |
|     }
 | |
|   }
 | |
| } // end of endEdit
 | |
| 
 | |
| function findChildNode(startNode, nodeName) {
 | |
| // TODO - currently only searchs siblings of startNode - does not recurse
 | |
|   var foundNode = null;
 | |
|   try {
 | |
|     if (startNode.hasChildNodes() ) {
 | |
|     var testNode = startNode.firstChild;
 | |
|     while (testNode != null && (testNode.nodeName.toLowerCase() != nodeName)) {
 | |
|       testNode = testNode.nextSibling;
 | |
|     }
 | |
|     foundNode = testNode;
 | |
|   }
 | |
|   } catch (error) {
 | |
|     alert("DEBUG - error in findChildNode() - " + error.message);
 | |
|     foundNode = null;
 | |
|   }
 | |
|   return foundNode;
 | |
| }
 | |
| 
 | |
| function checkEdit(event) {
 | |
| try {
 | |
|   var srcElem = findParentElem(event,"table");
 | |
|   var currentCell = gCurrentCell[srcElem.id];
 | |
|   var parentCell = findParentElem(event,"td");
 | |
|   if (parentCell == currentCell) {
 | |
|     if (parentCell && parentCell.editMode == "true") {
 | |
|       endEdit(parentCell,true);
 | |
|     }
 | |
| 
 | |
|     gFocusItem = srcElem;
 | |
|     setTimeout("doFocus();", 0);
 | |
|   }
 | |
| } catch (e) {
 | |
|   alert("DEBUG - error in checkEdit: " + e.message);
 | |
| }
 | |
| }
 | |
| 
 | |
| function ignoreArrows(event) {
 | |
|   var eventTarget = event.target;
 | |
|   var key = event.keyCode;
 | |
|   bEventContinue = true;  // let input field handle the key
 | |
|   if (key >=KEY_LEFT && key <= KEY_DOWN) {
 | |
|     if (event.stopPropagation) {
 | |
|             event.stopPropagation();
 | |
|         }
 | |
|         else {
 | |
|             event.cancelBubble = true;
 | |
|         }
 | |
|   }
 | |
|   /* This does not work - I can not get focus back into the cell after the escape!!!
 | |
|   else if (key == KEY_ESCAPE) {
 | |
|     // first let escape be used to clear the cell, if cell is empty end editing
 | |
|     if (eventTarget.value == "") {
 | |
|       if (event.stopPropagation) {
 | |
|         event.stopPropagation();
 | |
|       }
 | |
|       else {
 | |
|         event.cancelBubble = true;
 | |
|       }
 | |
|       var srcElem = findParentElem(event,"table");
 | |
|         var currentCell = gCurrentCell[srcElem.id];
 | |
|         var parentCell = findParentElem(event,"td");
 | |
|         if (parentCell == currentCell) {
 | |
|           if (parentCell && parentCell.editMode == "true") {
 | |
|             endEdit(parentCell,false);
 | |
|           }
 | |
| 
 | |
|         }
 | |
|         // focus the table - that will focus the currentCell
 | |
|         gFocusItem = srcElem;
 | |
|         setTimeout("doFocus();", 0);
 | |
| 
 | |
|     }
 | |
| 
 | |
|   } */
 | |
| 
 | |
| 
 | |
| } // end of ignoreArrows
 | |
| function setCell(tableId) {
 | |
|   var currentCell = gCurrentCell[tableId];
 | |
|   if (currentCell == null) {
 | |
|     // no cell selected, set it to first cell
 | |
|     var grid = document.getElementById(tableId);
 | |
|     var rows = grid.rows;
 | |
|     var firstRow = rows[0];
 | |
|     currentCell = firstRow.cells[0];
 | |
|     gCurrentRow[tableId] = 0;
 | |
|     gCurrentCol[tableId] = 0;
 | |
|     gCurrentCell[tableId] = currentCell;
 | |
| 
 | |
|   }
 | |
|   currentCell.className="cellFocusSelect";
 | |
|   gFocusItem = currentCell;
 | |
|   setTimeout("doFocus()", 0);
 | |
| 
 | |
| }
 | |
| 
 | |
| // would like to change the style of the cell when focus leaves the table completely but not sure how to implement since table gets onblur when each cell loses focus
 | |
| function blurCell(event, tableId) {
 | |
|     var currentCell = gCurrentCell[tableId];
 | |
|     if (currentCell != null) {
 | |
|       currentCell.className="cellBlur";
 | |
|     }
 | |
| 
 | |
|   // else do nothing
 | |
| }
 | |
| 
 | |
| // very specific function to change the styles on the page
 | |
| function doColor(colorScheme) {
 | |
| 
 | |
|   // get the styles
 | |
|   var oSS = pageGetStyleSheet("basic", null);
 | |
|   var ssRules = cssGetRules(oSS);
 | |
| 
 | |
|   var colorArray;
 | |
|   if (ssRules != null) {
 | |
|     switch(colorScheme) {
 | |
|       case "grey":
 | |
|         colorArray = new Array("#C0C0C0","#F5F5F5","#999999","#F5F5F5");
 | |
|         changeColors(ssRules, colorArray);
 | |
|         break;
 | |
|       case "blues":
 | |
|         colorArray = new Array("#00CED1", "#B0E0E6","#000080","#E0FFFF");
 | |
|         changeColors(ssRules, colorArray);
 | |
|         break;
 | |
|       case "green":
 | |
|         colorArray = new Array("#3CB371","#90EE90","#008000","#F0FFF0");
 | |
|         changeColors(ssRules, colorArray);
 | |
|         break;
 | |
|       case "rose":
 | |
|         colorArray = new Array("#CD5C5C","#F08080","#800000","#FFE4E1");
 | |
|         changeColors(ssRules, colorArray);
 | |
|       default:
 | |
|         // do nothing
 | |
|       break;
 | |
|     } // end switch
 | |
|   }
 | |
| 
 | |
|   return false; // do not propagate
 | |
| }
 | |
| function changeColors(ssRules, colorArray) {
 | |
|   var theRule;
 | |
|   // menubar background-color
 | |
|   theRule = cssGetRule(ssRules, "menubar");
 | |
|   changeStyleRule(theRule, "background-color", colorArray[0]);
 | |
|   // menu background-color
 | |
|   theRule = cssGetRule(ssRules, "menu");
 | |
|   changeStyleRule(theRule, "background-color", colorArray[0]);
 | |
|   theRule = cssGetRule(ssRules,"topMenu");
 | |
|   changeStyleRule(theRule,  "border-color", colorArray[0]);
 | |
|   changeStyleRule(theRule, "background-color", colorArray[0]);
 | |
|   theRule = cssGetRule(ssRules, "cellFocusSelect");
 | |
|   changeStyleRule(theRule, "background-color", colorArray[0]);
 | |
|   theRule = cssGetRule(ssRules, "table");
 | |
|   changeStyleRule(theRule, "border-color", colorArray[0]);
 | |
|   theRule = cssGetRule(ssRules, "menudrop");
 | |
|   changeStyleRule(theRule, "background-color", colorArray[1]);
 | |
|   changeStyleRule(theRule, "border-color",colorArray[1]);
 | |
|   theRule = cssGetRule(ssRules, "cellSelect");
 | |
|   changeStyleRule(theRule, "background-color", colorArray[3]);
 | |
|   theRule = cssGetRule(ssRules, "topMenu:focus");
 | |
|   changeStyleRule(theRule, "border-color", colorArray[2]);
 | |
|   changeStyleRule(theRule, "background-color", colorArray[2]);
 | |
|   theRule = cssGetRule(ssRules, "topMenu:hover");
 | |
|   changeStyleRule(theRule,  "border-color", colorArray[2]);
 | |
|   changeStyleRule(theRule, "background-color", colorArray[2]);
 | |
|   theRule = cssGetRule(ssRules, "menuitem:focus");
 | |
|   changeStyleRule(theRule,  "border-color", colorArray[2]);
 | |
|   changeStyleRule(theRule,  "background-color", colorArray[2]);
 | |
|   theRule = cssGetRule(ssRules, "menuitem:hover");
 | |
|   changeStyleRule(theRule, "border-color", colorArray[2]);
 | |
|   changeStyleRule(theRule, "background-color", colorArray[2]);
 | |
|   //theRule = cssGetRule(ssRules, "action");
 | |
|   //changeStyleRule(theRule,  "color", colorArray[2]);
 | |
|   theRule = cssGetRule(ssRules, "cellBlur");
 | |
|   changeStyleRule(theRule,  "backgournd-color", colorArray[3]);
 | |
| 
 | |
| 
 | |
| 
 | |
| }
 | |
| function doTotals(tableId, key) {
 | |
| // simple function to do some totaling of information in the table
 | |
| // hard coded to the format of this particular table (i.e. for demo purposes only - NOT general purpose)
 | |
| // id of the table containing the data
 | |
| // keyName - item name we are totaling
 | |
| // column numbers are hard coded
 | |
| 
 | |
| var DATE_COL = 1;
 | |
| var EXPENSE_COL = 2;
 | |
| var display= "no results";
 | |
| var results;
 | |
| bEventContinue = false;
 | |
| try {
 | |
|   var activeTable = document.getElementById(tableId);
 | |
|   var tableRows = activeTable.rows;
 | |
| 
 | |
|   //var prevRow = rows[currentRow];
 | |
|   //        prevCell = prevRow.cells[currentCol];
 | |
|   var lcKey = key.toLowerCase();
 | |
|   if (lcKey == "date") {
 | |
|     display = "";
 | |
|     var exception = "";
 | |
|     var dates = new Array();
 | |
|     // find all unique dates then total each
 | |
|     for(var i=1; i<tableRows.length; i++) {
 | |
|       exception="";  //reset
 | |
|       var bFound = false;
 | |
|       var dateCell = tableRows[i].cells[DATE_COL];
 | |
|         if (dateCell.firstChild && dateCell.firstChild.data) {
 | |
|             var cellData =dateCell.firstChild.data;
 | |
|             if (i == 1) {
 | |
|               // first cell - force adding date to array
 | |
|               bFound = false;
 | |
|             }
 | |
|             else {
 | |
|               // see if date already exists in array
 | |
|               for(var j=0; j<dates.length; j++) {
 | |
|                 if (dates[j] == cellData) {
 | |
|                   bFound = true;
 | |
|                   break;
 | |
|                 }
 | |
|               }
 | |
|             } // end of else
 | |
|             if (bFound == false) {
 | |
|               dates[dates.length] = cellData;
 | |
|               results = getData(tableRows,cellData,DATE_COL);
 | |
|               if (results.length > 0) {
 | |
|                 var total = calcTotal(results);
 | |
|                 if (total > 1000) {
 | |
|                   exception = " !!! EXCEPTION: daily total over $1000 !!!"
 | |
|                 }
 | |
|                 display += "Total for " + cellData + " is $" + total + exception + "\n";
 | |
| 
 | |
|               }
 | |
|             }
 | |
|           } // end of if celldata
 | |
|         } // end of for
 | |
|   } // end of if date
 | |
|   else {
 | |
|     results = getData(tableRows,lcKey,EXPENSE_COL);
 | |
|     if (results.length > 0) {
 | |
|         var total = calcTotal(results);
 | |
|         display = "Total for " + key + " is $" + total;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   gAlertString = display;
 | |
|   setTimeout("delayedAlert(gAlertString);",0);
 | |
| 
 | |
| } catch (error) {
 | |
|   alert("DEBUG- error in doTotals() " + error.message);
 | |
|   bEventContinue = true;
 | |
| }
 | |
|   return bEventContinue;
 | |
| }
 | |
| function getData(tableRows,lcKey, colNum) {
 | |
| // find all rows that contain key and store amount contents in array
 | |
| var AMOUNT_COL = 3;
 | |
|   var results = new Array();
 | |
|   for (var i=1; i<tableRows.length; i++) {
 | |
|     var keyCell = tableRows[i].cells[colNum];
 | |
|     if (keyCell.firstChild && keyCell.firstChild.data) {
 | |
|       var cellData =keyCell.firstChild.data;
 | |
|       cellData = cellData.toLowerCase();
 | |
|       if (cellData.indexOf(lcKey) > -1) {
 | |
|         var amtCell  = tableRows[i].cells[AMOUNT_COL];
 | |
|         var data = amtCell.firstChild.data; // lots of assumptions here!!!
 | |
|          results[results.length] = data;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return results;
 | |
| }
 | |
| function calcTotal(results) {
 | |
|   // results is array of strings to total - may have $
 | |
|   var total =0;
 | |
|   for (var i=0;  i < results.length; i++) {
 | |
|     var value = null;
 | |
|     var amt = results[i];
 | |
|     var idx = amt.indexOf('$');
 | |
|     if (idx > -1) {
 | |
|       amt = amt.substring(idx+1); // assumes only one $ and it is at the beginning
 | |
|     }
 | |
|     value = parseFloat(amt, 10);
 | |
|     if (value != NaN) {
 | |
|       total += value;
 | |
|     }
 | |
|   }
 | |
|   return total.toFixed(2);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| -->
 | |
| </script>
 | |
| <style type="text/css" id="basic" title="basic">
 | |
| table {
 | |
|  empty-cells:show;
 | |
|  border-collapse: collapse;  // Show empty table cells in IE
 | |
| }
 | |
| 
 | |
| .menubar {
 | |
|   background-color:#C0C0C0;
 | |
| }
 | |
| .menu {
 | |
|   float:left;
 | |
|   width:5em;
 | |
|   padding:1px 3px;
 | |
|   background-color:#C0C0C0;
 | |
|   color:black;
 | |
| 
 | |
| }
 | |
| .menudrop {
 | |
|   display:none;
 | |
|   background-color:#F5F5F5;
 | |
|   width:150%;
 | |
|   border: solid #999999 1px;
 | |
| 
 | |
| 
 | |
| }
 | |
| .menusub {
 | |
|   display:none;
 | |
|   background-color:#F5F5F5;
 | |
|   border:solid #999999 1px;
 | |
|   position:absolute;
 | |
|   width:25%;
 | |
| }
 | |
| 
 | |
| .content {
 | |
|   margin-top:2em;
 | |
|   position:absolute;
 | |
|   clear:both;
 | |
| 
 | |
| }
 | |
| .topMenu {
 | |
|   border-style:solid;
 | |
|   border-color:#C0C0C0;
 | |
|   border-width:1px;
 | |
|   background-color:#C0C0C0;
 | |
| }
 | |
| 
 | |
| .topMenu:focus {
 | |
|   background-color:#999999;
 | |
|   border-style:dashed;
 | |
|   border-color:#999999;
 | |
|   border-width:1px;
 | |
|   color:white;
 | |
| }
 | |
| .topMenu:hover {
 | |
|   background-color:#999999;
 | |
|   border-style:dashed;
 | |
|   border-color:#999999;
 | |
|   border-width:1px;
 | |
|   color:white;
 | |
| }
 | |
| 
 | |
| .menuitem {
 | |
|   border-style:solid;
 | |
|   border-color:#F5F5F5;
 | |
|   border-width:1px;  /*color must be the same as background color (which is inherited from .menudrop) */
 | |
|   text-align:justify;
 | |
| }
 | |
| .menuitem:focus {
 | |
|   color:white;
 | |
|   background-color:#999999;
 | |
|   border-style:dashed;
 | |
|   border-color:#999999;
 | |
|   border-width:1px;
 | |
| 
 | |
| }
 | |
| .menuitem:hover {
 | |
|   background-color:#999999;
 | |
|   border-style:dashed;
 | |
|   border-color:#999999;
 | |
|   border-width:1px;
 | |
|   color:white;
 | |
| 
 | |
| }
 | |
| .menuitem[aria-disabled="true"] {
 | |
|   color:#666666;
 | |
| }
 | |
| .rowSelected {
 | |
|   background-color:#66CCCC;
 | |
| 
 | |
| }
 | |
| td[aria-readonly="true"] {
 | |
|   color:#666666;
 | |
| }
 | |
| .cellFocusSelect {
 | |
|   background-color:#CCCCCC;
 | |
|   outline: 1px dashed green;
 | |
| 
 | |
| }
 | |
| .cellFocus {
 | |
|   outline: 1px dashed green;
 | |
| }
 | |
| 
 | |
| .cellSelect {
 | |
|   background-color:#DCDCDC;
 | |
| }
 | |
| .cellBlur {
 | |
|   border-width:1px ;
 | |
|   border-style:dotted;
 | |
|   border-color:#999999;
 | |
|   background-color:#F5F5F5;
 | |
| }
 | |
| table, th, td {
 | |
| 
 | |
|   border-width:2px;
 | |
|   border-style:groove;
 | |
|   border-color:#CCCCCC;
 | |
| 
 | |
| }
 | |
| 
 | |
| .action {
 | |
|   color:#0000FF;
 | |
|   text-decoration:underline;
 | |
| }
 | |
| a:visited {
 | |
|   color:#000066;
 | |
| }
 | |
| 
 | |
| .leftCellHi {
 | |
|   border-left:2px dotted #00FF00;
 | |
|   border-top:2px dotted #00FF00;
 | |
|   border-bottom:2px dotted #00FF00;
 | |
| }
 | |
| .middleCellHi {
 | |
|   border-top:2px dotted #00FF00;
 | |
|   border-bottom:2px dotted #00FF00;
 | |
| }
 | |
| 
 | |
| .rightCellHi {
 | |
|   border-right:2px dotted #00FF00;
 | |
|   border-top:2px dotted #00FF00;
 | |
|   border-bottom:2px dotted #00FF00;
 | |
| }
 | |
| .nosize {
 | |
|   position:absolute;
 | |
|   width:0px;
 | |
|   height:0px;
 | |
|   overflow:hidden;
 | |
| }
 | |
| 
 | |
| 
 | |
| </style>
 | |
| 
 | |
| <style type="text/css"></style></head>
 | |
| <body onkeydown="topMenu.doMenu(event);" role="application" onload="gFocusItem = document.getElementById('table2'); setTimeout('doFocus();',0); ">
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| <h1>Accessible Widgets </h1>
 | |
|   
 | |
| 
 | |
| <div style="position:absolute;z-index:2;">
 | |
| <div id="theMenuBar" class="menubar" role="menubar" onkeydown="return topMenu.doNavigation(event);" tabindex="-1">
 | |
|   <div class="menu" id="edit" onclick="topMenu.showMenu(event, this.id, false);" onkeydown="if (event.keyCode == 13 ) {topMenu.showMenu(event, this.id, true);}" onmouseover="topMenu.showMenu(event,this.id,false);" onmouseout="topMenu.hideMenu(event);">
 | |
|     <div tabindex="-1" role="menuitem" aria-haspopup="true" id="edittop" class="topMenu">Edit</div>
 | |
|     <div class="menudrop" role="menu" id="editItems">
 | |
|       <div id="cut" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do Cut');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'do cut');}" onmouseover="topMenu.focusItem(event,0,0);">Cut</div>
 | |
|       <div id="copy" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do Copy');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'do copy');}" onmouseover="topMenu.focusItem(event,0,1);">Copy</div>
 | |
|       <div id="paste" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do Paste');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'do paste');}" onmouseover="topMenu.focusItem(event,0,1);">Paste</div>
 | |
|     </div>
 | |
|   </div>
 | |
|   <div class="menu" id="2" onclick="topMenu.showMenu(event, this.id,false);" onkeydown="if (event.keyCode == 13 ) {topMenu.showMenu(event, this.id, true);}" onmouseover="topMenu.showMenu(event,this.id,false);" onmouseout="topMenu.hideMenu(event);">
 | |
|     <div tabindex="-1" role="menuitem" aria-haspopup="true" id="2top" class="topMenu">View</div>
 | |
|     <div class="menudrop" role="menu" id="2Items" style="display:none;">
 | |
|       <div tabindex="-1" role="menuitem" aria-haspopup="true" id="2.1sub" class="menuitem" onkeydown="if (event.keyCode == 13 ) {return topMenu.showSubMenu(event,this.id);}">Themes          ></div>
 | |
|         <div class="menusub" role="menu" id="2.1subItems" style="display:none;">
 | |
|           <div id="2.1.1" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionColor(event,'grey');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionColor(event,'grey');}">Basic Grey </div>
 | |
|           <div id="2.1.2" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionColor(event,'blues');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionColor(event,'blues');}">The Blues</div>
 | |
|           <div id="2.1.3" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionColor(event,'green');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionColor(event,'green');}">Garden</div>
 | |
|           <div id="2.1.4" tabindex="-1" role="menuitem" class="menuitem" aria-disabled="true" onclick="return topMenu.doAlert(event,this,'do Item4');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionColor(event,'pink');}">In the Pink</div>
 | |
|           <div id="2.1.5" tabindex="-1" role="menuitem" class="menuitem" oonclick="return topMenu.doActionColor(event,'rose');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionColor(event,'rose');}">Rose </div>
 | |
|         </div><!-- end themes sub menu items -->
 | |
|         <div tabindex="-1" role="menuitem" class="menuitem" id="2.2">Hide</div>
 | |
|         <div tabindex="-1" role="menuitem" class="menuitem" id="2.3">Show</div>
 | |
|         <div tabindex="-1" role="menuitem" aria-haspopup="true" id="2.4sub" class="menuitem" onclick="return topMenu.showSubMenu(event,this.id);" onkeydown="if (event.keyCode == 13 ) {return topMenu.showSubMenu(event,this.id);}">More                ></div>
 | |
|         <!--<div tabindex="-1" role="menuitem" class="menuitem" id="2.4sub" onclick="return topMenu.showSubMenu(event,this.id);" onkeydown="if (event.keyCode == 13 ) {return topMenu.showSubMenu(event,this.id);}">More                ></div> -->
 | |
|           <div class="menusub" role="menu" id="2.4subItems" style="display:none">
 | |
|             <div id="2.4.1" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do Something 1');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'doSomething 1');}">one </div>
 | |
|             <div id="2.4.2" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do Something 2');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'doSomething 2');}">two</div>
 | |
|           </div> <!-- end of more sub menu -->
 | |
|       </div><!-- end View drop menu -->
 | |
|     </div>
 | |
|   <div class="menu" id="3" onclick="topMenu.showMenu(event, this.id,false);" onkeydown="if (event.keyCode == 13 ) {topMenu.showMenu(event, this.id, true);}" onmouseover="topMenu.showMenu(event,this.id,false);" onmouseout="topMenu.hideMenu(event);">
 | |
|   <div tabindex="-1" role="menuitem" aria-haspopup="true" id="3top" class="topMenu">Tools</div>
 | |
|         <div class="menudrop" role="menu" id="3Items" style="display:none;">
 | |
|           <div id="3.1" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do spell check');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'do spell check');}">Spelling...</div>
 | |
|           <div id="3.2" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do error checking');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'do error checking');}">Error Checking...</div>
 | |
|           <div id="3.3sub" tabindex="-1" role="menuitem" aria-haspopup="true" class="menuitem" onclick="return topMenu.showSubMenu(event,this.id);;" onkeydown="if (event.keyCode == 13) {return topMenu.showSubMenu(event,this.id);}">Show Rows    ></div>
 | |
|           <div class="menusub" role="menu" id="3.3subItems" style="display:none">
 | |
|                       <div id="3.3.1" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'highlight even rows');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'highlight even rows');}">even</div>
 | |
|                       <div id="3.3.2" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'highlight odd rows');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'hghlight odd rows');}">odd</div>
 | |
|                       <div id="3.3.3" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'highlight all rows');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'highlight all rows');}">all</div>
 | |
|           </div> <!-- end of more sub menu -->
 | |
|           <div id="3.4" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'do Options');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'do Options');}">Options... </div>
 | |
|         </div>
 | |
|   </div>
 | |
|   <div class="menu" id="four" onclick="topMenu.showMenu(event, this.id,false);" onkeydown="if (event.keyCode == 13 ) {topMenu.showMenu(event, this.id, true);}" onmouseover="topMenu.showMenu(event,this.id,false);" onmouseout="topMenu.hideMenu(event);">
 | |
|   <div tabindex="-1" role="menuitem" aria-haspopup="true" id="fourtop" class="topMenu">Totals</div>
 | |
|         <div class="menudrop" role="menu" id="fourItems" style="display:none;">
 | |
|           <div id="4.1" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionTotal(event,'table2','lodging');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionTotal(event,'table2','lodging');}">Lodging </div>
 | |
|           <div id="4.2" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionTotal(event,'table2','breakfast');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionTotal(event,'table2','breakfast');}">Breakfast </div>
 | |
|           <div id="4.3" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionTotal(event,'table2','lunch');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionTotal(event,'table2','lunch');}">Lunch </div>
 | |
|           <div id="4.4" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionTotal(event,'table2','dinner');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionTotal(event,'table2','dinner');}">Dinner </div>
 | |
|           <div id="4.5" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doActionTotal(event,'table2','date');" onkeydown="if (event.keyCode == 13) {return topMenu.doActionTotal(event,'table2','date');}">By Date </div>
 | |
|         </div>
 | |
|   </div>
 | |
|   <div class="menu" id="five" onclick="topMenu.showMenu(event, this.id,false);" onkeydown="if (event.keyCode == 13 ) {topMenu.showMenu(event, this.id, true);}" onmouseover="topMenu.showMenu(event,this.id,false);" onmouseout="topMenu.hideMenu(event);">
 | |
|   <div tabindex="-1" role="menuitem" aria-haspopup="true" id="fivetop" class="topMenu">Help</div>
 | |
|         <div class="menudrop" role="menu" id="fiveItems" style="display:none;">
 | |
|           <div id="5.1" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'Show Help Index');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'Show Help index');}">Help Index</div>
 | |
|           <div id="5.2" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'Show navigation help');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'Show navigation help');}">Navigation Help</div>
 | |
|           <div id="5.3" tabindex="-1" role="menuitem" class="menuitem" onclick="return topMenu.doAlert(event,this,'DHTML roadmap Example, March 2005');" onkeydown="if (event.keyCode == 13) {topMenu.doAlert(event,this,'DHTML Roadmap example, March 2005');}">About</div>
 | |
| 
 | |
|         </div>
 | |
|   </div>
 | |
| </div>
 | |
| </div>
 | |
| 
 | |
| <div class="content">
 | |
| <div style="height:20em; overflow:auto;">
 | |
| <table tabindex="0" border="2" cellspacing="0" id="table2" role="grid" onkeydown=" return doTableKeys(event);" onfocus="setCell(this.id);">
 | |
| <thead>
 | |
| <tr>
 | |
|   <th tabindex="-1" role="columnheader" id="colhead1" style="width:6em" onclick="doClick(event,0,0);" onkeydown="if (event.keyCode==13) {return doLink('aEntry');}" class="cellFocusSelect"><span class="action" title="Sort by Entry #" onclick="alert('sort column on click');" tabindex="-1" id="aEntry">Entry #</span></th>
 | |
|   <th tabindex="-1" role="columnheader" id="colhead2" onclick="doClick(event,0,1);" onkeydown="if (event.keyCode==13) {return doLink('aDate');}" style="width:10em"><span class="action" title="Sort by Date" onclick="alert('sort column on click');" tabindex="-1" id="aDate">Date</span></th>
 | |
|   <th tabindex="-1" role="columnheader" id="colhead3" onclick="doClick(event,0,2);" onkeydown="if (event.keyCode==13) {return doLink('aExpense');}" style="width:20em"><span class="action" title="Sort by Expense Name" onclick="alert('sort column on click');" tabindex="-1" id="aExpense">Expense</span></th>
 | |
|   <th tabindex="-1" role="columnheader" id="colhead4" onclick="doClick(event,0,3);" onkeydown="if (event.keyCode==13) {return doLink('aAmount');}" style="width:8em"><span class="action" title="Sort by Amount" onclick="alert('sort column on click');" tabindex="-1" id="aAmount">Amount</span></th>
 | |
|   <th tabindex="-1" role="columnheader" id="colhead5" onclick="doClick(event,0,4);" onkeydown="if (event.keyCode==13) {return doLink('aMerchant');}" style="width:15em"><span class="action" title="Sort by Merchant" onclick="alert('sort column on click');" tabindex="-1" id="aMerchant">Merchant</span></th>
 | |
|   <th tabindex="-1" role="columnheader" id="colhead6" style="width:8em"><span>Type</span></th>
 | |
| 
 | |
| </tr>
 | |
| </thead>
 | |
| <tbody>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,1,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">1</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" id="testCell" onclick="doClick(event,1,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}">03/14/05</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,1,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}">Conference Fee</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,1,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}">$449.00</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,1,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}">CSUN Center on Disability</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,1,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}">credit</td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,2,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">2</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,2,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}">03/15/05</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,2,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}">lodging</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,2,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}">$119.00</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,2,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}">LAX Hilton</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,2,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}">credit</td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,3,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">3</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,3,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}">03/15/05</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,3,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}">dinner</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,3,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}">$24.00</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,3,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}">Chili's</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,3,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}">cash</td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,4,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">4</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,4,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}">03/16/05</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,4,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}">lodging</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,4,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}">$119.00</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,4,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}">LAX Hilton</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,4,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}">credit</td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,5,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">5</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,5,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}">03/16/05</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,5,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}">breakfast</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,5,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}">$6.50</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,5,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}">Starbucks</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,5,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}">cash</td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,6,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">6</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,6,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}">03/16/05</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,6,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}">lunch</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,6,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}">$9.35</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,6,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}">Super Sub Stop</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,6,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}">cash</td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,7,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">7</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,7,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}">03/16/05</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,7,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}">dinner</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,7,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}">$40.00</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,7,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}">Davio's</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,7,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}">credit</td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,8,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">8</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,8,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,8,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,8,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,8,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,8,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,9,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">9</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,9,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,9,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,9,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,9,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,9,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,10,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">10</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,10,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,10,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,10,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,10,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,10,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,11,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">11</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,11,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,11,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,11,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,11,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,11,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,12,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">12</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,12,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,12,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,12,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,12,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,12,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,13,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">13</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,13,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,13,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,13,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,13,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,13,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,14,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">14</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,14,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,14,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,14,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,14,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,14,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,15,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">15</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,15,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,15,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,15,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,15,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,15,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,16,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">16</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,16,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,16,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,16,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,16,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,16,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,17,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">17</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,17,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,17,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,17,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,17,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,17,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| <tr>
 | |
|   <td tabindex="-1" role="rowheader" aria-readonly="true" onclick="doClick(event,18,0);" ondblclick="doEdit(event,this,0);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,0);return false;}">18</td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,18,1);" ondblclick="doEdit(event,this,1);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,1);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,18,2);" ondblclick="doEdit(event,this,2);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,2);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,18,3);" ondblclick="doEdit(event,this,3);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,3);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,18,4);" ondblclick="doEdit(event,this,4);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,4);return false;}"></td>
 | |
|   <td tabindex="-1" role="gridcell" aria-selected="false" onclick="doClick(event,18,5);" ondblclick="doEdit(event,this,5);" onkeydown="if (event.keyCode == 13) { doEdit(event,this,5);return false;}"></td>
 | |
| </tr>
 | |
| </tbody>
 | |
| </table>
 | |
| </div>
 | |
| </form>
 | |
| </div>
 | |
| </body>
 | |
| </html>
 |