Your IP : 172.28.240.42


Current Path : /var/www/html/clients/nsmk.e-nk.ru/application/maxsite/plugins/file_manager/js/
Upload File :
Current File : /var/www/html/clients/nsmk.e-nk.ru/application/maxsite/plugins/file_manager/js/manager.js

function log(str)
	{
	if (FileManager.debug == true)
		{
		$("#FM-log").prepend(str + "<br />");
		}	
	}

// http://www.webtoolkit.info/javascript-url-decode-encode.html

var URL = { 
	// публичная функция для кодирования URL 
	encode : function (string) { 
		return escape(this._utf8_encode(string)); 
	}, 
 	// публичная функция для декодирования URL 
	decode : function (string) { 
		return this._utf8_decode(unescape(string)); 
	}, 
	// приватная функция для кодирования URL 
	_utf8_encode : function (string) { 
		string = string.replace(/\r\n/g,"\n"); 
		var utftext = ""; 
 
		for (var n = 0; n < string.length; n++) { 
 
			var c = string.charCodeAt(n); 
 
			if (c < 128) { 
				utftext += String.fromCharCode(c); 
			} 
			else if((c > 127) && (c < 2048)) { 
				utftext += String.fromCharCode((c >> 6) | 192); 
				utftext += String.fromCharCode((c & 63) | 128); 
			} 
			else { 
				utftext += String.fromCharCode((c >> 12) | 224); 
				utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
				utftext += String.fromCharCode((c & 63) | 128); 
			} 
 
		} 
 
		return utftext; 
	}, 
	// приватная функция для декодирования URL 
	_utf8_decode : function (utftext) { 
		var string = ""; 
		var i = 0; 
		var c = 0, c1 = 0, c2 = 0; 
 
		while ( i < utftext.length ) { 
 
			c = utftext.charCodeAt(i); 
 
			if (c < 128) { 
				string += String.fromCharCode(c); 
				i++; 
			} 
			else if((c > 191) && (c < 224)) { 
				c2 = utftext.charCodeAt(i+1); 
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 
				i += 2; 
			} 
			else { 
				c2 = utftext.charCodeAt(i+1); 
				c3 = utftext.charCodeAt(i+2); 
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 
				i += 3; 
			} 
		} 
		return string; 
	} 
}

FileManager.settings					= {};
FileManager.settings.confirm_file_delete	= {type: "owner", state: true, name: "Подтверждение при удаление файла"};
FileManager.settings.confirm_file_rewrite	= {type: "owner", state: true, name: "Подтверждение при перезаписи файла"};
FileManager.settings.absolute_path		= {type: "owner", state: true, name: "Aбсолютные пути (иначе относительные)"};
FileManager.settings.maximum_performance	= {type: "owner", state: true, name: "Максимальная производительность"};
FileManager.settings.click_description		= {type: "owner", state: true, name: "Редактирование описания по одинарному клику (иначе двойной)"};

FileManager.folder		= undefined;
FileManager.cur		= undefined;	/* текущий <a> */
FileManager.dir 		= {};
FileManager.config		= FileManager.config;
/*
	type: parent, connect, owner
*/
FileManager.selected	= [];			// выбранные файлы

FileManager.typeList	= 'FMA-T';		// trumb default
FileManager.typeCode	= 'FML-A';		// адрес default

FileManager.STO		= {};			// window timeout id

FileManager.history		= [];			
FileManager.historyID	= 0;

/*========================================*/
/* http://snowcore.net/clone-javascript-object */
FileManager.cloneObject = function(o)
	{
	if(!o || 'object' !== typeof o)
		{
		return o;
		}
	var c = 'function' === typeof o.pop ? [] : {};
	var p, v;
	for(p in o)
		{
		if(o.hasOwnProperty(p))
			{
			v = o[p];
			if(v && 'object' === typeof v)
				{c[p] = this.cloneObject(v)}
			else	{c[p] = v}
			}
		}
	return c;
	}
FileManager.lockUI = function(mode)
	{
	if (mode == true)
		{
		$("#FM-prev").addClass('disable');
		$("#FM-next").addClass('disable');
		$("#FM-refresh").addClass('disable');
		$("ul.FM-tree").removeClass("FM-tree").addClass("FM-tree-lock");
		}
	else	{
		$("#FM-prev").removeClass('disable');
		$("#FM-next").removeClass('disable');
		$("#FM-refresh").removeClass('disable');
		$("ul.FM-tree-lock").removeClass("FM-tree-lock").addClass("FM-tree");
		}	
	}

FileManager.error = function(XMLHttpRequest,  textStatus, errorThrown)
	{
	//A1 = XMLHttpRequest;
	var i		= XMLHttpRequest.responseText.indexOf("{");
	var m	= i < 0 ? XMLHttpRequest.responseText : XMLHttpRequest.responseText.substring(0,i);

E1 = XMLHttpRequest;
E2 = textStatus;
E3 = errorThrown;

	alert('error');			
	alert('status='+XMLHttpRequest.status+', readyState='+XMLHttpRequest.readyState+', сервер вернул ошибочный результат('+textStatus+'):\n'+m);

	// content this не принадлежит FileManager !!!
	$(FileManager.cur).parent().removeClass('wait'); // разблокируем
	FileManager.lockUI(false);
	}

FileManager.mimeIA	= "mp3,gif,jpg,jpeg,png,php,zip,txt,rar,doc,rtf,pdf,html,htm,css,xml,odt,avi,wmv,flv,swf,wav,xls,7z,gz";
FileManager.makeMap	= function(str)
	{
	var obj = {}, items = str.split(",");
	for ( var i = 0; i < items.length; i++ )
		obj[ items[i] ] = true;
	return obj;
	}
FileManager.mimeIA	= FileManager.makeMap(FileManager.mimeIA);


/* по расширению взять картинку */
FileManager.getmimeIA = function(ext)
	{
	if((!ext) || (!this.mimeIA[ext]))
		{return "mime_empty.png"}
	else	{return this.mimeIA[ext]+'.png'}
	}

FileManager.clearPreview = function()
	{
	$("#FM-lightbox").css("visibility", 'hidden').attr("href",'#');
	$("#FM-preview-image").hide(0).removeAttr("src");
	$("#FM-preview-filename").hide(0).html('');
	$("#FM-preview-table").hide(0);
	$("#FM-preview-desc").hide(0).html('');

	$("#FileManager-buffer").val('');
	this.selected = [];
	}

FileManager.resizeimage = function(maxW, maxH, defW, defH)
	{
	var kofW  = maxW/defW;
	var kofH  = maxH/defH;

	if ((kofW < 1) || (kofH < 1))
		{
		if (kofH < kofW)
			{
			kofW = kofH;
			}
		
		var imgW	= Math.ceil(defW * kofW);	
		var imgH	= Math.ceil(defH * kofW);

		if (imgW > maxW)	imgW = maxW;
		if (imgH > maxH)	imgH = maxH;
		}
	else {	
		var imgW = defW;
		var imgH = defH;
		}

	return [imgW, imgH];
	}

FileManager.setDS = function(folder)
	{
	var st = FileManager.DS;
	if (st == '\\')
		{
		st='\\\\';
		}
	return folder.replace(new RegExp(st,'g'), '/');
	}

FileManager.lightboxURL = function(filename)
	{
	var url = this.url+URL.encode(this.setDS(this.folder)+filename);
	$("#FM-lightbox").attr("href", url);
	return url;
	}

