docs: function(ql) {
  				var fm      = ql.fm,
  			preview = ql.preview,
  			textMaxlen = parseInt(ql.options.textMaxlen) || 2000,
  			prettify = function() {
  				if (fm.options.cdns.prettify) {
  					fm.loadScript([fm.options.cdns.prettify + (fm.options.cdns.prettify.match(/\?/)? '&' : '?') + 'autorun=false']);
  					prettify = function() { return true; };
  				} else {
  					prettify = function() { return false; };
  				}
  			},
  			PRcheck = function(node, cnt) {
  				if (prettify()) {
  					if (typeof window.PR === 'undefined' && cnt--) {
  						setTimeout(function() { PRcheck(node, cnt); }, 100);
  					} else {
  						if (typeof window.PR === 'object') {
  							node.css('cursor', 'wait');
  							requestAnimationFrame(function() {
  								PR.prettyPrint && PR.prettyPrint(null, node.get(0));
  								node.css('cursor', '');
  							});
  						} else {
  							prettify = function() { return false; };
  						}
  					}
  				}
  			};
  		
  		preview.on(ql.evUpdate, function(e) {
  			var file = e.file,
  				mime = file.mime,
  				jqxhr, loading;
  			
  			if (fm.mimeIsText(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax)) {
  				e.stopImmediatePropagation();
  				
  				(typeof window.PR === 'undefined') && prettify();
  				
  				loading = $('<div class="elfinder-quicklook-info-data"> '+fm.i18n('nowLoading')+'<span class="elfinder-info-spinner"></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
  
  				// stop loading on change file if not loadin yet
  				preview.one('change', function() {
  					jqxhr.state() == 'pending' && jqxhr.reject();
  				});
  				
  				jqxhr = fm.request({
  					data           : {cmd : 'get', target : file.hash, conv : 1, _t : file.ts},
  					options        : {type: 'get', cache : true},
  					preventDefault : true
  				})
  				.done(function(data) {
  					var reg = new RegExp('^(data:'+file.mime.replace(/([.+])/g, '\\$1')+';base64,)', 'i'),
  						text = data.content,
  						part, more, node, m;
  					ql.hideinfo();
  					if (window.atob && (m = text.match(reg))) {
  						text = atob(text.substr(m[1].length));
  					}
  					
  					more = text.length - textMaxlen;
  					if (more > 100) {
  						part = text.substr(0, textMaxlen) + '...';
  					} else {
  						more = 0;
  					}
  					
  					node = $('<div class="elfinder-quicklook-preview-text-wrapper"><pre class="elfinder-quicklook-preview-text prettyprint"></pre></div>');
  					
  					if (more) {
  						node.append($('<div class="elfinder-quicklook-preview-charsleft"><hr/><span>' + fm.i18n('charsLeft', fm.toLocaleString(more)) + '</span></div>')
  							.on('click', function() {
  								var top = node.scrollTop();
  								$(this).remove();
  								node.children('pre').removeClass('prettyprinted').text(text).scrollTop(top);
  								PRcheck(node, 100);
  							})
  						);
  					}
  					node.children('pre').text(part || text);
  					
  					node.on('touchstart', function(e) {
  						if ($(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
  							e.originalEvent._preventSwipeX = true;
  						}
  					}).appendTo(preview);
  					
  					PRcheck(node, 100);
  				})
  				.always(function() {
  					loading.remove();
  				});
  			}
  		});
  	}