(function($) {
	$.finder = [];
	me = function(instance){
		if(typeof instance == 'string'){
			return $.finder[instance];
		}else{
			return $.finder[$(instance).attr("id")];
		}
	}
	
	jQuery.fn.extend({
		finder: function(options, callback){
			$('body').createOverlay();
			if(!this.attr("id")) this.attr("id", $.finder.length);
			$.finder.push({ id:this.attr("id"), target:this });
			instance = $.finder[$.finder.length-1];
			for(v in options) instance[v] = options[v];
			instance.type = (instance.type==null) ? "all" : instance.type.toString();
			instance.duration = (instance.duration==null) ? 0 : instance.duration;
			instance.save = instance.root;
			
			$(this).bind("select", callback);
			
			$(this).bind("click", function(){
				$('.finder').attr("with", $(this).attr("id"));
				$.get(me(this).url+'/process', { 'function':'load', 'url':'/'+me(this).save, 'process':me(this).url+'/process', 'root':me(this).root, 'type':me(this).type }, function(data){
					url = data.substring(data.indexOf("#")+1, data.indexOf("#", 1));
					data = data.substring(data.indexOf("#", 1)+1, data.length);
					$('.finder').html('<div class="finder-nav">'+url.locations()+'</div>'+data);
					$('.finder-overlay').click();
				 });
				return false;
			});
		},
		
		finder: function(options, callback){
			$('body').createOverlay();
			if(!this.attr("id")) this.attr("id", $.finder.length);
			$.finder.push({ id:this.attr("id"), target:this });
			instance = $.finder[$.finder.length-1];
			for(v in options) instance[v] = options[v];
			instance.type = (instance.type==null) ? "all" : instance.type.toString();
			instance.duration = (instance.duration==null) ? 0 : instance.duration;
			instance.save = instance.root;
			
			$(this).bind("select", callback);
			
			$(this).bind("click", function(){
				$('.finder').attr("with", $(this).attr("id"));
				$.get(me(this).url+'/process', { 'function':'load', 'url':'/'+me(this).save, 'process':me(this).url+'/process', 'root':me(this).root, 'type':me(this).type }, function(data){
					url = data.substring(data.indexOf("#")+1, data.indexOf("#", 1));
					data = data.substring(data.indexOf("#", 1)+1, data.length);
					$('.finder').html('<div class="finder-nav">'+url.locations()+'</div>'+data);
					$('.finder-overlay').click();
				 });
				return false;
			});
		},
		
		exists: function(){
			return ($(this).length > 0) ? true : false;
		},
		
		finderRefresh: function(){
			$('.finder-nav a:last').click();
		},
		
		ask : function(options, callback){
			$('body').createOverlay();
			

			$(this).bind("askConfirm", callback);

			$(this).bind("click", { 'options':options, 'callback':callback }, function(){
				if($(".finder-overlay").css("opacity") <= 0){
					$(".finder").html("<div style=\"padding:20px;text-align:center;width:400px;\">"+options.data+"<br/><button role=\"confirm-ask\" class=\"confirm-ask\" style=\"margin:20px 5px 20px 140px;\"><em>OK</em></button><button role=\"cancel\" class=\"cancel-button\" style=\"margin:20px 140px 20px 5px;\"><em>Cancel</em></button><br/><br/></div>");
					$(".finder-overlay").click();
					jQuery.fn.extend({ askConfirm: callback });
					$('.finder').attr("with", $(this).attr("class"));
					$('.confirm-ask').bind("click", { 'me':this }, function(event, options){
						instance = $(".finder").attr("with");
						$("."+instance).trigger("askConfirm");
						$(this).unbind("askConfirm");
					});
					$(window).resize();
				}
				return false;
			});
		},
		
		createOverlay: function(){
			if(!$(this).find(".finder-overlay").exists()){
				$("<div class=\"finder-overlay\"></div><div class=\"finder\"></div>").appendTo(this)
				.css({ opacity:0 })
				$('.finder').live('dragstart', ingore).live('selectstart', ingore);
				$(".finder-overlay").bind("click", function(){
					$(window).resize();
					if($(this).css("opacity") > 0){
						$(this).fadeTo(200, 0, function(){ $(this).css({ 'display':'none' }) });
						$('.finder').fadeTo(200, 0, function(){ $(this).css({ 'display':'none' }).empty().attr("with", null); });
					}else{
						$(this).css({
							display: 'block'
						}).fadeTo(200, 0.7);
						
						$('.finder').css({ 
							'display':'block',
							'opacity':0,
							'top':($(window).scrollTop() + (($(window).height() / 2) )-($('.finder').height()/2))+'px',
							'left':(($(window).width() / 2)-($('.finder').width()/2))+'px'
						}).fadeTo(200, 1);
					}
				});

				$(window).bind("scroll resize", function(){
					$('.finder-overlay').css({
						'width':$(window).width(),
						'height':$(window).height(),
						'top':$(window).scrollTop()+'px',
						'left':$(window).scrollLeft()+'px'
					});
					
					$('.finder').css({
						'top':($(window).scrollTop() + (($(window).height() / 2) )-($('.finder').height()/2))+'px',
						'left':(($(window).width() / 2)-($('.finder').width()/2))+'px'
					});
				});
				
				$('.finder > ul > li, .finder-nav > span').live("click", function(){
					instance = $('.finder').attr("with");
					$.get(me(instance).url+'/process', { 'function':'open', 'url':$(this).find("a").attr("href"), 'root':me(instance).root, 'type':me(instance).type }, function(data){	
						url = data.substring(data.indexOf("#")+1, data.lastIndexOf("#"));
						$('.finder-nav').html(url.locations());
						data = data.substring(data.lastIndexOf("#")+1, data.length);	

						if(me(instance).duration > 0){
							$('.finder > ul').css("position", "relative").animate({ 'left':'10px', 'opacity':0 }, me(instance).duration, function(){
								$(this).html(data).find(".draggable")
								.draggable({
										   scroll:true,
										   appendTo:'body',
										   scrollSensitivity: 100,
										   helper:'clone',
										   revert: 'invalid',
										   revertDuration: 350,
										   zIndex:'99999',
										   delay:20
								})
								$(this).parent().find(".droppable").finderDroppable();
								$(this).parent().parent().find(".finder-nav span").finderDroppable();
								
								$(this).css("left", "-10px");
								$(this).animate({ 'left':'0px', 'opacity':255 }, me(instance).duration);
							});
						}else{
							$('.finder > ul').html(data).find(".draggable").$(this).html(data).find(".draggable")
								.draggable({
										   appendTo:'body',
										   helper:'clone',
										   revert: 'invalid',
										   zIndex:'99999',
										   delay:20
								})
								$(this).parent().find(".droppable").finderDroppable();
								$(this).parent().parent().find(".finder-nav span").finderDroppable();
						}
						
						//$(".finder ul").sortable({ items: '.draggable', containment:'document', delay:20, helper:'clone', update:function(event, ui){
							//$.get($(this).attr("href"), { 'function':'order-quicklinks', data:$(this).sortable("serialize") });
						
						me(instance).save = $('.finder-nav a:last').attr("href");
						$("form", window.frames['upload-iframe'].document).find("#upload-url").val(me(instance).save);
					}, 'html');
					return false;
				});
				
				$('button[role="cancel"]').live("click", function(){
					$('.finder-overlay').click();
				});
				
				$('button[role="new-folder"]').live("click", function(){
					name = prompt("Name of folder", "");
					if(name != "" && name != null && name != "null"){
						instance = $('.finder').attr("with");
						$.get(me(instance).url+'/process', { 'function':'new-folder', 'url':me(instance).save+'/'+name }, function(data){
							$('.finder-nav a:last').click();
						}, 'html');
					}
					return false;
				});
				
				$('.openable').live("click", function(){
					href = $(this).attr("href");
					size = $(this).attr("size");
					full = String(window.location).replace(String(window.location.pathname), "");
					href = href.replace(full, "");
					href = href.replace("/../", "");
					href = href.replace("../", "");
					href = href.replace("/index.php/", "");
					if(href.indexOf("/") == 0) href.substring(1, href.length);
					href = full+'/'+href;
					name = href.substring(href.lastIndexOf("/")+1, href.lastIndexOf("."));
					folder = href.substring(href.lastIndexOf("/"), href.length);
					type = href.substring(href.lastIndexOf(".")+1, href.length);
					file = href;
					file = file.replace(/[\/]+/gi, "/");
					file = file.replace("http:/", "http://");
					instance = $('.finder').attr("with");
					$('#'+instance).trigger("select", {
						'name': name,
						'folder': folder,
						'file': file,
						'type': type,
						'size': size
					});
					$('.finder-overlay').click();
					return false;
				});
			}
		},
		
		finderDroppable:function(){
			$(this).droppable({
				accept:'.draggable',
				activeClass: 'finder-drag',
				hoverClass: 'finder-hover',
				tolerance:'pointer',
				drop: function(event, ui){
					folder = $(this).find("a").attr("href");
					file = $(ui.draggable).find("a").attr("href");
					send = file.substring(file.lastIndexOf("/")+1, file.length);
					send = folder+"/"+send;
					
					$.get(me(instance).url+'/process', { 'function':'move', 'file':file, 'folder':send }, function(data){
						$(ui.draggable).fadeOut(200).remove();
					});
				}
			});
		}
	});	
})(jQuery);

String.prototype.locations = function(){
	original = this;
	locations = this.split("/");
	out = new String;
	links = new String;
	for(i=0;i<locations.length;i++){
		if(locations[i] != ""){
			for(j=0;j<=i;j++){
				links += locations[j]+"/";
			}
			if(i==locations.length-1){
				out += "<span><a href='"+links.substring(0, links.length-1)+"' style=\"font-weight:bold\">"+locations[i]+"</a></span>";
			}else{
				out += "<span><a href='"+links.substring(0, links.length-1)+"'>"+locations[i]+"</a></span>";
			}
			links = "";
		}
	}
	return "In: "+out;
}

message = function(content, lead){

	$('body').createOverlay();
	$(".finder-overlay").stop().css({ 'display':'none', 'opacity':0 });
		if(lead != undefined)  button = "href=\""+lead+"\" class=\"admin-edit-link\"";
		else button = "role=\"cancel\" class=\"cancel-button\"";
		$(".finder").html("<div style=\"padding:20px;text-align:center;width:400px;\">"+content+"<br/><button "+button+" style=\"margin:20px 180px;\"><em>OK</em></button><br/><br/></div>");
		$(".finder-overlay").click();
		$(window).resize();
}

var ingore = function(){ return false; };