// Licensed Materials - Property of IBM
//
// 5724-D34   (Product: IBM HATS)
//
// (C) Copyright IBM Corp. 2002, 2004  All Rights Reserved

/***********************************************************
 * NOTICE: DO NOT MODIFY THE FOLLOWING VARIABLES!!
 ***********************************************************/
 var CODE_BACKSPACE = 8;
 var CODE_TAB       = 9;
 var CODE_ENTER     = 13;
 var CODE_PAUSE     = 19;
 var CODE_ESC       = 27;
 var CODE_PAGEUP    = 33;
 var CODE_PAGEDOWN  = 34;
 var CODE_END       = 35;
 var CODE_HOME      = 36;
 var CODE_INSERT    = 45;
 var CODE_DELETE    = 46;
 var CODE_A         = 65;
 var CODE_B         = 66;
 var CODE_C         = 67;
 var CODE_D         = 68;
 var CODE_E         = 69;
 var CODE_F         = 70;
 var CODE_G         = 71;
 var CODE_H         = 72;
 var CODE_I         = 73;
 var CODE_J         = 74;
 var CODE_K         = 75;
 var CODE_L         = 76;
 var CODE_M         = 77;
 var CODE_N         = 78;
 var CODE_O         = 79;
 var CODE_P         = 80;
 var CODE_Q         = 81;
 var CODE_R         = 82;
 var CODE_S         = 83;
 var CODE_T         = 84;
 var CODE_U         = 85;
 var CODE_V         = 86;
 var CODE_W         = 87;
 var CODE_X         = 88;
 var CODE_Y         = 89;
 var CODE_Z         = 90;
 var CODE_F1        = 112;
 var CODE_F2        = 113;
 var CODE_F3        = 114;
 var CODE_F4        = 115;
 var CODE_F5        = 116;
 var CODE_F6        = 117;
 var CODE_F7        = 118;
 var CODE_F8        = 119;
 var CODE_F9        = 120;
 var CODE_F10       = 121;
 var CODE_F11       = 122;
 var CODE_F12       = 123;
 var HostKey        = 1;
 var ApplicationKey = 2;
 var CODE_PLUS      = 107;
 var CODE_MINUS     = 109;
 