FileManager.previewResize = function(folder)
	{
	if ( (this.folder == folder) && $("#FM-preview-filename").html() )
		{
		var f	= this.dir[folder][$("#FM-preview-filename").html()];
//log('0 '+f);
		var size	= this.resizeimage($("#FM-lightbox").width(), $("#FM-lightbox").height(), f.list.image.dim[0], f.list.image.dim[1]);
		
		$("#FM-preview-image").width(size[0]).height(size[1]).show(0);
		$("#FM-lightbox").fadeTo(0,0).css("visibility",'visible').fadeTo(0,1);
		}

	$("#FM-preview-image").unbind('load');
	}

FileManager.preview = function(name)
	{
	var f = this.dir[this.folder][name];

	if ($("#FM-preview-filename").html() ==  f.filename){return;}

	$("#FM-preview-filename").html(f.filename).show(0);

//log('1 '+f);

	if (f.list)
		{
		$("#FM-lightbox").css("visibility", 'hidden');
		$("#FM-preview-image").hide(0).removeAttr("src").load(function(){FileManager.previewResize(FileManager.folder);}).attr("src", this.lightboxURL(f.filename));
		$("#preview-width").html(f.list.image.dim[0]);
		$("#preview-height").html(f.list.image.dim[1]);
		}
	else	{
		$("#FM-preview-image").removeAttr("src");
		$("#FM-lightbox").css("visibility", 'hidden').attr("href",'#');

		$("#preview-width").html('');
		$("#preview-height").html('');
		}
	
	$("#preview-size").html((f.filesize/1024).toFixed(2));

	$("#FM-preview-table").show(0);

	//$("#preview-lastmodif").html(f.lastmodif);
	if (f.desc)
		{
		$("#FM-preview-desc").html(f.desc).show(0);
		}
	else	{
		$("#FM-preview-desc").hide(0).html('');
		}
	}

FileManager.makeCode = function()
	{
	//if (typeof this.dir[this.folder] == "undefined")
	//	alert("makeCode просмотр несуществующего каталога: "+this.folder);

	var fs	= this.dir[this.folder];
	var list	=[];

	for(var i in this.selected)
		{
		var name	= this.selected[i];
		var url	=this.url+URL.encode(this.setDS(this.folder)+fs[name].filename), mini='';

		if ((fs[name].list) && (fs[name].list.mini))
			{
			mini = this.url+URL.encode(this.setDS(this.folder)+fs[name].list.mini.filename);
			}

		switch(this.typeCode)
			{
			case 'FML-A':
				list.push(url);
				break;

			case 'FML-H':
				if (mini)
					{
					list.push('<a href="'+url+'"><img src="'+mini+'" alt="" /></a>');
					}
				else	{
					list.push('<a href="'+url+'">'+fs[name].filename+'</a>');
					}
				break;

			case 'FML-B':
				if (fs[name].list)
					{
					list.push('[image='+url+']'+url+'[/image]');
					}
				else	{
					list.push('[file='+url+']'+url+'[/file]');
					}
				break;
			case 'FML-G':
				if (!mini) {mini = url;}
				list.push('[gal='+mini+' '+fs[name].filename+']'+url+'[/gal]');
				break;

			}
		}

	var st = list.join('\n');

	if (this.typeCode == 'FML-G')
			{
			st = '[gallery][galname]gallery name[/galname]\n'+st+'\n[/gallery]';
			}

	$("#FileManager-buffer").val(st);
	//$("#FileManager-buffer").val(list.join('').replace(/</gm,'&lt;').replace(/>/gm,'&gt;'));
	}

/* select File */
FileManager.selectFile = function(e, el)
	{
	clearTimeout(FileManager.STO['/preview/']);

	if(e.ctrlKey === false)
		{
		$("a."+FileManager.typeList).removeClass("FMS");
		this.selected = [];
		$(el).addClass("FMS");
		this.selected.push(el.title);
		}
	else {
		if($(el).hasClass("FMS") === true)
			{
			$(el).removeClass("FMS");
			for(var i in this.selected)
				{
				if (this.selected[i] == el.title)
					{
					delete this.selected[i];
					break;
					}
				}
			}
		else	{
			$(el).addClass("FMS");
			this.selected.push(el.title);
			}
		}


	this.makeCode();

	FileManager.STO['/preview/'] = window.setTimeout(function(){FileManager.preview(el.title);}, 0);
	}

FileManager.loadSrc = function(folder, f, dim)
	{
	if (this.folder == folder)
		{
		var fmTC = this.mimeIA [f.ext] ? ' fmTC-'+f.ext : ' fmTC-file';

		$("a[title='"+f.filename+"'] .DIMG").attr("class", '').addClass('DIMG');
		$("a[title='"+f.filename+"']").addClass("FML");

		var dim = this.resizeimage(96, 84, dim[0], dim[1]);

		$("a[title='"+f.filename+"'] img").width(dim[0]).height(dim[1]).fadeTo(0,1);
		//$("a[title='"+f.filename+"'] img").unbind('load');
		}
	}

FileManager.setSrc = function(folder, f)
	{
//log(f.filename);
	if (folder != this.folder){return} 

//log('2 '+f);

	if (f.list)
		{
		var url=this.url+URL.encode(this.setDS(folder)+f.filename), dim = f.list.image.dim;

		if (f.list.mini)
			{
			url = this.url+URL.encode(this.setDS(folder)+f.list.mini.filename);
			dim	= f.list.mini.dim;
			}

		$("a[title='"+f.filename+"'] img").fadeTo(0,0.01).load(this.loadSrc(folder, f, dim)).attr("src", url);
		}
	}

FileManager.addFile = function(folder, name)
	{
	var f = this.dir[folder][name];
	var img	= '';
	var FML	= '';	/* признак загруженности для изображений */
	var list	= '', listhead = '';
	
	var d='', s=f.filesize;

//log('3 '+f);

	for(var name in this.tasks)
		{
		if ((f.list) && (f.list[name]))
			{
			d = f.list[name].dim[0]+' × '+ f.list[name].dim[1];
			s = f.list[name].filesize;

			img = '<img alt="" />'; // img = '<img alt=""  onMouseDown="return false;" />';
			}

		listhead+='<div class="COL">'+name+'</div>';
		list+='<div class="SIZE">'+s+'</div><div class="DIM">'+d+'</div>';

		d=''; s='';
		}

	if (!img){FML=' FML';}

	/* class подложки, при загрузки изображения - ликвидируется */
	var fmTC = this.mimeIA [f.ext] ? ' fmTC-'+f.ext : ' fmTC-file';

	//var head = '';

	//if ($("#FM-list")[0].childNodes.length == 0)
	//	{
	//	head='<div class="'+this.typeList+' FMH"><div class="DNAME">имя</div>'+listhead+'<div class="LAST">изменен</div></div>';
	//	}

	return '<a class="'+this.typeList+FML+'" title="'+f.filename+'"><div class="DIMG'+fmTC+'">'+img+'</div><div class="DREM"><textarea readOnly>'+f.desc+'</textarea></div><div class="DNAME">'+f.filename+'</div>'+list+'<div class="LAST">'+f.lastmodif+'</div></a>';
	}

