// see license.txt for licensing
	if(!window.kfm_callerType)window.kfm_callerType='standalone';
	var loadedScripts=[],function_urls=[],kfm_cwd_name='',kfm_cwd_id=0,kfm_cwd_subdirs=[],contextmenu=null,selectedFiles=[];
	var kfm_tags=[],kfm_lastClicked,kfm_unique_classes=[],kfm_directory_over=0,kfm_kaejax_timeouts=[];
	var kfm_directories=[0,{name:kfm_vars.root_folder_name,pathname:'/'}],kfm_kaejax_is_loaded=0;
var Notice=new Class({
	getWrapper:function(){
		var w=$('notice_wrapper');
		if(w)return w;
		w=new Element('div',{
			'id':'notice_wrapper',
			'styles':{
				'position':'absolute',
				'top':5,
				'right':5,
				'z-index':222
			}
		});
		document.body.appendChild(w);
		return w;
	},
	initialize:function(message){
		var id=_Notices++;
		this.id=id;
		var notice_message=new Element('div',{
			'id':'notice_message_'+id,
			'class':'notice'
		});
		notice_message.setHTML(message);
		this.getWrapper().appendChild(notice_message);
		var myFx=new Fx.Style(notice_message,'opacity',{'duration':3500});
		myFx.start(1,0).chain(function(){
			var myFx2=new Fx.Style(notice_message,'height');
			myFx2.start(notice_message.offsetHeight-parseInt(notice_message.getStyle('padding-top'))-parseInt(notice_message.getStyle('padding-bottom')),0).chain(function(){
				notice_message.remove();
				var w=$('notice_wrapper');
				if(!w.childNodes.length)w.remove();
			});
		});
	}
});
var _Notices=0;
// see license.txt for licensing
var KFM=new Class({
	about:function(){
		var div=new Element('div',{
			'styles':{
				'width':400
			}
		});
		var html='<h1>KFM '+kfm_vars.version+'</h1>';
		{ // sponsors
			html+='<h2>Sponsors</h2>';
			html+='KFM is free software. Here are some recent sponsors:<br />';
			html+='<a href="http://tinyurl.com/2uerfm" style="float:right;display:block;border:1px solid red;background:#fff;text-decoration:none;text-align:center;margin-right:10px" target="_blank">Donate to KFM</a>';
			html+='<a href="http://webworks.ie/" target="_blank"><strong>webworks.ie</strong></a><br />';
			html+='<a href="http://www.bluenectar.com.au/" target="_blank">Blue Nectar</a><br />';
		}
		{ // developers
			html+='<h2>Developers</h2>';
			html+='<a href="http://verens.com/" target="_blank"><strong>Kae Verens</strong></a><br />';
			html+='<a href="http://www.companytools.nl/kfm" target="_blank">Benjamin ter Kuile</a><br />';
		}
		{ // translators
			html+='<h2>Translators</h2><table><tr><td>';
			html+='bg (Bulgarian): Tondy<br />';
			html+='cz (Czech): Petr Kamenik<br />';
			html+='da (Danish): Janich Rasmussen<br />';
			html+='de (German): Just Agens<br />';
			html+='en (English): Kae Verens<br />';
			html+='es (Spanish): Ramón Ramos<br />';
			html+='fa (Persion/Farsi): Ghassem Tofighi<br />';
			html+='fi (Finnish): Hannu (hlpilot)</td><td>';
			html+='fr (French): Hubert Garrido<br />';
			html+='ga (Irish): Kae Verens<br />';
			html+='hu (Hungarian): Ujj-Mészáros István<br />';
			html+='it (Italian): Stefano Luchetta<br />';
			html+='nl (Dutch): Roy Lubbers<br />';
			html+='pl (Polish): Jan Kurek<br />';
			html+='ro (Romanian): Andrei Suscov<br />';
			html+='ru (Russian): Andrei Suscov<br />';
			html+='sv (Swedish): Aram Mäkivierikko</td></tr></table>';
		}
		{ // bug testers
			html+='<h2>Bug Testers</h2>';
			html+='To many to mention! To report a bug, please <a href="http://mantis.verens.com/">go here</a>.';
		}
		div.setHTML(html);
		kfm_modal_open(div,kfm.lang.AboutKfm);
	},
	addCell:function(o,colNum,colSpan,subEls,className){
		var f=$(o.insertCell(+colNum));
		if(colSpan)f.colSpan=colSpan;
		if(subEls)kfm.addEl(f,subEls);
		if(className)f.className=className;
		return f;
	},
	addEl:function(o,a){
		if(!o)return;
		if(!a)return o;
		if($type(a)!='array')a=[a];
		for(var i=0;i<a.length;++i){
			if($type(a[i])=='array'){
				kfm.addEl(o,a[i]);
			}
			else{
				if($type(a[i])=='string')a[i]=newText(a[i]);
				if(!a[i])return;
				o.appendChild(a[i]);
			}
		}
		return o;
	},
	addRow:function(t,p,c){
		var o=t.insertRow(p===parseInt(p)?p:t.rows.length);
		if(c && c!=undefined)o.className=c;
		return o;
	},
	alert:function(txt){
		window.inPrompt=1;
		alert(txt);
		setTimeout('window.inPrompt=0',1);
	},
	showErrors:function(errors){
		var div=new Element('div',{
			'styles':{
				'width':400
			}
		});
		var html='';
		for(var i=0;i<errors.length;i++){
			html+='<span>'+errors[i].message+'</span><br/>';
			/* Add tooltip or do something with:
			 *errors[i].level
			 *errors[i].function
			 *errors[i].class
			 *errors[i].file
			 */
		}
		div.setHTML(html);
		kfm_modal_open(div,kfm.lang.Errors);
	},
	showMessages:function(messages){
		var message='';
		for(var i=0;i<messages.length;i++){
			message+=messages[i].message+'<hr>';
		}
		new Notice(message);
	},
	switchFilesMode:function(m){
		kfm_listview = +m;
		x_kfm_loadFiles(kfm_cwd_id,true,kfm_refreshFiles);
	},
	build:function(){
		kfm_addHook({name:"download", mode:0,"extensions":"all", writable:2, title:"download file", doFunction:function(files){
				kfm_downloadSelectedFiles(files[0]);
			}
		});
		if(!window.ie)kfm_addHook({name:"download", mode:1,"extensions":"all", writable:2, title:"download selected files", doFunction:function(files){
				kfm_downloadSelectedFiles();
			}
		});
		if(kfm_vars.permissions.file.rm)kfm_addHook({name:"remove", mode:2,extensions:"all", writable:1,title:kfm.lang.DeleteFile, doFunction:function(files){
				if(files.length>1)kfm_deleteSelectedFiles();
				else kfm_deleteFile(files[0]);
			}
		});
		if(kfm_vars.permissions.file.ed)kfm_addHook({name:"rename", mode:0,extensions:"all", writable:1,title:kfm.lang.RenameFile, doFunction:function(files){
				kfm_renameFile(files[0]);
			}
		});
		var form_panel,form,right_column,directories,logs,logHeight=64,w=window.getSize().size,j,i;
		{ // extend language objects
			for(var j in kfm.lang){
				if(kfm_regexps.percent_numbers.test(kfm.lang[j])){
					kfm.lang[j]=(function(str){
						return function(){
							var tmp=str;
							for(i=1;i<arguments.length+1;++i)tmp=tmp.replace("%"+i,arguments[i-1]);
							return tmp;
						};
					})(kfm.lang[j]);
				}
			}
		}
		kfm_cwd_name=starttype;
		$(document.body).setStyle('overflow','hidden');
		$('removeme').remove();
		kfm_addContextMenu(document.body,function(e){
			var links=[['kfm.about()',kfm.lang.AboutKfm]];
			var links=[{title:kfm.lang.AboutKfm, doFunction:function(){kfm.about();}}];
			kfm_createContextMenu(e.page,links);
		});
		if(kfm_vars.use_templates){
			$('templateWrapper').style.display='block';
			var documents_body=$('documents_body');
			if(!documents_body)alert('no #documents_body on page - please fix your template');
			var wrapper=$('kfm_search_wrapper');
			if(wrapper)wrapper.appendChild(kfm_searchBoxFile());
			var wrapper=$('kfm_upload_wrapper');
			if(wrapper)kfm.addEl(wrapper,kfm_createFileUploadPanel(true));
		}
		else{
			{ // create left column
				var left_column=kfm_createPanelWrapper('kfm_left_column');
				kfm_resizeHandler_addMaxHeight('kfm_left_column');
				kfm_addPanel(left_column,'kfm_directories_panel');
				kfm_addPanel(left_column,'kfm_widgets_panel');
				kfm_addPanel(left_column,'kfm_search_panel');
				kfm_addPanel(left_column,'kfm_directory_properties_panel');
				if(!kfm_inArray('kfm_logs_panel',kfm_hidden_panels))kfm_addPanel(left_column,'kfm_logs_panel');
				left_column.panels_unlocked=1;
				left_column.setStyles('height:'+w.y+'px');
				kfm_addContextMenu(left_column,function(e){
					var links=[],i;
					var l=left_column.panels_unlocked;
					links.push({title:l?'lock':'unlock', doFunction:function(){
							kfm_togglePanelsUnlocked();
						}
					});
					var ps=left_column.panels;
					for(var i=0;i<ps.length;++i){
						var p=$(ps[i]);
						if(!p.visible && !kfm_inArray(ps[i],kfm_hidden_panels))links.push({title:'Show panel '+p.panel_title, doFunction:function(){
								kfm_addPanel("kfm_left_column",ps[i]);
							}
						});
					}
					kfm_createContextMenu(e.page,links);
				});
			}
			{ // create right_column
				right_column=new Element('div',{
					'id':'kfm_right_column'
				});
			   var lselect=new Element('select',{	
			       'styles':{
			           'position':'absolute',
			           'z-index':2,
			           'right':0,
			           'top':1,
			           'border':0
			       },
			       'events':{
			           'change':function(){
										kfm.switchFilesMode(this.value);
			           }
			       }
			   });
			   lselect.appendChild((new Element('option',{
			       'selected':!kfm_listview,
			       'value':0
			   })).appendText(kfm.lang.Icons));
			   lselect.appendChild((new Element('option',{
			       'selected':kfm_listview,
			       'value':1
			   })).appendText(kfm.lang.ListView));

			   var header=new Element('div',{
			       'class':'kfm_panel_header',
			       'id':'kfm_panel_header'
			   }).setHTML('<span id="documents_loader"></span><span id="cwd_display"></span><span id="folder_info"></span>');

				var documents_body=new Element('div',{
					'id':'documents_body'
				});
			  right_column.appendChild(lselect);
			  right_column.appendChild(header);
				right_column.appendChild(documents_body);
			}
			{ // draw areas to screen and load files and directory info
				document.body.appendChild(left_column);
				document.body.appendChild(right_column);
			}
		}
		{ // set up main panel
			documents_body.addEvent('click',function(e){
				e=new Event(e);
				if(e.rightClick)return;
				if(!window.dragType)kfm_selectNone()
			});
			documents_body.addEvent('mousedown',function(e){
				e=new Event(e);
				if(e.rightClick)return;
				window.mouseAt=e.page;
				if(this.contentMode=='file_icons' && this.fileids.length)window.dragSelectionTrigger=setTimeout(function(){kfm_selection_dragStart()},200);
				documents_body.addEvent('mouseup',kfm_selection_dragFinish);
			});
			kfm_addContextMenu(documents_body,function(e){
				var links=[],i;
				links.push(['kfm_createEmptyFile()',kfm.lang.CreateEmptyFile,'filenew',!kfm_vars.permissions.file.mk]);
				if(selectedFiles.length>1)links.push(['kfm_renameFiles()',kfm.lang.RenameFile,'edit',!kfm_vars.permissions.file.ed]);
				if(selectedFiles.length>1)links.push(['kfm_zip()',kfm.lang.ZipUpFiles,'',!kfm_vars.permissions.file.mk]);
				if(selectedFiles.length!=$('documents_body').fileids.length)links.push(['kfm_selectAll()',kfm.lang.SelectAll,'ark_selectall']);
				if(selectedFiles.length){ // select none, invert selection
					links.push(['kfm_selectNone()',kfm.lang.SelectNone,'select_none']);
					links.push(['kfm_selectInvert()',kfm.lang.InvertSelection,'invert_selection']);
				}
				kfm_createContextMenu(e.page,links);
			});
			documents_body.parentResized=kfm_files_reflowIcons;
		}
		var dirs=$('kfm_directories');
		if(dirs){
			x_kfm_loadDirectories(kfm_vars.root_folder_id,kfm_refreshDirectories);
			kfm_addContextMenu(dirs.parentNode,function(e){
				var links=[];
				links.push(['kfm_createDirectory(1)',kfm.lang.CreateSubDir,'folder_new',!kfm_vars.permissions.dir.mk]);
				if(kfm_return_directory)links.push(['setTimeout("window.close()",1);window.opener.SetUrl("'+kfm_directories[node_id].realpath+'/");',kfm.lang.SendToCms]);
				if(!window.contextmenu){
					e=new Event(e);
					kfm_createContextMenu(e.page,links);
				}
			});
		}
// testtest
		x_kfm_loadFiles(kfm_vars.startupfolder_id,kfm_refreshFiles);
		document.addEvent('keyup',kfm.keyup);
		window.addEvent('resize',kfm_resizeHandler);
		kfm_contextmenuinit();
	},
	confirm:function(txt){
		window.inPrompt=1;
		var ret=confirm(txt);
		setTimeout('window.inPrompt=0',1);
		return ret;
	},
	getContainer:function(p,c){
		for(var i=0;i<c.length;++i){
			var a=c[i],x=getOffset(a,'Left'),y=getOffset(a,'Top');
			if(x<p.x&&y<p.y&&x+a.offsetWidth>p.x&&y+a.offsetHeight>p.y)return a;
		}
	},
	getParentEl:function(c,t){
		while(c.tagName!=t&&c)c=c.parentNode;
		return c;
	},
	initialize:function(){
		document.addEvent('domready',this.build);
	},
	keyup:function(e){
		var e=new Event(e);
		var key=e.code;
		var cm=$('documents_body').contentMode;
		switch(key){
			case 8:{ // delete
				kfm_delete(cm);
				break;
			}
			case 13:{ // enter
				if(!selectedFiles.length||window.inPrompt||cm!='file_icons')return;
				kfm_chooseFile();
				break;
			}
			case 27:{ // escape
				if(cm=='lightbox')kfm_img_stopLightbox();
				else if(!window.inPrompt&&kfm.confirm(kfm.lang.AreYouSureYouWantToCloseKFM))window.close();
				break;
			}
			case 37:{ // left arrow
				if(cm=='file_icons'){
					if(!kfm_listview)kfm_shiftFileSelectionLR(-1);
				}
				else if(cm=='lightbox'){
					window.kfm_slideshow_stopped=1;
					if(window.lightbox_slideshowTimer)clearTimeout(window.lightbox_slideshowTimer);
					window.kfm_slideshow.at-=2;
					kfm_img_startLightbox();
				}
				else break;
				e.stopPropagation();
				break;
			}
			case 38:{ // up arrow
				if(cm=='file_icons'){
					if(kfm_listview)kfm_shiftFileSelectionLR(-1);
					else kfm_shiftFileSelectionUD(-1);
				}
				break;
			}
			case 39:{ // right arrow
				if(cm=='file_icons'){
					if(!kfm_listview)kfm_shiftFileSelectionLR(1);
				}
				else if(cm=='lightbox'){
					window.kfm_slideshow_stopped=1;
					if(window.lightbox_slideshowTimer)clearTimeout(window.lightbox_slideshowTimer);
					kfm_img_startLightbox();
				}
				else break;
				e.stopPropagation();
				break;
			}
			case 40:{ // down arrow
				if(cm=='file_icons'){
					if(kfm_listview)kfm_shiftFileSelectionLR(1);
					else kfm_shiftFileSelectionUD(1);
				}
				break;
			}
			case 46:{ // delete
				kfm_delete(cm);
				break;
			}
			case 65:{ // a
				if(e.control&&cm=='file_icons'){
					clearSelections(e);
					kfm_selectAll();
				}
				break;
			}
			case 85:{ // u
				if(e.control&&cm=='file_icons'){
					clearSelections(e);
					kfm_selectNone();
				}
				break;
			}
			case 113:{ // f2
				if(cm!='file_icons')return;
				if(!selectedFiles.length)return kfm.alert(kfm.lang.PleaseSelectFileBeforeRename);
				if(selectedFiles.length==1){
					kfm_renameFile(selectedFiles[0]);
				}
				else kfm.alert(kfm.lang.RenameOnlyOneFile);
				break;
			}
			case 127:{ // backspace
				kfm_delete(cm);
				break;
			}
		}
	}
});
function kfm_delete(cm){
	if(!selectedFiles.length||cm!='file_icons')return;
	if(selectedFiles.length>1)kfm_deleteSelectedFiles();
	else kfm_deleteFile(selectedFiles[0]);
}
function kfm_inArray(needle,haystack){
	for(var i=0;i<haystack.length;++i)if(haystack[i]==needle)return true;
	return false;
}
function kfm_log(msg){
	var wrapper=$('kfm_logs_panel');
	if(!wrapper){
		if(msg.indexOf(kfm.lang.ErrorPrefix)!=0 && msg.indexOf('error: ')!=0)return;
		if(kfm_inArray('kfm_logs_panel',kfm_hidden_panels))return kfm.alert(msg.replace(kfm.lang.ErrorPrefix,'').replace('error: ',''));
		kfm_addPanel('kfm_left_column','kfm_logs_panel');
		kfm_refreshPanels('kfm_left_column');
		wrapper=$('kfm_logs_panel');
	}
	wrapper.visible=1;
	var el=$E('#kfm_logs_panel div.kfm_panel_body'),p=(new Element('p')).setHTML(msg);
	if(msg.indexOf(kfm.lang.ErrorPrefix)==0)p.setStyles('background:#ff0;fontWeight:bold;color:red');
	kfm.addEl(el,p);
	el.scrollTop=el.scrollTop+p.offsetHeight;
}
function kfm_prompt(txt,val,fn){
	window.inPrompt=1;
	var table=new Element('table',{
		'id':'kfm_prompt_table'
	});
	var row=table.insertRow(0),inp=newInput('kfm_prompt',0,val);
	row.insertCell(0).innerHTML=txt.replace(/\n/g,'<br />');
	row.insertCell(1).appendChild(inp);
	kfm_modal_open(table,'prompt',[[kfm.lang.Ok,function(){
		var v=$('kfm_prompt').value;
		kfm_modal_close();
		window.inPrompt=0;
		fn(v);
	}]]);
	$('kfm_prompt').focus();
}
function kfm_run_delayed(name,call){
	name=name+'_timeout';
	if(window[name])$clear(window[name]);
	window[name]=setTimeout(call,500);
}
function kfm_shrinkName(name,wrapper,text,size,maxsize,extension){
	var position=step=Math.ceil(name.length/2),postfix='[...]'+extension,prefix=size=='offsetHeight'?'. ':'';
	do{
		text.innerHTML=prefix+name.substring(0,position)+postfix;
		step=Math.ceil(step/2);
		position+=(wrapper[size]>maxsize)?-step:step;
	}while(step>1);
	var html='<span class="filename">'+name.substring(0,position+(prefix?0:-1))+'</span><span style="color:red;text-decoration:none">[...]</span>';
	if(extension)html+='<span class="filename">'+extension+'</span>';
	text.innerHTML=html;
}
/* Start kfm plugin iframe functions */
function kfm_pluginIframeShow(url){
	if(url){
		$j('#plugin_iframe_div').remove();
		var jDiv=$j('<div id="plugin_iframe_div"></div>').css({
			'display':'none',
			'position':'absolute',
			'left':0,
			'top':0,
			'width':'100%',
			'height':'100%',
			'backgroundImage':'url(i/bg-black-75.png)',
			'z-index':202
		});
		$j(jDiv).appendTo('body');
		$j(jDiv).append($j('<div id="plugin_iframe_header"></div>').css({
			'width':'100%',
			'height':'25px',
			'color':'white',
			'backgroundColor':'black'
		}));
		kfm_pluginIframeButton('close');
		$j(jDiv).slideDown('normal',function(){
			var x=$j('body').width(),y=$j('body').height()-25;
			$j(this).append(
				'<iframe id="plugin_iframe_element" src="'+url+'&ifx='+x+'&ify='+y+'" style="width:100%;height:100%;"></iframe>'
			);
		});
	}else{
		$j('#plugin_iframe_div').slideDown('normal');
	}
}
function kfm_pluginIframeButton(code,text){
	var btncode,btn;
	var hdr=document.getElementById('plugin_iframe_header');
	if(!hdr)return;
	if(code=='close'){
		btn=$j('<img src="themes/'+kfm_theme+'/icons/remove.png"/>').click(function(){kfm_pluginIframeHide();});
		btn.css({'float':'right'});
	}else{
		btn=$j('<span class="kfm_plugin_iframe_button"></span>').click(function(){eval(code);});
	}
	if(text)$j(btn).text(text);
	$j(btn).appendTo(hdr);
}
function kfm_pluginIframeHide(){
	$j('#plugin_iframe_div').slideUp('normal');
	//var ifd=document.getElementById('plugin_iframe_div');
	//if(ifd) ifd.style.display='none';
}
function kfm_pluginIframeMessage(message){
	/* not tested yet, should not be needed*/
	var msgdiv=document.getElementById('plugin_iframe_message');
	if(!msgdiv)return;
	msgdiv.innerHTML=message;
	msgdiv.style.display='block';
	setTimeOut('document.getElementById("plugin_iframe_message").style.display="none";',3000);
}
function kfm_pluginIframeVar(varname){
	var ifr=document.getElementById('plugin_iframe_element');
	if(!ifr) return null;
	var ifrvar=eval('ifr.contentWindow.'+varname);
	return ifrvar;
}
/* End kfm plugin iframe functions */
var kfm_regexps={
	all_up_to_last_dot:/.*\./,
	all_up_to_last_slash:/.*\//,
	ascii_stuff:/%([89A-F][A-Z0-9])/g,
	get_filename_extension:/.*\.([^.]*)$/,
	percent_numbers:/%[1-9]/,
	plus:/\+/g,
	remove_filename_extension:/\.[^.]*$/
}
var kfm=new KFM();
// see license.txt for licensing
function kfm_showMessage(message){
	new Notice(message);
}
function kfm_modal_close(msg){
	$('shader').remove();
	$('formWrapper').remove();
	if(msg)alert(msg);
}
function kfm_modal_open(form,title,actions){
	window.inPrompt=1;
	var body=document.body,scrollAt=window.ie?getWindowScrollAt():{x:0,y:0},a=window.getSize().size,wx=0,wy=0,pos=window.ie?'absolute':'fixed',i;
	if(window.ie)body.setStyles({
		'overflow':'hidden'
	});
	{ // shader
		var shader=new Element('div',{
			'id':'shader',
			'styles':{
				'background':'#fff',
				'opacity':'.5',
				'position':pos,
				'top':scrollAt.y,
				'left':scrollAt.x,
				'z-index':2,
				'width':a.x,
				'height':a.y
			}
		});
		body.appendChild(shader);
	}
	{ // wrapper
		var wrapper=new Element('div',{
			'id'   :'formWrapper',
			'class':'modal_dialog drag_this'
		});
		var h2=(new Element('h2')).setHTML(title);
		h2.className='prompt';
		form.setStyles({
			'position':'relative',
			'margin':0,
			'text-align':'left',
			'padding':0,
			'clear':'left'
		});
		wrapper.appendChild(h2);
		wrapper.appendChild(form);
		{ // link row
			var row=new Element('div');
			var link=new Element('a',{
				'href':'javascript:kfm_modal_close()'
			}).appendText(kfm.lang.Cancel);
			link.className='button';
			row.appendChild(link);
			if(actions&&actions.length)for(i=0;i<actions.length;++i){
				var v=actions[i];
				link=new Element('a',{
					'href':'#',
					'events':{
						'click':v[1]
					}
				}).appendText(v[0]);
				link.className='button';
				row.appendChild(link);
			}
			wrapper.appendChild(row);
		}
		row.setStyles({
			'background':'#eee',
			'border-top':'1px solid #ddd',
			'text-align':'right',
			'padding':'2px',
			'z-index':'3'
		});
		body.appendChild(wrapper);
		wrapper.style.width=(form.offsetWidth+10)+'px';
		var w=wrapper.offsetWidth;
		if(w<200||w>a.x*.9){
			w=w<200?200:parseInt(a.x*.9);
			wrapper.setStyles({
				'width':w
			});
		}
		var h=window.ie?wrapper.offsetHeight:h2.offsetHeight+form.offsetHeight+row.offsetHeight,q=window.ie?1:0,r=window.ie?0:4;
		if(parseFloat(h)>parseFloat(a.y*.9)){
			h=parseInt(a.y*.9);
			var h3=h-row.offsetHeight-h2.offsetHeight-q;
			form.setStyles({
				'margin':'0 auto',
				'overflow':'auto',
				'height':h3,
				'max-height':h3
			});
		}else{
			var h3=h-row.offsetHeight-h2.offsetHeight-q;
			form.setStyles({
				'overflow':'auto',
				'width':'100%',
				'max-height':h3
			});
		}
		wrapper.setStyles({
			'position':pos,
			'left':scrollAt.x+a.x/2-w/2,
			'top':scrollAt.y+a.y/2-h/2,
			'z-index':3
		});
	}
	wrapper.addEvent('keyup',function(e){
		e=new Event(e);
		e.stop();
	});
	kfm_resizeHandler_add('shader');
	kdnd_makeDraggable('modal_dialog');
}
// see license.txt for licensing
function kfm_closeContextMenu(){
	if(contextmenu)contextmenu.remove();
	contextmenu=null;
}
function kfm_contextmenuinit(){
	document.addEvent('click',function(e){
		e=new Event(e);
		if(e.control)return;
		if(!contextmenu)return;
		var c=contextmenu,m=e.page;
		var l=c.offsetLeft,t=c.offsetTop;
		if(m.x<l||m.x>l+c.offsetWidth||m.y<t||m.y>t+c.offsetHeight)kfm_closeContextMenu();
	});
	kfm_addContextMenu(document,function(e){
		if(window.webkit||!e.control)e.stop();
	});
}
function kfm_createContextMenu(m,links){
	var row;
	if(!window.contextmenu_loading)kfm_closeContextMenu();
	if(!contextmenu){
		window.contextmenu=new Element('table',{
			'class':'contextmenu',
			'styles':{
				'left':m.x,
				'top':m.y
			}
		});
		window.contextmenu.addLink=function(href,text,icon,disabled,isSubMenu, obj){
			if(disabled && !kfm_vars.show_disabled_contextmenu_links)return;
			row=kfm.addRow(this);
			if(disabled){
				row.className+=' disabled';
				href='';
			}
			if(isSubMenu){
				link=newLink('javascript:kfm_cm_openSubMenu("'+href+'",this);',text);
				row.className+=' is_submenu';
			}
			else if(href=='kfm_0')link=text;
			else{
				if(typeof(href)=="object"){
					var display=1; // default, display
					if(href.displayCheck) display=href.displayCheck(href.doParameter);
					if(!display)return;
					if(display==2)row.className+=' disabled';
					if(!href.name && href.title)href.name=href.title; // make name title if not exists
					if(!href.name) href.name='default'; // make name default if not exists
					link=newLink('#',href.title);
					link.doFunction=href.doFunction;
					link.doParameter=href.doParameter;
					link.addEvent("click",function(){
						kfm_closeContextMenu();
						href.doFunction(href.doParameter);
					});
				}
				else link=newLink('javascript:kfm_closeContextMenu();'+href,text);
			}
			if(typeof(href)=="object") kfm.addCell(row,0,0,'','kfm_contextmenu_iconCell kfm_plugin_'+href.name+'_contexticon kfm_plugin_'+href.name+'_'+kfm_theme+'_contexticon');
			else kfm.addCell(row,0,0,(icon?new Element('img',{src:'themes/'+kfm_theme+'/icons/'+icon+'.png'}):''),'kfm_contextmenu_iconCell');
			kfm.addCell(row,1,0,link,'kfm_contextmenu_nameCell');
			try{
				row.className+=' cm_'+href.name.replace(/[^a-zA-Z]*/g,'');
			}catch(e){
				row.className+=' cm_'+link.innerHTML.replace(/[^a-zA-Z]*/g,'');
			}
		};
		window.contextmenu_loading=setTimeout('window.contextmenu_loading=null',1);
		document.body.appendChild(contextmenu);
	}
	else{
		row=kfm.addRow(contextmenu);
		row.className+=' cm__separator';
		var col=kfm.addCell(row,0,2);
		col.appendChild(new Element('hr'));
	}
	var rows=contextmenu.rows.length;
	for(var i=0;i<links.length;++i){
		var link=links[i];
		if($type(link)=="object")contextmenu.addLink(link);
		else if(link[1])contextmenu.addLink(link[0],link[1],link[2],link[3],link[4]);
	}
	var w=contextmenu.offsetWidth,h=contextmenu.offsetHeight,ws=window.getSize().size;
	if(h+m.y>ws.y)contextmenu.style.top=(ws.y-h)+'px';
	if(w+m.x>ws.x)contextmenu.style.left=(m.x-w)+'px';
}
function kfm_addContextMenu(el,fn){
	el.addEvent(window.webkit&&!window.webkit420?'mousedown':'contextmenu',function(e){
		e=new Event(e);
		if(e.type=='contextmenu' || e.rightClick)fn(e);
	});
	return el;
}
kfm.cm={
	submenus:[]
}
// see license.txt for licensing
function kfm_changeDirectory(id, nofiles){
	if(!isNaN(id))id='kfm_directory_icon_'+id;
	if(id=='kfm_directory_icon_0')id='kfm_directory_icon_1';
	var el=$(id),a,els=$$('td.kfm_directory_open');
	if(!el)return;
	setTimeout('$clear(window.dragTrigger);',1);
	if(window.ie)while(el&&!el.node_id)el=el.parentNode;
	kfm_cwd_name=el.kfm_directoryname;
	kfm_cwd_id=el.node_id;
	for(var a=0;a<els.length;++a)els[a].removeClass('kfm_directory_open');
	el.parentNode.className+=' kfm_directory_open';
		kfm_filesLoader();
	if(!nofiles){
		setTimeout('x_kfm_loadFiles(kfm_cwd_id,kfm_refreshFiles);',20);
	}
	setTimeout('x_kfm_loadDirectories(kfm_cwd_id,kfm_refreshDirectories);',20);
}
function kfm_createDirectory(id){
	if(!kfm_vars.permissions.dir.mk)return kfm.alert('permission denied: cannot create directory');
	kfm_prompt(kfm.lang.CreateDirMessage(kfm_directories[id].path),kfm.lang.NewDirectory,function(newName){
		if(newName&&newName!=''&&!/\/|^\./.test(newName))x_kfm_createDirectory(id,newName,kfm_refreshDirectories);
	});
}
function kfm_deleteDirectory(id){
	if(!kfm_vars.permissions.dir.rm)return kfm.alert('permission denied: cannot delete directory');
	if(!kfm.confirm(kfm.lang.DelDirMessage(kfm_directories[id].path)))return;
	if(kfm_directories[id].hasChildren && !kfm.confirm(kfm.lang.RecursiveDeleteWarning(kfm_directories[id].name)))return;
	x_kfm_deleteDirectory(id,kfm_deleteDirectoryCheck);
}
function kfm_deleteDirectoryCheck(res){
	if(res.type&&res.type=='error'){
		switch(parseInt(res.msg)){
			case 1: kfm_log('error: '+kfm.lang.IllegalDirectoryName(res.name)); break;
			case 2:{ // not empty
				var ok=kfm.confirm(kfm.lang.RecursiveDeleteWarning(res.name));
				if(ok)x_kfm_deleteDirectory(res.id,1,kfm_deleteDirectoryCheck);
				break;
			}
			case 3: kfm_log('error: '+kfm.lang.RmdirFailed(res.name)); break;
			case 4: kfm_log('error: '+kfm.lang.DirectoryNotInDb); break;
			default: new Notice(res.msg);
		}
	}
	else{
		var is_found=0,p=res.oldpid;
		while(p&&!is_found){
			if(p==kfm_cwd_id)is_found=1;
			p=kfm_directories[p].parent;
		}
		if(is_found)kfm_changeDirectory('kfm_directory_icon_'+p);
		kfm_refreshDirectories(res);
	}
}
function kfm_dir_addLink(t,name,parent_addr,is_last,has_node_control,parent){
	var r=kfm.addRow(t),c,pdir=parent_addr+name,name=(name==''?kfm_vars.root_folder_name:name);
	var name_text=(new Element('span',{
		'id':'directory_name_'+parent
	})).setHTML('0');
	var el=new Element('div',{
		'id':'kfm_directory_icon_'+parent,
		'class':'kfm_directory_link '+(kfm_cwd_name==pdir?'':'kfm_directory_open')
	});
	el.appendChild(name_text),
	$extend(el,{
		'kfm_directoryname':pdir,
		'node_id':parent
	}).setStyle('cursor',(window.ie?'hand':'pointer'));
	kfm_addContextMenu(el,function(e){
		var el=e.target;
		while(el&&!el.node_id)el=el.parentNode;
		if(!el)return;
		var links=[],i,node_id=el.node_id;
		links.push(['kfm_renameDirectory("'+node_id+'")',kfm.lang.RenameDir,'',!kfm_vars.permissions.dir.ed]);
		links.push(['kfm_createDirectory("'+node_id+'")',kfm.lang.CreateSubDir,'folder_new',!kfm_vars.permissions.dir.mk]);
		if(node_id!=1)links.push(['kfm_deleteDirectory("'+node_id+'")',kfm.lang.DeleteDir,'remove',!kfm_vars.permissions.dir.rm]);
		if(kfm_return_directory)links.push(['setTimeout("window.close()",1);window.opener.SetUrl("'+kfm_directories[node_id].realpath+'/");',kfm.lang.SendToCms]);
		e=new Event(e);
		kfm_createContextMenu(e.page,links);
	});
	var cell=kfm.addCell(r,0,0,(
		has_node_control?
			newLink('javascript:kfm_dir_openNode('+parent+')','[+]','kfm_dir_node_'+parent,'kfm_dir_node_closed'):
			(new Element('span',{'id':'kfm_dir_node_'+parent})).setHTML('&nbsp;')
		),'kfm_dir_lines_'+(is_last?'lastchild':'child'));
	cell.style.width='16px';
	cell=kfm.addCell(r,1,0,el,'kfm_dir_name');
	if(window.webkit){ // fix cell width for konqueror
		cell.style.width=(t.offsetWidth-16)+'px';
	}
	el.addEvent('click',function(e){
		e=new Event(e);
		if(e.rightClick)return;
		kfm_changeDirectory(this.id);
	});
	el.addEvent('mouseout',function(){
		kfm_directory_over=0;
		this.removeClass('hovered');
	});
	el.addEvent('mouseover',function(){
		if(!kfm_directory_over)kfm_directory_over=parseInt(this.node_id);
	});
	{ // fix name width
		var reqHeight=name_text.offsetHeight;
		name_text.innerHTML='. '+name;
		el=name_text;
		el.setStyle('display','block');
		if(reqHeight&&el.offsetHeight>reqHeight){
			el.title=name;
			kfm_shrinkName(name,el,el,'offsetHeight',reqHeight,'');
		}
		else el.innerHTML=name;
		if(!window.ie)el.style.position='inherit';
	}
	{ // subdir holder
		r=kfm.addRow(t);
		kfm.addCell(r,0,0,' ',is_last?0:'kfm_dir_lines_nochild');
		kfm.addCell(r,1).id='kfm_directories_subdirs_'+parent;
	}
	kdnd_makeDraggable('kfm_dir_name');
	kdnd_addDropHandler('kfm_dir_name','.kfm_dir_name',kfm_dir_dropHandler);
	return t;
}
function kfm_dir_dropHandler(e){
	var dir_from=parseInt($E('.kfm_directory_link',e.sourceElement).node_id);
	if(dir_from==1)return;
	var dir_to=parseInt($E('.kfm_directory_link',e.targetElement).node_id);
	if(dir_to==0||dir_to==dir_from)return;
	if(!kfm_vars.permissions.dir.mv)return kfm.alert(kfm.lang.CannotMoveDirectory);
	x_kfm_moveDirectory(dir_from,dir_to,kfm_refreshDirectories);
	kfm_selectNone();
}
function kfm_dir_openNode(dir){
	var node=$('kfm_dir_node_'+dir);
	node.className='kfm_dir_node_opened';
	if(node.href)node.href=node.href.replace(/open/,'close');
	$('kfm_directories_subdirs_'+dir).empty().appendText(kfm.lang.Loading);
	x_kfm_loadDirectories(dir,kfm_refreshDirectories);
}
function kfm_dir_closeNode(dir){
	var node=$('kfm_dir_node_'+dir);
	node.className='kfm_dir_node_closed';
	if(node.href)node.href=node.href.replace(/close/,'open');
	$('kfm_directories_subdirs_'+dir).empty();
}
function kfm_refreshDirectories(res){
	var d,p,t;
	if(res.toString()===res)return kfm_log(res);
	d=res.parent;
	if(d==kfm_vars.root_folder_id){ // root node
		p=$('kfm_directories');
		t=new Element('table',{
			'id':'kfm_directories'
		});
		p.parentNode.replaceChild(kfm_dir_addLink(t,'','',1,0,kfm_vars.root_folder_id),p);
		kfm_directories[kfm_vars.root_folder_id]={
			'parent':0,
			'name':kfm_vars.root_folder_name,
			'path':'/',
			'realpath':res.properties.path,
			'hasChildren':res.directories.length
		}
		$('kfm_directory_icon_'+kfm_vars.root_folder_id).parentNode.className+=' kfm_directory_open';
	}
	t=new Element('table'),n='kfm_dir_node_'+d;
	t.setStyle('table-layout','fixed');
	dirwrapper=$('kfm_directories_subdirs_'+d).empty();
	dirwrapper.appendChild(t);
	var dirs=$A(res.directories);
	dirs.each(function(dir,a){
		kfm_dir_addLink(t,dir[0],res.reqdir,l=(a==dirs.length-1),dir[1],dir[2]);
		if(!kfm_directories[dir[2]])kfm_directories[dir[2]]={
			'parent':res.parent,
			'name':dir[0],
			'path':res.reqdir+dir[0],
			'realpath':res.properties.path+dir[0]+'/',
			'hasChildren':dir[1]
		};
	});
	if(d!='')$($(n).parentNode).empty().appendChild(dirs.length?
		newLink('javascript:kfm_dir_closeNode("'+res.parent+'")','[-]',n,'kfm_dir_node_open'):
		(new Element('span',{
			'id':n
		})).setHTML(' ')
	);
	kfm_cwd_subdirs[d]=res.directories;
	if(!kfm_cwd_subdirs[d])kfm_dir_openNode(res.parent);
	kfm_setDirectoryProperties(res.properties);
	if(!kfm_vars.startup_sequence)kfm_selectNone();
	kfm_log(kfm.lang.DirRefreshed);
	kfm_directories[kfm_cwd_id]=res.properties;
	kfm_directories[d].hasChildren=1;
	if(kfm_startup_sequence_index<kfm_vars.startup_sequence.length){
		kfm_changeDirectory(kfm_vars.startup_sequence[kfm_startup_sequence_index],true);
		kfm_startup_sequence_index++;
		if(kfm_startup_sequence_index > kfm_vars.startup_sequence.length)kfm_vars.startup_sequence=false;
	}
	else kfm_refreshPanels('kfm_left_column');
}
function kfm_renameDirectory(id){
	var directoryName=kfm_directories[id].name;
	kfm_prompt(kfm.lang.RenameTheDirectoryToWhat(directoryName),directoryName,function(newName){
		if(!newName||newName==directoryName)return;
		kfm_directories[id]=null;
		kfm_log(kfm.lang.RenamedDirectoryAs(directoryName,newName));
		x_kfm_renameDirectory(id,newName,kfm_refreshDirectories);
	});
}
function kfm_setDirectoryProperties(properties){
	if(!$('kfm_directory_properties'))return;
	var wrapper=$('kfm_directory_properties').empty();
	wrapper.properties=properties;
	var table=new Element('table'),row,cell,i;
	{ // directory name
		i=properties.allowed_file_extensions.length?properties.allowed_file_extensions.join(', '):kfm.lang.NoRestrictions;
		row=kfm.addRow(table);
		kfm.addCell(row,0,0,(new Element('strong')).setHTML(kfm.lang.Name));
		kfm.addCell(row,1,0,'/'+kfm_cwd_name);
	}
	{ // allowed file extensions
		i=properties.allowed_file_extensions.length?properties.allowed_file_extensions.join(', '):kfm.lang.NoRestrictions;
		row=kfm.addRow(table);
		kfm.addCell(row,0,0,(new Element('strong')).setHTML(kfm.lang.AllowedFileExtensions));
		kfm.addCell(row,1,0,i);
	}
	wrapper.appendChild(table);
}
// see ../license.txt for licensing
function kfm_addToSelection(id){
	id=parseInt(id);
	if(!id || selectedFiles.contains(id))return;
	selectedFiles.push(id);
	$('kfm_file_icon_'+id).className+=' selected';
	if(kfm_log_level>0)kfm_log(kfm.lang.FileSelected(id));
	kfm_selectionCheck();
}
function kfm_chooseFile(){
	if(selectedFiles.length>1 && !kfm_vars.files.allow_multiple_returns)return kfm.alert(kfm.lang.NotMoreThanOneFile);
	if(kfm_vars.files.return_id_to_cms){
		window.opener.SetUrl(selectedFiles.join(','));
		setTimeout('window.close()',1);
	}
	else {
		x_kfm_getFileUrls(selectedFiles,function(urls){
			if(copy_to_clipboard)copy_to_clipboard(urls.join("\n"));
			if(!window.opener || kfm_file_handler=='download'){
				var allImages=1;
				for(var i=0;i<selectedFiles.length;++i)if(!File_getInstance(selectedFiles[i]).width)allImages=0;
				if(!allImages){
					for(var i=0;i<urls.length;++i){
						var url=urls[i];
						if(/get.php/.test(url))url+='&forcedownload=1';
						document.location=url;
					}
				}
				else kfm_img_startLightbox(selectedFiles)
				return;
			}
			if(selectedFiles.length==1&&File_getInstance(selectedFiles[0]).width)window.opener.SetUrl(urls[0].replace(/([^:]\/)\//g,'$1'),0,0,File_getInstance(selectedFiles[0]).caption);
			else{
				if(selectedFiles.length==1)window.opener.SetUrl(urls[0]);
				else window.opener.SetUrl('"'+urls.join('","')+'"');
			}
			setTimeout('window.close()',1);
		});
	}
}
function kfm_isFileSelected(filename){
	return kfm_inArray(filename,selectedFiles);
}
function kfm_removeFromSelection(id){
	if(!id)return;
	var i;
	for(i=0;i<selectedFiles.length;++i){
		if(selectedFiles[i]==id){
			var el=$('kfm_file_icon_'+id);
			if(el)el.removeClass('selected');
			kfm_selectionCheck();
			return selectedFiles.splice(i,1);
		}
	}
}
function kfm_selectAll(){
	kfm_selectNone();
	var a,b=$('documents_body').fileids;
	for(a=0;a<b.length;++a)kfm_addToSelection(b[a]);
}
function kfm_selectInvert(){
	var a,b=$('documents_body').fileids;
	for(a=0;a<b.length;++a)if(kfm_isFileSelected(b[a]))kfm_removeFromSelection(b[a]);
	else kfm_addToSelection(b[a]);
}
function kfm_selectNone(){
	if(kfm_lastClicked){
		var el=$('kfm_file_icon_'+kfm_lastClicked);
		if(el)el.removeClass('last_clicked');
	}
	for(var i=selectedFiles.length;i>-1;--i)kfm_removeFromSelection(selectedFiles[i]);
	kfm_lastClicked=0;
	kfm_selectionCheck();
}
function kfm_selectionCheck(){
	if(selectedFiles.length==1){
		var el=$E('#kfm_file_details_panel div.kfm_panel_body');
		if(el)el.innerHTML='loading';
		kfm_run_delayed('file_details','if(selectedFiles.length==1)kfm_showFileDetails(selectedFiles[0]);');
	}
	else kfm_run_delayed('file_details','if(!selectedFiles.length)kfm_showFileDetails();');
}
function kfm_selection_drag(e){
	e=new Event(e);
	if(!window.dragType||window.dragType!=2||!window.drag_wrapper)return;
	clearSelections();
	var p1=e.page,p2=window.drag_wrapper.orig;
	var x1=p1.x>p2.x?p2.x:p1.x;
	var x2=p2.x>p1.x?p2.x:p1.x;
	var y1=p1.y>p2.y?p2.y:p1.y;
	var y2=p2.y>p1.y?p2.y:p1.y;
	window.drag_wrapper.setStyles('display:block;left:'+x1+'px;top:'+y1+'px;width:'+(x2-x1)+'px;height:'+(y2-y1)+'px;zIndex:4');
}
function kfm_selection_dragFinish(e){
	e=new Event(e);
	$clear(window.dragSelectionTrigger);
	if(!window.drag_wrapper)return;
	var right_column=$('documents_body'),p1=e.page,p2=window.drag_wrapper.orig,offset=right_column.scrollTop;
	var x1=p1.x>p2.x?p2.x:p1.x, x2=p2.x>p1.x?p2.x:p1.x, y1=p1.y>p2.y?p2.y:p1.y, y2=p2.y>p1.y?p2.y:p1.y;
//	y1+=offset;
//	y2+=offset;
	setTimeout('window.dragType=0;',1); // pause needed for IE
	window.drag_wrapper.remove();
	window.drag_wrapper=null;
	document.removeEvent('mousemove',kfm_selection_drag);
	document.removeEvent('mouseup',kfm_selection_dragFinish);
	var fileids=right_column.fileids;
	kfm_selectNone();
	for(var i=0;i<fileids.length;++i){
		var curIcon=$('kfm_file_icon_'+fileids[i]);
		var curTop=getOffset(curIcon,'Top');
		var curLeft=getOffset(curIcon,'Left');
		if((curLeft+curIcon.offsetWidth)>x1&&curLeft<x2&&(curTop+curIcon.offsetHeight)>y1&&curTop<y2)kfm_addToSelection(fileids[i]);
	}
	kfm_selectionCheck();
}
function kfm_selection_dragStart(e){
	if(window.dragType)return;
	if (!kfm_vars.use_templates && window.mouseAt.x > $('kfm_right_column').scrollWidth + $('kfm_left_column').scrollWidth - 15) return;
	window.dragType=2;
	var w=window.getSize().size;
	document.addEvent('mouseup',kfm_selection_dragFinish);
	window.drag_wrapper=new Element('div',{
		'id':'kfm_selection_drag_wrapper',
		'styles':{
			'display':'none'
		}
	});
	window.drag_wrapper.orig=window.mouseAt;
	kfm.addEl(document.body,window.drag_wrapper);
	document.addEvent('mousemove',kfm_selection_drag);
}
function kfm_shiftFileSelectionLR(dir){
	if(selectedFiles.length>1)return;
	var na=$('documents_body').fileids,a=0,ns=na.length;
	if(selectedFiles.length){
		for(;a<ns;++a)if(na[a]==selectedFiles[0])break;
		if(dir>0){if(a==ns-1)a=-1}
		else if(!a)a=ns;
	}
	else a=dir>0?-1:ns;
	kfm_selectSingleFile(na[a+dir]);
}
function kfm_shiftFileSelectionUD(dir){
	if(selectedFiles.length>1)return;
	var na=$('documents_body').fileids,a=0,ns=na.length,icons_per_line=0,topOffset=$('kfm_file_icon_'+na[0]).offsetTop;
	if(selectedFiles.length){
		if(topOffset==$('kfm_file_icon_'+na[ns-1]).offsetTop)return; // only one line of icons
		for(;$('kfm_file_icon_'+na[icons_per_line]).offsetTop==topOffset;++icons_per_line);
		for(;a<ns;++a)if(na[a]==selectedFiles[0])break; // what is the selected file
		a+=icons_per_line*dir;
		if(a>=ns)a=ns-1;
		if(a<0)a=0;
	}
	else a=dir>0?0:ns-1;
	kfm_selectSingleFile(na[a]);
}
function kfm_toggleSelectedFile(e){
	var row;
	e=new Event(e);
	if(e.rightClick)return;
	e.stopPropagation();
	var el=e.target;
	while(el.tagName!='DIV')el=el.parentNode;
	var id=el.file_id;
	if(kfm_listview){
		row=el;
		while(row.nodeName!='TR')row=row.parentNode;
		rowInd=row.rowIndex;
	}
	if(kfm_lastClicked){
		var el=$('kfm_file_icon_'+kfm_lastClicked);
		if(el)el.removeClass('last_clicked');
		else kfm_lastClicked=0;
	}
	if(kfm_lastClicked&&e.shift){
		var e=kfm_lastClicked;
		if(kfm_listview){
			row=el;
			while(row.nodeName!='TR')row=row.parentNode;
			smalRow=Math.min(row.rowIndex,rowInd);
			bigRow=Math.max(row.rowIndex,rowInd);
			$j('#kfm_files_listview_table tbody tr:lt('+bigRow+')').each(function(){
				if(this.rowIndex>=smalRow)kfm_addToSelection(this.fileid);
			});
		}else{
			clearSelections(e);
			kfm_selectNone();
			var a=$('documents_body').fileids,b,c,d;
			for(b=0;b<a.length;++b){
				if(a[b]==e)c=b;
				if(a[b]==id)d=parseInt(b);
			}
			if(c>d){
				b=c;
				c=d;
				d=b;
			}
			for(;c<=d;++c)kfm_addToSelection(a[c]);
		}
	}
	else{
		if(kfm_isFileSelected(id)){
			if(!e.control)kfm_selectNone();
			else kfm_removeFromSelection(id);
		}
		else{
			if(!e.control&&!e.meta)kfm_selectNone();
			kfm_addToSelection(id);
		}
	}
	kfm_lastClicked=id;
	$('kfm_file_icon_'+id).className+=' last_clicked';
}
function kfm_selectSingleFile(id){
	kfm_selectNone();
	kfm_addToSelection(id);
	var panel=$('kfm_right_column'),el=$('kfm_file_icon_'+id);
	var offset=panel.scrollTop,panelHeight=panel.offsetHeight,elTop=getOffset(el,'Top'),elHeight=el.offsetHeight;
	if(elTop+elHeight-offset>panelHeight)panel.scrollTop=elTop-panelHeight+elHeight;
	else if(elTop<offset)panel.scrollTop=elTop;
}
// see ../license.txt for licensing
function kfm_createEmptyFile(filename,msg){
	if(!filename || filename.toString()!==filename){
		filename='';
		msg='';
	}
	var not_ok=0;
	kfm_prompt(kfm.lang.WhatFilenameToCreateAs+msg,filename,function(filename){
		if(!filename)return;
		if(kfm_isFileInCWD(filename)){
			var o=kfm.confirm(kfm.lang.AskIfOverwrite(filename));
			if(!o)not_ok=1;
		}
		if(filename.indexOf('/')>-1){
			msg=kfm.lang.NoForwardslash;
			not_ok=1;
		}
		if(not_ok)return kfm_createEmptyFile(filename,msg);
		x_kfm_createEmptyFile(kfm_cwd_id,filename,kfm_refreshFiles);
	});
}
function kfm_leftColumn_disable(){
	var left_column=$('kfm_left_column');
	document.body.appendChild(new Element('div',{
		'id':'kfm_left_column_hider',
		'styles':{
			'position':'absolute',
			'left':0,
			'top':0,
			'width':left_column.offsetWidth,
			'height':left_column.offsetHeight,
			'opacity':'.7',
			'background':'#fff'
		}
	}));
	kfm_resizeHandler_addMaxHeight('kfm_left_column_hider');
}
function kfm_leftColumn_enable(){
	if(!$("kfm_left_column_hider"))return;
	$("kfm_left_column_hider").remove();
	kfm_resizeHandler_removeMaxHeight('kfm_left_column_hider');
}
function kfm_textfile_attachKeyBinding(){
	if(!codepress.editor||!codepress.editor.body)return setTimeout('kfm_textfile_attachKeyBinding();',1);
	var doc=codepress.contentWindow.document;
	if(doc.attachEvent)doc.attachEvent('onkeypress',kfm_textfile_keybinding);
	else doc.addEventListener('keypress',kfm_textfile_keybinding,false);
}
function kfm_textfile_close(){
	if($("edit-start").value!=codepress.getCode() && !kfm.confirm( kfm.lang.CloseWithoutSavingQuestion))return;
	kfm_leftColumn_enable();
	kfm_changeDirectory("kfm_directory_icon_"+kfm_cwd_id);
	$('kfm_right_column').removeEvent('keyup',kfm_textfile_keybinding);
}
function kfm_textfile_createEditor(){
	CodePress.run();
	if($("kfm_tooltip"))$("kfm_tooltip").remove();
	kfm_textfile_attachKeyBinding();
}
function kfm_textfile_initEditor(res,readonly){
	if(!$('kfm_left_column_hider'))kfm_leftColumn_disable();
	var t=new Element('table',{
		'id':'kfm_editFileTable',
		'styles':{
			'width':'100%'
		}
	});
	var right_column=$('kfm_right_column').empty();
	right_column.addEvent('keyup',kfm_textfile_keybinding);
	right_column.contentMode='codepress';
	right_column.appendChild(t);
	var r2=kfm.addRow(t),c=0;
	kfm.addCell(r2,c++,1,res.name);
	if(!readonly){ /* show option to save edits */
		kfm.addCell(r2,c++,1,newLink('javascript:new Notice("saving file...");$("edit-start").value=codepress.getCode();x_kfm_saveTextFile('+res.id+',$("edit-start").value,kfm_showMessage);','Save',0,'button'));
	}
	kfm.addCell(r2,c++,1,newLink('javascript:kfm_textfile_close()',kfm.lang.Close,0,'button'));
	var row=$(kfm.addRow(t));
	r3=kfm.addCell(row,0,c);
	r3.id='kfm_codepressTableCell';
	var className='codepress '+res.language+(readonly?' readonly-on':'');
	var h=window.getSize().size.y-t.offsetHeight-2;
	if(window.ie)h-=13;
	var codeEl=new Element('textarea',{
		'id':'codepress',
		'class':className,
		'value':res.content,
		'title':res.name,
		'styles':{
			'width':t.offsetWidth-25,
			'height':h
		}
	});
	changeCheckEl=newInput('edit-start','textarea',res.content);
	changeCheckEl.setStyle('display','none');
	r3.appendChild(codeEl);
	r3.appendChild(changeCheckEl);
	if(window.CodePress)kfm_textfile_createEditor();
	else loadJS('j/codepress-0.9.6/codepress.js','cp-script','en-us','kfm_textfile_createEditor();');
}
function kfm_textfile_keybinding(e){
	e=new Event(e);
	if(e.code!=27)return;
	e.stopPropagation();
	kfm_textfile_close();
}
// see ../license.txt for licensing
function kfm_changeCaption(id){
	kfm_prompt(kfm.lang.ChangeCaption,File_getInstance(id).caption,function(newCaption){
		x_kfm_changeCaption(id,newCaption,function(res){
			File_getInstance(id).caption=newCaption;
		});
	});
	/*
	var table=$extend(new Element('table',{
		'id':'kfm_newCaptionDetails'
	}),{kfm_caption_for:id});
	var row=table.insertRow(0),textarea=newInput('kfm_new_caption','textarea',File_getInstance(id).caption);
	textarea.setStyles('height:50px;width:200px');
	row.insertCell(0).appendChild(newText(kfm.lang.NewCaption));
	row.insertCell(1).appendChild(textarea);
	kfm_modal_open(table,kfm.lang.ChangeCaption,[[kfm.lang.ChangeCaption,kfm_changeCaption_set]]);
	$('kfm_new_caption').focus();
	*/
}
function kfm_changeCaption_set(){
	var id=$('kfm_newCaptionDetails').kfm_caption_for,newCaption=$('kfm_new_caption').value;
	if(!newCaption||newCaption==File_getInstance(id).caption)return;
	kfm_modal_close();
	if(kfm.confirm(kfm.lang.NewCaptionIsThisCorrect(newCaption))){
		kfm_log(kfm.lang.Log_ChangeCaption(id,newCaption));
		x_kfm_changeCaption(id,newCaption,kfm_refreshFiles);
	}
}
function kfm_resizeImage(id){
	var data=File_getInstance(id);
	var txt=kfm.lang.CurrentSize(data.width,data.height);
	kfm_prompt(txt+kfm.lang.NewWidth,data.width,function(x){
		x=parseInt(x);
		if(!x)return;
		txt+=kfm.lang.NewWidthConfirmTxt(x);
		kfm_prompt(txt+kfm.lang.NewHeight,Math.ceil(data.height*(x/data.width)),function(y){
			y=parseInt(y);
			if(!y)return;
			if(kfm.confirm(txt+kfm.lang.NewHeightConfirmTxt(y)))x_kfm_resizeImage(id,x,y,kfm_refreshFiles);
		});
	});
}
/* should have been moved to the cropper plugin
function kfm_cropImage(id){
	var data=File_getInstance(id);
	var div=document.createElement('DIV');
	div.style.position='absolute';
	div.id='cropperdiv';
	div.style.top=0;
	div.style.left=0;
	div.style.width='100%';
	div.style.height='100%';
	div.style.backgroundColor='#ddf';
	div.onclick=function(){this.style.display='none';}

	var ifr = document.createElement('IFRAME');
	ifr.src = 'plugins/cropper/croparea.php?id='+id+'&width='+data.width+'&height='+data.height;
	ifr.style.width = '100%';
	ifr.style.height = '100%'; //100% - 25px
	div.appendChild(ifr);
	document.body.appendChild(div);
}
function kfm_cropToOriginal(id,coords,dimensions){
	var F=File_getInstance(id);
	document.getElementById('cropperdiv').style.display = 'none';
	x_kfm_cropToOriginal(id, coords.x1, coords.y1, dimensions.width, dimensions.height, function(id){
		if($type(id)=='string')return kfm_log(id);
		F.setThumbnailBackground($('kfm_file_icon_'+id),true);
	});
}
function kfm_cropToNew(id, coords, dimensions){
	var filename=File_getInstance(id).name;
	kfm_prompt(kfm.lang.RenameFileToWhat(filename),filename,function(newName){
		if(!newName||newName==filename)return;
		document.getElementById('cropperdiv').style.display = 'none';
		x_kfm_cropToNew(id, coords.x1, coords.y1, dimensions.width, dimensions.height, newName, kfm_refreshFiles);
	});
}
*/
function kfm_returnThumbnail(id,size){
	if(!size)size='64x64';
	valid=1;
	kfm_prompt(kfm.lang.WhatMaximumSize,size,function(size){
		if(!size)return;
		if(!/^[0-9]+x[0-9]+$/.test(size)){
			alert('The size must be in the format XXxYY, where X is the width and Y is the height');
			valid=0;
		}
		if(!valid)return kfm_returnThumbnail(id,size);
		var x=size.replace(/x.*/,''),y=size.replace(/.*x/,'');
		x_kfm_getFileUrl(id,x,y,function(url){
			if(kfm_file_handler=='return'||kfm_file_handler=='fckeditor'){
				window.opener.SetUrl(url,0,0,File_getInstance(id).caption);
				window.close();
			}
			else if(kfm_file_handler=='download'){
				if(/get.php/.test(url))url+='&forcedownload=1';
				document.location=url;
			}
		});
	});
}
// see license.txt for licensing
function kfm_addPanel(wrapper,panel){
	wrapper=$(wrapper);
	if(!wrapper)return false;
	if(kfm_hasPanel(wrapper,panel)){
		$(panel).visible=1;
		kfm_refreshPanels(wrapper);
		return;
	}
	if(panel=='kfm_directories_panel'){
		el=kfm_createPanel(
			kfm.lang.Directories,
			'kfm_directories_panel',
			new Element('table',{
				'id':'kfm_directories'
			}),
			{'state':1,'abilities':-1,'order':1}
		);
	}
	else if(panel=='kfm_directory_properties_panel')el=kfm_createPanel(
		kfm.lang.DirectoryProperties,
		'kfm_directory_properties_panel',
		new Element('div',{
			'class':'kfm_directory_properties'
		}),
		{state:0,abilities:1}
	);
	else if(panel=='kfm_file_details_panel')el=kfm_createFileDetailsPanel();
	else if(panel=='kfm_file_upload_panel')el=kfm_createFileUploadPanel();
	else if(panel=='kfm_search_panel')el=kfm_createSearchPanel();
	else if(panel=='kfm_logs_panel')el=kfm_createPanel(
		kfm.lang.Logs,
		'kfm_logs_panel',
		(new Element('p')).setHTML(kfm.lang.LoadingKFM),
		{order:100}
	);
	else if(panel=='kfm_widgets_panel')el=kfm_createWidgetsPanel();
	else{
		kfm_log(kfm.lang.NoPanel(panel));
		return;
	}
	if(!wrapper.panels)wrapper.panels=[];
	wrapper.panels[wrapper.panels.length]=panel;
	wrapper.appendChild(el);
}
function kfm_createFileUploadPanel(contentsonly){
	{ // create form
		var kfm_uploadPanel_checkForZip=function(e){
			e=new Event(e);
			e.stopPropagation();
			var v=this.value;
			var h=(v.indexOf('.')==-1||v.replace(/.*(\.[^.]*)/,'$1')!='.zip');
			$('kfm_unzip1').setStyles({
				'visibility':(h?'hidden':'visible')
			});
			$('kfm_unzip2').setStyles('visibility:'+(h?'hidden':'visible'));
		}
		var sel=newSelectbox('uploadType',[kfm.lang.Upload,kfm.lang.CopyFromURL],0,0,function(){
			var copy=parseInt(this.selectedIndex);
			var unzip1=$('kfm_unzip1'),unzip2=$('kfm_unzip2'),file=$('kfm_file'),url=$('kfm_url');
			if(unzip1)unzip1.setStyles({
				'visibility':'hidden'
			});
			if(unzip2)unzip2.setStyles({
				'visibility':'hidden'
			});
			if(file)file.value='';
			if(url)url.value='';
			$('kfm_uploadWrapper').setStyles({
				'display':(copy?'none':'block')
			});
			$('kfm_copyForm').setStyles({
				'display':(copy?'block':'none')
			});
		});
		{ // upload from computer
			var wrapper=new Element('div',{
				'id':'kfm_uploadWrapper'
			});
			{ // normal single-file upload form
				var f1=newForm('upload.php','POST','multipart/form-data','kfm_iframe');
				f1.id='kfm_uploadForm';
				var iframe=new Element('iframe',{
					'id':'kfm_iframe',
					'name':'kfm_iframe',
					'src':'javascript:false',
					'styles':{
						'display':'none'
					}
				});
				var max_upload_size=new Element('input',{
					'id':'MAX_FILE_SIZE',
					'name':'MAX_FILE_SIZE',
					'type':'hidden',
					'value':'9999999999'
				});
				var submit=newInput('upload','submit',kfm.lang.Upload);
				if(!window.ie)submit.addEvent('click',function(e){
					e=new Event(e);
					if(e.rightClick)return;
					setTimeout('$("kfm_file").type="text";$("kfm_file").type="file"',1);
				});
				var input=newInput('kfm_file','file');
				input.addEvent('keyup',kfm_uploadPanel_checkForZip);
				input.addEvent('change',kfm_uploadPanel_checkForZip);
				var unzip1=new Element('span',{
					'id':'kfm_unzip1',
					'class':'kfm_unzipWhenUploaded',
					'styles':{
						'visibility':'hidden'
					}
				});
				kfm.addEl(unzip1,[newInput('kfm_unzipWhenUploaded','checkbox'),kfm.lang.ExtractAfterUpload]);
				kfm.addEl(f1,[input,max_upload_size,submit,unzip1]);
				wrapper.appendChild(f1);
			}
			if(kfm_vars.use_multiple_file_upload){ // load multi-upload thing if possible
				var t=new Element('table');
				t.id='kfm_uploadFormSwf';
				$j(t).css('display','none')
				var r=t.insertRow(0);
				var c=r.insertCell(0);
				var b1=new Element('input',{
					'type':'button',
					'value':kfm.lang.Browse
				});
				c.appendChild(b1);
				c=r.insertCell(1);
				var b2=new Element('input',{
					'id':'kfm_fileUploadSWFCancel',
					'type':'button',
					'value':kfm.lang.Cancel,
					'disabled':'disabled'
				});
				c.appendChild(b2);
				r=t.insertRow(1);
				c=r.insertCell(0);
				c.colSpan=2;
				c.id='kfm_uploadProgress';
				$(c).setHTML('&nbsp;');
				wrapper.appendChild(t);
				window.swfUpload=new SWFUpload({
					upload_url:"../../upload.php?swf=1&kfm_session="+window.session_key+"&PHPSESSID="+window.phpsession, // relative to the flash
					upload_cookies:["kfm_session"],
					flash_url : "j/swfupload-2.1.0b2/swfupload_f9.swf",
					file_size_limit : "9999999999",
					file_dialog_complete_handler:function(a){
						$('kfm_fileUploadSWFCancel').disabled=null;
						this.kfm_file_at=1;
						this.settings.upload_progress_handler({'size':1},0);
						this.startUpload();
					},
					upload_progress_handler:function(file,bytes_uploaded){
						var percent=Math.ceil((bytes_uploaded/file.size)*100);
						$('kfm_uploadProgress').setHTML('file '+window.swfUpload.kfm_file_at+' :'+percent+'%');
					},
					file_cancelled_handler:function(a){
						$('kfm_uploadProgress').setHTML('&nbsp;');
						$('kfm_fileUploadSWFCancel').disabled='disabled';
					},
					upload_success_handler:function(a,sdata){
						++window.swfUpload.kfm_file_at;
						if(sdata!='OK')new Notice("error uploading file:\n\n"+sdata); // TODO: new string
						setTimeout("window.swfUpload.startUpload()",1);
					},
					upload_complete_handler:function(a){
						x_kfm_loadFiles(kfm_cwd_id,kfm_refreshFiles);
						$('kfm_uploadProgress').setHTML('&nbsp;');
						$('kfm_fileUploadSWFCancel').disabled='disabled';
					},
					swfupload_pre_load_handler:function(){},
					swfupload_loaded_handler:function(){
						$('kfm_uploadForm').remove();
						$j('#kfm_uploadFormSwf').css('display','block');
					},
					error_handler:function(a){
						alert(a);
					},
					minimum_flash_version : "9.0.28",
					ui_container_id : "kfm_uploadFormSwf",
					degraded_container_id : "kfm_uploadForm",
					debug:false
				});
				b1.addEvent('click',function(e){
					e=new Event(e);
					if(e.rightClick)return;
					window.swfUpload.selectFiles();
				});
				b2.addEvent('click',function(e){
					e=new Event(e);
					if(e.rightClick)return;
					window.swfUpload.cancelUpload();
				});
			}
		}
		{ // copy from URL
			var f2=new Element('div',{
				'id':'kfm_copyForm',
				'styles':{
					'display':'none'
				}
			});
			var submit2=newInput('upload','submit',kfm.lang.CopyFromURL);
			var inp2=newInput('kfm_url',0,0,0,0,'width:100%');
			inp2.onkeyup=kfm_uploadPanel_checkForZip;
			inp2.onchange=kfm_uploadPanel_checkForZip;
			submit2.onclick=kfm_downloadFileFromUrl;
			var unzip2=new Element('span',{
				'id':'kfm_unzip2',
				'class':'kfm_unzipWhenUploaded',
				'styles':{
					'visibility':'hidden'
				}
			});
			kfm.addEl(unzip2,[newInput('kfm_unzipWhenUploaded','checkbox'),kfm.lang.ExtractAfterUpload]);
			kfm.addEl(f2,[inp2,submit2,unzip2]);
		}
	}
	var contents=[sel,wrapper,iframe,f2];
	return contentsonly?contents:kfm_createPanel(kfm.lang.FileUpload,'kfm_file_upload_panel',contents,{maxedState:3,state:3,order:2});
}
function kfm_createFileDetailsPanel(){
	return kfm_createPanel(kfm.lang.FileDetails,'kfm_file_details_panel',0,{abilities:1,order:4});
}
function kfm_createPanel(title,id,subels,vars){
	// states:    0=minimised,1=maximised,2=fixed-height, 3=fixed-height-maxed
	// abilities: -1=disabled,0=not closable,1=closable
	var el=$extend(
		kfm.addEl(
			new Element('div',{
				'id':id,
				'class':'kfm_panel'
			}),
			[
				(new Element('div',{
					'class':'kfm_panel_header'
				})).setHTML(title),
				kfm.addEl(new Element('div',{
					'class':'kfm_panel_body'
				}),subels)
			]
		),
		{
			state:0,height:0,panel_title:title,abilities:0,visible:1,order:99,
			addCloseButton:function(){if(this.abilities&1)this.addButton('removePanel','','x',kfm.lang.Close)},
			addMaxButton:function(){this.addButton('maximisePanel','','M',kfm.lang.Maximise)},
			addMinButton:function(){this.addButton('minimisePanel','','_',kfm.lang.Minimise)},
			addMoveDownButton:function(){if(this.id!=this.parentNode.panels[this.parentNode.panels.length-1])this.addButton('movePanel',',1','d',kfm.lang.MoveDown)},
			addMoveUpButton:function(){if(this.id!=this.parentNode.panels[0])this.addButton('movePanel',',-1','u',kfm.lang.MoveUp)},
			addRestoreButton:function(){this.addButton('restorePanel','','r',kfm.lang.Restore)},
			addButton:function(f,p,b,t){
				if(this.abilities==-1 || !this.childNodes[0])return;
				this.childNodes[0].appendChild(newLink('javascript:kfm_'+f+'("'+this.parentNode.id+'","'+this.id+'"'+p+')','['+b+']',0,'kfm_panel_header_'+b,t));
			}
		}
	);
	if(vars)el=$extend(el,vars);
	return el;
}
function kfm_createPanelWrapper(name){
	return $extend(new Element('div',{
		'id':name,
		'class':'kfm_panel_wrapper'
	}),{panels:[]});
}
function kfm_createSearchPanel(contentsonly){
	var t=new Element('table',{
		'id':'kfm_search_table'
	}),r,inp,rows=0;
	{ // filename
		r=t.insertRow(rows++);
		r.insertCell(0).appendChild(newText(kfm.lang.Filename));
		r.insertCell(1).appendChild(kfm_searchBoxFile());
	}
	{ // tags
		r=t.insertRow(rows++);
		r.insertCell(0).appendChild(newText(kfm.lang.Tags));
		inp=newInput('kfm_search_tags');
		inp.title=kfm.lang.CommaSeparated;
		inp.onkeyup=kfm_runSearch;
		r.insertCell(1).appendChild(inp);
	}
	return kfm_createPanel(kfm.lang.Search,'kfm_search_panel',t,{maxedState:3,state:3,order:3});
}
function kfm_createWidgetsPanel(){
	var widgets=[];
	kfm_widgets.each(function(el){
		widgets.push(el.display());
	});
	el=kfm_createPanel('Widgets','kfm_widgets_panel',widgets,{'state':3});
	return el;
}
function kfm_hasPanel(wrapper,panel){
	for(var i=0;i<wrapper.panels.length;++i)if(wrapper.panels[i]==panel)return true;
	return false;
}
function kfm_minimisePanel(wrapper,panel){
	$(panel).state=0;
	kfm_refreshPanels($(wrapper));
}
function kfm_maximisePanel(wrapper,panel){
	wrapper=$(wrapper);
	var p=$(panel);
	p.state=p.maxedState==3?3:1;
	kfm_refreshPanels($(wrapper));
}
function kfm_movePanel(wrapper,panel,offset){
	wrapper=$(wrapper);
	var i=0,j,k;
	for(;i<wrapper.panels.length;++i)if(wrapper.panels[i]==panel)j=i;
	if(offset<0)--j;
	k=wrapper.panels[j];
	wrapper.panels[j]=wrapper.panels[j+1];
	wrapper.panels[j+1]=k;
	wrapper.insertBefore($(wrapper.panels[j]),$(wrapper.panels[j+1]));
	kfm_refreshPanels(wrapper);
}
function kfm_refreshPanels(wrapper){
	wrapper=$(wrapper);
	if(!wrapper)return false;
	var ps=wrapper.panels,i,minheight=0;
	var minimised=[],maximised=[],fixed_height=[],fixed_height_maxed=[];
	for(i=0;i<ps.length;++i){
		var el=$(ps[i]);
		if(kfm_inArray(el.id,kfm_hidden_panels))el.visible=false;
		if(el.id=='kfm_file_upload_panel')el.visible=kfm_directories[kfm_cwd_id].is_writable;
		if(el.visible){
			el.setStyles({
				'display':'block'
			});
			el.minheight=el.childNodes[0].offsetHeight;
			minheight+=el.minheight;
			switch(el.state){
				case 0: minimised[minimised.length]=ps[i]; break;
				case 1: maximised[maximised.length]=ps[i]; break;
				case 2: fixed_height[fixed_height.length]=ps[i]; break;
				case 3: fixed_height_maxed[fixed_height_maxed.length]=ps[i]; break;
				default: kfm_log(kfm.lang.UnknownPanelState+el.state);
			}
		}
		else el.setStyles({
			'display':'none'
		});
	}
	var height=wrapper.offsetHeight;
	for(i=0;i<minimised.length;++i){
		var n=minimised[i];
		var el=$(n);
		el.childNodes[1].setStyles({
			'display':'none'
		});
		var head=el.childNodes[0].empty(),els=[];
		if(wrapper.panels_unlocked){
			el.addCloseButton();
			el.addMaxButton();
			el.addMoveDownButton();
			el.addMoveUpButton();
		}
		els[els.length]=el.panel_title;
		kfm.addEl(head,els);
	}
	for(i=0;i<fixed_height.length;++i){
		var n=fixed_height[i];
		var el=$(n);
		el.childNodes[1].setStyles({
			'height':el.height,
			'display':'block'
		});
		minheight+=el.height;
		var head=el.childNodes[0].empty(),els=[];
		if(wrapper.panels_unlocked){
			el.addCloseButton();
			el.addMaxButton();
			el.addMinButton();
			el.addMoveDownButton();
			el.addMoveUpButton();
		}
		els[els.length]=el.panel_title;
		kfm.addEl(head,els);
	}
	for(i=0;i<fixed_height_maxed.length;++i){
		var n=fixed_height_maxed[i];
		var el=$(n),body=el.childNodes[1].setStyles({
			'height':'auto',
			'display':'block'
		});
		minheight+=body.offsetHeight;
		var head=el.childNodes[0].empty(),els=[];
		if(wrapper.panels_unlocked){
			el.addCloseButton();
			el.addMinButton();
			el.addMoveDownButton();
			el.addMoveUpButton();
		}
		els[els.length]=el.panel_title;
		kfm.addEl(head,els);
	}
	if(maximised.length)var size=(height-minheight)/maximised.length;
	for(i=0;i<maximised.length;++i){
		var n=maximised[i];
		var el=$(n);
		el.childNodes[1].setStyles({
			'height':size,
			'display':'block'
		});
		var head=el.childNodes[0].empty(),els=[];
		if(wrapper.panels_unlocked){
			el.addCloseButton();
			el.addRestoreButton();
			el.addMinButton();
			el.addMoveDownButton();
			el.addMoveUpButton();
		}
		els[els.length]=el.panel_title;
		kfm.addEl(head,els);
	}
	{ // fix order of panels
		do{
			var els=wrapper.childNodes,arr=[],found=0,prev=0;
			for(var i=0;i<els.length,!found,els[i];++i){
				var order=els[i].order;
				if(order<prev&&i){
					wrapper.insertBefore(els[i],els[i-1]);
					found=1;
				}
				prev=order;
			}
		}while(found);
		for(i=0;i<els.length;++i)arr.push(els[i].order);
	}
}
function kfm_removePanel(wrapper,panel){
	var panel=$(panel);
	if(!panel)return;
	$(panel).visible=0;
	kfm_refreshPanels(wrapper);
}
function kfm_restorePanel(wrapper,panel){
	wrapper=$(wrapper);
	var p=$(panel);
	p.state=2;
	if(!p.height)p.height=p.childNodes[1].offsetHeight;
	kfm_refreshPanels(wrapper);
}
function kfm_togglePanelsUnlocked(){
	$('kfm_left_column').panels_unlocked=1-$('kfm_left_column').panels_unlocked;
	kfm_refreshPanels('kfm_left_column');
}
// see license.txt for licensing
function kfm_tagAdd(id){
	kfm_prompt(kfm.lang.WhatIsTheNewTag,'',function(newTag){
		if(newTag){
			files=selectedFiles.length?selectedFiles:id;
			x_kfm_tagAdd(files,newTag,kfm_showFileDetails);
		}
	});
}
function kfm_tagDraw(id){
	if($type(id)!='array'){
		if(kfm_tags[id])return (new Element('span')).setHTML(kfm_tags[id]);
		x_kfm_getTagName(id,kfm_tagDraw);
		return (new Element('span',{
			'class':'kfm_unknown_tag'
		})).setHTML(id);
	}
	var name=id[1],id=id[0],els=$ES('span.kfm_unknown_tag');
	kfm_tags[id]=name;
	for(var i=0;i<els.length;++i){
		var el=els[i];
		if(el.innerHTML==id){
			el.innerHTML=name;
			el.removeClass('kfm_unknown_tag');
		}
	}
}
function kfm_tagRemove(id){
	kfm_prompt(kfm.lang.WhichTagsDoYouWantToRemove,'',function(tagsToRemove){
		if(tagsToRemove){
			files=selectedFiles.length?selectedFiles:id;
			x_kfm_tagRemove(files,tagsToRemove,kfm_showFileDetails);
		}
	});
}
// see ../license.txt for licensing
function clearSelections(){
	window.getSelection().removeAllRanges();
}
function getOffset(el,s) {
	if(!el){
		return 0;
	}
	var n=parseInt(el['offset'+s],10),p=el.offsetParent;
	if(p){
		n+=getOffset(p,s)-parseInt(p['scroll'+s],10);
	}
	return n;
}
function getWindowScrollAt(){
	return {x:window.pageXOffset,y:window.pageYOffset};
}
function kfm_kaejax_do_call(func_name,args){
	var uri=function_urls[func_name];
	if(!window.kfm_kaejax_timeouts[uri]){
		window.kfm_kaejax_timeouts[uri]={t:setTimeout('kfm_kaejax_sendRequests("'+uri+'")',1),c:[],callbacks:[]};
	}
	var l=window.kfm_kaejax_timeouts[uri].c.length,v2=[];
	for(var i=0;i<args.length-1;++i){
		v2[v2.length]=args[i];
	}
	window.kfm_kaejax_timeouts[uri].c[l]={f:func_name,v:v2};
	window.kfm_kaejax_timeouts[uri].callbacks[l]=args[args.length-1];
}
function kfm_kaejax_sendRequests(uri){
	var t=window.kfm_kaejax_timeouts[uri],callbacks=window.kfm_kaejax_timeouts[uri].callbacks;
	t.callbacks=null;
	window.kfm_kaejax_timeouts[uri]=null;
	var x=new XMLHttpRequest(),post_data="kaejax="+escape(Json.toString(t)).replace(kfm_regexps.plus,'%2B').replace(kfm_regexps.ascii_stuff,'%u00$1').replace(/\n/g,' ');
	post_data=kfm_sanitise_ajax(post_data);
	x.open('POST',uri,true);
	x.setRequestHeader("Method","POST "+uri+" HTTP/1.1");
	x.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	x.onreadystatechange=function(){
		if(x.readyState!=4){
			return;
		}
		var r=x.responseText;
		if(r.substring(0,5)=='error'){
			return kfm.alert(r);
		}
		var v=eval('('+unescape(r)+')');
		var f,p,i;
		if(v.errors.length)kfm.showErrors(v.errors);
		if(v.messages.length)kfm.showMessages(v.messages);
		for(i=0;i<t.c.length;++i){
			f=callbacks[i];
			p=[];
			if($type(f)=='array'){
				p=f;
				f=f[0];
			}
			f(v.results[i],p);
		}
	};
	x.send(post_data);
}
function loadJS(url,id,lang,onload){
	var i=0;
	for(;i<loadedScripts.length;++i){
		if(loadedScripts[i]==url){
			return 0;
		}
	}
	loadedScripts.push(url);
	var el=new Element('script',{
		'type':'text/javascript'
	});
	if(id){
		el.id=id;
	}
	if(lang){
		el.lang=lang;
	}
	if(kfm_kaejax_is_loaded&&/\.php/.test(url)){
		url+=(/\?/.test(url)?'&':'?')+'kfm_kaejax_is_loaded';
	}
	if(onload){
		el.onload_triggered=0;
		el.onload=function(){
			if(!this.onload_triggered++){
				eval(onload);
			}
		};
		el.onreadystatechange=function(){
			if(this.readyState=='loaded'||this.readyState=='complete'){
				if(!this.onload_triggered++){
					eval(onload);
				}
			}
		};
	}
	el.src=url;
	$E('head').appendChild(el);
	return 1;
}
function newForm(action,method,enctype,target){
	if(window.ie)return $(document.createElement('<form action="'+action+'" method="'+method+'" enctype="'+enctype+'" target="'+target+'">'));
	return new Element('form',{
		'action':action,
		'method':method,
		'enctype':enctype,
		'target':target
	});
}
function newInput(n,t,v,cl){
	var b;
	if(!t){
		t='text';
	}
	switch(t){
		case 'checkbox':{
			b=new Element('input',{
				'id':n,
				'name':n,
				'type':'checkbox',
				'styles':{
					'width':'auto'
				}
			});
			break;
		}
		case 'textarea':{
			b=new Element('textarea',{
				'id':n,
				'id':n
			});
			break;
		}
		default:{
			b=new Element('input',{
				'id':n,
				'name':n,
				'type':t
			});
		}
	}
	if(v){
		if(t=='checkbox'){
			$extend(b,{checked:'checked',defaultChecked:'checked'});
		}
		else if(t!='datetime'){
			b.value=v;
		}
	}
	if(cl)b.className=cl;
	return b;
}
function newLink(h,t,id,c,title){
	if(!title){
		title='';
	}
	return (new Element('a',{
		'id':id,
		'class':c,
		'href':h,
		'title':title
	})).setHTML(t);
}
function newSelectbox(name,keys,vals,s,f){
	var el2=new Element('select',{
		'id':name
	}),el3,s2=0,i=0;
	if(!s){
		s=0;
	}
	if(!vals){
		vals=keys;
	}
	for(;i<vals.length;++i){
		var v1=vals[i].toString();
		var v2=v1.length>20?v1.substr(0,27)+'...':v1;
		el3=(new Element('option',{
			value:keys[i],
			title:v1
		})).setHTML(v2);
		if(keys[i]==s){
			s2=i;
		}
		el2.appendChild(el3);
	}
	el2.selectedIndex=s2;
	if(f){
		el2.onchange=f;
	}
	return el2;
}
function newText(a){
	return document.createTextNode(a);
}
if(window.ie){
	XMLHttpRequest=function(){
		var l=(ScriptEngineMajorVersion()>=5)?"Msxml2":"Microsoft";
		return new ActiveXObject(l+".XMLHTTP")
	}
	loadJS('j/browser-specific.ie.js');
}
if(window.webkit){
	loadJS('j/browser-specific.konqueror.js');
}
// see license.txt for licensing
var kfm_kaejax_replaces={'([89A-F][A-Z0-9])':'%u00$1','22':'"','2C':',','3A':':','5B':'[','5D':']','7B':'{','7D':'}'};
if(window.ie){
	window.kfm_kaejax_replaces_regexps=[];
	window.kfm_kaejax_replaces_replacements=[];
	for(var i in kfm_kaejax_replaces){
		kfm_kaejax_replaces_regexps.push(eval('/%'+i+'/g'));
		kfm_kaejax_replaces_replacements.push(kfm_kaejax_replaces[i]);
	}
}
else{
	for(var a in kfm_kaejax_replaces){
		kfm_kaejax_replaces[kfm_kaejax_replaces[a]]=eval('/%'+a+'/g');
		delete kfm_kaejax_replaces[a];
	}
}
var kfm_sanitise_ajax=window.ie?
	function(d){
		for(var a in window.kfm_kaejax_replaces_regexps)d=d.replace(kfm_kaejax_replaces_regexps[a],kfm_kaejax_replaces_replacements[a]);
		return d;
	}:
	function(d){
		var r=kfm_kaejax_replaces;
		for(var a in r)d=d.replace(r[a],a);
		return d;
	};
function kdnd_addDropHandler(source_class,target_selector,func){
	if(!kdnd_targets[source_class])kdnd_targets[source_class]={};
	kdnd_targets[source_class][target_selector]=func;
}
function kdnd_makeDraggable(source_class){
	if($type(source_class)=='array'){
		return source_class.each(kdnd_makeDraggable);
	}
	var els=$ES('.'+source_class),i,el;
	els.each(function(el){
		if(el.kdnd_applied)return;
		el.kdnd_applied=true;
		if(!el.dragevents)el.dragevents=[];
		if(!el.dragevents[source_class])el.dragevents[source_class]=kdnd_dragInit(el,source_class);
		el.addEvent('mousedown',el.dragevents[source_class]);
	});
}
function kdnd_unmakeDraggable(source_class){
	if($type(source_class)=='array'){
		return source_class.each(kdnd_unmakeDraggable);
	}
	var els=$$('.'+source_class),i,el;
	for(i=0;i<els.length;++i){
		el=els[i];
		if(!el.kdnd_applied)continue;
		el.kdnd_applied=false;
		if(!el.dragevents)el.dragevents=[];
		if(!el.dragevents[source_class])el.dragevents[source_class]=kdnd_dragInit(el,source_class);
		el.removeEvent('mousedown',el.dragevents[source_class]);
	}
}
function kdnd_drag(e){
	e=new Event(e);
	if(!window.kdnd_dragging)return;
	var m=e.page;
	clearSelections();
	window.kdnd_drag_wrapper.setStyles({
		'position':'absolute',
		'display':'block',
		'left':(m.x+window.kdnd_offset.x),
		'top':(m.y+window.kdnd_offset.y)
	});
	if(kdnd_source_el.hasClass('drag_this')){
		kdnd_source_el.setStyle('visibility','hidden');
	}
}
function kdnd_dragFinish(e,notest){
	e=new Event(e);
	clearTimeout(window.dragTrigger);
	if(!window.kdnd_dragging)return;
	if(!notest){ // check for targets and run functions if found
		var a,b,t=$H(kdnd_targets[window.kdnd_drag_class]),els,m=e.page,el;
		t.each(function(fn,a){
			els=$ES(a);
			for(b=0;b<els.length;++b){
				el=els[b];
				if(getOffset(el,'Left')<=m.x&&m.x<getOffset(el,'Left')+el.offsetWidth&&getOffset(el,'Top')<=m.y&&m.y<getOffset(el,'Top')+el.offsetHeight){
					e=$extend(e,{
						'sourceElement':kdnd_source_el,
						'targetElement':el
					});
					fn(e);
				}
			}
		});
		if(kdnd_source_el.hasClass('drag_this')){
			kdnd_source_el.setStyles({
				'left'       : (m.x+window.kdnd_offset.x),
				'top'        : (m.y+window.kdnd_offset.y),
				'visibility' : 'visible'
			});
		}
	}
	{ // cleanup
		window.kdnd_dragging=false;
		document.removeEvent('mousemove',kdnd_drag);
		document.removeEvent('mouseup',kdnd_dragFinish);
		window.kdnd_drag_wrapper.remove();
		window.kdnd_drag_wrapper=null;
		window.kdnd_source_el=null;
	}
}
function kdnd_dragInit(el,source_class){
	return function(e){
		e=new Event(e);
		if(e.rightClick)return;
		document.addEvent('mouseup',kdnd_dragFinish);
		clearTimeout(window.dragTrigger);
		window.dragTrigger=setTimeout(function(){
			kdnd_dragStart(el,source_class);
		},100);
		window.kdnd_offset={'x':el.offsetLeft-e.page.x,'y':el.offsetTop-e.page.y};
		e.stop();
	};
}
function kdnd_dragStart(el,source_class){
	window.kdnd_dragging=true;
	window.kdnd_drag_class=source_class;
	window.kdnd_source_el=el;
	var content=el.dragDisplay?el.dragDisplay():el.cloneNode(true);
	if(el.getStyle('position')=='absolute' || el.getStyle('position')=='fixed')content.setStyles({
		'position' : 'static',
		'left'     : 0,
		'top'      : 0
	});
	if(!el.hasClass('drag_this'))window.kdnd_offset={'x':16,'y':0};
	var styles=window.ie?{
		'display':'none'
	}:
	{
		'display':'none',
		'opacity':.7
	};
	window.kdnd_drag_wrapper=new Element('div',{
		'id':'kdnd_drag_wrapper',
		'styles':styles
	});
	window.kdnd_drag_wrapper.appendChild(content);
	document.body.appendChild(window.kdnd_drag_wrapper);
	document.addEvent('mousemove',kdnd_drag);
}
{ // variables
	var kdnd_targets=[];
}
var File=new Class({
	getText:function(varname){
		var el=new Element('span',{
			'class':varname+' file_'+varname+'_'+this.id
		});
		this.setText(el,varname);
		if(!this.textInstances[varname])this.textInstances[varname]=[];
		this.textInstances[varname].push(el);
		return el;
	},
	initialize:function(id,data){
		this.id=id;
		this.textInstances=[];
		if(data){
			File_Instances[id]=this;
			File_setData(data,this);
		}
		else x_kfm_getFileDetails(id,File_setData);
	},
	setText:function(el,varname){
		el.empty();
		var v=$pick(this[varname],'');
		if(varname=='name'){
			if(!kfm_listview && kfm_vars.files.name_length_displayed && kfm_vars.files.name_length_displayed<v.length){
				el.title=v;
				v=v.substring(0,kfm_vars.files.name_length_displayed-3)+'...';
			}
			else if(kfm_listview && kfm_vars.files.name_length_in_list && kfm_vars.files.name_length_in_list<v.length){
				el.title=v;
				v=v.substring(0,kfm_vars.files.name_length_in_list-3)+'...';
			}
		}
		if(varname=='modified' && !v){
			var v=(new Date(this.ctime*1000)).toGMTString().replace(/ GMT$/,'');
			this.modified=v;
		}
		el.appendText(v);
	},
	setThumbnailBackground:function(el,reset){
		if(this.icon_loaded && !reset)el.setStyle('background-image','url("'+this.icon_url+'")');
		else{
			var url='get.php?id='+this.id+'&width=64&height=64&get_params='+kfm_vars.get_params+'&r'+Math.random();
			var img=new Element('img',{
				src:url,
				styles:{
					width:1,
					height:1
				}
			});
			var id=this.id;
			img.addEvent('load',function(){
				var p=this.parentNode;
				p.setStyle('background-image','url("'+url+'")');
				var F=File_getInstance(id);
				F.icon_loaded=1;
				F.icon_url=url;
				this.remove();
			});
			kfm.addEl(el,img);
		}
	}
});
function File_getInstance(id,data){
	id=parseInt(id);
	if(isNaN(id))return;
	if(!File_Instances[id] || data)File_Instances[id]=new File(id,data);
	return File_Instances[id];
}
function File_setData(el,F){
	var id=+el.id;
	el=$H(el);
	if(!F)F=File_getInstance(id);
	el.each(function(varvalue,varname){
		F[varname]=varvalue;
		if(!F.textInstances || !F.textInstances[varname])return;
		F.textInstances[varname].each(function(t){
			F.setText(t,varname);
		});
	});
	File_Instances[id]=F;
}
var File_Instances=[];
// see license.txt for licensing
var kfm_file_bits={
	dragDisplay:function(){
		kfm_addToSelection(this.file_id);
		var drag_wrapper=new Element('div',{
			'id':'kfm_drag_wrapper',
			styles:{
				'min-width':100,
				'opacity':'.7'
			}
		});
		for(var i=0;i<10&&i<selectedFiles.length;++i)kfm.addEl(drag_wrapper,[File_getInstance(selectedFiles[i]).name,new Element('br')]);
		if(selectedFiles.length>10)kfm.addEl(
			drag_wrapper,
			(new Element('i')).setHTML(kfm.lang.AndNMore(selectedFiles.length-10))
		);
		return drag_wrapper;
	},
	padding:0
}
function kfm_buildFileDetailsTable(res){
	if(!res)return kfm_log('error: missing file details?');
	var table=new Element('table'),r;
	if(res.name){ // filename
		r=kfm.addRow(table);
		kfm.addCell(r,0,0,(new Element('strong')).setHTML(kfm.lang.Filename));
		kfm.addCell(r,1,0,res.name);
	}
	if(res.filesize){ // filesize
		r=kfm.addRow(table);
		kfm.addCell(r,0,0,(new Element('strong')).setHTML(kfm.lang.Filesize));
		kfm.addCell(r,1,0,res.filesize);
	}
	if(res.tags&&res.tags.length){ // tags
		r=kfm.addRow(table);
		kfm.addEl(kfm.addCell(r,0),(new Element('strong')).setHTML(kfm.lang.Tags));
		var arr=[],c=kfm.addCell(r,1);
		for(var i=0;i<res.tags.length;++i){
			kfm.addEl(c,kfm_tagDraw(res.tags[i]));
			if(i!=res.tags.length-1)kfm.addEl(c,', ');
		}
	}
	if(res.mimetype){ // mimetype
		r=kfm.addRow(table);
		kfm.addEl(kfm.addCell(r,0),(new Element('strong')).setHTML(kfm.lang.Mimetype));
		kfm.addEl(kfm.addCell(r,1),res.mimetype);
		switch(res.mimetype.replace(/\/.*/,'')){
			case 'image':{
				if(res.caption){ // caption
					r=kfm.addRow(table);
					kfm.addCell(r,0,0,(new Element('strong')).setHTML(kfm.lang.Caption));
					kfm.addCell(r,1).innerHTML=(res.caption).replace(/\n/g,'<br \/>');
				}
				break;
			}
		}
	}
	if(res.ctime){ // last change time
		r=kfm.addRow(table);
		kfm.addEl(kfm.addCell(r,0),(new Element('strong')).setHTML(kfm.lang.LastModified));
		var d=(new Date(res.ctime*1000)).toGMTString();
		kfm.addEl(kfm.addCell(r,1),d);
	}
	if(res.width) {
		r=kfm.addRow(table);
		kfm.addCell(r,0,0,(new Element('strong')).setHTML(kfm.lang.ImageDimensions));
		kfm.addCell(r,1,0,res.width+" x "+res.height);	  
	}
	return table;
}
function kfm_deleteFile(id){
	if(!kfm_vars.permissions.file.rm)return kfm.alert(kfm.lang.PermissionDeniedCannotDeleteFile);
	var filename=File_getInstance(id).name;
	if(kfm.confirm(kfm.lang.DelFileMessage(filename))){
		x_kfm_rm([id],kfm_removeFilesFromView);
	}
}
function kfm_deleteSelectedFiles(){
	if(!kfm_vars.permissions.file.rm)return kfm.alert('permission denied: cannot delete files');
	kfm_deleteFiles(selectedFiles);
}
function kfm_deleteFiles(files){
	var names=[],m='';
	 var dfiles=[]; // break reference system
	 for(var j=0;j<files.length;j++)dfiles.push(files[j]);//breaking reference to selectedFiles
	if(dfiles.length>10){
		for(var i=0;i<9;++i)names.push(File_getInstance(dfiles[i]).name);
		m='\n'+kfm.lang.AndNMore(dfiles.length-9);
	}
	else for(var i=0;i<dfiles.length;++i)names.push(File_getInstance(dfiles[i]).name);
	if(kfm.confirm(kfm.lang.DelMultipleFilesMessage+names.join('\n')+m))x_kfm_rm(dfiles,kfm_removeFilesFromView);
}
function kfm_downloadFileFromUrl(filename,msg){
	if(filename.toString()!==filename)filename='';
	var url=$('kfm_url').value;
	if(url.substring(0,4)!='http'){
		kfm_log(kfm.lang.UrlNotValidLog);
		return;
	}
	if(!filename)filename=url.replace(kfm_regexps.all_up_to_last_slash,'');
	var not_ok=0,o;
	kfm_prompt(kfm.lang.FileSavedAsMessage+msg,filename,function(filename){
		if(!filename)return;
		if(kfm_isFileInCWD(filename)){
			o=kfm.confirm(kfm.lang.AskIfOverwrite(filename));
			if(!o)not_ok=1;
		}
		if(filename.indexOf('/')>-1){
			msg=kfm.lang.NoForwardslash;
			not_ok=1;
		}
		if(not_ok)return kfm_downloadFileFromUrl(filename,msg);
		x_kfm_downloadFileFromUrl(url,filename,kfm_refreshFiles);
		$('kfm_url').value='';
	});
}
function kfm_downloadSelectedFiles(id){
	var wrapper=$('kfm_download_wrapper');
	if(!wrapper){
		wrapper=new Element('div',{
			'id':'kfm_download_wrapper',
			'styles':{
				'display':'none'
			}
		});
		kfm.addEl(document.body,wrapper);
	}
	wrapper.empty();
	if(id)kfm_downloadSelectedFiles_addIframe(wrapper,id);
	else for(var i=0;i<selectedFiles.length;++i)kfm_downloadSelectedFiles_addIframe(wrapper,selectedFiles[i]);
}
function kfm_downloadSelectedFiles_addIframe(wrapper,id){
	var iframe=new Element('iframe');
	iframe.src='get.php?id='+id+'&forcedownload=1';
	kfm.addEl(wrapper,iframe);
}
function kfm_extractZippedFile(id){
	x_kfm_extractZippedFile(id,kfm_refreshFiles);
}
function kfm_files_reflowIcons(){
	var panel=$('documents_body');
	if(panel.contentMode!='file_icons')return;
	var els=$ES('.kfm_file_icon',panel);
	for(var i=0;i<els.length;++i){
		var el=els[i];
		el.setStyle('clear','none');
		if(i&&els[i-1].offsetLeft>=el.offsetLeft)el.setStyle('clear','left');
	}
}
function kfm_isFileInCWD(id){
	var i,files=$('documents_body').fileids;
	for(i=0;i<files.length;++i)if(files[i]==id)return true;
	return false;
}
function kfm_incrementalFileDisplay(){
	var b=window.kfm_incrementalFileDisplay_vars,fsdata=b.data.files,wrapper=$('documents_body');
	var icon=new Element('div',{
		'class':'kfm_file '+(kfm_listview?'kfm_file_listview':'kfm_file_icon'),
		'styles':{
			'cursor':(window.ie?'hand':'pointer')
		},
		'events':{
			'click':kfm_toggleSelectedFile,
			'dblclick':function(e){
				e=new Event(e);
				var el=e.target;
				while(!el.file_id && el)el=el.parentNode;
				if(!el)return;
				var id=el.file_id;
				kfm_selectNone();
				kfm_addToSelection(id);
				var openingHook=kfm_getDefaultOpener(id);
				if(!window.opener && openingHook)openingHook.doFunction([id]);
				else kfm_chooseFile();
			}
		}
	});
	if(!kfm_listview){
		icon.addEvent('mouseover',function(e){ // initialise info tooltip
			if(window.kfm_tooltipInit)$clear(window.kfm_tooltipInit);
			if(window.kdnd_dragging)return; // don't open if currently dragging files
			e=new Event(e);
			window.kfm_tooltipInit=setTimeout('kfm_showToolTip('+e.target.file_id+')',1000);
		});
		icon.addEvent('mouseout',function(){ // remove info tooltip
			if(window.kfm_tooltipInit)$clear(window.kfm_tooltipInit);
			var o=$('kfm_tooltip');
			if(o)o.remove();
		});
	}
	kfm_addContextMenu(icon,function(e){
		var el=e.target;
		while(el.parentNode&&!el.file_id)el=el.parentNode;
		if(!el.parentNode)return;
		{ // variables
			var i,id=el.file_id;
			var F=File_getInstance(id);
			var extension=F.name.replace(/.*\./,'').toLowerCase();
			var writable=F.writable;
		}
		{ // add the links
			var links=[],a,b,c;
			if(selectedFiles.length>1)links=kfm_getLinks(selectedFiles);
			else{
				a=kfm_getDefaultOpener(id);
				if(a){
					b=$j.extend({},a);
					b.name='open'; // TODO: string
					b.title='open'; // TODO: string
					links.push(b);
				}
				var a=kfm_getLinks([id]);
				for(b=0;b<a.length;++b)links.push(a[b]); 
			}
			if(selectedFiles.length<=1 && F.width)links.push(['kfm_changeCaption('+id+')',kfm.lang.ChangeCaption,'edit',!kfm_vars.permissions.file.ed]);
			links.push(['kfm_tagAdd('+id+')',kfm.lang.AddTagsToFiles,'add_tags',!kfm_vars.permissions.file.ed]);
			links.push(['kfm_tagRemove('+id+')',kfm.lang.RemoveTagsFromFiles,'',!kfm_vars.permissions.file.ed]);
			kfm_createContextMenu(e.page,links);
		}
	});
	do{
		var a,fdata,name,F,nameEl,el,fullfilename,id;
		a=b.at;
		fdata=fsdata[a];
		if(wrapper.contentMode!='file_icons')return (window.kfm_incrementalFileDisplay_vars=null);
		name=fdata.name;
		fullfilename=kfm_cwd_name+'/'+name;
		id=fdata.id;
		F=File_getInstance(id,fdata);
		ext=fdata.ext;
		nameEl=F.getText('name');
		el=icon.cloneNode(true);
		el.cloneEvents(icon);
		if(!kfm_listview)$j(el).addClass('kfm_icontype_'+ext);
		el.id='kfm_file_icon_'+id;
		el.dragDisplay=kfm_file_bits.dragDisplay;
		var writable=fdata.writable;
		{ // file attributes
			el.file_id=id;
			if(!kfm_listview && fdata.width)F.setThumbnailBackground(el);
			wrapper.files[a]=el;
		}
		kfm.addEl(wrapper,el);
		if(kfm_listview){
			var cs=0,cell;
			var listview_table=$j('#kfm_files_listview_table tbody').get(0);
			var rows=listview_table.rows.length;
			var row=listview_table.insertRow(rows);
			row.fileid=F.id;
			cell=row.insertCell(cs++);
			cell.className='listview_icon listview_icon_'+ext;
			if(window.ie)cell.innerHTML='&nbsp;';
			else cell.setHTML('&nbsp;');
			row.insertCell(cs++).appendChild(el);
			{ // file size
				cell=row.insertCell(cs++);
				var hidden=document.createElement('span');
				hidden.style.display='none';
				hidden.appendChild(document.createTextNode(F.filesize_raw));
				cell.appendChild(hidden);
				cell.appendChild(F.getText('filesize'));
			}
			row.insertCell(cs++).appendChild(F.getText('ext'));
			{ // modified time
				cell=row.insertCell(cs++);
				var hidden=document.createElement('span');
				hidden.style.display='none';
				hidden.appendChild(document.createTextNode(F.ctime));
				cell.appendChild(hidden);
				cell.appendChild(F.getText('modified'));
			}
		}
		else wrapper.appendChild(el);
		el.appendChild(nameEl);
		if(a&&$('kfm_file_icon_'+fsdata[a-1].id).offsetLeft>=el.offsetLeft)el.setStyle('clear','left');
		window.kfm_incrementalFileDisplay_vars.at=a+1;
	}while(a+1<fsdata.length && (a+1)%kfm_show_files_in_groups_of);
	if(a+1<fsdata.length)window.kfm_incrementalFileDisplay_loader=setTimeout('kfm_incrementalFileDisplay()',1);
	else{
		kdnd_makeDraggable('kfm_file');
		if(kfm_listview){
			$j('#kfm_tooltip').remove();
			$j('#kfm_files_listview_table').columnSizing();
			$j('#kfm_files_listview_table').tablesorter({
				sortList:[[1,0]],
				headers:{
					1:{
						sorter:'kfmobject'
					}
				},
				widgets:['zebra']
			});
		}
		$j('#documents_loader').empty().html('&nbsp;');
		if(kfm_vars.startup_selectedFiles){
			for(var i=0;i<kfm_vars.startup_selectedFiles.length;++i)kfm_addToSelection(kfm_vars.startup_selectedFiles[i]);
			kfm_vars.startup_selectedFiles=false;
		}
	}
}
function kfm_refreshFiles(res){
	if(!res.files)return;
	$j('#folder_info').text(res.files.length+(res.files.length==1?' file':' files')); //TODO new string
	kdnd_addDropHandler('kfm_file','.kfm_directory_link',function(e){
		dir_over=e.targetElement.node_id;
		var mv='x_kfm_moveFiles(['+selectedFiles.join(',')+'],'+dir_over+',function(e){if($type(e)=="string")return alert(kfm.lang.CouldNotMoveFiles);kfm_removeFilesFromView(['+selectedFiles.join(',')+'])});kfm_selectNone()';
		var cp='x_kfm_copyFiles(['+selectedFiles.join(',')+'],'+dir_over+',kfm_showMessage);kfm_selectNone()';
		if(kfm_vars.files.drags_move_or_copy == 1)eval(mv); // always Move
		else if(kfm_vars.files.drags_move_or_copy == 2)eval(cp); // always Copy
		else{
			var links=[];
			links.push([cp,kfm.lang.CopyFiles]);
			links.push([mv,kfm.lang.MoveFiles,0,!kfm_vars.permissions.file.mv]);
			kfm_createContextMenu(e.page,links);
		}
	});
	if(window.kfm_incrementalFileDisplay_loader){
		$clear(window.kfm_incrementalFileDisplay_loader);
		window.kfm_incrementalFileDisplay_vars=null;
	}
	kfm_selectNone();
	if(!res)return;
	if(res.parent)kfm_cwd_id=res.parent;
	if(res.toString()===res)return kfm_log(res);
	window.kfm_incrementalFileDisplay_vars={at:0,data:res};
	var a,b,lowest_name,lowest_index,wrapper=$('documents_body').empty();
	$extend(wrapper,{contentMode:'file_icons',fileids:[],files:[]});
	$j('#cwd_display').text(kfm.lang.CurrentWorkingDir(res.reqdir));
	{ // order files by name
		if(!res.files)res.files=[];
		for(a=0;a<res.files.length-1;++a){
			lowest_name=res.files[a].name;
			lowest_index=a;
			for(b=a+1;b<res.files.length;++b){
				if(res.files[b].name<lowest_name){
					lowest_index=b;
					lowest_name=res.files[b].name;
				}
			}
			if(lowest_index!=a){
				b=res.files[a];
				res.files[a]=res.files[lowest_index];
				res.files[lowest_index]=b;
			}
		}
	}
	for(a=0;a<res.files.length;++a)wrapper.fileids[a]=res.files[a].id;
	document.title='KFM: '+res.reqdir;
	kfm_lastClicked=null;
	kfm_log(kfm.lang.FilesRefreshed);
	if(res.uploads_allowed)kfm_addPanel('kfm_left_column','kfm_file_upload_panel');
	else kfm_removePanel('kfm_left_column','kfm_file_upload_panel');
	kfm_refreshPanels('kfm_left_column');
	if(!res.files.length){
		$j('#documents_loader').empty().html('&nbsp;');
		kfm.addEl(wrapper,(new Element('span',{
			'class':'kfm_empty'
		})).setHTML(kfm.lang.DirEmpty(res.reqdir)));
	 }else{
		if(kfm_listview){
			var listview_table=new Element('table',{
				'id':'kfm_files_listview_table'
			});
			wrapper.appendChild(listview_table);
			$j(listview_table).html('<thead><tr class="listview_headers"><th>&nbsp;</th><th>Name</th><th style="width:72px">Size</th><th style="width:72px">Type</th><th style="width:142px">Modified</th></tr></thead><tbody></tbody>');
				$j(listview_table).css('width','99%');
		}
		kfm_incrementalFileDisplay();
	}
}
function kfm_removeFilesFromView(files){
	kfm_selectNone();
	if($type(files)!='array' || !files.length)return;
	var i=0,right_column=$('documents_body');
	for(var i=0;i<files.length;++i){
		var el=$('kfm_file_icon_'+files[i]);
		if(el){
			if(kfm_listview){
							el.parentNode.parentNode.remove();
							var trows=$ES('#kfm_files_listview_table tr');
						}
			else el.remove();
		}
		right_column.fileids.remove(files[i]);
	}
	kfm_files_reflowIcons();
}
function kfm_renameFile(id){
	var filename=File_getInstance(id).name;
	kfm_prompt(kfm.lang.RenameFileToWhat(filename),filename,function(newName){
		if(!newName||newName==filename)return;
		kfm_log(kfm.lang.RenamedFile(filename,newName));
		x_kfm_renameFile(id,newName,kfm_refreshFiles);
	});
}
function kfm_renameFiles(nameTemplate){
	if(nameTemplate && nameTemplate.toString()!==nameTemplate)nameTemplate='';
	var ok=false;
	kfm_prompt(kfm.lang.HowWouldYouLikeToRenameTheseFiles,nameTemplate,function(nameTemplate){
		var asterisks=nameTemplate.replace(/[^*]/g,'').length;
		if(!nameTemplate)return;
		if(!/\*/.test(nameTemplate))alert(kfm.lang.YouMustPlaceTheWildcard);
		else if(/\*[^*]+\*/.test(nameTemplate))alert(kfm.lang.IfYouUseMultipleWildcards);
		else if(asterisks<(''+selectedFiles.length).length)alert(kfm.lang.YouNeedMoreThan(asterisks,selectedFiles.length));
		else ok=true;
		if(!ok)return kfm_renameFiles(nameTemplate);
		x_kfm_renameFiles(selectedFiles,nameTemplate,kfm_refreshFiles);
	});
}
function kfm_showFileDetails(id){
	var res=File_getInstance(id);
	var fd=$('kfm_file_details_panel'),el=$('kfm_left_column');
		if(!el)return false;
	if(!fd){
		kfm_addPanel('kfm_left_column','kfm_file_details_panel');
		kfm_refreshPanels(el);
	}
	var body=$E('#kfm_file_details_panel div.kfm_panel_body').empty();
	if(!res){
		body.innerHTML=kfm.lang.NoFilesSelected;
		return;
	}
	var table=kfm_buildFileDetailsTable(res);
	kfm.addEl(body,table);
}
function kfm_showToolTip(id){
	if(!id || kfm_listview)return;
	var F=File_getInstance(id);
	var table=kfm_buildFileDetailsTable(F),icon=$('kfm_file_icon_'+id);
	if(!icon||contextmenu)return;
	table.id='kfm_tooltip';
	kfm.addEl(document.body,table);
	var l=getOffset(icon,'Left'),t=getOffset(icon,'Top'),w=icon.offsetWidth,h=icon.offsetHeight,ws=window.getSize().size;
	l=(l+(w/2)>ws.x/2)?l-table.offsetWidth:l+w;
	table.setStyles('position:absolute;top:'+t+'px;left:'+l+'px;visibility:visible;opacity:.9');
}
function kfm_zip(name){
	if(!name || name.toString()!==name)name='zipped.zip';
	var ok=false;
	kfm_prompt(kfm.lang.WhatFilenameDoYouWantToUse,name,function(name){
		if(!name)return;
		if(/\.zip$/.test(name))ok=true;
		else kfm.alert(kfm.lang.TheFilenameShouldEndWithN('.zip'));
		if(!ok)return kfm_zip(name);
		x_kfm_zip(name,selectedFiles,kfm_refreshFiles);
	});
}
function kfm_fileLoader(id){
	if($type(id)!='array')return $j('#kfm_file_icon_'+id).css('background-image','url(themes/'+kfm_theme+'/icons/64x64/loader.gif)');
	id.each(kfm_fileLoader);
}
function kfm_filesLoader(){
	$j('<img src="themes/'+kfm_theme+'/small_loader.gif" alt=""/>').appendTo('#documents_loader');
}
// see license.txt for licensing
function kfm_resizeHandler(){
	var w=window.getSize().size;
	for(var i=0;i<kfm_resizeHandler_maxHeights.length;++i)if($(kfm_resizeHandler_maxHeights[i]))$(kfm_resizeHandler_maxHeights[i]).setStyle('height',w.y);
	for(var i=0;i<kfm_resizeHandler_maxWidths.length;++i)if($(kfm_resizeHandler_maxWidths[i]))$(kfm_resizeHandler_maxWidths[i]).setStyle('width',w.x);
	var el=$('kfm_codepressTableCell');
	if(el){
		var iframe=$E('iframe',el);
		if(iframe){
			iframe.style.height=0;
			iframe.style.width=0;
			iframe.style.height=(el.offsetHeight-10)+'px';
			iframe.style.width=(el.offsetWidth-10)+'px';
		}
	}
	kfm_refreshPanels('kfm_left_column');
	var els=$ES('body *');
	els.each(function(el){
		if(el.parentResized)el.parentResized();
	});
}
function kfm_resizeHandler_add(name){
	kfm_resizeHandler_addMaxWidth(name);
	kfm_resizeHandler_addMaxHeight(name);
}
function kfm_resizeHandler_addMaxHeight(name){
	if(!kfm_resizeHandler_maxHeights.contains(name))kfm_resizeHandler_maxHeights.push(name);
}
function kfm_resizeHandler_addMaxWidth(name){
	if(!kfm_resizeHandler_maxWidths.contains(name))kfm_resizeHandler_maxWidths.push(name);
}
function kfm_resizeHandler_remove(name){
	kfm_resizeHandler_removeMaxWidth(name);
	kfm_resizeHandler_removeMaxHeight(name);
}
function kfm_resizeHandler_removeMaxHeight(name){
	if(!kfm_resizeHandler_maxHeights.contains(name))kfm_resizeHandler_maxHeights.remove(name);
}
function kfm_resizeHandler_removeMaxWidth(name){
	if(!kfm_resizeHandler_maxWidths.contains(name))kfm_resizeHandler_maxWidths.remove(name);
}
var kfm_resizeHandler_maxHeights=[];
var kfm_resizeHandler_maxWidths=[];
// see license.txt for licensing
function kfm_runSearch(){
	kfm_run_delayed('search',kfm_runSearch2);
}
function kfm_runSearch2(){
	var keywords='',tags='';
	var kEl=$("kfm_search_keywords"),tEl=$("kfm_search_tags");
	if(kEl)keywords=kEl.value;
	if(tEl)tags=tEl.value;
	if(keywords==""&&tags=="")x_kfm_loadFiles(kfm_cwd_id,kfm_refreshFiles);
	else x_kfm_search(keywords,tags,kfm_refreshFiles)
}
function kfm_searchBoxFile(){
	return new Element('input',{
		'id':'kfm_search_keywords',
		'events':{
			'keyup':kfm_runSearch
		}
	});
}