/***********************************************************
 * NOTICE: DO NOT MODIFY THE ABOVE VARIABLES!!
 ***********************************************************/

 var defaultKeyMappings = [
 // KEYCODE,       ALT, CTRL, SHIFT, MNEMONIC
 //============ command key mappings ================
   [CODE_ENTER,      0,    0,     0, '[enter]'     ],
   [CODE_PAUSE,      0,    0,     0, '[attn]'      ],
   [CODE_ESC,        0,    0,     0, '[clear]'     ],
   [CODE_ESC,        0,    0,     1, '[sysreq]'    ],
   [CODE_R,          0,    1,     0, '[reset]'     ],
   [CODE_PAGEUP,     0,    0,     0, '[pageup]'    ],
   [CODE_PAGEUP,     1,    0,     0, 'refresh'     ],
   [CODE_PAGEDOWN,   0,    0,     0, '[pagedn]'    ],
   [CODE_PAGEDOWN,   1,    0,     0, '[pa3]'       ],
   [CODE_END,        1,    0,     0, '[pa2]'       ],
   [CODE_INSERT,     1,    0,     0, 'default'     ],
   [CODE_DELETE,     1,    0,     0, '[pa1]'       ],
   [CODE_D,          0,    1,     0, 'disconnect'  ],
   [CODE_H,          0,    1,     0, '[help]'      ],
   [CODE_P,          0,    1,     0, '[printhost]' ],   
   [CODE_J,          0,    1,     0, 'printjobs'   ],
   [CODE_ENTER,      1,    0,     0, 'reverse'     ],   
   [CODE_K,          0,    1,     0, 'toggle'      ],
   [CODE_S,          0,    1,     0, 'ResetButton' ],   
 //============ function key mappings ===============
   [CODE_F1,         0,    0,     0, '[pf1]'       ],
   [CODE_F1,         0,    0,     1, '[pf13]'      ],
   [CODE_F2,         0,    0,     0, '[pf2]'       ],
   [CODE_F2,         0,    0,     1, '[pf14]'      ],
   [CODE_F3,         0,    0,     0, '[pf3]'       ],
   [CODE_F3,         0,    0,     1, '[pf15]'      ],
   [CODE_F4,         0,    0,     0, '[pf4]'       ],
   [CODE_F4,         0,    0,     1, '[pf16]'      ],
   [CODE_F5,         0,    0,     0, '[pf5]'       ],
   [CODE_F5,         0,    0,     1, '[pf17]'      ],
   [CODE_F6,         0,    0,     0, '[pf6]'       ],
   [CODE_F6,         0,    0,     1, '[pf18]'      ],
   [CODE_F7,         0,    0,     0, '[pf7]'       ],
   [CODE_F7,         0,    0,     1, '[pf19]'      ],
   [CODE_F8,         0,    0,     0, '[pf8]'       ],
   [CODE_F8,         0,    0,     1, '[pf20]'      ],
   [CODE_F9,         0,    0,     0, '[pf9]'       ],
   [CODE_F9,         0,    0,     1, '[pf21]'      ],
   [CODE_F10,        0,    0,     0, '[pf10]'      ],
   [CODE_F10,        0,    0,     1, '[pf22]'      ],
   [CODE_F11,        0,    0,     0, '[pf11]'      ],
   [CODE_F11,        0,    0,     1, '[pf23]'      ],
   [CODE_F12,        0,    0,     0, '[pf12]'      ],
   [CODE_F12,        0,    0,     1, '[pf24]'      ],
   [CODE_ENTER,      0,    1,     0, '[fldext]'    ],
   [CODE_PLUS,       0,    1,     0, '[field+]'    ],
   [CODE_MINUS,      0,    1,     0, '[field-]'    ]
 ];

 //***********************************************************************************
 //* Due to limitations in how the Macintosh Safari browser maps keys to ordinal 
 //* values, we have the need to remove the Function key defnitions from the default
 //* keymap.  If the mac safari browser is detected in keyboard init, we'll swap the
 //* table defined below out for the default table defined above.
 //***********************************************************************************
  var macSafariKeyMappings = [
// KEYCODE,       ALT, CTRL, SHIFT, MNEMONIC
//============ command key mappings ================
  [CODE_ENTER,      0,    0,     0, '[enter]'     ],
  [CODE_PAUSE,      0,    0,     0, '[attn]'      ],
  [CODE_ESC,        0,    0,     0, '[clear]'     ],
  [CODE_ESC,        0,    0,     1, '[sysreq]'    ],
  [CODE_R  ,        0,    1,     0, '[reset]'     ],
  [CODE_PAGEUP,     1,    0,     0, 'refresh'     ],
  [CODE_PAGEDOWN,   0,    0,     0, '[pagedn]'    ],
  [CODE_PAGEDOWN,   1,    0,     0, '[pa3]'       ],
  [CODE_END,        1,    0,     0, '[pa2]'       ],
  [CODE_INSERT,     1,    0,     0, 'default'     ],
  [CODE_DELETE,     1,    0,     0, '[pa1]'       ],
  [CODE_D,          0,    1,     0, 'disconnect'  ],
  [CODE_H,          0,    1,     0, '[help]'      ],
  [CODE_P,          0,    1,     0, '[printhost]' ],   
  [CODE_J,          0,    1,     0, 'printjobs'   ],
  [CODE_ENTER,      1,    0,     0, 'reverse'     ],   
  [CODE_K,          0,    1,     0, 'toggle'      ],
  [CODE_S,          0,    1,     0, 'ResetButton' ],   
  [CODE_ENTER,      0,    1,     0, '[fldext]'    ],
];

var applicationKeys =[
   'disconnect',
   'refresh',
   'printjobs',
   'toggle',
   'default',
   'reverse',
   'ResetButton'                                    
 ];

var MAC = false;                                                
if ((navigator.userAgent.toLowerCase().indexOf("mac")!=-1))  
    MAC=true;                                                                                           
var macSafari = false;
if( MAC && (navigator.userAgent.toLowerCase().indexOf('safari')!=-1) )
    macSafari = true;

var NS6 = document.getElementById;
if (NN) NS6=true;
else
   NS6 = false;
   
