ui.finder-min.js 10.8 KB
/*****************************************************************************
 * jQuery Finder v0.7 - Makes lists into a Finder, similar to Mac OS X
 * 
 * @date		$Date: 2009-02-27 14:17:07 +0200 (Fri, 27 Feb 2009) $
 * @revision 	$Rev: 14 $
 * @copy		(c) Copyright 2009 Nicolas Rudas. All Rights Reserved.
 * @licence		MIT Licensed
 * @discuss		groups.google.com/group/jquery-en/browse_thread/thread/480bb6f722b66345
 * @issues		code.google.com/p/jqueryfinder/issues/
 * @latest		code.google.com/p/jqueryfinder/source
 * @demo		nicolas.rudas.info/jquery/finder
 * 
 *****************************************************************************
 * Syntax:
 *		$(selector).finder()					Create a new finder with default options
 *
 *		$(selector).finder(options)				Create a new finder with additional options
 *
 *		$(selector).finder(method,[arguments])	Execute a method on an existing finder
 *												-	select			Select item
 *												-	refresh			Reload currently selected item (cache is ignored)
 *												-	destroy			Completely remove finder

 *												
 **/
(function(A){A.fn.finder=function(F,H){var I={title:"",url:false,onInit:function(O){},onRootInit:function(O,P){},onRootReady:function(O,P){},onItemSelect:function(O,P,Q){return false;},onItemOpen:function(Q,P,O){},onFolderSelect:function(O,P,Q){},onFolderOpen:function(Q,P,O){},processData:function(O){return A('<div class="ui-finder-content"/>').append(O);},animate:true,cache:false,ajax:{cache:false},listSelector:false,maxWidth:450,classNames:{"ui-finder":"ui-widget ui-widget-header","ui-finder-wrapper":"ui-widget-content","ui-finder-header":undefined,"ui-finder-title":undefined,"ui-finder-list-item-active":"ui-state-default","ui-finder-list-item-activeNow":"ui-state-hover","ui-finder-list-item-file":"ui-icon-document","ui-finder-list-item-folder":"ui-icon-folder-collapsed","ui-finder-icon-folder-arrow":"ui-icon ui-icon-triangle-1-e"},toolbarActions:function(){return"";}};var N=A.Finders=A.Finders||{};var M=function(){return parseInt(new Date().valueOf(),10);};var K=A.scrollTo||false;if(typeof K=="function"){K=true;A.scrollTo.defaults.axis="xy";A.scrollTo.defaults.duration=900;}var B,C,D=(typeof H=="string")?H:null,G=(typeof H=="function")?H:null,J=arguments;if(typeof F=="string"){B=F;}else{if(typeof F=="object"){C=F;}}if(C){if(C.classNames){C.classNames=jQuery.extend(I.classNames,C.classNames);}C=jQuery.extend(I,C);}else{C=I;}function E(R,P){var O=this;this.cache={};this._queue=[];this.settings={};this.id=P;this.initial=A(R).clone(true);this.element=A(R);this.element.attr("data-finder-ts",this.id);for(var Q in C){O.settings[Q]=C[Q];}return this;}E.prototype.init=function(){var P=this,O=this.settings.toolbarActions.apply(this.element)||"",Q=this.settings.classNames,S=Q["ui-finder"]||"",R=Q["ui-finder-wrapper"]||"",T=Q["ui-finder-header"]||"",U=Q["ui-finder-title"]||"";this.element.wrap('<div class="ui-finder '+S+'"/>').wrap('<div class="ui-finder-wrapper '+R+'"/>').wrap('<div class="ui-finder-container"/>');this.wrapper=this.element.parents(".ui-finder-container");this.wrapper.parents(".ui-finder").prepend('<div class="ui-finder-header '+T+'">'+O+"</div>").prepend('<div class="ui-finder-title '+U+'">'+this.settings.title+"</div>");this.widget=this.wrapper.parents(".ui-finder");this._toolbar=A("div.ui-finder-header",this.widget);this._title=A("div.ui-finder-title",this.widget);this.wrapper.unbind("click.FinderSelect").bind("click.FinderSelect",function(X){var W=X.target,V=A(W);if(!V.closest("li.ui-finder-list-item").length&&!V.is("> li.ui-finder-list-item").length||V.parents(".ui-finder-column").length===0){return ;}P.queue(V);return Boolean(P.lastSelectCallbackReturned);});setTimeout(function(){P.settings.onInit.apply(P.element,[P]);P.settings.listItemBorderColour=A(".ui-widget-header").css("backgroundColor");P.selectItem("root");},0);return this;};E.prototype.title=function(O){this._title.html(O);return this;};E.prototype.toolbar=function(O){this._toolbar.html(O);return this;};E.prototype.queue=function(R,O,Q){var P=this,S=this.wrapper;this._queue.push([R,O,Q]);if(!P.isProcessing){P.preSelect();}return this;};E.prototype.preSelect=function(){var O=this,P=this._queue;if(P.length==0){return ;}O.select.apply(O,P[0]);return this;};E.prototype.select=function(e,b,U){var Y=this,S=this.wrapper,W=(typeof e=="string")?A('a[rel="'+e+'"]',S):A(e),O=W;if(typeof e.length!="number"){throw"jQuery Finder: Target must be either a URL or a jQuery/DOM element";return this;}if(!W[0]){throw"jQuery Finder: Target element does not exist";return this;}this.isProcessing=true;var T=W.closest("li.ui-finder-list-item"),g=A("> a:first",T),d=T.parents("div[data-finder-list-level]:first"),Z=d.attr("data-finder-list-level"),Q=(T.hasClass("ui-finder-file"))?"file":"folder",R=g.attr("rel"),V=A("div.ui-finder-column:visible",S),c=this.settings.classNames,f=c["ui-finder-list-item-active"]||"",P=c["ui-finder-list-item-activeNow"]||"";W=(W[0]!==T[0]&&W[0]!==g[0])?T:W;if(U=="select"){O=W=T;}A(".ui-finder-list-item.ui-finder-list-item-activeNow",S).removeClass("ui-finder-list-item-activeNow "+P);V.each(function(){var i=A(this),h=i.attr("data-finder-list-level");if(h>=Z){A(".ui-finder-list-item.ui-finder-list-item-active",i).removeClass("ui-finder-list-item-active "+f);}if(h>Z){i.remove();}});T.addClass("ui-finder-list-item-active "+f).addClass("ui-finder-list-item-activeNow "+P);if(K){setTimeout(function(){d.scrollTo(T);},0);}var a,X=[T,O,Y];if(Q=="file"){a=Y.settings.onItemSelect.apply(Y.element,X);}else{a=Y.settings.onFolderSelect.apply(Y.element,X);}this.lastSelectCallbackReturned=a;if(a!==false&&a!==true){T.addClass("ui-finder-loading");Y.selectItem(R,b,[W,T]);return this;}this.adjustWidth(true);this.finalise();return this;};E.prototype.selectItem=function(P,S,T){var X=this,Q=X.settings,U=(T)?T[0]:null,O=(T)?T[1]:null,W=(O)?O[0].className.match(/(file|folder)/)[0]:"folder",R=(P=="root")?(Q.url)?null:this.element:A("> ul, > ol, > div",O).eq(0).clone(),P=(P=="root"&&typeof Q.url==="string")?Q.url:P;var V=function(){var Z=Q.processData,Y=R;if(A.isFunction(Z)){R=Z(R);if(!R.length){R=Y;}}else{R=A(R);}X.cache[P]={url:P,data:R,response:Y,date:new Date().valueOf(),status:"success"};if(P==Q.url&&typeof Q.onRootInit==="function"){Q.onRootInit.apply(X.element,[R,X]);}if(W=="folder"){A("> ul, > ol",R).eq(0).find("> li").each(function(){var e=A(this),b,f;if(e.hasClass("ui-finder-folder")){b="folder";}else{if(e.hasClass("ui-finder-file")){b="file";}else{if(e.children("ul,ol").length){e.addClass("ui-finder-folder");b="folder";}else{e.addClass("ui-finder-file");b="file";}}}f=(b=="file")?Q.classNames["ui-finder-list-item-file"]:Q.classNames["ui-finder-list-item-folder"];e.addClass("ui-finder-list-item").css("borderColor",Q.listItemBorderColour).append('<span class="'+Q.classNames["ui-finder-icon-folder-arrow"]+'									ui-finder-icon ui-finder-icon-arrow"/>');var a=A("> a",this),d=a.attr("href")||"_blank"+new Date().valueOf(),c=a.attr("title")||"";if(a.attr("rel")==d.substring(1)||!d.length){return ;}a.attr("rel",d).attr("href",d).append('<span class="ui-icon '+f+" ui-finder-icon ui-finder-icon-"+b+'"/>');if(c.length==0){a.attr("title",d);}});}X.appendNewColumn(P,R,[U,O],W);};if(R&&R.length&&!S){V();}else{if(R&&R.length&&S&&P.match(/_blank\d+/)){V();}else{if(typeof this.cache[P]=="object"&&this.settings.cache&&!S){if(this.cache[P].status=="success"){R=this.cache[P].data;V();}}else{if(!P.match(/_blank\d+/)){A.ajax({url:P,cache:X.settings.ajax.cache,success:function(Y){R=Y;},error:function(Z,Y){R=Y;},complete:function(){V();}});}}}}return this;};E.prototype.appendNewColumn=function(Q,U,W,Y){var Z=this,X=(W)?W[0]:null,O=(W)?W[1]:null,V=(O)?O.parents("div[data-finder-list-level]:first"):null,P=Q.replace(/[\W\s]*/g,""),R=(function(){if(Q==Z.settings.url||Q=="root"){return 0;}return parseInt(V.attr("data-finder-list-level"),10)+1;})();var T=A('div[data-finder-list-id="'+P+'"]');if(T.length>0){T[0].parentNode.removeChild(T[0]);}T=A('<div class="ui-finder-column ui-widget-content ui-finder-new-col"/>').css("display","none").attr("data-finder-list-id",P).attr("data-finder-list-source",Q).attr("data-finder-list-level",R).css("z-index",0);Z.wrapper[0].appendChild(T[0]);T[0].appendChild(A(U)[0]);setTimeout(function(){Z.adjustWidth(false,T,Q);},0);if(X&&X[0]&&X.is("a")){var S=[O,T,Z];if(Y=="file"){Z.settings.onItemOpen.apply(Z.element,S);}else{Z.settings.onFolderOpen.apply(Z.element,S);}}return this;};E.prototype.adjustWidth=function(S,Y,Q){var e=this,P=this.wrapper;Y=Y||A("div[data-finder-list-id]:visible:last",P);var U=(!S)?P.children("div[data-finder-list-id]:not(.ui-finder-new-col):visible"):P.children("div[data-finder-list-id]:visible:not(:last)"),R=0;Y.removeClass("ui-finder-new-col");U.css("right","auto");U.each(function(){A(this).width("auto").width(A(this).outerWidth()+20);R+=A(this).width();});var a=10,X=(!Y.data("yscroll"))?a:0;var Z=Y.width(),c=(e.settings.maxWidth&&Z>e.settings.maxWidth)?e.settings.maxWidth:Z+X,W=R+c,T=P.width(),d=P.parent().width();Y.data("yscroll",true);if(W>d||W<T&&T>d&&W!=T){if(c==W||W<d){W="auto";}X=(W!="auto"&&W!=T)?a:"";P.width(W+X);}Y.css("left",R);Y.css("right",0);Y.css("z-index",2);Y.css({display:"block",visibility:"hidden"});if(Y&&K){this.wrapper.parent().scrollTo(Y);}if(!S&&this.settings.animate){var V=(!isNaN(this.settings.animate))?this.settings.animate:500;var b=Y.css("left").replace(/\D/g,""),O=P.width()-b;Y.css("overflow-y","hidden").css("right",O).css("visibility","visible").animate({right:0},{duration:V,complete:function(){Y.css("overflow-y","scroll");e.finalise(Y,Q);}});}else{Y.css("visibility","visible");e.finalise(Y,Q);}return this;};E.prototype.finalise=function(P,O){A("div.ui-finder-column .ui-finder-list-item.ui-finder-loading",this.wrapper).removeClass("ui-finder-loading");this.isProcessing=false;this._queue.shift();if(this._queue.length>0){this.preSelect();}if(O==this.settings.url&&typeof this.settings.onRootReady==="function"){this.settings.onRootReady.apply(this.element,[P,this]);}return this;};E.prototype.destroy=function(){this.wrapper.unbind("click.FinderSelect");this.element.parents(".ui-finder").replaceWith(this.initial);delete N[this.id];return this;};E.prototype.current=function(){var O=A(".ui-state-hover",this.wrapper).find("a:first");return(O.length>0)?O:null;};E.prototype.refresh=function(){var O=this.current();if(O){this.queue(O,true);}else{this.selectItem("root",true);}return this;};var L=N[A(this).eq(0).attr("data-finder-ts")];if(B=="current"&&L){return L.current();}else{if(B=="get"&&L){return L;}}return this.each(function(){var P=A(this).attr("data-finder-ts")||null,O=new Date().valueOf();if(P&&B){var R=N[P];if(B=="select"&&H){if(H.constructor==Array){H=H.reverse();for(var Q=H.length-1;Q>=0;Q--){R.queue(H[Q],false,B);}}else{R.queue(H,false,B);}}else{if(B=="title"){R.title(H);}else{if(B=="toolbar"){R.toolbar(H);}else{if(B=="destroy"){R.destroy();}else{if(B=="refresh"){R.refresh();}}}}}}else{if(!B){N[O]=new E(this,O).init();}else{if(!P&&B){throw"jQuery Finder: Element is not a finder";}}}});};})(jQuery);