FileManager.showFiles = function(folder)
	{
	if (folder != this.folder){return}

	for(var i in this.STO)
		{
		clearTimeout(this.STO[i]);
		}

	this.STO	= {};

	var files	= this.dir[folder];
	var list	= {};
	var html	= [];

	html.push('<div id="FM-list">');

	var count = 0;
	
	for(var name in files)
		{
		if ((name != '/tasks/') &&  (name != '/config/'))
			{
			list[name] = true;
			html.push(this.addFile(folder, name));
			count++;
			}
		}

	html.push('</div>');
/*
	//FileManager.STO['/folder/'] = window.setTimeout(function(){$("#FM-list").html(html.join(''));}, 5000);
	FileManager.STO['/folder/'] = window.setTimeout(function()
		{
		$("#FM-RP").html(html.join(''));
		preventSelection($("#FM-list").get(0));
		}, 500);
*/

	this.$FM_RP.html(html.join(''));

	function toSSfast()
		{
		for(var name in files)
			{
			if (files[name].list){FileManager.setSrc(folder, files[name]);}
			}
		}

	var pac = 3;
	
	function toSS()
		{
		if (folder != FileManager.folder){return;}

		var ip = 0;

		for(var name in list)
			{
			delete list[name];

			if (files[name].list)
				{
				FileManager.setSrc(folder, files[name]);

				ip++;

				if (ip == pac)
					{
					FileManager.STO[name] = window.setTimeout(function(){toSS()}, pac*50);
					return;
					}
				}
			}
		}

	if (this.settings.maximum_performance.state == true)
		{
		toSSfast()
		}
	else	{
		FileManager.STO['/start/'] = window.setTimeout(function(){toSS()}, 200 + count*2);
		}	
	}

/* загрузка существующего файла (или его переименование) */
FileManager.refreshFile = function(folder, oldname, newname)
	{
	if (this.folder == folder)
		{
//log('refresh '+$("#FM-preview-filename").html()+' '+oldname);
		
		st = this.addFile(folder, newname);
		$("a[title='"+oldname+"']").attr('title', newname).replaceWith(st);
		this.setSrc(folder, this.dir[folder][newname]);
			
		// картинка была на превью
		if ($("#FM-preview-filename").html() ==  newname)	// #FM-preview-filename - изменено после редактирования
			{
//log('refresh preview');
			$("a[title='"+newname+"']").addClass("FMS");
			$("#FM-preview-filename").html(''); // скидываем
			this.preview(newname);
			}
		}
	}

/* upLoad File */
FileManager.upLoadFile = function(data)
	{
//DATA = data;
//log('upLoadFile');

	var folder	= data.folder;
	var f		= data.file;

	for(var name in f.tasks)
		{
		if (f.tasks[name].error)
			{
			alert('Произошла ошибка выполнения задания "'+name+'" для файла "'+f.tasks[name].filename+'", ответ сервера: '+f.tasks[name].error);
			}
		}

	delete f.tasks;

log('unload '+folder+' '+f.filename+' '+(typeof this.dir[folder][f.filename]));

	if (typeof this.dir[folder][f.filename] == "undefined")
		{
		this.dir[folder][f.filename] = f;
		
		if (this.folder == folder)
			{
			$('#FM-list').append(this.addFile(folder, f.filename));
			this.setSrc(folder, this.dir[folder][f.filename]);
			}
		}
	else	{
		// при загрузке существующего файла, описания мы не перечитываем, => надо брать то, что есть
		f.desc = this.dir[folder][f.filename].desc;
		this.dir[folder][f.filename] = f;

		this.refreshFile(folder, f.filename, f.filename);
		}

	}

/* если данные для папки были загружены => удаляем */
FileManager.deleteData = function(li)
	{
	if (li.hasClass('__L'))
		{
		li.removeClass('__L');
		var rel = $(li.children()[0]).attr('rel');
		delete FileManager.dir[rel];

		return true;
		}
	else	{return false;}
	}

/* если были данные проходимся по children */
FileManager.clearItems = function(li)
	{
	if (this.deleteData(li) === true)	
		{
		$(li.children()[1]).children().each(function(i)
			{
			FileManager.clearItems($(this));
			});
		}
	}
FileManager.removeTreeItems = function(li)
	{
	this.clearItems(li);

	li.removeClass('__E').addClass('__C');

	delete li.children('ul').remove();
	}
/* makeTreeItem ===========================================================*/
FileManager.makeTreeItem = function(rel, name, _delete, _rename)
	{
	return '<li class="__C"><a rel="'+(rel ? rel+this.DS : '')+'"><span class="delete'+(_delete ? '' : ' disable')+'" title="удалить"></span><span class="rename'+(_rename ? '' : ' disable')+'" title="переименновать"></span><span class="new" title="создать подкаталог"></span><abbr>'+(name ? name : '')+'</abbr></a></li>';
	}

/* setData ===========================================================*/
FileManager.setData = function(li, json)
	{
	var dir = [];

	dir.push('<ul class="FM-tree" style="display: none;">');

	for(var i=0, L=json.dir.length; i<L; i++)
		{
		dir.push(this.makeTreeItem(json.dir[i].rel, json.dir[i].name, true, true));
		}

	dir.push('</ul>');

	li.removeClass('wait').addClass('__L').append(dir.join(''));

	li.removeClass('__C').addClass('__E');
	$(li.children()[1]).show();

	this.dir[json.folder] = {};
	this.dir[json.folder] = json.files;
	//this.dir[json.folder]['/tasks/'] = json.files['/tasks/'];

	this.makeTasks(json.folder, json.files['/tasks/']);
	}

/*
	this.task - список задач текущего каталога

	как формируется this.task : берётся список задач родителя и если какой-то задачи нет в списке каталога, она добавляется
*/

// макеTasks вызывается только тогда когда данные загружены или есть в кэше
FileManager.makeTasks = function(folder, t) // json.tasks
	{
	var tasks={};

	if (t){tasks = t;}

	var _tasks;

	var parent = $(this.cur).parent().parent().parent();

	if (parent.attr("id") == "FileManager-datatree") // корень
		{
		_tasks	= this.tasksDef;
		}
	else	{
		_tasks	= this.dir[$(parent.children()[0]).attr("rel")]['/tasks/']; // ни хера се
		}

	for(var i in _tasks)	// проходимся по родительскому списку
		{
		if ((typeof tasks[i] == "undefined") || (tasks[i].type == 'parent'))	/* если в моём наборе этого нет  или это родительский элемент */
			{
			tasks[i]		= this.cloneObject(_tasks[i]); // обязательно cloneObject, иначе получим ссылку
			tasks[i].type	= 'parent';
			}
		}

	this.tasks = this.dir[folder]['/tasks/'] = tasks;
	}


/* loadData ===========================================================*/
FileManager.loadData = function(folder, li, show, refresh)
	{
	if (li.hasClass('__L'))	/* уже загружен */
		{
		this.makeTasks(folder, this.dir[folder]['/tasks/']);

		if (show === true){this.showFiles(folder);}
		return;
		}
	else	log('loadData no cache');

	li.addClass('wait');

	$.ajax(
		{
		url		:this.__fm
		,data	:{mode: 'folder', folder: folder, 'tasklist[]': this.getTaskList(), refresh: refresh}
		,error	:this.error
		,success	:function(json)
			{
//JJson = json;
			if (json.refresh == "true"){$("#FM-refresh").removeClass("active");}

			if (json.error)
				{
				alert(json.error);

				$("#FM-path").html('');
				li.hide(0);
				return;
				}

			FileManager.setData(li, json);

			if (show === true){FileManager.showFiles(json.folder);}
			}
		});
	}

/* setCur */
FileManager.setCur = function(a)
	{
	if (this.cur == a){return false}
	if (typeof this.cur != "undefined"){$(this.cur).removeClass('select')}

	this.cur	 = a;
	$(a).addClass('select');

	this.folder = $(a).attr('rel');
	$("#FM-path").html(this.FCPATH + this.folder);

	//$('#FM-list').empty();
	/* пока не вышел jQuery 1.4 */
	document.getElementById('FM-RP').removeChild(document.getElementById('FM-list'));
	
	FileManager.clearPreview();

	return true;
	}