var other = (!IE)&&(!NS6);

var preventDefault = false;
var keyHandlingEnabled = true;
var HostButtonList = new Array();
var ApplicationButtonList = new Array();
var toggleKeyCodeIndex,toggleKeyCode;
var NoHostKeypadButtons = true;
var bDebug = false;
var beInited = false;
var PortletKBInited = new Array();
var HATSPortletKBInited= new Array()
var toggleButtons = new Array();
var toggleButtonArraySize = 0;
var toggleLinks = new Array();
var toggleLinkArraySize = 0;
var toggleSearched = false;
var pjw;
var isKeySent = false;
var kbdSupportAll = false;


document.onkeypress = keypresshandler;
document.onkeydown = keydownhandler;
document.onkeyup = keyuphandler;


document.onhelp = function() { 
    if(other) return true;
    keyboard_init();
  if (preventDefault)
  {
    if (bDebug)
       alert("Hot-key F1(CTRL/SHIFT-F1) no longer brings up the help window!!");
    preventDefault = false;
    return false;
  }
}
document.oncontextmenu = function(e) { 
    if(other) return true;
    keyboard_init();
  if (preventDefault)
  {
    if(bDebug)
      alert("Blocking context menu in NS6 the similar way as blocking help window in IE...");
    preventDefault = false;
    return false;
  }
}

function toggleKeyboard(pID) {
        setHatsFocus(pID);
  if(other) return;
  keyboard_init();
 
  keyHandlingEnabled = !keyHandlingEnabled;
  if(bDebug)
      alert("keyHandlingEnabled status after toggled=" + keyHandlingEnabled);
  if (keyHandlingEnabled)
  {
      hatsForm.KeyboardToggle.value = "1";
  }
  else
  {
      hatsForm.KeyboardToggle.value = "0";
  }
  
  //if(pID != null && pID != "hatsportletid")
  //{   
        ms('toggle',pID);
  //}
  //else
  //{
  //    changeToggleCaptions();
  //}
}

document.onclick = clickhandler;
function clickhandler(e){
	e = (e) ? e : ((window.event) ? window.event : "");
	var element = (IE) ? e.srcElement : e.target;
	forceChange(element);   
    if(element.disabled==false){
        if(element.type == "radio"){
            pool = element.name.split("_");
            if(pool.length>=3) 
            {
                if((pool[0].indexOf("in")!=-1) &&(!isNaN(pool[1]))&&(!isNaN(pool[2]))){
                    if(!(element.checked)) return;
                    if(element.disabled==false)
                        element.blur();
                    if(element.disabled==false)
                        element.focus();
                }
            }
        }
    }
    if(carettrackingenabled||statuswindowenabled) updateCursorPosition(null); //A0 added null
}

function keyuphandler(e) {
	if(other) return true;    

	e = (e) ? e : ((window.event) ? window.event : "");
	var element = (IE&&!MAC) ? e.srcElement : e.target;

	if((enableDBCSSession == true) && (element.tagName == "INPUT") && element.onkeypress != null){
		element.onkeypress();
	}

	if((enableBIDI == "true") && (element.type != "password") && (element.tagName == "INPUT")){ 
        str = element.value;
        var length = str.length; 
                for(i = 0;i < length ;i++) {
                        code = str.charCodeAt(i);
                        if(((code > 64) & (code < 91)) || ((code > 96) & (code < 123))){
                                element.dir = "ltr";
                                break;
                        }
                        else if(code > 1487){
                                element.dir = "rtl";
                                break;
                        }
                }
        }
                
    if(carettrackingenabled||statuswindowenabled) updateCursorPosition(null); //A0 hatsForm.name);
}

function keypresshandler(e) {
   e = (e) ? e : ((window.event) ? window.event : "");

   refreshSafe = false;
        if(other) 
        {
                if (e.keyCode == CODE_ENTER)
                {
                   ms('[enter]');
                   return false;
                }
        return true;
        }
    keyboard_init();
     
   
    
  if (IE || !NS6)  return; 

  if (preventDefault)
  { 
    e.preventDefault(); 
      
        
    if(!(e.keyCode == CODE_F10 && (e.shiftKey)))preventDefault = false;
    return false;
  }
 
}

