docs: function(elements, types, fn, options) {
      if (!types || !fn || typeof types != "string")
        return;
  
      var elements = elation.utils.isNull(elements) 
            ? [null] 
            : !elation.utils.isArray(elements) || elements == window
              ? [ elements ] 
              : elements,
          types = types.split(',');
      
      if (typeof fn == "string") {
        fn = (function(func) { return function(ev) { eval(func); }; })(fn);
      }
  
      for (var e=0; e<elements.length; e++) {
        var element = elements[e];
        
        if (typeof element != 'object')
          continue;
        
        for (var i=0; i<types.length; i++) {
          var type = types[i];
          
          elation.events._register(element, type, fn);
          
          if (!element)
            continue;
  
          if (type.toLowerCase() == 'transitionend') {
            if ('onwebkittransitionend' in window) type = 'webkitTransitionEnd';
            else if ('onotransitionend' in element || navigator.appName == 'Opera') type = 'oTransitionEnd';
          }
          
          if ("addEventListener" in element) {
            //if (type == 'mousewheel' && elation.browser.type != 'safari')
            //  type = 'DOMMouseScroll';
            if (typeof fn == "object" && fn.handleEvent) {
              element[type+fn] = function(e) { 
                fn.handleEvent(e); 
              }
              element.addEventListener(type, element[(type + fn)], options);
            } else {
              element.addEventListener(type, fn, options);
            }
          } else if (element.attachEvent) {
            if (typeof fn == "object" && fn.handleEvent) { 
              element[type+fn] = function() { 
                fn.handleEvent(elation.events.fix(window.event)); 
              }
            } else {
              element["e" + type + fn] = fn;
              element[type + fn] = function() { 
                if (typeof element["e" + type + fn] == 'function') 
                  element["e" + type + fn](elation.events.fix(window.event)); 
              }
            }
            
            element.attachEvent("on" + type, element[type + fn]);
          }
        }
      }
      
      return this;
    }