(function () {
  var _rootSelector = 'body',
      _root = $(_rootSelector),
      _pattern = /([^_]+)_([^_]+)(_(\w+))?/;

  function execute(e, params)
  {
    var elem = e.srcElement ? e.srcElement : e.originalTarget;
    
    with (params) {
      try {
        if (typeof Vertis[module]['prototype'] == 'undefined') {
          Vertis[module][action](id, e);
        } else {
          var obj = new Vertis[module];
          obj[action](id, e);
        }

        return true;
      } catch (error) {
        //console.log('Action ' + module + '/' + action + ' does not exist');
      }
    }

    return false;
  }

  function click_handler(e)
  {
    var target = e.srcElement ? e.srcElement : e.target;
    
    var elem = $(target);

    if (elem.is('a') || elem.is(_rootSelector) || elem.attr('disabled') == 'disabled') {
      if (elem.is('a[onclick]'))
        return false;
      return true;
    }
   
    if (elem == null || typeof elem == 'undefined')
      return;

    var params = elem.attr('id').match(_pattern);
    
    if (params != null && (elem.hasClass('dblclick') == (e.type == 'dblclick'))) {
      if (execute(e, {module: params[1], action: params[2], id: params[4]})) {
        return;
      }
    }

    // event bubbling
    if (e.srcElement) {
      e.srcElement= $(elem).parent().get(0);
    } else {
      e.target = $(elem).parent().get(0);
    }

    click_handler(e);
  }

  _root.click(click_handler);
  _root.dblclick(click_handler);
})();