function keydownhandler(e) {
  e = (e) ? e : ((window.event) ? window.event : "");
  var element = (IE&&!MAC) ? e.srcElement : e.target;
    
  if((enableDBCSSession == true) && (element.tagName == "INPUT") && element.onkeypress != null){
    var a = " " + element.onkeypress;
	if(a.indexOf("allowSBCSOnly") != -1) {
  	  allowSBCSOnly(e);
	  if(e.returnValue == false) return;
	}
  }
  
  if(hatsForm==null) return true;
  if(other) return true;
  keyboard_init();
  preventDefault = false;
  if(hatsForm.name == "HATSForm")
  {
        if(!beInited) return true;
  }
  else
  {
        if(!HATSPortletKBInited[hatsForm.name]) return true;
  }
        
   //if(carettrackingenabled) updateCursorPosition(hatsForm.name);

        
   
  if (!(IE||NS6)) return true; 

  var keyCode = (IE)?(window.event.keyCode):(e.keyCode);
  var altKeyDown = (IE)?(window.event.altKey):(e.altKey);
  var ctrlKeyDown = (IE)?(window.event.ctrlKey):(e.ctrlKey);
  var shiftKeyDown = (IE)?(window.event.shiftKey):(e.shiftKey);


  if( isToggleKey(keyCode,altKeyDown,ctrlKeyDown,shiftKeyDown) && (ApplicationButtonList['toggle']) )
  {
     toggleKeyboard(hatsForm.name); 
     blockDefaultKeyAction(); 

     return false;
  }

  if (!keyHandlingEnabled) return true;

  var target = (IE&&!MAC)?(document.activeElement):(e.target);  

  if(IE){ 
 	if( target.tagName.toLowerCase()=="select"){      
          if(target.onchange){           
          		var a =" "+target.onchange;
                if(a.indexOf('ms')!=-1){   
          			if (  ((keyCode+""=="38") || (keyCode+""=="40")) 
                	&& !(altKeyDown && ctrlKeyDown && shiftKeyDown)
                    ) {   
                    			autoSubmitField=target;             
                    			autoSubmitFieldChanged=true;  
                                if ( keyCode+""=="38") target.selectedIndex-=1; 
                                else if ( keyCode+""=="40") target.selectedIndex+=1; 
                                else target.selectedIndex+=1; 
                                return false;  
                	}else if (  (keyCode+""=="9") 
                	//&& !(altKeyDown && ctrlKeyDown && shiftKeyDown)
                    ) {
                    	forceChange(null);  
                    }
                }
          }
	}
 }

 if(IE && (altKeyDown & (keyCode == CODE_ENTER))){  
        try {
                if(document.all.reverse == null) {
                        blockDefaultKeyAction();
                        return;
                }
        }
        catch(excp) {
                blockDefaultKeyAction();
                return;
        }
 }

  var mappingCount, code;

  mappingCount = defaultKeyMappings.length;

  for (i=0; i<mappingCount; i++)
  {
    code = defaultKeyMappings[i][0];

    if ((code == keyCode)
        && !(defaultKeyMappings[i][1]^altKeyDown)
        && !(defaultKeyMappings[i][2]^ctrlKeyDown)
        && !(defaultKeyMappings[i][3]^shiftKeyDown))
    {
      if((target!=null)&&(defaultKeyMappings[i][4]=="[enter]")) {
        if((target.tagName.toLowerCase()=="a") ||
                ((target.tagName.toLowerCase()=="input")&&
                 ((target.getAttribute("type").toLowerCase()=="button")||(target.getAttribute("type").toLowerCase()=="submit"))
                 )) {                   
                return true;
        }
        if(IE){ 
         if( target.tagName.toLowerCase()=="select"){      
          if(target.onchange)           
          {    
                var a =" "+target.onchange;
                if(a.indexOf('ms')!=-1){   
                	target.onchange();    
                    return false;           
                }
          }
         }
        }
      }
      sendKeyIfEnabled(defaultKeyMappings[i][4]);
      return true;
    }
  }

  return true;
}

var autoSubmitField = null;  
var autoSubmitFieldChanged = false;    
function forceChange(target){  
    if(autoSubmitField!=null){
    	if(autoSubmitFieldChanged){ 
    		if(autoSubmitField!=target){    
    			autoSubmitField.onchange(); 
    		}
    	}
    }
}


