docs: function(data, type) {
  			var defsorter = { name: true, perm: true, date: true,  size: true, kind: true },
  				sorterChk = !self.sorters._checked,
  				l         = data.length,
  				setSorter = function(file) {
  					var f = file || {},
  						sorters = [];
  					$.each(self.sortRules, function(key) {
  						if (defsorter[key] || typeof f[key] !== 'undefined' || (key === 'mode' && typeof f.perm !== 'undefined')) {
  							sorters.push(key);
  						}
  					});
  					self.sorters = self.arrayFlip(sorters, true);
  					self.sorters._checked = true;
  				},
  				keeps = ['sizeInfo'],
  				changedParents = {},
  				f, i, keepProp, parents;
  
  			for (i = 0; i < l; i++) {
  				f = Object.assign({}, data[i]);
  				if (f.name && f.hash && f.mime) {
  					if (sorterChk && f.phash === cwd) {
  						setSorter(f);
  						sorterChk = false;
  					}
  					
  					if (f.phash && (type === 'add' || type === 'change')) {
  						if (parents = self.parents(f.phash)) {
  							$.each(parents, function() {
  								changedParents[this] = true;
  							});
  						}
  					}
  					
  					if (files[f.hash]) {
  						$.each(keeps, function() {
  							if(files[f.hash][this] && ! f[this]) {
  								f[this] = files[f.hash][this];
  							}
  						});
  						if (f.sizeInfo && !f.size) {
  							f.size = f.sizeInfo.size;
  						}
  						deleteCache(files[f.hash], true);
  					}
  					files[f.hash] = f;
  					if (f.mime === 'directory' && !ownFiles[f.hash]) {
  						ownFiles[f.hash] = {};
  					}
  					if (f.phash) {
  						if (!ownFiles[f.phash]) {
  							ownFiles[f.phash] = {};
  						}
  						ownFiles[f.phash][f.hash] = true;
  					}
  				} 
  			}
  			// delete sizeInfo cache
  			$.each(Object.keys(changedParents), function() {
  				var target = files[this];
  				if (target && target.sizeInfo) {
  					delete target.sizeInfo;
  				}
  			});
  			
  			// for empty folder
  			sorterChk && setSorter();
  		}