var vdwkeyfunctions = new Array();

var VDW_EXTRAKEY_NO     = 0;//0000
var VDW_EXTRAKEY_CTRL   = 1;//0001
var VDW_EXTRAKEY_SHIFT  = 2;//0010
var VDW_EXTRAKEY_ALT    = 4;//0100

function VDWKeyFunction(code,extrakey,handler)
{
   this.code      = code;
   this.extraKey  = extrakey;
   this.handler   = handler;
   /* optimise create only one vdwevent object */
   this.oEvent    = null;//new vdwevent(evt);
}

VDWKeyFunction.prototype.checkKey = function(e)
{
   var extrakey = this.extraKey;
   this.oEvent  = new vdwevent(e);
   
   //alert(extrakey+" "+this.oEvent.keyCode(e)+" "+this.code);

   if(extrakey==VDW_EXTRAKEY_NO && (this.oEvent.getEvent(e).ctrlKey || oEvent.getEvent(e).shiftKey || oEvent.getEvent(e).altKey))
   {
      return false;
   }
   
   if(((extrakey & VDW_EXTRAKEY_CTRL) && (!this.oEvent.getEvent(e).ctrlKey)) || ((!(extrakey & VDW_EXTRAKEY_CTRL)) && (this.oEvent.getEvent(e).ctrlKey)))
   {
      return false;
   }
   
   if(((extrakey & VDW_EXTRAKEY_SHIFT) && (!this.oEvent.getEvent(e).shiftKey)) || ((!(extrakey & VDW_EXTRAKEY_SHIFT)) && (this.oEvent.getEvent(e).shiftKey)))
   {
      return false;
   }

   if(((extrakey & VDW_EXTRAKEY_ALT) && (!this.oEvent.getEvent(e).altKey)) || ((!(extrakey & VDW_EXTRAKEY_ALT)) && (this.oEvent.getEvent(e).altKey)))
   {
      return false;
   }
   
   //alert(extrakey+" "+this.oEvent.keyCode(e)+" "+this.code);

   return (this.oEvent.keyCode(e)==this.code) ? true : false;
}

VDWKeyFunction.prototype.fireHandler = function(evt,dum)
{
   /* if no handler defined return */
   if(!this.handler) return;

   /* check if it is a Add function */
   if(this.handler.func)
   {
      return this.handler.func(evt,dum,this.handler.params);
   }

   return this.handler(evt,dum);
}

function KeyFunctionListener(evt,dum)
{
   var result;

   for(var i = (vdwkeyfunctions.length-1);i>=0;i--)
   {
      if(!vdwkeyfunctions[i].checkKey(evt))
         continue;
      //alert('hier')
      result = vdwkeyfunctions[i].fireHandler(evt,dum);
      break;
   }

   return result;
}

function AddFunctionKey(code,handler,extrakey)
{
   if(!extrakey)
      extrakey = VDW_EXTRAKEY_NO;
   vdwkeyfunctions.push(new VDWKeyFunction(code,extrakey,handler));
}

//name = C-F5,function(){alert("C-F5")};
//       M-F7,fucntion(){alert("<M-F7>");
//       M-C-F7,function(){alert("<M-C-F7>")};
//       S-F7,function(){alert("<M-F7>")};
//       F7,function(){alert("<F7>")}
/*
function AddFunctionKeyByName(name,handler)
{
   var keys = name.split("-");
   var fl_first = true;
   var code = -1;

   for(var i=(keys.length-1);i>=0;i--)
   {
      if(fl_first)
      {
         switch(keys[i].toUpperCase())
         {
            case "HOME":
               code=
               break;
            case "END":
               break;
            case "PAGEUP":
               break;
            case "PAGEDOWN":
               break;
            case "INSERT":
               break;
            case "DELETE":
               break;

            // function keys 
            case "F1":
               break;
            case "F2":
               break;
            case "F3":
               break;
            case "F4":
               break;
            case "F5":
               break;
            case "F6":
               break;
            case "F7":
               break;
            case "F8":
               break;
            case "F9":
               break;
            case "F10":
               break;
            case "F11":
               break;
            case "F12":
               break;

            // alphabetic keys
            case "A":
               break;
            case "Z":
               break;
            case "E":
               break;
            case "R":
               break;
            case "T":
               break;
            case "Y":
               break;
            case "U":
               break;
            case "I":
               break;
            case "O":
               break;
            case "P":
               break;
            case "Q":
               break;
            case "S":
               break;
            case "D"
               break;
            case "F":
               break;
            case "G":
               break;
            case "H":
               break;
            case "J":
               break;
            case "K":
               break;
            case "L":
               break;
            case "M":
               break;
            case "W":
               break;
            case "X":
               break;
            case "C":
               break;
            case "V":
               break;
            case "B":
               break;
            case "N":
               break;
            default:
               //unknow key
               return;
         }
      }
      fl_first = false;
   }
}
*/
