/**
 * JFC library
 * Message mapper
 */
jfcMSGMapper={
_MSG_MAP          : []

,registerMessage  : function( _msg, _handler, _priority, _wrapper )
  {
    this._MSG_MAP[_msg]=this._MSG_MAP[_msg]?this._MSG_MAP[_msg]:[];
    this._MSG_MAP[_msg]   = ___arrayInsert(
                                            this._MSG_MAP[_msg]
                                            ,(_priority)?_priority:this._MSG_MAP[_msg].length
                                            ,{handler:_handler,wrapper:_wrapper}
                                          );
  }
,registerMessageWrapper  : function( _msg, _wrapper, _priority)  
{
    this.registerMessage( _msg, 0, _priority, _wrapper );
}
,unRegisterMessage  : function( _msg, _handler, _wrapper)  
{
    var ___MSG_MAP       = new Array()
    ___MSG_MAP[_msg] = new Array();
    
    for( var k in this._MSG_MAP[_msg])
        {
            if(!
                this._MSG_MAP[_msg][k].handler==_handler
                &&
                this._MSG_MAP[_msg][k].wrapper==_wrapper
            )
            {___MSG_MAP[_msg][k]=this._MSG_MAP[_msg][k]}
            this._MSG_MAP[_msg] = ___MSG_MAP[_msg];
        }
}
,removeMessage    :function( _msg )
{
    var ___MSG_MAP       = new Array()
    for( var k in this._MSG_MAP)
        if(k!=_msg)
            ___MSG_MAP[k] = this._MSG_MAP[k];
    this._MSG_MAP[k] = ___MSG_MAP[k];    
}
,handleMessage    : function(_handler,_msg,_args)  
{
    var evl = _handler+'(_msg';
    for( var nArg = 1; nArg < _args.length; nArg++)
            evl+=',_args['+nArg+']';
    evl += ');';
    eval(evl);
}
,handleWrapper    : function(_wrapper,_msg,_args)  
{
    var evl = 'dWrap(_wrapper,_msg';
    for( var nArg = 1; nArg < _args.length; nArg++)
            evl+=',_args['+nArg+']';
    evl += ');';
    eval(evl);
}
,invokeMessage    : function( _msg, _args )
  {
    for(var priority in this._MSG_MAP[_msg])
        {
            if(this._MSG_MAP[_msg][priority].wrapper)
            {
              this.handleWrapper(this._MSG_MAP[_msg][priority].wrapper, _msg, _args);
            }
            else
            {
              this.handleMessage(this._MSG_MAP[_msg][priority].handler,_msg, _args);
            }
        }
  }
,sendMessage      : function( _msg )
  {
     eval('this.invokeMessage( _msg,this.sendMessage.arguments);');
  }  
,getMSGMap      : function()
  {
      return this._MSG_MAP;
  }
,clear          : function()
{
    this._MSG_MAP = new Array();
}

}

function mapperSM(_msg)
{
    jfcMSGMapper.sendMessage(_msg);
}

function ___arrayInsert(_array,_key,_value)
{
    for(var k=_array.length-1;k >= _key;k--)
        {
            _array[k+1]=_array[k];
        }
   _array[_key]=_value;
   return _array;
}

