var inModal = false;

if(jQuery) (function($){
	
	$.extend($.fn, {
		cleverFiles: function(o, h) {
		
			var version_major = "1";
			var version_minor = "8";
			var revision = "$Rev: 991 $";
			var version = version_major+"."+version_minor+"."+revision.substring(6,revision.length-2);
		
			// Defaults
			if( !o ) var o = {};
			
			if( o.scriptList === undefined ) o.script = 'backend.php';
			if( o.scriptProperties === undefined ) o.scriptProperties = 'backend.php';
			if( o.scriptMove === undefined ) o.scriptMove = false;
			if( o.scriptCreate === undefined ) o.scriptCreate = 'backend.php';
			if( o.scriptRename === undefined ) o.scriptRename = false;
			if( o.loadMessage === undefined ) o.loadMessage = 'Loading...';
			if( o.parentAccess === undefined ) o.parentAccess = false;
			if( o.showBreadcrumb === undefined ) o.showBreadcrumb = false;
			if( o.delimiter === undefined ) o.delimiter = ',';
			if( o.root === undefined ) o.root = o.delimter;
			if( o.showBookmarks === undefined) o.showBookmarks = false;
			if( o.defaultBookmark === undefined) o.defaultBookmark = 0;
			if( o.showProperties === undefined) o.showProperties = false;
			if( o.width === undefined) o.width = 400;
			if( o.height === undefined) o.height = 300;
			if( o.bookmarksWidth === undefined) o.bookmarksWidth = 150;
			if( o.propertiesWidth === undefined) o.propertiesWidth = 200;
			if( o.allowMultiSelect === undefined) o.allowMultiSelect = false;
			if( o.showTableHeaders === undefined) o.showTableHeaders = false;
			if( o.showNavigation === undefined) o.showNavigation = false;
			if( o.showIcon === undefined) o.showIcon = true;
			if( o.allowFileActions === undefined) o.allowFileActions = false;
			if( o.showThumbnails === undefined) o.showThumbnails = false;
			if( o.maxFilesize === undefined) o.maxFilesize = false;
			if( o.allowSearch === undefined) o.allowSearch = false;
			if( o.searchDelay === undefined) o.searchDelay = 200;
			if( o.cleverUpload === undefined) o.cleverUpload = false;
			if( o.uploadParams === undefined) o.uploadParams = {};
			if( o.maxNameList === undefined ) o.maxNameList = 10;
			if( o.destinationBookmarks === undefined) o.destinationBookmarks = o.bookmarks;
			if( o.creatableItems === undefined) o.creatableItems = [{display: 'Folder', type: 'folder'}];
			if( o.allowNewContent === undefined) o.allowNewContent = false;
			if( o.showRefresh === undefined) o.showRefresh = false;
			if( o.appTitle === undefined ) o.appTitle = "&nbsp;";
			if( o.bookmarksTitle === undefined ) o.bookmarksTitle = "Places";
			if( o.propertiesTitle === undefined ) o.propertiesTitle = "Properties";
			if( o.showNavLabels === undefined ) o.showNavLabels = false;
			if( o.showServerErrors === undefined ) o.showServerErrors = false;
			if( o.keyboardListeners === undefined ) o.keyboardListeners = true;
			if( o.searchRestText === undefined ) o.searchRestText = "Search ";
			if( o.doUploadPath === undefined ) o.doUploadPath = "/files/do_upload";
			if( o.allowUpload === undefined ) o.allowUpload = false;
			if( o.pagination === undefined ) o.pagination = true;
			if( o.itemsPerPage === undefined ) o.itemsPerPage = 20;
			if( o.quickSelect === undefined ) o.quickSelect = false; // single click return
			if( o.thumbnailsMaxWidth === undefined ) o.thumbnailsMaxWidth = false;
			if( o.autoHideScrollbars === undefined ) o.autoHideScrollbars = true;
			if( o.method === undefined ) o.method = "post";
			
			if( o.postData === undefined ) o.postData = {};
			
			if( o.singleclicklinks === undefined) o.singleclicklinks = (!o.quickSelect);
			
			if( o.searchAutoFocus === undefined ) o.searchAutoFocus = true;
			
			if (o.scriptTranscodeProgress === undefined ) o.scriptTranscodeProgress = false;
			
			// Timeout on preloading images, prevents script blocking
			if( o.preloadTimeout === undefined ) o.preloadTimeout = 3000;
			
			// Prevents unintended document scrolling, doesn't work in IE
			if( o.smartScrolling === undefined ) o.smartScrolling = true;
			
			// Popup full-size previews when image is clicked in properties
			if( o.allowModalPreview === undefined ) o.allowModalPreview = false;

			// Array of entity objects to always hide from view
			if( o.hideItems  === undefined ) o.hideItems = [];
			
			
			// Other hidden options...
			
			// callback_onselect - returns the object of any file selected
			// autoSelect - automatically focus selection on a file
			
			if (h === undefined)
				h = function() {};
			
			var max_propheight = 0;
		
			var navheight = 40;
			var breadcrumbheight = 20;
			var borderwidth = 1;
			
			var root = $(this);
			var hist = Array();		
			var bookmarks, properties, breadcrumb, filelist, searchfield, selectaction, nav, listcontainer;	
			var histpos = -1;
			var lastsearch = "";
			var searchbuffer = "";
			var highlightid = false;
			var writable = false;
			var currentbookmark = false;
			
			var listwidth = 0;
			var ie7or8 = (document.all && !window.opera && window.XMLHttpRequest) ? true : false;
			var isCtrl = false;
			var ieScrollWidth = 0;
			var lasterror = false;
			
			var renameid = false;
			
			var imagepreloaded = false;
			var filebrowser = false;
			
			
			
			var temp_file_progress_elapsed = 0;
			var temp_file_progress_ettc = 0;
			
			$(this).each( function() {
			
				this.t = $(this);
								
				function bindTree(t)
				{
				
					$(t).find('TBODY TR').bind('click', function(e) {
						selectItem($(this));
						fileclick($(this).attr("rel"));								
					});
										
					$(t).find("TBODY TR").dblclick(function() {
						if ( $(this).hasClass('directory') )
							return navigate($(this).attr("rel"), false, true);
							
						returnSelected();	
					});
					
					$(t).find("TBODY TR TD.name A").click(function(){
					
						var row = $(this).parent().parent();
					
						if ( row.hasClass('directory') )
							return navigate(row.attr("rel"), false, true);
						
						selectItem(row);
						
						returnSelected();
					});	
				
				}
				
				function attachModalPreview(val)
				{
					
					var size = Array();
				
					$(val).bind("click", function ()
					{
						$.post($(this).attr("rel"), {}, function(data) {
							
							if (data == "logout")
								return; //location.reload(true);
							
							data = $(data);
							
							var panel = $('<div id="modalpanel" class="preview"></div>'); 
							
							$(panel).append('<div id="modal-buttons" class="single">\
							<a href="javascript:void(0)" id="modal-cancel" class="modal-button modal-close">Close</a>\
							</div>');
						
							var temp = $("<div />");
							
							temp.append(data);
							
							$("BODY").append(temp);
							var width = data.width();
							temp.remove();
							
							if (width < 100)
								width = 100;
								
							size = [data.height(), width];
													
							$(panel).modal({ 
								containerId: "clever-modal", 
								closeClass: "modal-close", 
								position: [100,],
								overlayId: "clever-overlay",
								containerCss: {width: (width+20)+'px'},
								onClose: function (dialog) {
									  dialog.data.fadeOut('fast', function () {
									    dialog.container.fadeOut('fast', function () {
									      dialog.overlay.fadeOut('fast', function () {
									        $.modal.close(); // must call this!
									        inModal = false;
									      });
									    });
									  });
								}, onOpen: function (dialog) {
								
									$(panel).prepend(data);
								
								  dialog.overlay.fadeIn('fast', function () {
								    dialog.container.fadeIn('fast', function () {
								      
								      dialog.data.fadeIn('fast');
								      inModal = true;
								      													      
								    });
								  });
								}				
							});
																
						}, 'html');
					
					});
					
					
					var img = $($(val).find("IMG"));
					
					img.parent().css("position", "relative");
					
					var imageholder = $("<div>").append(img.clone());
										
					//imageholder.height(size[0]+10);
					//imageholder.width(size[1]+10);
					
					$(val).simpletip({
					
						content: imageholder,
						position: [0,0],
						baseClass: "modal-preview-tooltip",
						showEffect: 'custom',
						showCustom: function(){
							$(this).css({display: "block", opacity:0});
						      $(this).fadeTo("fast",0.75);
						   }
					
					});
					

				}
					
				function fileclick(path)
				{
					
					if (o.showProperties)
					{
						properties.empty();
						properties.addClass("wait");
						properties.html("<div>"+o.loadMessage+"</div>");
						
						var data = jQuery.extend(o.postData, {file:path});
						
						ajax(o.scriptProperties, data, dataCallback_properties, ajaxError_properties, 'html');						
						
					}
					
					if (o.callback_onselect)
						o.callback_onselect(getSelectedObjects());
				
				}
				
				
				
				function dataCallback_properties(data)
				{
				
				
					if (data == "logout")
						return;// location.reload(true);
					
					var data = $(data);
					
					var c = function(data)
					{
						
						var resize = function (i, val){
						
							if ($(val).width() > (o.propertiesWidth+30))
								$(val).width(o.propertiesWidth-30);
								
							if ($(val).height() > 200)
								$(val).height(200);
						
						};
											
						properties.html(data);
						
						$.each(data.find("IMG"), resize);
						$.each(data.find("OBJECT"), resize);
						$.each(data.find("EMBED"), resize);
						
						if (o.allowModalPreview)
							$.each( properties.find("A.modal-preview"), function (i, val) { attachModalPreview(val); });
							
						if ($.browser.msie)
							$.each(properties.find("img[src$=.png]"), function(i, val){ correctOnePng(this);/*$(val).pngfix();*/ });
						
						properties.removeClass("wait");
						
						var propcontain = root.find("DIV.properties");
						
						if (properties.height() > max_propheight)
							propcontain.addClass("scroll");
						else
							propcontain.removeClass("scroll");
							
						properties.removeClass("empty");
						
						var title = $(properties.find("TH.title")[0]);
						
						if (o.scriptRename)
							title.bind('click', function(){ renameItem(); });
						
						$(title.find("P")[0]).width(o.propertiesWidth-20);
						
						//stop any existing timers
						$(document).stopTime("check_file_in_queue");
						$(document).stopTime("check_file_in_queue_bar");
						
						// if file in queue, bind and auto update
						if (o.scriptTranscodeProgress)
							bind_file_in_queue($(properties).find(".file_in_queue"));
							
						
						properties.find(".linkable_entity").each(function(){
						
							var t = $(this);
							
							var id = t.attr("rel");
							
							t.wrap( $("<a>").attr("href", "javascript:void(0)").click(function(){
								navigate(id);
							}) );
						
						});
					
					
					};
					
					// preload the image
					if (data.find("img").length)
					{
						var url = data.find("img").attr("src");
						
						$(document).stopTime("imgpreload");
						
						// try and preload the image
						$("<img />").attr('src', url).bind('load', function(){ 
							$(document).stopTime("imgpreload");
							c(data);
						});
						
						// set a timer just incase it never loads, or takes too long
						$(document).oneTime(o.preloadTimeout, "imgpreload", function()
						{
							c(data);
						});
						
					}
					else
						c(data);
					

				}
				
				
				function bind_file_in_queue(el)
				{
					// if no queued element, don't bother
					if (!el.length)
						return;
					
					var progress = $("<div>");
					
					var progress_bar_wrap = $("<div>").addClass("progress_bar_wrap");
					var progress_bar = $("<div>").addClass("progress_bar");
					
					progress_bar_wrap.append(progress_bar);
					
					var queue_pos = $("<p>").text("Queue position: ").append($("<span>").addClass("position_in_queue"));
					var etta = $("<p>").text("Tixec ETTC: ").append($("<span>").addClass("ettc"));
					var etta_clever = $("<p>").text("CleverStuff ETTC: ").append($("<span>").addClass("ettc_clever"));
					var status = $("<p>").text("Status: ").append($("<span>").addClass("status"));
					
					progress.append(queue_pos);
					progress.append(etta);
					progress.append(etta_clever);
					progress.append(status);
					progress.append(progress_bar_wrap);
					
					var id = el.attr("rel");
					
					el.replaceWith(progress);
					
					check_file_in_queue(progress, id);
					
					temp_file_progress_elapsed = 0;
					temp_file_progress_ettc = 0;
					
					$(document).everyTime(1000, "check_file_in_queue_bar", function(){
					
						draw_progress_bar(progress);
					
					});
				
				}
				
				function check_file_in_queue(progress, id)
				{
					
					$(document).stopTime("check_file_in_queue");
					
					//console.log("check_file_in_queue "+id);
					
					var data = {"file_id": id};
					
					ajax(o.scriptTranscodeProgress, data, check_file_in_queue_success, check_file_in_queue_error)					
				}
				
				function check_file_in_queue_success (data){	
			 		/* 
			 			elapsed: 7
						ettc: 43.9
						id: 90
						queue_length: 0
						status: "started"
						
					
					*/
			 		
			 		
			 		progress.find(".position_in_queue").text(data.queue_length);
			 		progress.find(".ettc").text(data.ettc+" sec");
					progress.find(".status").text(data.status);

			 		
			 		if (data.status == "completed")
			 		{
			 			$(document).stopTime("check_file_in_queue");
			 			$(document).stopTime("check_file_in_queue_bar");
			 			selectItemFromID(id);
			 			return;
			 		}
			 		
			 		
			 		var next_poll = (data.ettc / (data.queue_length+1)) / 4;
			 		
			 		temp_file_progress_elapsed = data.elapsed;
					temp_file_progress_ettc = data.ettc;
			 		
			 		
			 		if (next_poll < 2)
			 			next_poll = 2;
			 			
			 		
			 		$(document).oneTime(next_poll * 1000, "check_file_in_queue", function()
					{
						check_file_in_queue(progress, id);						
					});
			 		
			 		
			 	}
			 	
			 	function check_file_in_queue_error (XMLHttpRequest, textStatus, errorThrown)
			 	{
			 		alert("ERROR! check_file_in_queue");
			 	}
				
				function draw_progress_bar(progress)
				{
				
					if (temp_file_progress_ettc < 1)
						return;
				
					var progress_bar_wrap = progress.find(".progress_bar_wrap");
					var bar = progress_bar_wrap.find(".progress_bar");
					var width = progress_bar_wrap.width();
					
					
					var percent = ( temp_file_progress_elapsed / (temp_file_progress_elapsed+temp_file_progress_ettc));
					
					var bar_width =  width * percent;
					
					if (temp_file_progress_elapsed < 1 && temp_file_progress_ettc < 1)
						bar_width = 0;
					
					progress.find(".ettc_clever").text(Math.round(temp_file_progress_ettc) + " seconds");
					
					//console.log(width);
					
					bar.animate( {width: bar_width}, 500);
					
					temp_file_progress_elapsed++;
					temp_file_progress_ettc--;
				
				}
				
				
				function ajaxError_properties(XMLHttpRequest, textStatus, errorThrown)
				{				
					var text = XMLHttpRequest.responseText;

					lasterror = text;
						
					if (o.showServerErrors)
						showError();
					
					properties.removeClass("wait");
					properties.addClass('errorprop');
				
				}
							
				
				function returnSelected()
				{
	
					h(getSelectedObjects());
				
				}
				
				function getSelectedObjects()
				{
				
					var ents = Array();
					
					if ($(filelist).hasClass("multi"))
						$.each($(filelist).find("TBODY input[type=checkbox]"), function (i, val){
							
							if ($(val).attr("checked"))
								ents.push($(val).parent().parent().data("entity"));
						
						});
						
					if (ents.length == 0)
						$.each($(filelist).find("TR.selected"), function (i, val){
							ents.push($(val).data("entity"));				
						});
						
					if (ents.length == 0)
					{
						var crumbs = $(breadcrumb).find("LI.crumb");
						
						var cur_entity = $(crumbs[crumbs.length-1]).data("entity");
						
						if (cur_entity)
							ents.push(cur_entity);
					}
					
						
					return ents;
				
				}
				
				function deselect()
				{
					emptyProperties();
					selectItem(false);
				}
				
				
				function search(query, force)
				{
				
					if (force != undefined)
						return doSearch(query);
					
					searchbuffer = query;
				
					$(this).oneTime(o.searchDelay, function()
					{
						doSearch(query);
					
					});
				
				}
				
				
				function doSearch(query)
				{
				
					if (searchbuffer == query && searchbuffer != lastsearch)
					{
						
						$(root).find("DIV.nav DIV.search").addClass("wait");
						
						var filters = hist[histpos].filter;
						
						if (query.length > 0)
							filters.name = "%"+query+"%";
						else
							filters.name = "";
							
						hist[histpos].filter = filters;
						
						showTree(hist[histpos]);
						
						lastsearch = query;
					
					}
				}
				
				
				function showTree(item, page)
				{
					
					if (!item)
						return;
						
					if (!page)
						page = 1;
					
					path = item.path;
					filters = item.filter;
					
					c = filelist;
					
					listcontainer.removeClass('errorlist');
					listcontainer.addClass('waitlist');

					deselectItems();
					
					c.html("<tr><td>"+o.loadMessage+"</td></tr>");
					
					if (o.hideItems.length > 0)
					{
					
						var str = "^";
						
						for (i = 0; i < o.hideItems.length; i++)
							if (o.hideItems[i])
								str += ((str.length > 1) ? "|" : "") + o.hideItems[i];
							
						filters.id = str;
					}
					
					var post_data = {};
					
					post_data.path = path;
					post_data.filter = makeJson(filters);
					
					
					
					if (o.pagination)
					{
						post_data.items_per_page = o.itemsPerPage;
						post_data.page = page;
					}

					var bookmark = o.bookmarks[hist[histpos].bookmark];

					if (bookmark)
					{
						if (bookmark.fields)
							post_data.fields = bookmark.fields;
					}
					
					
					ajax(o.scriptList, post_data, function(data){
						dataCallback_list(data, item);
						 	if (item.bookmark != currentbookmark)
								selectBookmark(item.bookmark);
					}, ajaxError_list);
					
				}			
				
				function ajaxError_list(XMLHttpRequest, textStatus, errorThrown)
				{	
				
					var text = XMLHttpRequest.responseText
					
					lasterror = text;
					
					if (o.showServerErrors)
						showError();
					
					listcontainer.removeClass('waitlist');
					listcontainer.addClass('errorlist');
					
				}
				
				
				function showError()
				{	
					if (lasterror.length > 0)
						alert(lasterror);
				}
				
				
				
				function dataCallback_list(json, item)
				{
					// stop any properties queue
					$(document).stopTime("check_file_in_queue");
					$(document).stopTime("check_file_in_queue_bar");
					
					listcontainer.removeClass("noscroll");
						
												
						var el = root.find("table.root");
												
						el.empty();							
							
						if (json.error != undefined)
						{
							if (json.error == "logout")
								return;//location.reload(true);
							
							return 	el.append('<tr><td class="error">Error: '+json.error+'</td></tr>');
						}
							
						
						writable = json.edit;
						
						if (o.showBreadcrumb)
							writePath(json.path);
							
							
						$.each(json.items, function(i, val){
						
							if (val.Name)
								val.name = val.Name; //Case hackery
							
							val.path = json.path;
							
							el.append(generateEntityItem(val, path, i, json.fields));
							
							
							
							if (val.icon && o.showIcon && o.showThumbnails){
							
								// create each image
								var image = $("<img>").attr("src", val.icon).load(function(){
									var img = $(this);
									
									// once loaded check not too large
									if (o.thumbnailsMaxWidth)
									{
										if (this.width > o.thumbnailsMaxWidth)
											img.width(o.thumbnailsMaxWidth);
									}

									
									img.height(this.height)
									
									img.insertAfter("#thumb"+i);
									
									
									if (o.autoHideScrollbars)
									{
										checkscrollbars();
									}
									
								});
								
								if ($.browser.msie)
									image.insertAfter("#thumb"+i);
							
							}
							
						});
						
						listcontainer.removeClass('waitlist');
						
						if (json.items.length == 0)
						{
							listcontainer.addClass("emptylist");
						} else
						{
							listcontainer.removeClass("emptylist");
							bindTree(c);
						}
						
						
						if (filters.name != undefined)
							$(root).find("DIV.nav DIV.search").removeClass("wait");
							
							
						
						
						emptyProperties();
						checkNavButtons();
						
						
						if (o.showTableHeaders) 
						{
						
							var headers = $(root.find("DIV.headers"));
							
							headers.empty();
							headers.html("");
							
							
						
							if (o.allowMultiSelect)
							{
								headers.append('<div class="select"><input type="checkbox" name="all" id="selectall" /></div>');
								
								headers.find("INPUT").bind("click", function() {
								
									if ($(this).attr("checked")) {
										$.each($(filelist).find("TD INPUT"), function (i, val){
										
											$(val).attr("checked", true);
											$(val).attr("disabled", "disabled");
										
										});
									 } else {
										$.each($(filelist).find("TD INPUT"), function (i, val){
											$(val).attr("checked", false);
											$(val).removeAttr("disabled");
											$(val).parent().parent().removeClass("selected");
										});
									}
								});	
							}
							
							if (o.showIcon)
							{	
								var iconheader = $('<div class="icon">&nbsp;</div>').bind('click', function()
								{
									doSort('type');
								});
							
								headers.append(iconheader);
							}
							
							
							
							for ( var field_key in json.fields )
							{
								var field = json.fields[field_key];
								
								var h = $('<div>'+field.name+'</div>');
								
								if (field.sortable)
								{
									h.wrapInner($("<a>").attr("href", "javascript:void(0)"));
									
									h.addClass("sortable").find("a").bind("click", function(){
										doSort(field_key);
									});
									
									if (json.sort)
									{
										if (json.sort.by == field_key)
											h.addClass(json.sort.direction);
									}
								}
								
								headers.append(h);
							}
							
							
							
						}
						
						var widths = Array();
						
						var listheight = o.height - (o.showTableHeaders ? 23 : 0) - (o.showNavigation ? 42 : 0) - ((o.showBreadcrumb) ? breadcrumbheight : 0);
						
						if (o.pagination && json.total > json.items.length)
						{
							listheight -= 20;
							var pagination = filebrowser.find(".pagination");
							
							pagination.find(".showing").text("Listing "+json.limit[0]+"-"+json.limit[1]+" of "+json.total);
							
							var cur_page = Math.floor(json.limit[0] / o.itemsPerPage) + 1;
							var num_pages = Math.floor(json.total / o.itemsPerPage) + 1;
							
							
							var first = pagination.find(".first").unbind().fadeTo("slow", cur_page == 1 ? 0.3 : 1);
							
							if (cur_page != 1)
								first.click(function(){
									showTree(item, 1);
								});
							
							var next = pagination.find(".next").unbind().fadeTo("slow", num_pages > cur_page ? 1 : 0.3);
							
							if (num_pages > cur_page)
								next.click(function(){
									showTree(item, cur_page+1);
								});
							
							
							var prev = pagination.find(".prev").unbind().fadeTo("slow", cur_page > 1 ? 1 : 0.3);
							
							if (cur_page > 1)
								prev.click(function(){
									showTree(item, cur_page-1);
								});
								
								
							var last = pagination.find(".last").unbind().fadeTo("slow", cur_page < num_pages ? 1 : 0.3);
							
							if (cur_page < num_pages)
								last.click(function(){
									showTree(item, num_pages);
								});
							
							
						}
						
						listcontainer.animate( {height:listheight}, 200);
						
						listcontainer.width(listwidth);
						
						
						if (o.autoHideScrollbars)
						{
							checkscrollbars();
						}
								
						
						if (o.showTableHeaders && json.items.length > 0) 
						{
							
							$.each($(filelist.find("TBODY TR")[0]).find("TD"), function (i, val)
							{
								widths[i] = $(val).width();
							});
							
							
							$.each(headers.find("DIV"), function (i, val)
							{
								$(val).width(widths[i]);
							});
							
							
						}
						
						if (o.allowMultiSelect)
							multiselect();
							
						if (o.smartScrolling)
							listcontainer.unbind().scroll(function(){
								var t = $(this);
								
								if (t.isNearTheEnd())
									t.scrollTop(t.scrollTop()-1);
								else if (t.scrollTop() == 0)
									t.scrollTop(1);
							
							});
				
						if (json.items.length > 0 && $.browser.msie && $.browser.version < 7)
							$(filelist.find("img[src$=.png]")).each(function(){
								correctOnePng(this);		
							});
							
						if (highlightid)
						{
							selectItemFromID(highlightid);
							highlightid = false;
							
							if (renameid)
							{
								renameItem();
								renameid = false;
							}
								
								
						}
				
				}
				
				
				function checkscrollbars()
				{
				
					var all_loaded = true;
				
					listcontainer.find("img").each(function(){
						
						if (!this.complete)
							all_loaded = false;
							
						//console.log(this.height);
					});
				
					if (!all_loaded)
					{	
						//console.log("Still waiting...");
						return false;
					}
					
						
					var listheight = o.height - (o.showTableHeaders ? 23 : 0) - (o.showNavigation ? 42 : 0) - ((o.showBreadcrumb) ? breadcrumbheight : 0);
				
					if ($.browser.msie && !ie7or8)
					{
						listcontainer.removeClass("noscroll");
					
						listcontainer.width(listwidth-ieScrollWidth);
						filelist.width(listwidth-ieScrollWidth);
						
						listcontainer.css('overflow-y', 'scroll');
						
						if (filelist.find("tr").length == 0)
							listcontainer.addClass("noscroll");
						
					} else if (listheight > filelist.height())
					{
						//console.log("all loaded. listheight:"+listheight+" fielist:"+filelist.height());
					
						listcontainer.addClass("noscroll");
						filelist.find("TBODY").css("width", "100%");
					} else {
						listcontainer.removeClass("noscroll");
					}
				
				}
				
				function doSort(field)
				{
				
					var filter = hist[histpos].filter;
					
					if (filter.sort)
					{
						// If already filtering upon field
						if (filter.sort.indexOf(field) == 0)
						{
							if (filter.sort.toLowerCase().indexOf("asc") >= field.length)
								filter.sort = field+" DESC";
							else
								filter.sort = field+" ASC";
						
						}
					} else
						filter.sort = field+" ASC";
						
					hist[histpos].filter = filter;
					
					refresh();
				
				}
				
				function makeJson(f)
				{
				
					var str = "";
				
					for (attr in f)
						if (f[attr])
							str += "\""+escape(attr)+"\":\""+escape(f[attr])+"\",";
					
					
					if (str.length > 0)
						str = str.substring(0, str.length-1)
					
					str = "{"+str+"}";
					
					return str;
				
				}
				
				
				function generateEntityItem(e, p, i, fields)
				{
					
					
					var tr = $("<TR>");
					
					tr.addClass(e.iscontainer ? "directory" : "file");
					tr.addClass((i%2) ? 'even' : 'odd');
					tr.attr("id", "cleverfilerow_"+e.id);
					tr.attr("rel", e.id);
					
					if (o.allowMultiSelect)
					{
						tr.append ( $("<td>").addClass("select").append( $("<input>").attr( { type:"checkbox", name: "entity"} ).val(e.id) ) );
					}
					
					
					if (o.showIcon)
					{
						var icon = $("<td>");
						icon.addClass("icon");
						icon.addClass("type_"+e.type);
						
						if (e.icon && o.showThumbnails)
						{
							icon.addClass('showicon');
							icon.append( $("<div>").attr("id", "thumb"+i) );
						}
						
						tr.append(icon);						
					}
					
										
					for ( var field_key in fields )
					{
						
						var field = fields[field_key];
						
						var td = $("<TD>").addClass(field_key.toLowerCase());
						
						if (e[field_key])
						{
							// TODO name field should be independant of tp
							if (field_key == "name" && o.singleclicklinks)
							{
								td.append( $("<a>").attr("href", "javascript:void(0)").text(e[field_key]) );
							} else
								td.text(e[field_key]);
						}
						tr.append(td);
						
					}
					
					return tr.data('entity', e);
				}	
				
				function findEntity(id)
				{	
				
					var int_id = parseInt(id);
					
					var items = $(filelist).find("TBODY TR");
					
					for (i = 0; i < items.length; i++)
					{
					
						var tmp = items[i];
						
						var ent = $(tmp).data("entity");
						
						if (ent != undefined)
							if (ent.id == int_id)
								return ent;
					
					}
					
					if (o.showBreadcrumb)
					{
					
						items = $(breadcrumb).find("LI");
						
						for (i = 0; i < items.length; i++)
						{
						
							var tmp = $(items[i]).data("entity");
							
							if (tmp.id == int_id)
								return tmp;
						}
					}

				
					return null;
				}
				
				
				function selectItem(i)
				{
					deselectItems();
					
					if (i)
					{
						$(i).addClass("selected");
						
						if (writable)
							$(selectaction).removeAttr("disabled");
							
							
						if (o.quickSelect)
							returnSelected();

					}
						
				}
				
				function deselectItems()
				{
					$.each($(filelist).find("tr"), function(i, val){
						
						var row = $(val);
						
						if (o.allowMultiSelect)
						{
							var box = $(row.find("INPUT")[0]);
							if (box.attr("checked"))
								return;
						}
						
							
						row.removeClass("selected");
					});
					
					$(selectaction).attr("disabled", true);
					
				}
				
				function selectItemFromID(id)
				{
					var item = $(filelist).find("TR#cleverfilerow_"+id);
					
					listcontainer.scrollTo($(item), {duration:200} );
					
					fileclick(id);
					selectItem(item);
				
				}
				
				function writePath(path)
				{			
						$(breadcrumb).html('<ul><li class="wait">Loading</li></ul>');
						var list = $($(breadcrumb).find("UL"));
						
						list.empty();
						
						var temp_path = "";
						
						$.each(path, function (i, val){

							temp_path += ((temp_path.length) ? "," : "") + val.id;
							
							var item = $('<li class="directory crumb" rel="'+val.id+'"><a href="javascript:void(0)" rel="'+temp_path+'" class="icon type_'+val.type+' " title="'+val.name+'" ><span>'+val.name+'</span></a></li>');
							
							item.data("entity", val);
							
							list.append(item);
							
						
						});
												
						$.each(list.find("LI"), function (i, val){
					
							$(this).bind('click', function(){
							
								navigate($(this).find("A").attr("rel"));
							
							});
							
							$(this).hover( function(){
								$(this).find("A SPAN").show();
							}, 
								function()
								{	
									if ($(this).hasClass("cpse"))
										$(this).find("A SPAN").hide();
								}
							);
							
							if ($(list).width() > $(filelist).width())
							{
								var s = $(val).find("A SPAN");
								s.hide();
								$(this).addClass("cpse");
							}
								
						});
				}
				
				function translateID(path)
				{
				
					var ids = path.split(o.delimiter);
					
					var str = "";
					
					for (var i = 0; i < ids; i++)
					{

						var en = findEntity(ids[i]);
						str += en.name;
						if (i < (ids - 1))
							str += o.delimter;
					
					}
					
					return str;
				
				}
				
				
				// p = path
				// f = filter
				function navigate(p, f, append, b)
				{
					
					if (append)
					{
						var cur = hist[histpos];
						p = cur.path + "," + p;
					}
					
					histpos++;
					
					if (!f)
					{
						f = hist[histpos-1].filter;
						f.name = "";
					}
					
					var bookmark = currentbookmark;
					
					if (b)
						bookmark = b;
					
					var historyentry = {path: p, filter: f, bookmark: bookmark}
					
					hist[histpos] = historyentry;
					
					// null previous forward history
					hist[histpos + 1] = null;
					restoreSearch();
					showTree(historyentry);
					
				}
				
				function checkNavButtons()
				{
					if (o.showNavigation)
					{
						if (histpos == 0)
							nav.find('A.navback').fadeTo("slow", 0.33);
						else 
							nav.find('A.navback').fadeTo("slow", 1)
						
						if (!hist[histpos+1])
							nav.find('A.navforward').fadeTo("slow", 0.33);
						else
							nav.find('A.navforward').fadeTo("slow", 1);
							
							
						if (writable && (o.allowNewContent || o.allowUpload))
						{
							nav.find('A.navadd').fadeTo("slow", 1);
							nav.find('A.navupload').fadeTo("slow", 1);
						} else
						{
							nav.find('A.navadd').fadeTo("slow", 0.33);
							nav.find('A.navupload').fadeTo("slow", 0.33);
						}
					
					}
				}
				
				function back()
				{
				
					if (histpos == 0)
						return;
					restoreSearch();
					showTree(hist[--histpos]);
				
				}
				
				function forward()
				{
				
					if (!hist[histpos + 1])
						return;
					
					restoreSearch();
					showTree(hist[++histpos]);
				
				}
				
				function restoreSearch()
				{
					if (o.allowSearch && hist[histpos])
						if (hist[histpos].filter.name)
							$(searchfield).val("");
						else
							$(searchfield).val(hist[histpos].filter.name);
				}
				
				function emptyProperties()
				{
					if (o.showProperties)
					{
						$(properties).empty();
						var propcontain = root.find("DIV.properties");
						$(propcontain).removeClass("scroll");
						properties.addClass("empty");
						properties.height(max_propheight - 40);
					}
						
				}
			
				
				function loadBookmarks(b)
				{
					// if table headers are visible, add space to match this
					if (o.showTableHeaders)
						b.html('<div class="title"><strong>'+o.bookmarksTitle+'</strong></div>');
						
					b.append('<div id="bookmarkswrap"><ul /></div>');
					
					var list = b.find("UL");
										
					// generate the html for each bookmark
					$.each(o.bookmarks, function (i, val) {	
						
						var el = $(document.createElement('li'));
					
						el.width(o.bookmarksWidth-10);
						
						el.html('<a href="javascript:void(0)"><span>'+(val.name ? val.name : '')+'</span></a>');
						el.attr("rel", i);
						
						
						// if bookmarks has a large icon
						if (val.large)
						{
							el.addClass("large");
							el.width(o.bookmarksWidth);
							$(el.find("span")).width(o.bookmarksWidth-40);
						}
						
						if (val.icon)						
							el.find("A").css("background-image", "url("+val.icon+")");
						
						list.append(el);
					
					});

					
					b.find('LI A').bind('click', function() {
						navigateBookmark( $(this).parent().attr('rel'));	
					});	
				
				}
				
				
				function multiselect(enable)
				{
				
					if (enable == true || enable == undefined)
						filelist.addClass("multi");
					else
						filelist.removeClass("multi");
				
				}
				
				function navigateBookmark(i)
				{
					
					var index = i;
					
					// If requested bookmark is name not index
					if (isNaN(index))
						$.each(o.bookmarks, function (k, val){
							if (isNaN(index))
								if (index.toLowerCase().match(val.name.toLowerCase()) != null)
									index = k;
						});
					
					// get book mark data
					var b = o.bookmarks[index];
					
					if (b == undefined)
						return alert("Invalid Bookmark");
					
					o.root = b.root;
					
					var path = b.root;
					
					if (b.path)
						path += o.delimiter + b.path;
					
					var filters = {};
					
					if (b.filter)
						filters = b.filter;
					
					
					navigate(path, filters, false, i);
					
				}
				
				function selectBookmark(i)
				{
					currentbookmark = i;
					
					if (o.showBookmarks)
					{
						$.each(bookmarks.find("UL LI"), function (k, val){
							$(val).removeClass("selected");
							if ($(i) == k)
								$(val).addClass("selected");
						});
						
						var els = $(bookmarks).find("UL LI")
						$(els[i]).addClass("selected");
					}	
				
				}
				
				function generateFileList(files)
				{
				
					var str = "";
					
					var maxnames;
					
					if (o.maxNameList == false)
						maxnames = files.length;
					else
						maxnames = (files.length > o.maxNameList) ? o.maxNameList : files.length;
					
					for (var i = 0; i < maxnames; i++)
						str += files[i].name + ((i < (maxnames - 1)) ? ", " : "");
						
					if (maxnames < files.length)
						str += " and " + (files.length - maxnames) + " others";
					
					
					return str;
				}
				
				
				function moveItem()
				{
					
					if (!writable)
						return alert("Not writable");
					
					var selecteditems = getSelectedObjects();
					
					if (!selecteditems.length)
						return;
					
					var str = generateFileList(selecteditems);
				
					var text = $("<div />");
					
					$(text).append('<h3>Select Destination for...</h3><p><em>'+str+'</em></p><div id="panelbrowser">File Browser Here</div>');
					
					$(text).append('<div id="modal-buttons"><a href="javascript:void(0);" id="modal-cancel" class="modal-button modal-close">Cancel</a><a href="javascript:void(0)" id="modal-select" class="modal-button">Move</a></div>');

					
					 
					attachModalBox(text, [180,], false, function(){
					
						$(text).find("#panelbrowser").cleverFiles({
					      scriptList: o.scriptList,
					      bookmarks: o.destinationBookmarks,
					      bindbutton: $(text).find("#modal-select"),
					      showNavigation: true,
					      height: 200,
					      width: 560,
					      allowMultiSelect: false,
					      showBreadcrumb: true,
					      showBookmarks: o.destinationBookmarks.length > 1
	
					    }, function(items) { 
					    
					    	
					    	var data = {};
					    	data.destination = items[0].id;
					    		
					    	data.items = "";
					    	
					    	for (i = 0; i < selecteditems.length; i++)
					    		data.items += ((data.items.length > 0) ? "," : "") + selecteditems[i].id;
					    	
					    	$.post(o.scriptMove, data, function(json, textStatus){
					    	
					    		if (json.error)
					    			return alert(json.error);
					    	
					    		$.modal.close();
					    		inModal = false;
					    		
					    		navigate(data.destination);
					    		refresh(selecteditems[0].id);
					    		
					    	}, "json");
					    
					    });
					
					});
					
				}
				
				function refresh(id, rename)
				{
					if (id != undefined)
					{
						highlightid = id;
						
					}
					
					if (rename)
						renameid = id;
					
					showTree(hist[histpos]);
				
				}
				
				
				function addItem()
				{
					
					if (!writable)
						return false;
					
					var option = $('<select/>');
					
					$(option).append('<option value="null" id="removeme">Choose Type</option>');
					
					for (i = 0; i < o.creatableItems.length; i++)
						$(option).append('<option value="'+i+'">'+o.creatableItems[i].display+"</option>");
					
					var text = $('<div><h3>Create New Item</h3><form>&nbsp;</form><div id="config" /><div id="modal-buttons"><a href="javascript:void(0);" id="modal-cancel" class="modal-button modal-close">Cancel</a><a href="javascript:void(0);" id="modal-confirm" class="modal-button disabled">Create</a></div></div>');
					
					var config = $(text).find("#config");
					
					var createbutton = $(text).find("#modal-confirm");
					
					option.bind("change", function(){
					
						var value = $(this).val();
						
						$($(text).find("#removeme")).remove();
						
						$.post(o.scriptCreate, {path: hist[histpos].path, type: o.creatableItems[parseInt(value)].type}, function(html, textStatus){
					    	
					    	$(config).html(html);
					    	
					    	$(config).find("form").append( $("<input>").attr("type", "hidden").attr("name", "path").val(hist[histpos].path) );
					    	$(config).find("form").append( $("<input>").attr("type", "hidden").attr("name", "location").val(hist[histpos].path.split(o.delimiter).pop()) );
					    	
					    	
					    	var destination = $(config).find("FORM").attr("action");
					    	
					    	$(createbutton).removeClass("disabled");
					    	
					    	$(createbutton).unbind(); // Very important!
					    	
					    	var submitting = false;
					    	
					    	var action = function()
					    	{
					    		var form = $(config).find("FORM");
					    		
					    		if (form.hasClass("asynchronous"))
					    		{
					    			
					    			var text = $(form[0]).serialize();
					    		
						    		$.post(destination, {data: text, path: hist[histpos].path}, function(json, textStatus){
						    		
						    			refresh(json.id);
						    			$.modal.close();
						    			inModal = false;
						    		
						    		}, "json");
						    		
						    		return false;
					    		
					    		} else
					    		{
					    			var event = jQuery.Event("submit");
					    			form.trigger(event);
					    		}
					    			
					    	
					    	}
					    	
					    	
					    	$(createbutton).bind("click", action);
					    	
					    	var form = $(config).find("FORM");
					    	
					    	if (form.hasClass("asynchronous"))
					    		form.submit(action);
					   	});	
					
					});
					
					$(text.find("FORM")[0]).html(option);	
						
					attachModalBox(text, [80,0]);
				
				}
				
				function deleteItem()
				{
					
					if (!writable)
						return false;
					
					var items = getSelectedObjects();
					
					if (!items)
						return;
					
					var str = generateFileList(items);
					
					var ids = ""
					for (i = 0; i < items.length; i++)
						ids += ((ids.length > 0) ? "," : "") + items[i].id;
					
					var text = $('<h3>Are you sure you want to delete...</h3><p>'+str+'</p><div id="modal-buttons"><a href="javascript:void(0);" id="modal-cancel" class="modal-button modal-close">Cancel</a><a href="javascript:void(0);" id="modal-confirm" class="modal-button">Delete</a></div>');
					
					$(text).find("#modal-confirm").bind('click', function() { 
						
						$.post(o.scriptDelete, {items: ids}, function(json, textStatus){
			    		
			    			if (json.error)
			    				return alert(json.error);
			    		
			    			refresh();
			    			
			    			$.modal.close();
			    			inModal = false;
			    		
			    		}, 'json');
						
					});
					
					attachModalBox(text);
				
				}
				
				
				function renameItem()
				{
				
					if (!o.scriptRename)
						return;
				
					if (!writable)
						return alert("Not editable");
				
					var selected = getSelectedObjects();
					
					if (selected.length > 1)
						return alert("You cannot rename multiple items");
						
					if (selected.length == 0)
						return;	
						
					var item = selected[0];
				
					var text = $('<div><h3>Rename file</h3><form id="renameform"><input type="text" id="newfilename" value="'+item.name+'" style="width:250px;" /></form><div id="modal-buttons"><a href="javascript:void(0);" id="modal-cancel" class="modal-button modal-close">Cancel</a><a href="javascript:void(0);" id="modal-confirm" class="modal-button">Rename</a></div></div>');
					
					
					var renamefunction = function(event) { 
					
						$.post(o.scriptRename, {id: item.id, name: $("#newfilename").val()}, function(json, textStatus){
			    		
			    			if (json.error)
			    				return alert(json.error);
			    		
			    			refresh(item.id);
			    			
			    			$.modal.close();
			    			inModal = false;
			    		
			    		}, 'json')
			    	
			    		return false;
			    	};
					
					text.find("#renameform").submit(renamefunction);
					
					text.find("#modal-confirm").bind('click', renamefunction);					
					
					attachModalBox(text, false, 300);
					
				}
				
				function getCurrentID()
				{

					var cur = hist[histpos];
					
					var ids = new Array(cur.path);
					
					if (cur.path.indexOf(o.delimiter) != -1)
						ids = cur.path.split(o.delimiter);
					
					var id = ids[ids.length-1];
					
					return id;
				
				}
				
				function uploadItem()
				{
					
					if (!writable)
						return alert("Not writable");
					
					var id = getCurrentID();
					
					var cur = findEntity(id);
					
					maxFilesize = o.maxFilesize;
					
					if (cur == null)
						cur = {"name": "root", "id": id};
					
					var text;
					
					var hasFlash = swfobject.hasFlashPlayerVersion("9.0.18") && o.cleverUpload;
					
					var flashversion = swfobject.getFlashPlayerVersion();
					
					var warningmessage = "";
					
					if (!hasFlash)
					{
						if (flashversion.major == 0)
							warningmessage = "Consider installing Adobe Flash for a better file upload experience.";
						else
							warningmessage = "Your version of Adobe Flash ("+flashversion.major+"."+flashversion.minor+") is outdated . Please consider upgrading.";
					}
					
					if (hasFlash)
						
						text = $("<h3>Upload to "+cur.name+"</h3>\
					 <div id=\"cleverupload\">Loading Flash...</div><span id=\"cleverupload_opening\">Please wait, opening file browser...</span>\
					 <form id=\"cleveruploadform\" action=\""+o.doUploadPath+"\" method=\"post\" enctype=\"multipart/form-data\">\
					 <input type=\"hidden\" value=\""+cur.id+"\" name=\"parent_id\" />\
					 <div id=\"filesize\"><span id=\"totalsize\">&nbsp;</span><span id=\"currentsize\">&nbsp;</span></div>\
					 <div id=\"progress\"><div id=\"bar\"><div id=\"filename\"></div></div></div>\
					 <div id=\"modal-buttons\"><a href=\"javascript:void(0)\" id=\"modal-cancel\" class=\"modal-button\">Cancel</a><a href=\"javascript:void(0)\" id=\"modal-confirm\" class=\"modal-button disabled\">Upload File</a></form></div>");
					
					else text = $("<h3>Upload to "+cur.name+"</h3>\
					<div id=\"cleverupload\">&nbsp;</div>\
					 <form id=\"cleveruploadform\" action=\""+o.doUploadPath+"\" method=\"post\" enctype=\"multipart/form-data\">\
					 <em>"+warningmessage+"</em>\
					 <input type=\"hidden\" value=\""+cur.id+"\" name=\"parent_id\" /><input name=\"file\" type=\"file\" id=\"filechooser\"/><div id=\"filename\"></div>\
					 <div id=\"filesize\"><span id=\"totalsize\">&nbsp;</span><span id=\"currentsize\">&nbsp;</span>\
					 <div id=\"modal-buttons\"><a href=\"javascript:void(0)\" id=\"modal-cancel\" class=\"modal-button\">Cancel</a><a href=\"javascript:void(0)\" id=\"modal-confirm\" class=\"modal-button disabled\">Upload File</a></form></div>");
					
					var panel = $('<div id="modalpanel" class="cleverupload"></div>');
					
					$(text).find("#modal-cancel").click(function(){
						
						movie = $("#cleveruploadmovie");
						
						try {
							if ($(movie).html() != "&nbsp;")
								movie[0].cancelUpload();
						} catch (err)
						{
							// Unable to cancel upload
						}
						
						
						$.modal.close();
						inModal = false;
						
						refresh();
					
					});
					
					panel.html(text);
				
					$(panel).modal({ containerId: "clever-modal-upload",  
								position: [190,],
								overlayId: "clever-overlay",
								onClose: function (dialog) {
									
									  dialog.data.fadeOut('fast', function () {
									    dialog.container.fadeOut('fast', function () {
									      dialog.overlay.fadeOut('fast', function () {
									        refresh($("#filename").attr("rel"), $("#filename").hasClass("duplicate"));        
									        $.modal.close(); // must call this!
									        inModal = false;
									        
									      });
									    });
									  });
								}, onOpen: function (dialog) {
								  dialog.overlay.fadeIn('fast', function () {
								    dialog.container.fadeIn('fast', function () {
								   		inModal = true;
								   		$("#cleveruploadbutton").hide();
								   		$("#bar").width(0);
								   		
								   		$("#cleveruploadform").submit(function(){ 
								   			if ($("#filechooser").length == 0) 
								   			{
								   				$("#modal-confirm").trigger("click");
								   				return false;}
								   			 });
								   		
								   		var param = {};
								   		var vars = {};
								   		
								   		var showButton = true;//$.browser.msie;
								   		
								   		if (showButton)
								   		{
								   			param.bgcolor = "FFFFFF";
								   			vars.buttonLabel = "Select File";
								   			param.allowscriptaccess = 'always';
								   		}
								   			
								   			
								   		param.quality = "high";	
								   		
								   		var hiddenfile = $("#filechooser");
								   		
								   		$("#modal-confirm").click(function()
								   		{
								   			
								   			if ($(this).hasClass("disabled"))
								   				return;
								   				
								   			if (hiddenfile.val())
								   				return $("#cleveruploadform").trigger("submit");
								   				
								   			if (!hasFlash)
								   				return;
								   			
								   			$("#cleverchoosefile").attr("disabled", "disabled");
									   											   		
									   		var filename = $("#userfilename");
									   		o.uploadParams["do_not_transcode"] = false;
									   		o.uploadParams["parent_id"] = cur.id;
									   		o.uploadParams["filename"] = filename.val();
									   		
									   		filename.parent().hide();
											
											$("#bar").addClass("progress");
											
											try {
												
												$("#cleveruploadmovie")[0].executeUpload(o.uploadUrl, "file", o.uploadParams);
												
											} catch (err)
											{
												alert("Unable to upload file\nError:'"+err.description+"'");
											}
											$("#modal-confirm").hide();
											
											return false;
								   		
								   		});
								   		
								   		hiddenfile.change(function(){
								   		
								   			var val = $(this).val();
								   		
								   			var segments = val.split('\\');
								   			
								   			val = segments[segments.length-1];
								   		
								   			cleverupload_onFileSelected(val, 0);
								   		});
								   		
								   		
								   		$("#cleverchoosefile").bind("click", function(){								   			
								   			hiddenfile.trigger("click");
								   		});
								   		
								      	dialog.data.fadeIn('fast', function(){
									if (hasFlash)
											try {
												swfobject.embedSWF(o.cleverUpload, "cleverupload", 104, 27, "9.0.0", "", vars, param, {"id":"cleveruploadmovie"},
									   			 function (e){
									   				hasFlash = e.success;
									   				if (!e.success)
									   					alert("There was an error inserting the Flash into the page.")
									   			});
									   			
									   			
											} catch (err)
											{
												alert("Error inserting flash \n"+err);
											}

											$("#cleverupload_opening").hide();
								      		inModal = true;

								      	});
								    });
								  });
								}				
					});
					
				}
				
				
				function attachModalBox(el, position, width, callback)
				{
				
					if (!position)
						position = [190,]
						
					if (!width)
						width = 600;
				
					//http://www.ericmmartin.com/projects/simplemodal/
				
					var panel = $('<div id="modalpanel"></div>'); 
					
					$(panel).html(el);
					
					var c = (callback) ? callback : function(){};
					
					$(panel).modal({ containerId: "clever-modal", 
								closeClass: "modal-close", 
								position: position,
								overlayId: "clever-overlay",
								containerCss: {width: width+'px'},
								onClose: function (dialog) {
									  dialog.data.fadeOut('fast', function () {
									    dialog.container.fadeOut('fast', function () {
									      dialog.overlay.fadeOut('fast', function () {
									        $.modal.close(); // must call this!
									        inModal = false;
									      });
									    });
									  });
								}, onOpen: function (dialog) {
								  dialog.overlay.fadeIn('fast', function () {
								    dialog.container.fadeIn('fast', function () {
								      dialog.data.fadeIn('fast');
								      
								      	c();
								      
								      inModal = true;
								    });
								  });
								}				
					});
				
				}
				
				
				function findSelectedRow()
				{
					var row = $(filelist).find("TBODY TR.selected")[0];
					
					if (row)
						return $(row);
						
					return false;
				
				}
				
				
				function moveUp()
				{
					
					var currow = findSelectedRow();
					
					var prevrow;
					
					if (!currow)
					{
						var list = $(filelist).find("TBODY TR");
						prevrow = $(list[list.length-1]);
					} else
						prevrow = currow.prev();
					
					if (!prevrow.length)
						return;
					
					selectItemFromID(prevrow.data("entity").id);
					
					
				}
				
				function moveDown()
				{
					
					var currow = findSelectedRow();
					
					var nextrow;
					
					if (!currow)
					{
						var list = $(filelist).find("TBODY TR");
						nextrow = $(list[0]);

					} else
						nextrow = currow.next();
					
					if (!nextrow.length)
						return;
						
					selectItemFromID(nextrow.data("entity").id);
					
					
				}
				
				function enterPress()
				{
					var selected = findSelectedRow();
					
					if (!selected)
						return;
						
					if ( $(selected).hasClass('directory') )
							return navigate($(selected).attr("rel"), false, true);
							
					returnSelected();
					
					
				}
				
				function selectAll()
				{
					
					if (!o.allowMultiSelect)
						return;
						
					if (!$(filelist).hasClass("multi"))
						$(filelist).addClass("multi");
					
					var selectall = $("#selectall");
					
					if (selectall.val() != "on") {
						$.each($(filelist).find("TD INPUT"), function (i, val){
							
							selectall.attr("checked", true);
							$(val).attr("checked", true);
							$(val).attr("disabled", "disabled");
						
						});
					 } else {
						$.each($(filelist).find("TD INPUT"), function (i, val){
							selectall.attr("checked", false);
							$(val).attr("checked", false);
							$(val).removeAttr("disabled");
						});
					}
				
				}
				
				function ajax(url, data, success, error, datatype)
				{
				
					var config = {};
					
					data = jQuery.extend(o.postData, data);
				
					config.type = o.method;
					
					if (datatype === undefined)
					{
						config.dataType = "json";
					}
						
					
					if (o.method == "get")
					{
						var vars = http_build_query(data);
						url += "?" + vars + "&callback=?";
					} else
						config.data = data;
					
					config.url = url;
					
					if ($.isFunction(success))
						config.success = success;
						
					if ($.isFunction(error))
						config.failure = error;
					
					$.ajax(config);
				}
				
				function http_build_query( formdata ) {  

				    var key, use_val, tmp_arr = [];  
				  
				    var arg_separator = '&';  
				  
				    for (key in formdata) {  
				        use_val = urlencode(formdata[key].toString());  
				        use_key = urlencode(key);
				        tmp_arr[i++] = use_key + '=' + use_val;  
				    }  
				  
				    return tmp_arr.join(arg_separator);  
				}  
				
				function urlencode (str) {
    				
    				str = (str+'').toString();
    				return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
                                                                    replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
				}

				function init()
				{	
					
					root.addClass("cleverstuff");
					
					root.empty();
					
					var heightoffset = ((o.showNavigation) ? (navheight + borderwidth) : 0 ) + ( (o.showBreadcrumb) ? (breadcrumbheight + borderwidth) : 0 ); 
					
					var widthoffset = (o.width - ((o.showBookmarks) ? (o.bookmarksWidth + borderwidth) : 0));
					
					// allow for cleverfiles to be initiated with a default file already selected
					if (o.autoSelect)
						highlightid = o.autoSelect;
					
					if (o.showNavigation)
					{
						root.append('<div class="nav"></div>');
						nav = $(root).find("DIV.nav");
						
						if (o.showNavLabels)
							nav.addClass("showlabels");
						
						nav.width(o.width-2);
						
						if (o.showBookmarks)
								nav.append('<div class="title" style="width:'+o.bookmarksWidth+'px; float:left;">'+o.appTitle+'</div>');
						
						if (o.allowSearch)
						{
							
							nav.append('<div class="search"><form><input type="search" results="5" class="searchbar" tabindex="1" value="Search "/></form></div>');
							nav.find('FORM').submit( function() {
								search(nav.find(".searchbar").val(), true); 
								return false;
							});
							searchfield = $(nav.find(".searchbar"));
							
							searchfield.addClass("rest");
							
							searchfield.bind( "keyup click", function() {
								search($(this).val());
							});
							
							
							if (o.searchRestText)
							{
								searchfield.bind("blur", function(){
									var t = $(this);
									if (t.val() == 0)
									{
										t.val(o.searchRestText);
										t.addClass("rest");
									}
										
								});
								
								searchfield.bind("focus", function(){
								
									var t = $(this);
									if (t.val() == o.searchRestText && t.hasClass("rest"))
									{
										t.val("");
										t.removeClass("rest");
									}
										
								
								});
							}
							
							if (o.searchAutoFocus)
								searchfield.focus();
							
						
						}
						
						
						nav.append('<div><a href="javascript:void(0)" class="navback" title="Back"><span>Back</span></a></div><div><a href="javascript:void(0)" class="navforward" title="Forward"><span>Forward</span></a></div>');
						nav.find('A.navback').bind('click', function() { back(); });
						nav.find('A.navforward').bind('click', function() { forward(); });
						
						
						if (o.allowFileActions)
						{
						
							nav.append('<div class="fileactions"><select></select></div>');
							
							selectaction = $(nav.find("SELECT")[0]);
							
							selectaction.append('<option value="0">Select Action</option>');
							
							if (o.scriptDelete)
								selectaction.append('<option value="1">Move</option>');
								
							if (o.scriptMove)
								selectaction.append('<option value="2">Delete</option>');
							
							if (o.scriptRename)
								selectaction.append('<option value="3">Rename</option>');
							
							selectaction.attr("disabled", true);
							
							$(selectaction).bind("change", function(){
						
								switch(parseInt($(this).val())){		
									case 0: break;
									case 1:
										moveItem(); break;
									case 2:
										deleteItem(); break;
									case 3:
										renameItem(); break;
									default:
										alert("Not supported yet");
								}
							
								$($(this).find("OPTION")[0]).attr("selected", "true");
							
							});
						}
						
						if (o.allowNewContent)
						{
							nav.append('<div class="haslabel"><a href="javascript:void(0)" class="navadd" title="Add New"><span>Create</span></a></div>');
							nav.find("A.navadd").bind('click', function() { addItem(); });
						}
						
						if (o.allowUpload)	
						{			
							nav.append('<div class="haslabel"><a href="javascript:void(0)" class="navupload" title="Upload"><span>Upload</span></a></div>');
							nav.find("A.navupload").bind('click', function() { uploadItem(); });
						}
						
						if (o.showRefresh)
						{
							nav.append('<div class="haslabel"><a href="javascript:void(0)" class="navrefresh" title="Refresh"><span>Refresh</span></a></div>');
							nav.find("A.navrefresh").bind('click', function() { refresh(); });
						}					
						
					}
					
					if (o.showBookmarks)
					{
						root.append('<div class="bookmarks" />');
						bookmarks = root.find("DIV.bookmarks");
						var bookmarkheight = o.height - navheight - ((o.showBreadcrumb) ? breadcrumbheight : 0);
						bookmarks.height(bookmarkheight);
						bookmarks.width(o.bookmarksWidth);
						loadBookmarks(bookmarks);
					}
						
					// Loading message
					root.append('<div class="files"></div>');
					filebrowser = root.find("DIV.files");
					filebrowser.height(o.height-heightoffset);
					filebrowser.width( o.width - ((o.showProperties) ? (o.propertiesWidth) : 0) - ((o.showBookmarks) ? (o.bookmarksWidth) : 0)  -2 );
					
					if (o.showTableHeaders)
						filebrowser.html('<div class="headers" />');
						
					filebrowser.append('<div class="filelist"><table class="root" /></div>');
					
					if (o.pagination)
					{
						
						filebrowser.append('<div class="pagination">\
												<div class="paging">\
													<div class="first"><span>&lt;&lt;</span></div>\
													<div class="prev"><span>&lt;</span></div>\
													<div class="next"><span>&gt;</span></div>\
													<div class="last"><span>&gt;&gt;</span></div>\
												</div>\
												<div class="showing">Listing x-y of z</div>\
											</div>');
					}
					
					if (o.showProperties)
					{
						root.append('<div class="properties" />');
						var propcontain = root.find("DIV.properties");
						
						if (o.showTableHeaders)
							propcontain.html('<div class="title"><strong>'+o.propertiesTitle+'</strong></div>');
							
						propcontain.append('<div class="propcontent" />');
						properties = root.find("DIV.propcontent");
						
						max_propheight = o.height-heightoffset+2;
							
						propcontain.height(max_propheight);
						
						propcontain.width(o.propertiesWidth);
						
						emptyProperties();
					}
			
					if (o.showBreadcrumb)
					{
						root.append('<div class="breadcrumb">&nbsp;</div>');
						var crumbbar = $(root).find("DIV.breadcrumb");
						
						crumbbar.html('<div class="spacer" style="width:'+(o.showBookmarks?o.bookmarksWidth:0)+'px;">&nbsp;</div>');
							
						
						crumbbar.append('<div class="path">&nbsp;</div>');
						breadcrumb = crumbbar.find("DIV.path");
					}
											
					root.append('<div class="clear">&nbsp;</div>');
					
					root.width(o.width);
					
					//set heights
					root.height(o.height);
					
					$('<div class="clear hidden">&nbsp;</div>').insertAfter($(root));
					
					filelist = root.find("TABLE.root");
					listcontainer = filelist.parent();
					listcontainer.height(o.height-heightoffset);
					
					listwidth = listcontainer.parent().width();
					
					
					if (o.bindbutton != undefined)
						for (i = 0; i < o.bindbutton.length; i++)
							$(o.bindbutton[i]).bind('click', function(){ returnSelected(); });
					
					
					if (o.bookmarks.length > 0)
						return navigateBookmark(o.defaultBookmark);
					
					// Get the initial file list
					showTree(o.root);
					
					if ($.browser.msie)
						root.bind("onselectstart", function() {return false;});
					
									
				}
				
				
				init(); // Lets begin!
				
				if (o.keyboardListeners)
				{
					$(document).ready( function() { 
						$(document).keyup(function (e) {
							if(e.which == 17) isCtrl=false;
						}).keydown(function(e)
						{ 	
						
						if (!inModal)
							switch(e.which)
							{	
								
				/*Control*/		case 17: isCtrl = true; break;
				/*Spacebar*/	case 32: 
				/*Return*/		case 13: enterPress(); break;
				/*UpCursor*/	case 38: moveUp(); break;
				/*DownCur*/		case 40: moveDown(); break;
				/*LeftCur*/		case 37: back(); break;
				/*RightCur*/	case 39: forward(); break;
				/*CTRL+A*/		case 65: if (isCtrl) selectAll(); break;
				/*CTRL+F*/		case 70: if (isCtrl && searchfield) searchfield.focus(); break;
				/*CTRL+U*/		case 85: if (isCtrl) uploadItem(); break;
				/*CTRL+E*/		case 69: if (isCtrl) showError(); break;
							
							}
						
						});
					});
				}
				
				
			});
		}
	});
	
})(jQuery);

