").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
6 |
--------------------------------------------------------------------------------
/filemanager/static/filemanager/js/jquery/zclip/ZeroClipboard.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IMGIITRoorkee/django-filemanager/c161f303666e6042292c09d23d432315ba330287/filemanager/static/filemanager/js/jquery/zclip/ZeroClipboard.swf
--------------------------------------------------------------------------------
/filemanager/static/filemanager/js/jquery/zclip/jquery.zclip.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | * zClip :: jQuery ZeroClipboard v1.1.1
3 | * http://steamdev.com/zclip
4 | *
5 | * Copyright 2011, SteamDev
6 | * Released under the MIT license.
7 | * http://www.opensource.org/licenses/mit-license.php
8 | *
9 | * Date: Wed Jun 01, 2011
10 | */
11 |
12 | (function(a){a.fn.zclip=function(c){if(typeof c=="object"&&!c.length){var b=a.extend({path:"ZeroClipboard.swf",copy:null,beforeCopy:null,afterCopy:null,clickAfter:true,setHandCursor:true,setCSSEffects:true},c);return this.each(function(){var e=a(this);if(e.is(":visible")&&(typeof b.copy=="string"||a.isFunction(b.copy))){ZeroClipboard.setMoviePath(b.path);var d=new ZeroClipboard.Client();if(a.isFunction(b.copy)){e.bind("zClip_copy",b.copy)}if(a.isFunction(b.beforeCopy)){e.bind("zClip_beforeCopy",b.beforeCopy)}if(a.isFunction(b.afterCopy)){e.bind("zClip_afterCopy",b.afterCopy)}d.setHandCursor(b.setHandCursor);d.setCSSEffects(b.setCSSEffects);d.addEventListener("mouseOver",function(f){e.trigger("mouseenter")});d.addEventListener("mouseOut",function(f){e.trigger("mouseleave")});d.addEventListener("mouseDown",function(f){e.trigger("mousedown");if(!a.isFunction(b.copy)){d.setText(b.copy)}else{d.setText(e.triggerHandler("zClip_copy"))}if(a.isFunction(b.beforeCopy)){e.trigger("zClip_beforeCopy")}});d.addEventListener("complete",function(f,g){if(a.isFunction(b.afterCopy)){e.trigger("zClip_afterCopy")}else{if(g.length>500){g=g.substr(0,500)+"...\n\n("+(g.length-500)+" characters not shown)"}e.removeClass("hover");alert("Copied text to clipboard:\n\n "+g)}if(b.clickAfter){e.trigger("click")}});d.glue(e[0],e.parent()[0]);a(window).bind("load resize",function(){d.reposition()})}})}else{if(typeof c=="string"){return this.each(function(){var f=a(this);c=c.toLowerCase();var e=f.data("zclipId");var d=a("#"+e+".zclip");if(c=="remove"){d.remove();f.removeClass("active hover")}else{if(c=="hide"){d.hide();f.removeClass("active hover")}else{if(c=="show"){d.show()}}}})}}}})(jQuery);var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"ZeroClipboard.swf",nextId:1,$:function(a){if(typeof(a)=="string"){a=document.getElementById(a)}if(!a.addClass){a.hide=function(){this.style.display="none"};a.show=function(){this.style.display=""};a.addClass=function(b){this.removeClass(b);this.className+=" "+b};a.removeClass=function(d){var e=this.className.split(/\s+/);var b=-1;for(var c=0;c
-1){e.splice(b,1);this.className=e.join(" ")}return this};a.hasClass=function(b){return !!this.className.match(new RegExp("\\s*"+b+"\\s*"))}}return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(d,b,c){var a=this.clients[d];if(a){a.receiveEvent(b,c)}},register:function(b,a){this.clients[b]=a},getDOMObjectPosition:function(c,a){var b={left:0,top:0,width:c.width?c.width:c.offsetWidth,height:c.height?c.height:c.offsetHeight};if(c&&(c!=a)){b.left+=c.offsetLeft;b.top+=c.offsetTop}return b},Client:function(a){this.handlers={};this.id=ZeroClipboard.nextId++;this.movieId="ZeroClipboardMovie_"+this.id;ZeroClipboard.register(this.id,this);if(a){this.glue(a)}}};ZeroClipboard.Client.prototype={id:0,ready:false,movie:null,clipText:"",handCursorEnabled:true,cssEffects:true,handlers:null,glue:function(d,b,e){this.domElement=ZeroClipboard.$(d);var f=99;if(this.domElement.style.zIndex){f=parseInt(this.domElement.style.zIndex,10)+1}if(typeof(b)=="string"){b=ZeroClipboard.$(b)}else{if(typeof(b)=="undefined"){b=document.getElementsByTagName("body")[0]}}var c=ZeroClipboard.getDOMObjectPosition(this.domElement,b);this.div=document.createElement("div");this.div.className="zclip";this.div.id="zclip-"+this.movieId;$(this.domElement).data("zclipId","zclip-"+this.movieId);var a=this.div.style;a.position="absolute";a.left=""+c.left+"px";a.top=""+c.top+"px";a.width=""+c.width+"px";a.height=""+c.height+"px";a.zIndex=f;if(typeof(e)=="object"){for(addedStyle in e){a[addedStyle]=e[addedStyle]}}b.appendChild(this.div);this.div.innerHTML=this.getHTML(c.width,c.height)},getHTML:function(d,a){var c="";var b="id="+this.id+"&width="+d+"&height="+a;if(navigator.userAgent.match(/MSIE/)){var e=location.href.match(/^https/i)?"https://":"http://";c+=' '}else{c+=' '}return c},hide:function(){if(this.div){this.div.style.left="-2000px"}},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide();this.div.innerHTML="";var a=document.getElementsByTagName("body")[0];try{a.removeChild(this.div)}catch(b){}this.domElement=null;this.div=null}},reposition:function(c){if(c){this.domElement=ZeroClipboard.$(c);if(!this.domElement){this.hide()}}if(this.domElement&&this.div){var b=ZeroClipboard.getDOMObjectPosition(this.domElement);var a=this.div.style;a.left=""+b.left+"px";a.top=""+b.top+"px"}},setText:function(a){this.clipText=a;if(this.ready){this.movie.setText(a)}},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");if(!this.handlers[a]){this.handlers[a]=[]}this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;if(this.ready){this.movie.setHandCursor(a)}},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(d,f){d=d.toString().toLowerCase().replace(/^on/,"");switch(d){case"load":this.movie=document.getElementById(this.movieId);if(!this.movie){var c=this;setTimeout(function(){c.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){var c=this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=true;return}this.ready=true;try{this.movie.setText(this.clipText)}catch(h){}try{this.movie.setHandCursor(this.handCursorEnabled)}catch(h){}break;case"mouseover":if(this.domElement&&this.cssEffects){this.domElement.addClass("hover");if(this.recoverActive){this.domElement.addClass("active")}}break;case"mouseout":if(this.domElement&&this.cssEffects){this.recoverActive=false;if(this.domElement.hasClass("active")){this.domElement.removeClass("active");this.recoverActive=true}this.domElement.removeClass("hover")}break;case"mousedown":if(this.domElement&&this.cssEffects){this.domElement.addClass("active")}break;case"mouseup":if(this.domElement&&this.cssEffects){this.domElement.removeClass("active");this.recoverActive=false}break}if(this.handlers[d]){for(var b=0,a=this.handlers[d].length;b 1024)
10 | {
11 | ++i;
12 | val = val/1024;
13 | }
14 | val = val.toString();
15 | if(val.indexOf('.') != -1)
16 | val = val.substr(0,val.indexOf('.')+3);
17 | return val + denominations[i];
18 | }
19 |
20 | function size(){
21 | $('#main').height($(window).height()-47);
22 | $('#left').height($(window).height()-69);
23 | $('#right').height($(window).height()-49);
24 | $('#content').height($(window).height()-100);
25 | }
26 |
27 | function onload(){
28 | size();
29 | refresh_dirs();
30 | show_files(dir_id);
31 | $('body').bind('click',function(e){$('#dir-menu').hide();$('.unzip-menu').hide();$('#file-menu').hide();});
32 | if(messages.length>0){
33 | $('#message').html(messages[0]);
34 | setTimeout("$('#message').html('Hint : Use right click to add, rename or delete files and folders');",10000);
35 | }
36 | else
37 | $('#message').html('Hint : Use right click to add,rename or delete files and folders');
38 | $('#ufile').change(function(){form_submit('upload','file');});
39 | if($.browser.mozilla) {
40 | moz_major_ver = (+($.browser.version.split(".")[0]))
41 | if(moz_major_ver < 23){
42 | // https://bugzilla.mozilla.org/show_bug.cgi?id=701353 should be fixed in 23
43 | $('#upload-label').click(function(){
44 | $('#ufile').click();
45 | });
46 | }
47 | }
48 | $('#space_quota').width(((space_consumed*100)/max_space).toString()+'%');
49 | $('#space_quota_string').html(get_human_string(space_consumed) + ' of ' + get_human_string(max_space) + ' used');
50 | }
51 |
52 | $('body').ready(onload);
53 | $(window).resize(size);
54 |
55 | function refresh_dirs()
56 | {
57 | $('#left').html(show_directories(dir_structure));
58 | }
59 |
60 | function get_dir(id,ds)
61 | {if(!ds)ds=dir_structure;
62 | dir = null;
63 | for(d in ds)
64 | { if(ds[d]['id']==id)
65 | { dir = ds[d];
66 | break;
67 | }
68 | var dq = get_dir(id,ds[d]['dirs']);
69 | if(dq != null)
70 | { dir =dq;
71 | break;
72 | }
73 | }
74 | return dir;
75 | }
76 |
77 | function get_path(id,ds,basepath)
78 | {if(!ds)ds=dir_structure;
79 | if(!basepath)basepath='';
80 | path = null;
81 | for(d in ds)
82 | { if(ds[d]['id']==id)
83 | { path=d+'/';
84 | break
85 | }
86 | var pq = get_path(id,ds[d]['dirs'],d+'/');
87 | if(pq != null)
88 | { path=pq;
89 | break;
90 | }
91 | }
92 | if(path) return basepath+path;
93 | else return null;
94 | }
95 |
96 | function change_sign(id)
97 | {d = get_dir(id);
98 | if(d['open']=='yes')d['open']='no';
99 | else d['open']='yes';
100 | refresh_dirs();
101 | }
102 |
103 | function CKEditorRepy(filename)
104 | { var filepath = ckeditor_baseurl+get_path(dir_id)+filename;
105 | window.opener.CKEDITOR.tools.callFunction(CKEditorFuncNum,filepath);
106 | window.close();
107 | }
108 |
109 | function show_files(id)
110 | { dir_id = id;
111 | var dirs = [];
112 | var dir_list = get_dir(id)['dirs'];
113 | for(var a in dir_list)
114 | dirs.push({'name':a,'id':dir_list[a]['id']});
115 | dirs = dirs.sort(function(a,b){
116 | if(a['name'].toLowerCase() < b['name'].toLowerCase())return -1;
117 | if(a['name'].toLowerCase() > b['name'].toLowerCase())return 1;
118 | return 0;
119 | });
120 | files = get_dir(id)['files'].sort(
121 | function(a, b) {
122 | if (a.toLowerCase() < b.toLowerCase()) return -1;
123 | if (a.toLowerCase() > b.toLowerCase()) return 1;
124 | return 0;
125 | });
126 | $('#content').html('');
127 | for(d in dirs)
128 | {
129 | $('#content').append(""+
132 | "
"+dirs[d]['name']+"
\n");
133 | }
134 | for(f in files)
135 | { var ext = files[f].split('.')[(files[f].split('.').length-1)];
136 | $('#content').append("\n");
140 | }
141 | $('#status').html(get_path(id))
142 | $('.current_directory').removeClass('current_directory');
143 | $('#'+dir_id).addClass('current_directory');
144 | }
145 |
146 | function show_directories(ds)
147 | { var html = "";
148 | for(d in ds)
149 | { var image = (ds[d]['open']=='yes'?'opened_folder.png':'folder.png');
150 | if(d=='')image = 'home_folder.png';
151 | var id = ds[d]['id'];
152 | var sign;
153 | sign = (ds[d]['open']=='yes'?'[-]':'[+]');
154 | var empty = true;
155 | for(i in ds[d]['dirs']){empty=false;break;}
156 | if(empty)sign = '';
157 | html+=""+sign+"
"+
158 | "
"+
159 | "
"+
160 | "
"+(d==''?'root':d)+"
\n";
161 | if(ds[d]['open']=='yes')
162 | html+=""+show_directories(ds[d]['dirs'])+"
\n";
163 | }
164 | return html;
165 | }
166 |
167 | function getPosition(e) {
168 | e = e || window.event;
169 | var cursor = {x:0, y:0};
170 | if (e.pageX || e.pageY) {
171 | cursor.x = e.pageX;
172 | cursor.y = e.pageY;
173 | }
174 | else {
175 | var de = document.documentElement;
176 | var b = document.body;
177 | cursor.x = e.clientX +
178 | (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
179 | cursor.y = e.clientY +
180 | (de.scrollTop || b.scrollTop) - (de.clientTop || 0);
181 | }
182 | return cursor;
183 | }
184 |
185 | function rightclick_handle(e,id,type)
186 | { var c = getPosition(e);
187 | if(type == 'dom'){
188 | if(e.button==0){
189 | $('#dom-menu').hide();
190 | }
191 | if(e.button==2){
192 | selected_dir_id = id;
193 | $('#dom-menu').css('left',c.x+8);
194 | $('#dom-menu').css('top',c.y+2);
195 | if(clipboard['empty'])
196 | {
197 | $('#paste-dir').hide();
198 | $('#paste-dir').next().hide();
199 | }
200 | else
201 | {
202 | $('#paste-dir').show();
203 | $('#paste-dir').next().show();
204 | }
205 | $('#dom-menu').show();
206 | }
207 | }
208 | else if(type == 'dir'){
209 | if(e.button==2){
210 | selected_dir_id = id;
211 | $('#dir-menu').css('left',c.x+8);
212 | $('#dir-menu').css('top',c.y+2);
213 | if(clipboard['empty'])
214 | {
215 | $('#paste-dir').hide();
216 | $('#paste-dir').next().hide();
217 | }
218 | else
219 | {
220 | $('#paste-dir').show();
221 | $('#paste-dir').next().show();
222 | }
223 | $('#dir-menu').show();
224 | }
225 | }
226 | else if(type == 'file'){
227 | if(e.button==2){
228 | selected_file = id;
229 | $('.unzip-menu').hide();
230 | var ext = selected_file.substr(selected_file.lastIndexOf('.') + 1);
231 | if(ext=='zip'){
232 | $('.unzip-menu').show();
233 | }
234 | $('#file-menu').css('left',c.x+8);
235 | $('#file-menu').css('top',c.y+2);
236 | $('#file-menu').show();
237 | if(!zclip){
238 | zclip = true;
239 | $('#copy-public-link-file').zclip({
240 | path: static_url+'filemanager/js/jquery/zclip/ZeroClipboard.swf',
241 | copy: function(){
242 | var public_link = public_url_base+get_path(dir_id)+selected_file;
243 | return public_link;
244 | },
245 | clickAfter: false,
246 | beforeCopy: function(){},
247 | afterCopy: function(){
248 | $('.unzip-menu').hide();
249 | $('#file-menu').hide();
250 | }
251 | });
252 | }
253 | }
254 | if(e.button==0 && e.detail>=2 && CKEditorFuncNum){
255 | CKEditorRepy(id);
256 | }
257 | }
258 | }
259 |
260 | function do_action(act,t)
261 | {var heading;
262 | if(t == 'dom')
263 | {if(act == 'add')heading = "Enter name of the new folder";
264 | if(act == 'paste')
265 | {
266 | if(clipboard['empty'])
267 | {
268 | alert('Clipboard is empty. Please cut/copy the required file.');
269 | return;
270 | }
271 | if(get_path(dir_id).indexOf(clipboard['path']) == 0)
272 | {
273 | alert('Cannot move/copy to the folder');
274 | return;
275 | }
276 | if(window.confirm(clipboard['mode']+' '+clipboard['path'] + ' to '+get_path(dir_id)))
277 | {
278 | form_submit(clipboard['mode'],'', '');
279 | }
280 | return;
281 | }
282 | if(act == 'download'){window.open('.'+get_path(selected_dir_id)+'?download=dir');return;}
283 | }
284 | if(t == 'dir')
285 | {if(act == 'add')heading = "Enter name of sub-folder";
286 | if(act == 'rename')heading = "Enter new name of folder";
287 | if(act == 'delete'){form_submit(act,t);return;}
288 | if(act == 'download'){window.open('.'+get_path(selected_dir_id)+'?download=dir');return;}
289 | if(act == 'cut'){ if(selected_dir_id == 1){alert('You cannot cut root directory');return;}clipboard['empty']=false;clipboard['type']='dir';clipboard['path']=get_path(selected_dir_id);clipboard['mode']='cut';return;}
290 | if(act == 'copy'){ clipboard['empty']=false;clipboard['type']='dir';clipboard['path']=get_path(selected_dir_id);clipboard['mode']='copy';return;}
291 | if(act == 'paste')
292 | {
293 | if(clipboard['empty'])
294 | {
295 | alert('Clipboard is empty. Please cut/copy the required file.');
296 | return;
297 | }
298 | if(get_path(selected_dir_id).indexOf(clipboard['path']) == 0)
299 | {
300 | alert('Cannot move/copy to a child folder');
301 | return;
302 | }
303 | if(window.confirm(clipboard['mode']+' '+clipboard['path'] + ' to '+get_path(selected_dir_id)))
304 | {
305 | form_submit(clipboard['mode'],'', '');
306 | }
307 | return;
308 | }
309 | }
310 | if(t == 'file')
311 | {if(act == 'rename')heading = "Enter new name of file";
312 | if(act == 'delete'){form_submit(act,t);return;}
313 | if(act == 'download'){window.open('.'+get_path(dir_id)+selected_file+'?download=file');return;}
314 | if(act == 'copy-public-link'){window.prompt("Public URL(Ctrl+C to copy to clipboard):",public_url_base+get_path(dir_id)+selected_file);return;}
315 | if(act == 'cut'){ clipboard['empty']=false;clipboard['type']='file';clipboard['path']=get_path(dir_id)+selected_file;clipboard['mode']='cut';return;}
316 | if(act == 'copy'){ clipboard['empty']=false;clipboard['type']='file';clipboard['path']=get_path(dir_id)+selected_file;clipboard['mode']='copy';return;}
317 | if(act == 'unzip'){clipboard['empty']=false;clipboard['type']='file';clipboard['path']=get_path(dir_id)+selected_file;clipboard['mode']='unzip';form_submit(clipboard['mode'],clipboard['type'],'');return;}
318 | }
319 | action = act;
320 | type = t;
321 | var w = $(window);
322 | $('#popup').css('left',w.width()/2-100);
323 | $('#popup').css('top',w.height()/2-100);
324 | $('#heading').html(heading);
325 | $('#popup').show();
326 | $('#input').focus();
327 | $('#input').keypress(
328 | function(e){
329 | code= (e.keyCode ? e.keyCode : e.which);
330 | if(code == 13){
331 | var value=$('#input').val();
332 | $('#input').val('');
333 | $('#popup').hide();
334 | form_submit(action,type,value);
335 | }
336 | });
337 | }
338 |
339 | function form_submit(action,type,value){
340 | $('#path').val(get_path(dir_id));
341 | $('#current_path').val(get_path(dir_id));
342 | $('#file_or_dir').val(type);
343 | if(action == 'cut')
344 | {
345 | $('#action').val('move');
346 | $('#file_or_dir').val(clipboard['type']);
347 | $('#path').val(clipboard['path']);
348 | $('#current_path').val(get_path(selected_dir_id));
349 | $('#submit').trigger('click');
350 | }
351 | if(action == 'copy')
352 | {
353 | $('#action').val('copy');
354 | $('#file_or_dir').val(clipboard['type']);
355 | $('#path').val(clipboard['path']);
356 | if(type == 'dom')$('#current_path').val(get_path(dir_id));
357 | if(type == 'dir')$('#current_path').val(get_path(selected_dir_id));
358 | $('#submit').trigger('click');
359 | }
360 | if(action == 'upload')
361 | { $('#action').val('upload');
362 | $('#submit').trigger('click');
363 | }
364 | else if(action == 'add')
365 | { if(type == 'dom')$('#path').val(get_path(dir_id));
366 | if(type == 'dir')$('#path').val(get_path(selected_dir_id));
367 | $('#action').val('add');
368 | $('#name').val(value);
369 | $('#submit').trigger('click');
370 | }
371 | else if(action == 'rename')
372 | { if(type == 'dir')$('#path').val(get_path(selected_dir_id));
373 | if(type == 'file')$('#path').val(get_path(dir_id)+selected_file);
374 | $('#action').val('rename');
375 | $('#name').val(value);
376 | $('#submit').trigger('click');
377 | }
378 | else if(action == 'delete')
379 | { if(type == 'dir')$('#path').val(get_path(selected_dir_id));
380 | if(type == 'file')$('#path').val(get_path(dir_id)+selected_file);
381 | $('#action').val('delete');
382 | $('#submit').trigger('click');
383 | }
384 | else if(action == 'unzip')
385 | { // if(type == 'dir')$('#path').val(get_path(selected_dir_id));
386 | if(type == 'file')$('#path').val(get_path(dir_id)+selected_file);
387 | $('#action').val('unzip');
388 | $('#submit').trigger('click');
389 | }
390 | }
391 |
--------------------------------------------------------------------------------
/filemanager/templates/filemanager/index.html:
--------------------------------------------------------------------------------
1 | {% load static %}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
12 |
27 |
28 |
29 |
30 |
31 |
56 |
67 |
90 |
120 |
121 | {% if show_space %}
122 |
126 |
127 |
128 | {% endif %}
129 |
130 |
131 |
132 |
133 |
134 |
--------------------------------------------------------------------------------
/filemanager/widgets.py:
--------------------------------------------------------------------------------
1 | from django import forms
2 | from django.utils.safestring import mark_safe
3 |
4 | from .settings import FILEMANAGER_CKEDITOR_JS
5 |
6 |
7 | def filemanager_config(url):
8 | d = {}
9 | d['filebrowserBrowseUrl'] = url
10 | d['filebrowserImageBrowseUrl'] = url
11 | d['filebrowserWidth'] = 800
12 | d['filebrowserHeight'] = 500
13 | return d
14 |
15 |
16 | class CKEditorWidget(forms.Textarea):
17 | def __init__(self, attrs={}, config={}, filemanager_url=''):
18 | """ config : CKEditor config
19 | filemanager_url : for user to 'browse server'
20 | In config : toolbar = 'Basic'/'Standard'/'Full'
21 | """
22 | default = {
23 | 'toolbar': 'Standard',
24 | 'height': 250,
25 | 'width': 900
26 | }
27 | default.update(config)
28 | if filemanager_url:
29 | default.update(filemanager_config(filemanager_url))
30 | self.config = default
31 | return super(CKEditorWidget, self).__init__(attrs)
32 |
33 | class Media:
34 | js = (
35 | FILEMANAGER_CKEDITOR_JS,
36 | )
37 |
38 | def render(self, name, value, attrs=None):
39 | rendered = super(CKEditorWidget, self).render(name, value, attrs)
40 | div = "
"
41 | return rendered + mark_safe(
42 | div
43 | + u"""""" % (attrs['id'], self.config)
48 | )
49 |
--------------------------------------------------------------------------------
/requirements-test.txt:
--------------------------------------------------------------------------------
1 | coverage
2 | coveralls
3 | responses
4 | isort
5 | flake8
6 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | django>=1.7,<1.11.99
2 | Pillow
3 | python-magic # python-magic-bin==0.4.14 for MAC users
4 |
--------------------------------------------------------------------------------
/runflake8:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 |
4 | flake8 --max-line-length=110 \
5 | --exclude=./docs/,./build/,./setup.py,./filemanager/migrations/ || exit 1
6 |
--------------------------------------------------------------------------------
/runisort:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | isort --check-only --skip setup.py --recursive .
3 |
--------------------------------------------------------------------------------
/runtests.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 |
4 | import os
5 | import sys
6 |
7 | sys.path.insert(0, "tests")
8 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
9 |
10 | if __name__ == "__main__":
11 | from django.core.management import execute_from_command_line
12 | args = sys.argv
13 | args.insert(1, "test")
14 | args.insert(2, "filemanager")
15 | execute_from_command_line(args)
16 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | from setuptools import find_packages, setup
3 |
4 |
5 | def get_install_requires():
6 | """
7 | parse requirements.txt, ignore links, exclude comments
8 | """
9 | requirements = []
10 | for line in open('requirements.txt').readlines():
11 | # skip to next iteration if comment or empty line
12 | skip = (
13 | line.startswith('#')
14 | or line == ''
15 | or line.startswith('http')
16 | or line.startswith('git')
17 | )
18 | if skip:
19 | continue
20 | # add line to requirements
21 | requirements.append(line)
22 | return requirements
23 |
24 |
25 | setup(
26 | name="django-filemanager",
27 | version="0.0.1",
28 | author="Information Management Group",
29 | author_email="img.iitr.img@gmail.com",
30 | description="A file manager for Django",
31 | license="MIT",
32 | packages=find_packages(exclude=["tests", ]),
33 | install_requires=get_install_requires(),
34 | zip_safe=False,
35 | include_package_data=True,
36 | test_suite='tests.main',
37 | )
38 |
--------------------------------------------------------------------------------
/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IMGIITRoorkee/django-filemanager/c161f303666e6042292c09d23d432315ba330287/tests/__init__.py
--------------------------------------------------------------------------------
/tests/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import os
3 | import sys
4 |
5 | if __name__ == "__main__":
6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
7 |
8 | from django.core.management import execute_from_command_line
9 |
10 | execute_from_command_line(sys.argv)
11 |
--------------------------------------------------------------------------------
/tests/settings.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | BASE_DIR = os.path.dirname(os.path.dirname(__file__))
4 |
5 | SECRET_KEY = '(87tn_@g0nktauqp^@y(m$3=tv_l9-3xi19dwb9k_9v-^jq$yi'
6 |
7 | DEBUG = True
8 |
9 | ALLOWED_HOSTS = []
10 |
11 | MEDIA_ROOT = BASE_DIR
12 |
13 | INSTALLED_APPS = (
14 | 'django.contrib.admin',
15 | 'django.contrib.auth',
16 | 'django.contrib.contenttypes',
17 | 'django.contrib.sessions',
18 | 'django.contrib.messages',
19 | 'django.contrib.staticfiles',
20 | 'filemanager'
21 | )
22 |
23 | MIDDLEWARE_CLASSES = (
24 | 'django.contrib.sessions.middleware.SessionMiddleware',
25 | 'django.middleware.common.CommonMiddleware',
26 | 'django.middleware.csrf.CsrfViewMiddleware',
27 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
28 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
29 | 'django.contrib.messages.middleware.MessageMiddleware',
30 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
31 | )
32 |
33 | ROOT_URLCONF = 'urls'
34 |
35 | DATABASES = {
36 | 'default': {
37 | 'ENGINE': 'django.db.backends.sqlite3',
38 | 'NAME': os.path.join(BASE_DIR, 'filemanager.db'),
39 | }
40 | }
41 |
42 | TEMPLATES = [
43 | {
44 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
45 | 'APP_DIRS': True,
46 | 'OPTIONS': {
47 | 'context_processors': [
48 | 'django.template.context_processors.debug',
49 | 'django.template.context_processors.request',
50 | 'django.contrib.auth.context_processors.auth',
51 | 'django.contrib.messages.context_processors.messages',
52 | ],
53 | },
54 | }
55 | ]
56 |
57 |
58 | LANGUAGE_CODE = 'en-us'
59 |
60 | TIME_ZONE = 'UTC'
61 |
62 | USE_I18N = True
63 |
64 | USE_L10N = True
65 |
66 | USE_TZ = True
67 |
68 | STATIC_URL = '/static/'
69 |
--------------------------------------------------------------------------------
/tests/tests.py:
--------------------------------------------------------------------------------
1 | from django.core.urlresolvers import reverse
2 | from django.test import Client, TestCase
3 |
4 |
5 | class FilemanagerTest(TestCase):
6 | def setUp(self):
7 | self.client = Client()
8 |
9 | def test_view_returns_200(self):
10 | url = reverse('view', kwargs={'path': ''})
11 | response = self.client.get(url)
12 |
13 | self.assertEqual(response.status_code, 200)
14 |
--------------------------------------------------------------------------------
/tests/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import include, url
2 | from django.contrib import admin
3 |
4 | from filemanager import path_end
5 | from views import view
6 |
7 | urlpatterns = (
8 | url(r'^admin/', include(admin.site.urls)),
9 | url(r'^abc/' + path_end, view, name='view'),
10 | )
11 |
--------------------------------------------------------------------------------
/tests/views.py:
--------------------------------------------------------------------------------
1 | from django.conf import settings
2 |
3 | from filemanager import FileManager
4 |
5 |
6 | def view(request, path):
7 | extensions = ['html', 'htm', 'zip', 'py', 'css', 'js', 'jpeg', 'jpg', 'png']
8 | fm = FileManager(settings.MEDIA_ROOT, extensions=extensions)
9 | return fm.render(request, path)
10 |
--------------------------------------------------------------------------------