/* delete FILES */
FileManager.deleteFiles = function()
	{
	var f = this.dir[this.folder].f;
	var list = [];

	for(var i in this.selected)
		{
		list.push(this.selected[i]);
		}

	if ( (this.settings.confirm_file_delete.state == false) || confirm("УДАЛЯЕМ ?\n\n"+list.join('; ')) )		
		{
		//$('.FM-tree').removeClass('FM-tree').addClass('FM-tree-lock');
		$(this.cur).parent().addClass('wait');

		$.ajax(
			{
			url		:this.__fm
			,data	:{mode: 'deletefiles', folder: this.folder, 'files[]':list, 'tasklist[]': this.getTaskList()}
			,async	:false
			,error	:this.error
			,success	:function(json)
				{
				//$('.FM-tree-lock').removeClass('FM-tree-lock').addClass('FM-tree');
				$(FileManager.cur).parent().removeClass('wait');

				if (json.error)
					{
					alert(json.error);
					return;
					}

				var nodelete = [];

				for(var name in json.files)
					{
					if (json.files[name]['delete'] === false)
						{nodelete.push(json.files[name].file);}
					else	{
						delete FileManager.dir[json.folder][name];

						if (FileManager.folder == json.folder)
							{
							delete $("a[title='"+name+"']").remove();
							}
						}
					}

				if (FileManager.folder == json.folder)
					{
					FileManager.clearPreview();
					}

				if (nodelete.length)
					{
					alert('по неизвестной нам причине, некоторые файлы не были удалены:\n'+nodelete.join('\n'));
					}
				}
			});
		}
	}

/* for textarea */
FileManager.changeDesc = function(folder, div, text)
	{
	filename = $(div).attr('title');

	$(FileManager.cur).parent().addClass('wait');

	FileManager.lockUI(true);

	$.ajax(
		{
		url		:this.__fm
		,data	:{mode: 'changedesc', folder: folder, 'filename': filename, desc: text}
		
		,error	:this.error
		,success	:function(json)
			{
			if (json.error)
				{
				alert(json.error);
				return;
				}

			FileManager.dir[json.folder][json.filename].desc = json.desc;

			if ((FileManager.folder == json.folder) && ($("#FM-preview-filename").html() == json.filename))
				{
				$("#FM-preview-desc").html(json.desc);
				if (json.desc)
					{
					$("#FM-preview-desc").show();
					}
				else	{
					$("#FM-preview-desc").hide();
					}
				}

			$(FileManager.cur).parent().removeClass('wait');

			FileManager.lockUI(false);
			}
		});
	}

/* TEXTAREA функции */
FileManager.textarea = function(_self, e)
	{
	function Post(textarea)
		{
		textarea.attr("readOnly", true);
		textarea.css({"color":'#555', "background":'none', 'cursor':'pointer'});
		}

	function Quest(folder, textarea, oldvalue)
		{
		if (confirm("Текст был изменен. Сохранить?"))
			{FileManager.changeDesc(folder, textarea.parent().parent(), textarea.val());}
		else {textarea.val(oldvalue);}

		Post(textarea);	
		}

	if (_self.fm_init != true)
		{
		_self.fm_init 		= true;
		_self.selectionEnd	= FileManager.curetPos;
		_self.selectionStart	= _self.selectionEnd;
		
		$(_self).one("focus", function()
			{
			_self.fm_old	= $(_self).val();
			_self.fm_key	= false;

			$(_self).removeAttr("readOnly");		// readOnly нужен для принятия решения при нажатии DEL
			//$(this).attr("enabled", true);

			$(_self).css({"color":'#000', "background":'#ffffff', 'cursor':'default'});
			$(_self).attr("title",'для сохранения нажмите [Ctrl-S], для отмены [ESC]');	

			$(_self).one("blur", function()
				{
				_self.fm_init = false;
				$(_self).die();			// !!!

				if ((_self.fm_key === false) && (_self.fm_old !=  $(_self).val()))
					{window.setTimeout(function(f, t, v){ Quest(f, t, v)}, 25, FileManager.folder, $(_self), _self.fm_old);}
				else	{Post($(_self))}
				})

			}) // focus

		$(_self).keypress(function(e)
			{
			if (e.ctrlKey && (e.keyCode == 83))
				{
				e.preventDefault();		// что б не было окна Save
					//e.stopPropagation();

				FileManager.changeDesc(FileManager.folder, $(_self).parent().parent(), $(_self).val());
				_self.fm_key = true;
				$(_self).blur();
				
				return false;
				}
			});

		$(_self).keydown(function(e)
			{
			if (e.ctrlKey && (e.keyCode == 83))
				{
				//e.preventDefault();	
				window.setTimeout(function(f, a, v){FileManager.changeDesc(f, a, v)}, 25, FileManager.folder, $(_self).parent().parent(), $(_self).val());
				_self.fm_key = true;
				$(_self).blur();
				return false;
				}
			if (e.keyCode == 27)	// ESC keypress not work in Chrome
				{
				$(_self).val(_self.fm_old);
				_self.fm_key = true;
				$(_self).blur();
				return false;
				}
			});

		$(_self).focus();
		}
	}

/* settings */
FileManager.absolute_path_change = function()
	{
	if (this.settings.absolute_path.state == false)
		{
		this.url = '/';
		}
	else	{
		this.url = this.fullurl;
		}

	this.makeCode();
	}

FileManager.FM_settings_save = function($panel, button)
	{
	$.ajax(
		{
		url		:this.__fm
		,data	:{mode: 'changedesc', folder: this.root + this.DS, filename: '/settings/', desc: $.toJSON(this.settings)}
		,async	:false	
		,error	:this.error
		,success	:function(json)
			{
			if (json.error)
				{
				alert(json.error);
				return;
				}

			$panel.slideUp('fast');
			$("#FM-settings").toggleClass("active");
//alert($("#"+button.id).attr("class"));
//alert(button.id);
			}
		});
	}

FileManager.FM_tasks_apply = function($panel, button)
	{
	$(button).parent().children('table').children('tbody').children().each(function (i)	// список TR
		{
		var type = this.className; // - connect, parent, owner - автоматически меняется в this.tasks

		tds		= $(this).children();
		var items	= ['0', '1', 'max', 'width', 'height', 'crop', 'rotate', 'watermark'];

		var st = '';

		var name = $(tds[1]).html();

		for(var i=2; i<8; i++)
			{
			//st+=names[i]+' ';
			//FileManager.tasks[name][items[i]] = $(tds[i]).children()[0].value; // input
			}

		// пока только мах
		FileManager.tasks[name][items[2]] = $(tds[2]).children()[0].value; 
			
/*
		
		$(this).children().each(function(i)	// список TH, TD
			{
			// 0 - setConnect
			// 1 - config-name
			// ...
			// 8 - state
			st+=i+'='+this.className+'; ';
			});
		
*/
		//log(st);
		});

	
	}
FileManager.FM_tasks_save = function($panel, button)
	{
	var forsave = {};

	for(var i in this.tasks)
		{
		if (this.tasks[i].type != 'parent')
			{
			forsave[i] = this.tasks[i];
			}
		}

	$.ajax(
		{
		url		:this.__fm
		,data	:{mode: 'changedesc', folder: this.folder, filename: '/tasks/', desc: $.toJSON(forsave)}
		,async	:false	
		,error	:this.error
		,success	:function(json)
			{
			if (json.error)
				{
				alert(json.error);
				return;
				}

			$panel.slideUp('fast');
			$(button).toggleClass("active");
			}
		});
	}