function sendKeyIfEnabled(mnemonic) {
    if(other) return;
    keyboard_init();
  if (bDebug) alert("check before sending key... " + mnemonic + "");
 
  if ( (kbdSupportAll) || 
       (NoHostKeypadButtons && !ApplicationButtonList[mnemonic]) ||
       (HostButtonList[mnemonic] | ApplicationButtonList[mnemonic]) )
  {
    blockDefaultKeyAction();
    if(mnemonic == "printjobs")
    {
       openPrintWindow(PrintURL);
    }
    else
    {
       ms(mnemonic,hatsForm.name);
       isKeySent = true;
    }
  }
}

function blockDefaultKeyAction() {
    if(other) return;
    keyboard_init();
  if (IE)
  {
    window.event.keyCode = 0;
    window.event.returnValue = false;
  }
  preventDefault = true;
}

function getToggleKeyCodeIndex(){
    if(other) return 0;
  var mappingCount, code;

  mappingCount = defaultKeyMappings.length;

  for (i=0; i < mappingCount; i++)
  {
    code = defaultKeyMappings[i][0];

    if (defaultKeyMappings[i][4] == "toggle")
    {
       toggleKeyCodeIndex = i;
       return toggleKeyCodeIndex;
    }
  }
}

function getToggleKeyCode(){
    if(other) return 0;
   return defaultKeyMappings[getToggleKeyCodeIndex()][0];
}

function isToggleKey(keyCode,altKeyDown,ctrlKeyDown,shiftKeyDown){
    if(other) return false;
    keyboard_init();
    var code;
    var i = toggleKeyCodeIndex;

    code = defaultKeyMappings[i][0];

    if ((code == keyCode)
        && !(defaultKeyMappings[i][1]^altKeyDown)
        && !(defaultKeyMappings[i][2]^ctrlKeyDown)
        && !(defaultKeyMappings[i][3]^shiftKeyDown))
    {
          return true;
    }
  return false;
}

function keyboard_init(){
  if(other || hatsForm == null ) return;

  if( macSafari )
      defaultKeyMappings = macSafariKeyMappings;

  if(hatsForm.name == "HATSForm")
  {
        if(beInited==true) return;
        beInited = true;
  }else
  {
        
        if(HATSPortletKBInited[hatsForm.name] == null) HATSPortletKBInited[hatsForm.name] = false;
        if(HATSPortletKBInited[hatsForm.name] == true)
        {
                return;
        }
        //setFormObj();  //the form obj must to be reloaded, if this portlet has not done keyboard_init.
        
        for(pID in HATSPortletKBInited)
        {
          HATSPortletKBInited[pID] = false;
          if(pID == hatsForm.name)
          {
                 HATSPortletKBInited[pID] = true;
          }

        }
  }

  toggleKeyCode = getToggleKeyCode();
  InitButtonList();

  if (bDebug)debug_yoyo();

  if (hatsForm.KeyboardToggle.value=="0") keyHandlingEnabled = false; 
  else if (hatsForm.KeyboardToggle.value=="1") keyHandlingEnabled = true;  
}

function whatKindOfKey(mnemonic){
   if(other) return 0;
   keyboard_init();
   for (var i=0 ; i < defaultKeyMappings.length ; i++)
   {
      if(mnemonic == defaultKeyMappings[i][4])
      {
         if(isApplicationKey(mnemonic))
            return ApplicationKey;
         else
            return HostKey;
      }
   }
   return 0;
}

function isApplicationKey(mnemonic){
    if(other) return false;
    keyboard_init();
   for (var i=0 ; i < applicationKeys.length ; i++)
   {
      if(mnemonic == applicationKeys[i])
         return true;
   }
   return false;
}

