// Licensed Materials - Property of IBM
//
// 5724-D34   (Product: IBM HATS)
//
// (C) Copyright IBM Corp. 2002  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;


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){
	if(event.srcElement.disabled==false){
		if(event.srcElement.type == "radio"){
	        pool = event.srcElement.name.split("_");
	   		if(pool.length>=3) 
	   		{
	   			if((pool[0].indexOf("in")!=-1) &&(!isNaN(pool[1]))&&(!isNaN(pool[2]))){
	   				if(!(event.srcElement.checked)) return;
	            	if(event.srcElement.disabled==false)
	            	    event.srcElement.blur();
	        		if(event.srcElement.disabled==false)
	        			event.srcElement.focus();
	   			}
	   		}
		}
	}
	if(carettrackingenabled||statuswindowenabled) updateCursorPosition();
}

function keyuphandler(e) {
	if(other) return true;    

    if((enableBIDI == "true") && (event.srcElement.type != "password") && (event.srcElement.tagName == "INPUT")){ 
       	str = event.srcElement.value;
        var length = str.length; 
		for(i = 0;i < length ;i++) {
			code = str.charCodeAt(i);
			if(((code > 64) & (code < 91)) || ((code > 96) & (code < 123))){
				event.srcElement.dir = "ltr";
				break;
			}
			else if(code > 1487){
				event.srcElement.dir = "rtl";
				break;
			}
		}
	}
		
    if(carettrackingenabled||statuswindowenabled) updateCursorPosition(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) {
   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)?(document.activeElement):(e.target);  

 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;
      	}
      }
      sendKeyIfEnabled(defaultKeyMappings[i][4]);
      return true;
    }
  }

  return true;
}

function sendKeyIfEnabled(mnemonic) {
    if(other) return;
    keyboard_init();
  if (bDebug) alert("check before sending key... " + mnemonic + "");
 
  if ( (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);
    }

}



