| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | 
							- var is = require('./is');
 
- var delegate = require('delegate');
 
- /**
 
-  * Validates all params and calls the right
 
-  * listener function based on its target type.
 
-  *
 
-  * @param {String|HTMLElement|HTMLCollection|NodeList} target
 
-  * @param {String} type
 
-  * @param {Function} callback
 
-  * @return {Object}
 
-  */
 
- function listen(target, type, callback) {
 
-     if (!target && !type && !callback) {
 
-         throw new Error('Missing required arguments');
 
-     }
 
-     if (!is.string(type)) {
 
-         throw new TypeError('Second argument must be a String');
 
-     }
 
-     if (!is.fn(callback)) {
 
-         throw new TypeError('Third argument must be a Function');
 
-     }
 
-     if (is.node(target)) {
 
-         return listenNode(target, type, callback);
 
-     }
 
-     else if (is.nodeList(target)) {
 
-         return listenNodeList(target, type, callback);
 
-     }
 
-     else if (is.string(target)) {
 
-         return listenSelector(target, type, callback);
 
-     }
 
-     else {
 
-         throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
 
-     }
 
- }
 
- /**
 
-  * Adds an event listener to a HTML element
 
-  * and returns a remove listener function.
 
-  *
 
-  * @param {HTMLElement} node
 
-  * @param {String} type
 
-  * @param {Function} callback
 
-  * @return {Object}
 
-  */
 
- function listenNode(node, type, callback) {
 
-     node.addEventListener(type, callback);
 
-     return {
 
-         destroy: function() {
 
-             node.removeEventListener(type, callback);
 
-         }
 
-     }
 
- }
 
- /**
 
-  * Add an event listener to a list of HTML elements
 
-  * and returns a remove listener function.
 
-  *
 
-  * @param {NodeList|HTMLCollection} nodeList
 
-  * @param {String} type
 
-  * @param {Function} callback
 
-  * @return {Object}
 
-  */
 
- function listenNodeList(nodeList, type, callback) {
 
-     Array.prototype.forEach.call(nodeList, function(node) {
 
-         node.addEventListener(type, callback);
 
-     });
 
-     return {
 
-         destroy: function() {
 
-             Array.prototype.forEach.call(nodeList, function(node) {
 
-                 node.removeEventListener(type, callback);
 
-             });
 
-         }
 
-     }
 
- }
 
- /**
 
-  * Add an event listener to a selector
 
-  * and returns a remove listener function.
 
-  *
 
-  * @param {String} selector
 
-  * @param {String} type
 
-  * @param {Function} callback
 
-  * @return {Object}
 
-  */
 
- function listenSelector(selector, type, callback) {
 
-     return delegate(document.body, selector, type, callback);
 
- }
 
- module.exports = listen;
 
 
  |