function InitButtonList(){
    if(other) return;
   var cells,elementNext,cellName;
   var debugOut="";

   cells = document.getElementsByTagName("input");
   for ( var j=0 ; j < cells.length ; j++)
   {
      if(cells[j].getAttribute("accesskey")!= "hatsportletid")
      {
              if(cells[j].getAttribute("accesskey")!= hatsForm.name)
              {
                continue;
              }


      }

      elementNext = cells[j];
      cellName = elementNext.name;
      if (elementNext.type == "button")
      {
         if (bDebug) debugOut = debugOut + "\n" + "   button cellName = " + cellName;
         switch(whatKindOfKey(cellName))
         {
            case 1://HostKey:
               NoHostKeypadButtons = false;
               if (!(elementNext.disabled))
               {
                   HostButtonList[cellName]= true;
                   if (bDebug) debugOut = debugOut + ":=> HostKey \n";
               }
               break;
            case 2://ApplicationKey:
               if (!(elementNext.disabled))
               {
                   ApplicationButtonList[cellName]= true;
                   if (bDebug) debugOut = debugOut + ":=> ApplicationKey \n";
               }
               break;
         }
      }
   }

   cells = document.getElementsByTagName("a");
   for ( var j=0 ; j < cells.length ; j++)
   {
      if(cells[j].getAttribute("accesskey")!= "hatsportletid")
      {
              if(cells[j].getAttribute("accesskey")!= hatsForm.name)
              {
                continue;
              }
      }

      elementNext = cells[j];
      cellName = elementNext.name;
      if (bDebug) debugOut = debugOut + "\n" + "   link cellName = " + cellName;
      switch(whatKindOfKey(cellName))
      {
        case 1://HostKey:
            NoHostKeypadButtons = false;
            if (elementNext.href != "")
            {
                HostButtonList[cellName]= true;
                if (bDebug) debugOut = debugOut + ":=> HostKey \n";
            }
            break;
         case 2://ApplicationKey:
            if (elementNext.href != "")
            {
                ApplicationButtonList[cellName]= true;
                if (bDebug) debugOut = debugOut + ":=> ApplicationKey \n";
            }
            break;
         }
   }
   if (bDebug) alert(debugOut);
}

function debug_yoyo(){
    if(other) return;
    keyboard_init();
  alert("toggleKeyCodeIndex="+toggleKeyCodeIndex+"\n"+"toggleKeyCode="+toggleKeyCode);

  var out="HostButtonList Aray \n============================\n";
  for (member in HostButtonList )
  {
     out = out + member + " = " +HostButtonList[member] +"\n";
  }
  alert(out);
  out="ApplicationButtonList Aray \n============================\n";
  for (member in ApplicationButtonList )
  {
     out = out + member + " = " +ApplicationButtonList[member] +"\n";
  }
  alert(out);
}

function closePrintJobWindow(){
  if (pjw != null) {
        pjw.close();
  }
}

function openPrintWindow(url) {
var features,newX,newY;
   if (IE)
   {
     newX = window.screenLeft + 20;
     newY = window.screenTop + 20;
   }
   if (ns4 || ns6)
   {
     newX = window.screenX + 20;
     newY = window.screenY + 20;
   }
   features = 'resizable,top=' + newY +
                     ',left=' + newX +
                     ',screenX=' + newX +
                     ',screenY=' + newY + ',scrollbars,status,toolbar';
   pjw = window.open(url,"HATSv1PrintJobViewOpenedByEndUser",features );
}

function searchToggles()
{
    var cells;
    
    cells = document.getElementsByTagName("input");
    for (var i=0; i < cells.length; i++)
    {
        if (cells[i].getAttribute("name") == "toggle")
        {
            toggleButtons[toggleButtonArraySize++] = cells[i];
        }
    }
    //search links
    cells = document.getElementsByTagName("a");
    for (var i=0; i < cells.length; i++)
    {
        if (cells[i].getAttribute("name") == "toggle")
        {
            toggleLinks[toggleLinkArraySize++] = cells[i];
        }
    }
    toggleSearched = true;
}
function changeToggleCaptions()
{
    if (!toggleSearched)
    {
        searchToggles();
    }
    var captionText = keyHandlingEnabled ?
                        keyboardOffString:
                        keyboardOnString;
    

    for (var i=0; i < toggleButtons.length; i++)
    {
        toggleButtons[i].value = captionText;
    }
    for (var i=0; i < toggleLinks.length; i++)
    {
        toggleLinks[i].replaceChild(
           document.createTextNode(captionText ),
                 toggleLinks[i].firstChild);
    }

}