var maxFilesize = false;

function cleverupload_onFileSelected(filename, size)
{ 
	$("#cleverupload_opening").hide();
	$('#filename').html('<label for="filename">Name in ThoughtPark</label><input type="text" name="filename" value="'+filename+'" id="userfilename"/>');
	$('#filesize').attr('rel', size);
	$('#bar').width("0%");
	
	$('#bar').removeClass('error');
	$('#bar').removeClass('complete');
	$("#modal-confirm").show();
	var sizestr = filesize(size);
	
	$('#totalsize').text(sizestr);
	
	var filetoobig = (maxFilesize) ? (maxFilesize < size) : false;
	$("#filename").show();
	if (filetoobig)
	{	
		/* $('#currentsize').text("File too big ("+filesize(maxFilesize)+" maximum) "); */
		$('#modal-confirm').addClass('disabled');
		$("#filename").hide();
		alert("The file you are trying to upload is "+sizestr+", \nit needs to be no more than "+filesize(maxFilesize)+".");
		
		return;
	}
			
	$('#currentsize').text("");
	$('#modal-confirm').removeClass('disabled');
	$("#filename").show();

} 

function cleverupload_onUploadProgress(progress) { 

	$('#bar').addClass('progress');
	$('#bar').width(progress*100+'%'); 
	$('#currentsize').text(filesize(parseInt($("#filesize").attr("rel"))*progress)+"/");
	
	//if (progress == 1)
	//	alert("progress "+progress);
}  

function cleverupload_onUploadComplete(response) { 
	
	$("#bar").removeClass("progress");
	$('#bar').addClass('complete');
	$('#bar').width("100%");
	$("#filename").attr("rel", response.file_id);
	if (response.duplicate_filename > 0)
		if (confirm("A file with the same name already exists. \nDo you wish to rename the file you have just uploaded?"))
			$("#filename").addClass("duplicate");
	$.modal.close();
	inModal = false;	
} 

function cleverupload_onUploadError(error) { 
	alert('error: ' + error);
	$('#bar').removeClass('progress');
	$('#bar').addClass('error'); 
}

function cleverupload_onFileBrowserOpened(){
	$("#cleverupload_opening").show();
}

function filesize(bytes)
{

	var size_increments = new Array(1073741824,1048576,1024, 1);
	var size_string = new Array("GB", "MB", "KB", "B");
	
	for (i=0; i < size_increments.length; i++)
	{
		var value = bytes/size_increments[i];
		
		if (value > 0.9)
			return roundNumber(value, 1) + size_string[i];
	}
	
	return "";
}

function roundNumber(num, dec) {
	return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}

$.fn.isNearTheEnd = function() { 
    return this[0].scrollTop + this.height() >= this[0].scrollHeight; 
}