FileManager.makeItemPanel = function(idpanel)
	{
	var disabled;

	function setType(type)
		{
		switch (type)
			{
			case 'parent':		return '<a class="fm-button title="подключить"><span></span></a>';
			case 'connect':	return '<a class="fm-button title="отключить"><span></span></a>';
			default:			return '';								// owner
			}
		}

	$(idpanel+" tbody").empty();

	var namearr = idpanel.replace(/#FM-([A-Za-z]*)-panel/,'$1');
	
	var arr = this[namearr];	// мы работаем со ссылкой
	var st='';

	for(var i in arr)	// {type: "owner", state: true}
		{
		var t	= arr[i];
		

		if (t.type == 'parent')
			disabled = ' disabled';
		else	disabled = '';

		st+='<tr class="'+t.type+'" title="'+namearr+'"><th class="setConnect" title="'+i+'">'+setType(t.type)+'</th><td class="config-name">'+t.name+'</td>';

		for(var e in t)
			{
			if ((e != 'type') && (e != 'name') && (e != 'state'))
				{
				//st+='<td>'+t[e]+'</td>';
				st+='<td><input type="text" value="'+t[e]+'" autocomplete="off"'+disabled+' /></td>';
				}	
			}

		var title	= '';

		if (t.type == 'parent')
			{
			title = 'изменение этой опции, будет выполняться, только пока Вы находитесь в этом каталоге, и действовать при переходе в подчинённые каталоги';	
			}
		
		st+='<th class="state" title="'+i+'"><a class="fm-button '+t.state+'"  title="'+title+'"><span></span></a></th></tr>';
		}

	$(idpanel+" tbody").append(st);
	}

FileManager.save_splitter = function()
	{
	Storage.put('splitter', $.toJSON({width:{'#FM-LP':this.$FM_LP.width(), '#FM-RP': this.$FM_RP.width()}, height: {'#FM-LT': this.$FM_LT.height(), '#FM-LB': this.$FM_LB.height()}}));
	}

/*==============================================================================================================*/
FileManager.setSizePreview = function()
	{
	var inline = false;

	if ($("#FM-preview-image").css("display") == 'inline')
		{
		inline = true;
		$("#FM-preview-image").hide(0);
		}	

	$("#FM-lightbox").width($("#FM-preview").width());
	$("#FM-lightbox").height(Math.ceil($("#FM-lightbox").width()/3 * 2)); // 3 x 2

	if (inline == true)
		{
		this.previewResize(this.folder);
		}
	}

FileManager.resize = function()
	{
	if (this.$FM.css("display") == 'none')
		{
		return;
		}

	this.$FM.hide(0);

	var WH = this.$w.height();
	var WW = this.$w.width();
				
	this.$FM
		.height(WH-parseInt(this.$FM.css('padding-top'))-parseInt(this.$FM.css('padding-bottom')))
		.width(WW-parseInt(this.$FM.css('padding-left'))-parseInt(this.$FM.css('padding-right')));

	this.$FM.show(0);

	var FM	= this.$FM.height();
	var FMP	= $("#FM-menu").outerHeight();
	var FMB	= $("#FM-buf").outerHeight();
	var FMI	= $("#FM-info").outerHeight();
	var FML	= 0;

	if (this.debug == true)
		{
		FML = $("#FM-log").height();
		}

	h = FM - (FMP + FMB + FMI + FML + 4); // 4 - borders

//	log(FM+' '+FMP+' '+FMB+' '+FMI +' '+FML+' ');

	this.$FM_LP.height(h);
	this.$FM_VS.height(h);

	var w = this.$FM.width() - this.$FM_VS.width() - parseInt(this.$FM_RP.css('margin-left'));

	var koffW= w / (this.$FM_LP.width() + this.$FM_RP.width());
	var Lw	= parseInt(koffW * this.$FM_LP.width());

	this.$FM_LP.width(Lw);
	this.$FM_VS.css('left', Lw);

	this.$FM_RP.height(h).width(w - Lw);

	$("#FM-buf").width(this.$FM.width() - 6);

	h = h - this.$FM_HS.height() - 2 - 4;

	var koffH	= h / (this.$FM_LT.height() + this.$FM_LB.height());
	var Th	= parseInt(koffH * this.$FM_LT.height());

	this.$FM_LT.height(Th);
	this.$FM_HS.css('top', Th  + 2 + 4);
	this.$FM_LB.height(h - Th);

	this.setSizePreview();

	var p = $("#FileManager-buffer").offset();

	$("#FM-panel-code").css({top: p.top - $("#FM-panel-code").height(), right:parseInt(this.$FM.css('padding-right')) + 24});

	w = 0;

	$("#FM-menu").children().each(function (i)
		{
//		log(i + ' '+this.id);
		w = w+ $(this).outerWidth();
		});

//	log(w);

	$("#FM-path").width($("#FM-menu").innerWidth() - w + $("#FM-path").width() - 26);
	}




/*==============================================================================================================*/
/*==============================================================================================================*/


$(function()
	{

	FileManager.load = true;

	$("#container").hide(0);

	/* CSS */
	if ($.browser.mozilla === true)
		{
		$("#FM-editfoldername").css({"height":'15px', "padding-top":'3px'});
		$("#FM-editfilename").css({"height":'15px', "padding-top":'3px'});
		}
	if ($.browser.opera === true)
		{
		$("#FM-editfoldername").css({"height":'17px', "padding":'0 0 1px 3px', "vertical-align":'super'});
		$("#FM-editfilename").css({"height":'17px', "padding":'0 0 1px 0', "vertical-align":'super'});
		}

	$("#FM-lightbox").prependTo("#FM-preview").css("display", 'table-cell');

	FileManager.$w		= $(window);
	FileManager.$FM		= $("#FM");
	FileManager.$FM_LP	= $("#FM-LP");		// левая панель
	FileManager.$FM_RP	= $("#FM-RP");		// правая панель
	FileManager.$FM_VS	= $("#FM-VS");		// вертикальный сплиттер между левой (FM-LP) и правой (FM-RP) панелями
	FileManager.$FM_HS	= $("#FM-HS");		// горизонтальный сплиттер между FM-LT (верхней) и FM-LB (нижней) панелями
	FileManager.$FM_LT	= $("#FM-LT");		// левая панель, верхняя часть (tree)
	FileManager.$FM_LB	= $("#FM-LB");		// левая панель, нижняя часть (preview)

	FileManager.$FM.show(0);
	
	Storage.swfUrl = FileManager.fm + "swf/storage.swf";

	Storage.init(function()
		{
		/* splitter */
		data = $.parseJSON(Storage.get('splitter'));

		for(var css in data)
			{
			var i = data[css];
			for(var name in i)
				{
				if (i[name] > 0){$(name)[css](i[name]);}
				}
			}

		FileManager.resize();

		FileManager.$w.resize(function(){FileManager.resize();});
		});

	//if (!Storage.active)
	//	{
	//	alert('File-manager: Ошибка, вероятно у Вас не установлен или отключен Flash-плагин. Не будет работать загрузка файлов и сохранение положений сплиттеров.');
	//	}

	/* first resize */
	

	function vSplit(_self)
		{
		var S = parseInt(FileManager.$FM_VS.css('left')) - _self.start;

		var minLW = 30;

		if ((_self.Lw+S) < minLW)
			{
			S = minLW - _self.Lw;
			FileManager.$FM_VS.css('left', S + _self.start);
			}

		var minRW = 100;

		if ((_self.Rw-S) < minRW)
			{
			S = _self.Rw - minRW;
			FileManager.$FM_VS.css('left', S + _self.start);
			}

		FileManager.$FM_LP.width(_self.Lw+S);
		FileManager.$FM_RP.width(_self.Rw-S);
		}

	FileManager.$FM_VS
		.draggable(
			{
			axis:'x'
			,cursor:'e-resize'
			//,refreshPositions:true
			//,grid:[16]
			})
		.bind('dragstart', function(event, ui)
			{
			this.Lw	= FileManager.$FM_LP[0].clientWidth;
			this.Rw	= FileManager.$FM_RP[0].clientWidth;
			this.start	= this.Lw;
			})
		.bind('drag', function(event, ui){vSplit(this);})
		.bind('dragstop', function(event, ui)
			{
			vSplit(this);
			FileManager.setSizePreview();
			FileManager.save_splitter();
			}
	);

	function hSplit(_self)
		{
		var S = parseInt(FileManager.$FM_HS.css('top')) - _self.Th - 6; // margin-top:4px;

		FileManager.$FM_LT.height(_self.Th + S);
		FileManager.$FM_LB.height(_self.Bh - S);
		}

	FileManager.$FM_HS
		.draggable(
			{
			axis:'y'
			,cursor:'n-resize'
			,refreshPositions:true
			,grid:[16, 16]
			})
		.bind('dragstart', function(event, ui)
			{
			this.Th = FileManager.$FM_LT.height();
			this.Bh = FileManager.$FM_LB.height();
			})
		.bind('drag', function(){hSplit(this);})
		.bind('dragstop', function()
			{
			hSplit(this);
			FileManager.setSizePreview();
			FileManager.save_splitter();
			}
	);

	/* close FileManager */
	$("#FM-close").mousedown(function(e)
		{
		if (e.button === 0)
			{
			$("div.fm-panel").hide(0);
			$("a.fm-button").removeClass('active');

			//$("#FM-swfupload").css("position",'absolute').appendTo("body");

			FileManager.$FM.hide(0);
			
			$("#FM-loading").hide(0);
			$("#container").show(0);
			//$("#FM-loader").slideDown(0);

			return false;
			}
		});

	/* ========================================= */

	$.ajaxSetup(
		{
		dataType		:'json'	// если будет неправильный разбор json свалимся в error
		,global		:false
		,async		:true	// default
		,cache		:false
		,type		:'POST'
		,timeout		:20000	// 20 sec
		}
	);

	/* set settings */
	if (loader.settings)
		{
		delete loader.settings['confirm_file_rename']; // удаление старой переменной

		for(var i in loader.settings)
			{
			FileManager.settings[i] = FileManager.cloneObject(loader.settings[i]);
			}
		}

	FileManager.absolute_path_change();

	/* DREM textarea */
	FileManager.$FM_RP
		.click(function(e)
			{
			if (e.target.nodeName == 'TEXTAREA')
				{
				var ta = e.target;

				if (ta.selectionStart == ta.selectionEnd)
					{
					FileManager.curetPos = ta.selectionStart;
					}

				if (ta.fm_init != true)
					{
					if (FileManager.settings.click_description.state == true)
						{FileManager.textarea(ta, e)}
					else	{ta.blur()}
					}
				}
			})
		.dblclick(function(e)
			{
			if (e.target.nodeName == 'TEXTAREA')
				{
				var ta = e.target;

				if ((FileManager.settings.click_description.state == false) && (ta.fm_init != true))
					{FileManager.textarea(ta, e)}
				}
			});

	/* навигация по каталогам **************************************/
	$("ul.FM-tree li").live("mousedown",function(e)
		{
		if ($(this).hasClass('wait')){return}

		if ((!e.button) || ((e.button == 0) && (e.ctrlKey === false) && (e.altKey === false) && (e.shiftKey === false)))
			{

			if ((e.target.tagName == "A") || (e.target.tagName == "ABBR") || ((e.target.tagName == "LI") && (!$(this).hasClass('__L')))) // A || ABBR  in CSS display:block !!!
				{
				var pcur = FileManager.cur;

				if (FileManager.setCur($(this).children()[0]) == true)
					{
					// удалить элементы массива от FileManager.historyID (включительно) до конца
					if (FileManager.history.length > 0)
						{
						FileManager.history.splice(FileManager.historyID, FileManager.history.length - FileManager.historyID);
						$("#FM-next").addClass('disable');
						}

					FileManager.history.push(pcur);
					FileManager.historyID = FileManager.history.length;
					$("#FM-prev").removeClass('disable');

					FileManager.loadData(FileManager.folder, $(this), true);
					return false;
					}
				}

			// открытие - закрытие папок
			if (e.target.tagName == "LI") 
				{
				if ($(this).hasClass('__E'))
					{
					$(this).removeClass('__E').addClass('__C');
					$($(this).children()[1]).hide();
					return false;
					}
				if ($(this).hasClass('__L'))
					{
					$(this).removeClass('__C').addClass('__E');
					$($(this).children()[1]).show();
					return false;
					}
				}

			}
		}
	);

	/* PREV */

	$("#FM-prev").mousedown(function()
		{
		if ($("#FM-prev").hasClass('disable')){return;}

		var a	= FileManager.history[FileManager.historyID-1];
		var pcur	= FileManager.cur;

		if (FileManager.setCur(a) == true)
			{
			if (FileManager.historyID == FileManager.history.length)
				{
				FileManager.history.push(pcur);
				}

			FileManager.historyID--;
			
			if (FileManager.historyID == 0)
				{
				$("#FM-prev").addClass('disable');
				}

			$("#FM-next").removeClass('disable');

			FileManager.loadData(FileManager.folder, $(a).parent(), true);
			return false;
			}
		});

	/* NEXT */	

	$("#FM-next").mousedown(function()
		{
		if ($("#FM-next").hasClass('disable')){return;}

		var a = FileManager.history[FileManager.historyID+1];	

		if (FileManager.setCur(a) == true)
			{
			FileManager.historyID++;
			if (FileManager.historyID == FileManager.history.length -1)
				{
				FileManager.history.pop();
				$("#FM-next").addClass('disable');
				}

			$("#FM-prev").removeClass('disable');

			FileManager.loadData(FileManager.folder, $(a).parent(), true);
			return false;
			}	
		});

	/* создание корня */
	//$("#FM-tree").html(FileManager.makeTreeItem('root', 'root', false, false)); 

	$("#FM-tree").html(FileManager.makeTreeItem(FileManager.root, FileManager.root, false, false)); 
	FileManager.setCur($("#FM-tree a")[0]);
	FileManager.setData($("#FM-tree li"), loader);
	FileManager.showFiles(loader.folder);

	//delete loader;


	/* имитиция root open */
	//$("#FM-tree abbr").mousedown();

	/* new, rename folder */
	$("#FM-editfoldername").FMeditor(
		{
		activator		: $("#FM-tree .rename, #FM-tree .new")
		,before		: function(activator)
			{
			//if ($(this).hasClass('disable') == true){return;}

			if (activator.hasClass('new') === true)
				{
				if (!$(FileManager.cur).parent().hasClass('__L'))
					{
					alert('Нельзя создать подкаталог, каталог не был загружен...');
					return false;
					}

				var UL = activator.parent().next().prepend(FileManager.makeTreeItem('', 'New folder', true, true));
				var LI0 = $(UL.children()[0]);

				LI0.attr("id",'FM-EFN');
				$(LI0.children()[0]).after($("#FM-editfoldername")); //FileManager.editfoldername
				}

			if (activator.hasClass('rename') === true)
				{
				activator.parent().after($("#FM-editfoldername"));
				}

			FileManager.lockUI(true);

			return true;
			}
		,setText		: function(activator)
			{
			if (activator.hasClass('rename') === true){return activator.parent().children("abbr")}	// return element TEXT
			if (activator.hasClass('new') === true){return $("#FM-editfoldername").prev().children("abbr")}
			}
		,setContainer	: function(activator)
			{
			if (activator.hasClass('rename') === true){return activator.parent()}	// контейнер
			if (activator.hasClass('new') === true){return $("#FM-editfoldername").prev()}
			}
		,afterstart	: function(activator, text, cont)
			{
			if (activator.hasClass('new') === true){text.html('')}

			cont.next().next().removeClass('FM-tree').addClass('FM-tree-lock');

			}
		,callback		: function(activator, oldname, newname, a, post, error)
			{
			$(FileManager.cur).parent().addClass('wait');
			$(document).css("cursor",'wait');

			$.ajax(
				{
				url		:FileManager.__fm
				,data	:{mode:activator.attr("class")+'folder', folder:FileManager.folder, newname:newname, oldname:oldname, 'tasklist[]':FileManager.getTaskList()}
				,async	:false	
				,error	:FileManager.error
				,success	:function(json)
					{
					$(FileManager.cur).parent().removeClass('wait'); // это не правильно, найти li отдельно для error, new & rename

					if (json.error)
						{
						alert(json.error);
						error();
						}
					else	{
						post(json.newname);

						$("#FM-editfoldername").appendTo(FileManager.$FM[0]);

						if (activator.attr("class") == 'rename')
							{
							$("#FM-path").html(FileManager.FCPATH + json.folder);

							FileManager.removeTreeItems(a.parent());
							a.attr("rel", json.folder);
							FileManager.folder = json.folder;
							FileManager.setData(a.parent(), json);
							FileManager.clearPreview();

							//$('#FM-list').empty();
							/* по не вышел jQuery 1.4 */
							document.getElementById('FM-RP').removeChild(document.getElementById('FM-list'));

							FileManager.showFiles(json.folder);
							}
						// при создании нового каталога, мы остаёмся в родительском
						if (activator.attr("class") == 'new')
							{
							a.parent().removeAttr("id");
							a.attr("rel", json.folder);
							FileManager.setData(a.parent(), json);
							}
						}
					}
				});
			}
		,cancel		:function(activator)
			{
			$("#FM-editfoldername").appendTo(FileManager.$FM[0]);

			if (activator.hasClass('rename') === true){}
			if (activator.hasClass('new') === true)
				{
				$("#FM-EFN").remove(); // old remove
				}
			}
		,after		:function(cont)
			{
			//cont.next().next().removeClass('FM-tree-lock').addClass('FM-tree');
			FileManager.lockUI(false);
			}
		});

/* !!!
	$("a.fm-button")
		.mousedown(function(e)
			{
			if ((e.button === 0) && (this.id != 'FM-close'))
				{
				$(this).addClass("down");
				}
			})
		.mouseup(function()
			{
			$(this).removeClass("down");
			}
	);
*/

	/* refresh folder */
	$("#FM-refresh").mousedown(function(e)
		{
		if (e.button != 0){return;}
		if ($(this).hasClass("active")){return;}

		$(this).addClass("active");

		var MTL = $(FileManager.cur).parent();

		FileManager.removeTreeItems(MTL);
		FileManager.clearPreview();

		//$("#FM-list").empty();
		/* по не вышел jQuery 1.4 */
		document.getElementById('FM-RP').removeChild(document.getElementById('FM-list'));

		FileManager.loadData(FileManager.folder, MTL, true, true);
		}
	);

	/* delete folder */
	$("ul.FM-tree .delete").live("mousedown", function(e)
		{
		if (e.button != 0){return;}

log('span '+e.target.className);

		if ($(this).hasClass('disable') == true){return;}

		var mode 	= e.target.className;
		var MTL		= $(FileManager.cur).parent();
		var folder	= FileManager.folder;

		if (mode == 'delete')
			{
			if (confirm("Удалить каталог '"+folder+"' и всё содержимое?"))
				{
				$(MTL).addClass('wait');

				$.ajax(
					{
					url		:FileManager.__fm
					,data	:{mode:'deletefolder', folder: folder}
					,error	:FileManager.error
					,success	:function(json)
						{
						if (json.error)
							{
							$(MTL).removeClass('wait');
							alert(json.error);
							return;
							}

						if (confirm("УДАЛЯЕМ ?\n\n"+json.list))
							{
							$.ajax(
								{
								url		:FileManager.__fm
								,data	:{mode:'deletefolder', folder: folder, command:'run'}
								,error	:FileManager.error
								,success	:function(json)
									{
									if (json.error)
										{
										$(MTL).removeClass('wait');
										alert(json.error);
										return;
										}
	
									if (json.list == true)
										{
										var item;

										if ($(MTL).next().length > 0)
											{item = $(MTL).next()}
										else {
											if ($(MTL).prev().length > 0)
												{item = $(MTL).prev()}
											else	{item = $(MTL).parent().parent()}
											}

										FileManager.removeTreeItems(MTL);
										$(MTL).remove(); // // old empty old remove
										$("#FileManager-buffer").val('');
										/* MTL - больше нет !!! */
										FileManager.setCur(item.children()[0]);
										FileManager.loadData(FileManager.folder, $(FileManager.cur).parent(), true);	/* так как может быть не загружен */
										}
									else	{alert('что-то пошло не так, json.list != true')}
									}
								});
							}
						else	{$(MTL).removeClass('wait')}
						}
					});
				}
			}
		return false; // no mousedown .FM-tree li
		});

	/* rename file */
	$("#FM-editfilename").FMeditor(
		{
		activator	: $("#FM-preview-filename")
		,before	: function(activator)
			{
			FileManager.lockUI(true);
			
			$("#FM-editfilename").width($("#FM-preview").width() - 4); // 2 - border + margin FM-editfilename

			return true;
			}
		,callback	: function(activator, oldname, newname, container, post, error)
			{
			$("#FM-lightbox").mousedown(function(){return false;});

			$(FileManager.cur).parent().addClass('wait');

			$.ajax(
				{
				url		:FileManager.__fm
				,data	:{mode:'renamefile', folder:FileManager.folder, newname:newname, oldname:oldname, 'tasklist[]':FileManager.getTaskList()}
				,async	:false	
				,error	:FileManager.error
				,success	:function(json)
					{
					$("#FM-lightbox").die('mousedown');
					$(FileManager.cur).parent().removeClass('wait');

					FileManager.lockUI(false);
					
					if (json.error)
						{
						alert(json.error);
						error();
						return;
						}

					post(json.newname);
					
					delete FileManager.dir[json.folder][json.oldname];
					FileManager.dir[json.folder][json.newname] = json.file;

					FileManager.refreshFile(json.folder, json.oldname, json.newname);

					delete FileManager.selected[$.inArray(json.oldname, FileManager.selected)];	
					FileManager.selected.push(json.newname);
					FileManager.makeCode();
					}
				});
			}
		,after	:function(cont)
			{
			FileManager.lockUI(false);
			}
		});


	/* delete file(s) */
	FileManager.$w.keydown(function(e)
		{
			if
			(
				(e.keyCode == 46) 
				&& FileManager.selected.length 
				&& ($("#FM-editfilename").css('display') == 'none') 
				&& ($("#FM-editfoldername").css('display') == 'none') 
				&& ($("div.DREM textarea").not("[readOnly]").length == 0)
			)														// del
				{
				FileManager.deleteFiles();
				return false;
				}
		});


	/* SELECT FILE */ 
	//$(".FMA-T, .FMA-D, .FMA-L").live('click',function(e){e.preventDefault();e.stopPropagation();return false;});

	$("#FM-list .FMA-T, #FM-list .FMA-D, #FM-list .FMA-L").live('mousedown',function(e)				
		{
		if ((e.button === 0) && !$(this).hasClass('FMH')) // FMH - заголовок списка
			{
//			e.preventDefault();
//			e.stopPropagation();

			if ($("#FM-editfilename").css('display') != 'none'){return true}
			FileManager.selectFile(e, this);

//			return false;	// принимает textarea
			}
		}
	);

/*
E2 = [];

	$("#FM-RP").bind("mousedown", function(e)
		{
E2.push(e);
		if (e.target.parentNode.nodeName == 'A')
			{
			if ($("#FM-editfilename").css('display') != 'none'){return;}
			FileManager.selectFile(e, $(e.target.parentNode));
			}
		});
*/	

	/* режимы списка */
	$("#FMA-T, #FMA-D, #FMA-L").mousedown(function()		
		{
		$("#"+FileManager.typeList).removeClass("select");
		$(this).addClass("select");
		$("a."+FileManager.typeList).removeClass(FileManager.typeList).addClass(this.id);
		FileManager.typeList  = this.id;
		return false;
		});
	/* режимы кода */
	$("#FML-A, #FML-H, #FML-B, #FML-G").mousedown(function()	
		{
		$("#"+FileManager.typeCode).removeClass("select");
		$(this).addClass("select");
		$("a."+FileManager.typeCode).removeClass(FileManager.typeCode).addClass(this.id);
		FileManager.typeCode  = this.id;

		FileManager.makeCode(FileManager.folder);
		});

	$("#FileManager-buffer").click(function()
		{
		$(this).select();
		//$(this).blur();
		return false;
		}
	);

/* настройки =========================================*/


	// открытие панели

	$("#FM-settings, #FM-tasks").mousedown(function()
		{
		$("div.fm-panel:visible").slideUp(0);
		$("a.active:not(#"+this.id+")").toggleClass("active");

		$(this).toggleClass("active");

		if ($(this).hasClass('active'))
			{
			var idpanel	= "#"+this.id+"-panel";
			var p		= $(this).offset();
			
			
			FileManager.makeItemPanel(idpanel);
			$(idpanel).fadeTo(0, 1).css({"top":p.top +  $(this).height() + 10, "left":p.left - $(idpanel).width() + $(this).width()}).slideDown('fast');
			}
		
		return false;
		});

/*
	$("a.fm-button-save").mousedown(function()
		{
		//var panel = $(this).parent();
		$("div.fm-panel:visible").slideUp('fast');
		$("a.active").toggleClass("active");

		if ($.isFunction(FileManager[this.id]))
			{
			FileManager[this.id]();
			}
		else	{
			alert('Функция '+this.id+' не определена см. a.fm-button-save');
			}

		return false;
		});
*/

	$(".fm-panel > div > a").mousedown(function()	// кнопки на fm-panel: APPLY, SAVE
		{
		if ($.isFunction(FileManager[this.id]))
			{
			FileManager[this.id]($(this).parent().parent(), this);
			}
		else	{
			alert('Функция '+this.id+' не определена см. a.fm-button-save');
			}

		return false;
		});
	
	$("div.fm-panel th.setConnect a").live("mousedown",function()
		{
		var td	= $(this).parent();
		var tr	= td.parent();
		var arr	= tr.attr('title');
		var i		= td.attr('title');
		
//alert(name);
		var type='';

		if (FileManager[arr][i].type == 'parent')
			{
			tr.removeClass('parent').addClass('connect');
			type = 'connect';
			tr.children("td").children("input").removeAttr("disabled");
			}
		if (FileManager[arr][i].type == 'connect')
			{
			tr.removeClass('connect').addClass('parent');
			type = 'parent';
			tr.children("td").children("input").attr("disabled", true);
			}

		FileManager[arr][i].type = type;

		return false;
		});	

	$("div.fm-panel th.state a").live("mousedown",function()
		{
		if($(this).hasClass('false'))
			$(this).removeClass('false').addClass('true');
		else	$(this).removeClass('true').addClass('false');

		var arr = 

		FileManager[$(this).parent().parent().attr('title')][$(this).parent().attr('title')].state = $(this).hasClass('true') ? true : false;

		var f_opt = $(this).parent().attr('title')+'_change';

		/* определенна функция для опции */
		if ($.isFunction(FileManager[f_opt]))
			{	
			FileManager[f_opt]();
			}

		var f_panel = $(this).parent().parent().attr('title')+'_change';

		/* определенна функция для панели */
		if ($.isFunction(FileManager[f_panel]))
			{
			FileManager[f_panel]($(this).parent().attr('title'));
			}

		return false;
		});


/*
	$("div.fm-panel > input").change(function()
		{
		log('change');
		});

	$(":input").keydown(function()
		{
		log('keydown');
		});

	$("tr").keydown(function()
		{
		log('keydown tr');
		});
	$("div.fm-panel table").keydown(function(e)
		{
		if ((e.target.nodeName == "INPUT") && (e.target.type == "text"))
			{
EE = e;

			//var v = String.fromCharCode(e.keyCode);
			
			//v.replace(/(\d?)/gm,'$1'));
			//alert();
			//log('keydown = '+e.target.value);
			//e.target.value = e.target.value;.replace(/\d?/gm)
			}
		});
*/
	
	/* запрет выделения */
	preventSelection($("#FM-settings-panel").get(0));
	preventSelection($("#FM-tasks-panel").get(0));
	preventSelection($("#FileManager-datatree").get(0));
	preventSelection(FileManager.$FM_RP[0]);
	preventSelection($("#FM-panel-code").get(0));
});

/*
$.ajax(options)

async		- логический тип, по умолчанию true, т.е все запросы отсылаются асинхронно. В случае false - отправка осуществляется синхронно, синхронные запросы могут на время выполнения запроса заблокировать браузер.
beforeSend	- может содержать функцию, которая должна быть вызвана до передачи запроса. Функция Ajax Event.
cache		- логический тип, по умолчанию true. Если установить в false, запрашиваемая страница не будет кэшироваться браузером.
complete		- функция, которая исполняется после завершения запроса AJAX. Функция Ajax Event.
contentType	- при передаче данных серверу сообщает content-type. По умолчанию - application/x-www-form-urlencoded.
data			- данные, которые передаются на сервер. Если данные не являются строкой, то они конвертируются в строку запроса. Для запросов типа GET данные прикрепляются к URL. Объект должен состоять из пар ключ/значение. Если в значении массив, то jQuery упорядочивает значения, принадлежащие одному ключу, например, {foo:["bar1", "bar2"]} превращается в &foo=bar1&foo=bar2.
dataType		- тип данных, ожидаемых от сервера. Если опция не определена, то jQuery попытается определить тип, основываясь на MIME-типе ответа сервера. Доступные типы - xml, html, script, text, json (расценивает ответ как данные в формате JSON и возвращает JavaScript объект), jsonp (загружает данные в формате JSON используя JSONP, необходимо дополнительно добавить "?callback=?" в конец строки запроса в URL, чтобы определить вызов).
error		- функция, исполняемая в случае неудачного запроса.
global		- логический тип, по умолчанию true. Вызывать или нет глобальные обработчики событий Ajax для этого запроса (например ajaxStart или ajaxStop).
ifModified	- логический тип, по умолчанию false, запрос будет успешным только в случае, если данные ответа изменились со времени последнего запроса.
username	- имя пользователя, которое будет использовано для HTTP запроса авторизации.
password	- пароль, который будет использован для HTTP запроса авторизации.
processData	- логический тип, по умолчанию true. В опции data данные представлены в виде объекта, который преобразуется в строку запроса, подходящую для content-type по умолчанию - "application/x-www-form-urlencoded". Если требуется дугое, нужно установить processData в false.
success		- функция, которая будет вызвана в случае успешного завершения запроса
timeout		- устанавливает локальное время ожидания для запроса в мс.
type			- тип запроса - POST либо GET. По умолчанию - GET.
url			- url запроса. По умолчанию - текущая страница.
*/