docs: function() {
  		var self = this,
  			messages = this.messages, 
  			input    = [],
  			ignore   = [], 
  			message = function(m) {
  				var file;
  				if (m.indexOf('#') === 0) {
  					if ((file = self.file(m.substr(1)))) {
  						return file.name;
  					}
  				}
  				return m;
  			},
  			i, j, m, escFunc, start = 0;
  		
  		if (arguments.length && arguments[0] === false) {
  			escFunc = function(m){ return m; };
  			start = 1;
  		}
  		for (i = start; i< arguments.length; i++) {
  			m = arguments[i];
  			
  			if (Array.isArray(m)) {
  				for (j = 0; j < m.length; j++) {
  					if (m[j] instanceof jQuery) {
  						// jQuery object is HTML element
  						input.push(m[j]);
  					} else if (typeof m[j] !== 'undefined'){
  						input.push(message('' + m[j]));
  					}
  				}
  			} else if (m instanceof jQuery) {
  				// jQuery object is HTML element
  				input.push(m[j]);
  			} else if (typeof m !== 'undefined'){
  				input.push(message('' + m));
  			}
  		}
  		
  		for (i = 0; i < input.length; i++) {
  			// dont translate placeholders
  			if ($.inArray(i, ignore) !== -1) {
  				continue;
  			}
  			m = input[i];
  			if (typeof m == 'string') {
  				// translate message
  				m = messages[m] || (escFunc? escFunc(m) : self.escape(m));
  				// replace placeholders in message
  				m = m.replace(/\$(\d+)/g, function(match, placeholder) {
  					placeholder = i + parseInt(placeholder);
  					if (placeholder > 0 && input[placeholder]) {
  						ignore.push(placeholder);
  					}
  					return escFunc? escFunc(input[placeholder]) : self.escape(input[placeholder]);
  				});
  			} else {
  				// get HTML from jQuery object
  				m = m.get(0).outerHTML;
  			}
  
  			input[i] = m;
  		}
  
  		return $.grep(input, function(m, i) { return $.inArray(i, ignore) === -1 ? true : false; }).join('<br>');
  	}