diff --git a/.gitignore b/.gitignore
index 4db26c73..40bcedd9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@
# Build folders to ignore
bin
build
-#target
+target
build.local.*
diff --git a/README.md b/README.md
index 085c944f..a487f40b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# h5ai v0.11 · a beautified Apache index
+# h5ai v0.12 · a beautified Apache index
h5ai tries to make browsing files on a Apache HTTP server more comfortable. It makes use of the
built-in autoindex module of Apache and adds styles and functionality to the page generated by
@@ -17,6 +17,12 @@ please respect their rights.
## Changelog
+### v0.12
+*2011-07-28*
+
+* improved performance
+
+
### v0.11
*2011-07-27*
diff --git a/build.properties b/build.properties
index a7882a12..56369e69 100644
--- a/build.properties
+++ b/build.properties
@@ -3,7 +3,7 @@ custom = true
# project
project.name = h5ai
-project.version = 0.11
+project.version = 0.12
# src
@@ -11,7 +11,8 @@ src.dir = src
# build
-build.dir = target
+build.dir = build
+release.dir = release
# libs
diff --git a/build.xml b/build.xml
index 147dc69e..4fbf91d3 100644
--- a/build.xml
+++ b/build.xml
@@ -22,6 +22,7 @@
+
@@ -30,6 +31,7 @@
+
@@ -39,6 +41,13 @@
+
+
+
+
+
+
+
diff --git a/release/h5ai-0.12.tar.gz b/release/h5ai-0.12.tar.gz
new file mode 100644
index 00000000..dfe7b2be
Binary files /dev/null and b/release/h5ai-0.12.tar.gz differ
diff --git a/release/h5ai-0.12.zip b/release/h5ai-0.12.zip
new file mode 100644
index 00000000..79d738ed
Binary files /dev/null and b/release/h5ai-0.12.zip differ
diff --git a/src/h5ai/js/inc/h5ai.js b/src/h5ai/js/inc/h5ai.js
index b9096fa2..f3bee6c8 100644
--- a/src/h5ai/js/inc/h5ai.js
+++ b/src/h5ai/js/inc/h5ai.js
@@ -28,8 +28,7 @@ var H5ai = function ( options, langs, pathCache ) {
};
this.config = $.extend( {}, defaults, options );
-
-
+
/*******************************
* public api
*******************************/
@@ -93,7 +92,7 @@ var H5ai = function ( options, langs, pathCache ) {
};
viewmode = this.getViewmode();
- $( "body > nav li.view" ).hide().removeClass( "current" );
+ $( "#viewdetails,#viewicons" ).hide().removeClass( "current" );
if ( this.config.viewmodes.length > 1 ) {
if ( $.inArray( "details", this.config.viewmodes ) >= 0 ) {
@@ -106,14 +105,11 @@ var H5ai = function ( options, langs, pathCache ) {
if ( viewmode === "details" ) {
$( "#viewdetails" ).closest( "li" ).addClass( "current" );
- $( "#table" ).hide();
$( "#extended" ).addClass( "details-view" ).removeClass( "icons-view" ).show();
} else if ( viewmode === "icons" ) {
$( "#viewicons" ).closest( "li" ).addClass( "current" );
- $( "#table" ).hide();
$( "#extended" ).removeClass( "details-view" ).addClass( "icons-view" ).show();
} else {
- $( "#table" ).show();
$( "#extended" ).hide();
};
};
@@ -179,17 +175,6 @@ var H5ai = function ( options, langs, pathCache ) {
- /*******************************
- * table view
- *******************************/
-
- this.initTableView = function () {
-
- $( "#table td" ).removeAttr( "align" ).removeAttr( "valign" );
- };
-
-
-
/*******************************
* extended view
*******************************/
@@ -228,14 +213,17 @@ var H5ai = function ( options, langs, pathCache ) {
$li.find( "a.size" ).prepend( $icon );
};
+ $.timer.log( "start entries" );
// entries
$( "#table td" ).closest( "tr" ).each( function () {
var path = pathCache.getPathForTableRow( document.location.pathname, this );
$ul.append( path.updateExtendedHtml() );
} );
+ $.timer.log( "end entries" );
$( "#table" ).remove();
$( "#extended" ).append( $ul );
+ console.log( "folders", $( "#extended .folder" ).size() , "files", $( "#extended .file" ).size() );
// empty
if ( $ul.children( ".entry:not(.parentfolder)" ).size() === 0 ) {
@@ -254,7 +242,6 @@ var H5ai = function ( options, langs, pathCache ) {
this.initViews = function () {
- this.initTableView();
this.initExtendedView();
$( "#viewdetails" ).closest( "li" )
diff --git a/src/h5ai/js/inc/path.js b/src/h5ai/js/inc/path.js
index 956bd463..4c1c0483 100644
--- a/src/h5ai/js/inc/path.js
+++ b/src/h5ai/js/inc/path.js
@@ -1,45 +1,42 @@
+var pathnameSplitRegEx = /^(\/(.*\/)*)([^\/]+\/?)$/;
+var pathEndsWithSlashRegEx = /\/$/;
var PathCache = function () {
-
- var pathnameRegEx = /^(\/(.*\/)*)([^\/]+\/?)$/;
+
+ this.cache = {};
+ this.objectCache = {};
+
this.splitPathname = function ( pathname ) {
if ( pathname === "/" ) {
return [ "", "/" ];
};
- var match = pathnameRegEx.exec( pathname );
+ var match = pathnameSplitRegEx.exec( pathname );
return [ match[1], match[3] ];
};
-
-
- this.cache = {};
-
-
+
+
this.loadCache = function () {
var json = localStorage.getItem( "h5ai.cache" );
var objs = $.evalJSON( json );
- var cache = {};
+ var objectCache = {};
for ( idx in objs ) {
var obj = objs[idx];
- var path = this.objectToPath( obj );
- cache[path.absHref] = path;
+ objectCache[obj.r] = obj;
};
- return cache;
+ return objectCache;
};
this.storeCache = function () {
var objs = [];
- for ( ref in this.cache ) {
- var path = this.cache[ref];
- if ( path.isFolder ) {
- objs.push( this.pathToObject( path ) );
- };
+ for ( ref in this.objectCache ) {
+ objs.push( this.objectCache[ref] );
};
var json = $.toJSON( objs );
localStorage.setItem( "h5ai.cache", json );
@@ -77,45 +74,103 @@ var PathCache = function () {
};
return path;
};
-
+
+
+ this.getAbsHref = function ( folder, tableRow ) {
+
+ if ( ! pathEndsWithSlashRegEx.test( folder ) ) {
+ folder += "/";
+ };
+
+ if ( tableRow === undefined ) {
+ return folder;
+ };
+
+ var $a = $( tableRow ).find( "td" ).eq( 1 ).find( "a" );
+ var isParentFolder = ( $a.text() === "Parent Directory" );
+ var href = $a.attr( "href" );
+ return isParentFolder ? undefined : folder + href;
+ };
+
this.getPathForFolder = function ( folder ) {
- return this.getCachedPath( new Path( this, folder ) );
+ var absHref = this.getAbsHref( folder );
+
+ var cachedPath = this.cache[absHref];
+ if ( cachedPath !== undefined ) {
+ return cachedPath;
+ };
+
+ var path = new Path( this, folder );
+ this.cache[path.absHref] = path;
+
+ var obj = this.objectCache[absHref];
+ if ( obj !== undefined ) {
+ path.status = obj.s;
+ path.content = {};
+ path.treeOpen = obj.o;
+ for ( idx in obj.c ) {
+ var href = obj.c[idx];
+ path.content[href] = this.getPathForFolder( href );
+ };
+ } else {
+ var obj = this.pathToObject( path );
+ this.objectCache[obj.r] = obj;
+ this.storeCache();
+ };
+
+ return path;
};
this.getPathForTableRow = function ( parentFolder, tableRow ) {
- return this.getCachedPath( new Path( this, parentFolder, tableRow ) );
- };
-
-
- this.getCachedPath = function ( path ) {
-
- if ( path.isParentFolder ) {
- return path;
- };
-
- var cachedPath = this.cache[path.absHref];
+ var absHref = this.getAbsHref( parentFolder, tableRow );
+
+ var cachedPath = this.cache[absHref];
if ( cachedPath !== undefined ) {
return cachedPath;
};
+
+ var path = new Path( this, parentFolder, tableRow );
+ if ( ! path.isParentFolder ) {
+ this.cache[path.absHref] = path;
+
+ var obj = this.objectCache[absHref];
+ if ( obj !== undefined ) {
+ path.status = obj.s;
+ path.content = {};
+ path.treeOpen = obj.o;
+ for ( idx in obj.c ) {
+ var href = obj.c[idx];
+ path.content[href] = this.getPathForFolder( href );
+ };
+ } else {
+ if ( path.isFolder && path.status !== undefined ) {
+ var obj = this.pathToObject( path );
+ this.objectCache[obj.r] = obj;
+ this.storeCache();
+ };
+ };
+ };
- this.cache[path.absHref] = path;
- this.storeCache();
return path;
};
- this.cache = this.loadCache();
+
+ this.objectCache = this.loadCache();
};
+
+
+
var Path = function ( pathCache, folder, tableRow ) {
- if ( ! /\/$/.test( folder ) ) {
+ if ( ! pathEndsWithSlashRegEx.test( folder ) ) {
folder += "/";
};
@@ -128,7 +183,7 @@ var Path = function ( pathCache, folder, tableRow ) {
this.icon16 = $img.attr( "src" );
this.alt = $img.attr( "alt" );
this.label = $a.text();
- this.href = $a.attr("href"); //decodeURI( $a.attr("href") );
+ this.href = $a.attr("href");
this.date = $tds.eq( 2 ).text();
this.size = $tds.eq( 3 ).text();
} else {
@@ -146,7 +201,7 @@ var Path = function ( pathCache, folder, tableRow ) {
};
};
- if ( /\/$/.test( this.label ) ) {
+ if ( pathEndsWithSlashRegEx.test( this.label ) ) {
this.label = this.label.slice( 0, -1 );
};
@@ -223,7 +278,14 @@ var Path = function ( pathCache, folder, tableRow ) {
this.updateCrumbHtml = function () {
+ if ( this.html.$crumb !== undefined && this.html.$crumb.data( "status" ) === this.status ) {
+ return this.html.$crumb;
+ };
+
var $html = $( "" ).data( "path", this );
+ if ( this.status !== undefined ) {
+ $html.data( "status", this.status );
+ };
try {
$html.addClass( this.isFolder ? "folder" : "file" );
@@ -264,7 +326,14 @@ var Path = function ( pathCache, folder, tableRow ) {
this.updateExtendedHtml = function () {
+ if ( this.html.$extended !== undefined && this.html.$extended.data( "status" ) === this.status ) {
+ return this.html.$extended;
+ };
+
var $html = $( "" ).data( "path", this );
+ if ( this.status !== undefined ) {
+ $html.data( "status", this.status );
+ };
try {
$html.addClass( this.isFolder ? "folder" : "file" );
@@ -339,6 +408,7 @@ var Path = function ( pathCache, folder, tableRow ) {
this.status = status;
this.content = content;
this.treeOpen = true;
+ pathCache.objectCache[this.absHref] = pathCache.pathToObject( this );
$( "#tree" ).get( 0 ).updateScrollbar( true );
this.updateTreeHtml( function() {
$( "#tree" ).get( 0 ).updateScrollbar();
@@ -346,6 +416,7 @@ var Path = function ( pathCache, folder, tableRow ) {
}, this ) );
} else if ( $indicator.hasClass( "open" ) ) {
this.treeOpen = false;
+ pathCache.objectCache[this.absHref] = pathCache.pathToObject( this );
$indicator.removeClass( "open" );
$( "#tree" ).get( 0 ).updateScrollbar( true );
$html.find( "> ul.content" ).slideUp( function() {
@@ -353,6 +424,7 @@ var Path = function ( pathCache, folder, tableRow ) {
} );
} else {
this.treeOpen = true;
+ pathCache.objectCache[this.absHref] = pathCache.pathToObject( this );
$indicator.addClass( "open" );
$( "#tree" ).get( 0 ).updateScrollbar( true );
$html.find( "> ul.content" ).slideDown( function() {
diff --git a/src/h5ai/js/main.js b/src/h5ai/js/main.js
index 114bba8f..bd84841b 100644
--- a/src/h5ai/js/main.js
+++ b/src/h5ai/js/main.js
@@ -6,12 +6,27 @@
// @include "inc/h5ai.js"
// @include "inc/tree.js"
+
+ var Timer = function () {
+
+ this.start = new Date().getTime();;
+ this.last = this.start;
+ this.log = function ( label ) {
+ var now = new Date().getTime();
+ console.log( "timer", label, "+" + (now - this.last), "=" + (now - this.start) );
+ this.last = now;
+ };
+ };
+ $.timer = new Timer();
+
/*******************************
* create
*******************************/
+ $.timer.log( "start pathcache" );
var pathCache = new PathCache();
+ $.timer.log( "end pathcache" );
var h5ai = new H5ai( h5aiOptions, h5aiLangs, pathCache );
var tree = new Tree( pathCache, h5ai );
@@ -30,11 +45,12 @@
$( function() {
h5ai.init();
- tree.init();
+ tree.init();
// just for testing, resets the local cache /////////
$( ".l10n-footerUsing" ).click( function () {
pathCache.cache = {};
+ pathCache.objectCache = {};
pathCache.storeCache();
} );
/////////////////////////////////////////////////////
diff --git a/target/dot.htaccess b/target/dot.htaccess
deleted file mode 100644
index b0a9fe5b..00000000
--- a/target/dot.htaccess
+++ /dev/null
@@ -1,146 +0,0 @@
-################################
-# h5ai 0.11
-# customized .htaccess
-################################
-
-
-# Options +Indexes
-# Options +FollowSymLinks
-
-
-
-
- ################################
- # cache images for 52 weeks
- ################################
-
-
- Header set Cache-Control "max-age=31449600, public"
-
-
-
-
-
-################################
-# style auto index
-################################
-
-################################
-# IMPORTANT FOR XAMPP
-# if you're running XAMPP you might need to replace the
-# following line with
-#
-################################
-
-
- ################################
- # uncomment the following line to force directory listing
- # even for directories with valid index files
- ################################
-
- # DirectoryIndex IGNORE-DEFAULT-INDEX-FILES
-
-
- ################################
- # h5ai header and footer
- ################################
-
- HeaderName /h5ai/header.html
- ReadmeName /h5ai/footer.html
-
-
- ################################
- # hide h5ai folder and config files from index
- ################################
-
- IndexIgnore h5ai h5ai.header.html h5ai.footer.html
-
-
- ################################
- # table options
- ################################
-
- IndexOrderDefault Ascending Name
-
- IndexOptions Type=text/html;h5ai=0.11
- IndexOptions Charset=UTF-8
- IndexOptions FancyIndexing
- IndexOptions HTMLTable
- IndexOptions XHTML
- IndexOptions SuppressHTMLPreamble
- IndexOptions SuppressRules
- IndexOptions SuppressDescription
- IndexOptions FoldersFirst
- IndexOptions IgnoreCase
- IndexOptions IconsAreLinks
- IndexOptions VersionSort
- IndexOptions NameWidth=*
-
-
- ################################
- # icon mapping
- ################################
-
- AddIcon /h5ai/icons/16x16/parent.png ..
- AddIcon /h5ai/icons/16x16/folder.png ^^DIRECTORY^^
- AddIcon /h5ai/icons/16x16/blank.png ^^BLANKICON^^
-
- AddIcon /h5ai/icons/16x16/readme.png README
- AddIcon /h5ai/icons/16x16/copying.png COPYING LICENSE
- AddIcon /h5ai/icons/16x16/install.png INSTALL
- AddIcon /h5ai/icons/16x16/authors.png AUTHORS
- AddIcon /h5ai/icons/16x16/log.png LOG Log log
-
- AddIcon /h5ai/icons/16x16/css.png .less
- AddIcon /h5ai/icons/16x16/script.png .conf .ini .sh .shar .csh .ksh .tcl
- AddIcon /h5ai/icons/16x16/makefile.png .pom pom.xml build.xml
- AddIcon /h5ai/icons/16x16/bin.png .so .o
-
- AddIcon /h5ai/icons/16x16/archive.png .tar.gz .tgz .tar.bz2
- AddIcon /h5ai/icons/16x16/zip.png .zip .Z .z .jar .war .gz .bz2
- AddIcon /h5ai/icons/16x16/tar.png .tar
- AddIcon /h5ai/icons/16x16/pdf.png .pdf
- AddIcon /h5ai/icons/16x16/deb.png .deb
- AddIcon /h5ai/icons/16x16/rpm.png .rpm
- AddIcon /h5ai/icons/16x16/cd.png .iso .cue
-
- AddIconByType /h5ai/icons/16x16/png.png image/png
- AddIconByType /h5ai/icons/16x16/jpg.png image/jpeg
- AddIconByType /h5ai/icons/16x16/gif.png image/gif
- AddIconByType /h5ai/icons/16x16/ico.png image/x-icon
- AddIconByType /h5ai/icons/16x16/bmp.png image/x-ms-bmp
-
- AddIconByType /h5ai/icons/16x16/html.png text/html
- AddIconByType /h5ai/icons/16x16/css.png text/css
- AddIconByType /h5ai/icons/16x16/xml.png application/xml
- AddIconByType /h5ai/icons/16x16/js.png application/javascript application/json
- AddIconByType /h5ai/icons/16x16/php.png application/x-httpd-php
-
- AddIconByType /h5ai/icons/16x16/py.png text/x-python
- AddIconByType /h5ai/icons/16x16/rb.png application/x-ruby
- AddIconByType /h5ai/icons/16x16/java.png text/x-java
- AddIconByType /h5ai/icons/16x16/cpp.png text/x-c++src
- AddIconByType /h5ai/icons/16x16/hpp.png text/x-c++hdr
- AddIconByType /h5ai/icons/16x16/c.png text/x-csrc
- AddIconByType /h5ai/icons/16x16/h.png text/x-chdr
-
- AddIconByType /h5ai/icons/16x16/pdf.png application/pdf
-
- AddIconByType /h5ai/icons/16x16/rtf.png text/rtf application/rtf
- AddIconByType /h5ai/icons/16x16/tex.png text/x-tex
- AddIconByType /h5ai/icons/16x16/makefile.png text/x-makefile
-
- AddIconByType /h5ai/icons/16x16/bin.png application/java-vm
- AddIconByType /h5ai/icons/16x16/exe.png application/x-executable application/x-msdos-program
-
- AddIconByType /h5ai/icons/16x16/text.png text/*
- AddIconByType /h5ai/icons/16x16/image.png image/*
- AddIconByType /h5ai/icons/16x16/audio.png audio/*
- AddIconByType /h5ai/icons/16x16/video.png video/*
-
- AddIconByEncoding /h5ai/icons/16x16/zip.png x-compress x-gzip x-bzip2
-
- DefaultIcon /h5ai/icons/16x16/unknown.png
-
-
-
diff --git a/target/h5ai/css/main.css b/target/h5ai/css/main.css
deleted file mode 100644
index 63ce6358..00000000
--- a/target/h5ai/css/main.css
+++ /dev/null
@@ -1 +0,0 @@
-html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}ins{background-color:#ff9;color:#000;text-decoration:none}mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold}del{text-decoration:line-through}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}input,select{vertical-align:middle}body{font:13px/1.231 sans-serif;*font-size:small}select,input,textarea,button{font:99% sans-serif}pre,code,kbd,samp{font-family:monospace,sans-serif}a:hover,a:active{outline:0}ul,ol{margin-left:2em}ol{list-style-type:decimal}nav ul,nav li{margin:0;list-style:none;list-style-image:none}small{font-size:85%}strong,th{font-weight:bold}td{vertical-align:top}sub,sup{font-size:75%;line-height:0;position:relative}sup{top:-0.5em}sub{bottom:-0.25em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word;padding:15px}textarea{overflow:auto}.ie6 legend,.ie7 legend{margin-left:-7px}input[type="radio"]{vertical-align:text-bottom}input[type="checkbox"]{vertical-align:bottom}.ie7 input[type="checkbox"]{vertical-align:baseline}.ie6 input{vertical-align:text-bottom}label,input[type="button"],input[type="submit"],input[type="image"],button{cursor:pointer}button,input,select,textarea{margin:0}input:invalid,textarea:invalid{border-radius:1px;-moz-box-shadow:0 0 5px red;-webkit-box-shadow:0 0 5px red;box-shadow:0 0 5px red}.no-boxshadow input:invalid,.no-boxshadow textarea:invalid{background-color:#f0dddd}::-moz-selection{background:#ff5e99;color:#fff;text-shadow:none}::selection{background:#ff5e99;color:#fff;text-shadow:none}a:link{-webkit-tap-highlight-color:#ff5e99}button{width:auto;overflow:visible}.ie7 img{-ms-interpolation-mode:bicubic}body,select,input,textarea{color:#444}h1,h2,h3,h4,h5,h6{font-weight:bold}a,a:active,a:visited{color:#607890}a:hover{color:#036}.ir{display:block;text-indent:-999em;overflow:hidden;background-repeat:no-repeat;text-align:left;direction:ltr}.hidden{display:none;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:"\0020";display:block;height:0;overflow:hidden}.clearfix:after{clear:both}.clearfix{zoom:1}@media print{*{background:transparent!important;color:black!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{color:#444!important;text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}html.js .jsDisabledFallback{display:none}html.no-js body>nav ul{display:none}body{font-family:Ubuntu,sans-serif;font-size:16px;color:#555;margin:80px 30px}body>nav{position:fixed;z-index:1;width:100%;left:0;top:0;font-size:.85em;background-color:#f1f1f1;border-bottom:2px solid #d2d2d2}body>nav span.jsDisabledFallback{display:block;height:30px;line-height:30px;padding:0 10px;color:#999}body>nav a,body>nav a:active,body>nav a:visited{color:#555;cursor:pointer;text-decoration:none;opacity:.7;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:block;height:30px;line-height:30px;padding:0 10px}body>nav a:hover,body>nav a:active:hover,body>nav a:visited:hover,body>nav a.hover,body>nav a:active.hover,body>nav a:visited.hover{color:#e80;background-color:rgba(255,255,255,0.5);opacity:1.0}body>nav .current a{background-color:rgba(255,255,255,0.5);opacity:1.0}body>nav img{width:16px;height:16px;vertical-align:bottom;padding:0 6px 6px 0}body>nav .crumb{float:left;border-right:1px solid #e7e7e7}body>nav .crumb .hint{margin-left:8px;font-style:italic;color:#999}body>nav .crumb img.hint{width:10px;height:10px;vertical-align:baseline;padding:0}body>nav .view{float:right;border-left:1px solid #e7e7e7}#content{max-width:960px;margin:0 auto}#content>header{display:none;padding-bottom:10px;margin-bottom:80px;border-bottom:2px dashed #ddd}#content>footer{display:none;padding-top:10px;margin-top:80px;border-top:2px dashed #ddd}#table table{display:block;width:100%;border-collapse:collapse}#table table th,#table table td{padding:3px 6px;text-align:left;border:0}#table table th{padding-bottom:18px;opacity:.4;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#table table th:hover,#table table th:hover a{color:#555;cursor:pointer;opacity:.9}#table table th a,#table table th a:visited{color:#555;font-weight:normal}#table table th a img,#table table th a:visited img{width:12px;height:12px;padding:0 8px}#table table td{border:1px solid #ddd;border-left:none;border-right:0}#table table td:nth-child(1),#table table th:nth-child(1){text-align:center;width:16px}#table table td:nth-child(1) img,#table table th:nth-child(1) img{width:16px;height:16px;padding-top:2px}#table table td:nth-child(2),#table table th:nth-child(2){width:682px;max-width:682px;overflow:hidden;white-space:nowrap}#table table td:nth-child(3),#table table th:nth-child(3){text-align:right;width:160px;min-width:160px;white-space:nowrap}#table table td:nth-child(4),#table table th:nth-child(4){text-align:right;width:70px;min-width:70px;white-space:nowrap}#extended.details-view{display:none}#extended.details-view ul{margin:0;padding:0;list-style:none}#extended.details-view ul li{position:relative;white-space:nowrap;clear:both}#extended.details-view ul li.header a,#extended.details-view ul li.header a:active,#extended.details-view ul li.header a:visited{padding-bottom:18px;color:#555;text-decoration:none;opacity:.4;cursor:pointer;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#extended.details-view ul li.header a:hover,#extended.details-view ul li.header a:active:hover,#extended.details-view ul li.header a:visited:hover{color:#555;opacity:.9}#extended.details-view ul li.header a img,#extended.details-view ul li.header a:active img,#extended.details-view ul li.header a:visited img{width:12px;height:12px;padding:0 8px}#extended.details-view ul li.entry{border-bottom:1px solid #ddd}#extended.details-view ul li.entry a,#extended.details-view ul li.entry a:active,#extended.details-view ul li.entry a:visited{display:block;color:#555;text-decoration:none;cursor:pointer}#extended.details-view ul li.entry a:hover,#extended.details-view ul li.entry a:active:hover,#extended.details-view ul li.entry a:visited:hover,#extended.details-view ul li.entry a.hover,#extended.details-view ul li.entry a:active.hover,#extended.details-view ul li.entry a:visited.hover{background-color:#f6f6f6;color:#e80}#extended.details-view ul li.entry.error a,#extended.details-view ul li.entry.error a:active,#extended.details-view ul li.entry.error a:visited{color:#aaa}#extended.details-view ul li.entry.error a .label .hint,#extended.details-view ul li.entry.error a:active .label .hint,#extended.details-view ul li.entry.error a:visited .label .hint{margin-left:12px;font-size:.9em;color:#c55}#extended.details-view ul li.entry.error a:hover,#extended.details-view ul li.entry.error a:active:hover,#extended.details-view ul li.entry.error a:visited:hover,#extended.details-view ul li.entry.error a.hover,#extended.details-view ul li.entry.error a:active.hover,#extended.details-view ul li.entry.error a:visited.hover{opacity:1;background-color:#f6f6f6;color:#e80}#extended.details-view ul li .icon,#extended.details-view ul li .label,#extended.details-view ul li .date,#extended.details-view ul li .size{padding:6px}#extended.details-view ul li .icon{display:inline-block;position:absolute;left:0;top:2px;width:16px}#extended.details-view ul li .icon img{width:16px;height:16px}#extended.details-view ul li .icon.big{display:none}#extended.details-view ul li .label{display:block;margin:0 270px 0 24px;overflow:hidden;white-space:nowrap;text-align:left}#extended.details-view ul li .date{position:absolute;right:100px;top:0;text-align:right;width:160px;white-space:nowrap}#extended.details-view ul li .size{position:absolute;right:0;top:0;text-align:right;width:80px;white-space:nowrap}#extended.details-view .empty{text-align:center;margin:50px 0;color:#ddd;font-size:5em;font-weight:bold}#extended.icons-view{display:none;padding:3px;border:1px solid #eee;border-radius:15px}#extended.icons-view ul{margin:0;padding:0;list-style:none}#extended.icons-view ul li.header{display:none}#extended.icons-view ul li.entry{float:left}#extended.icons-view ul li.entry a,#extended.icons-view ul li.entry a:active,#extended.icons-view ul li.entry a:visited{display:block;margin:8px;padding:8px;width:100px;height:120px;float:left;text-align:center;text-decoration:none;overflow:hidden;border-radius:5px;color:#555;cursor:pointer;border:2px solid rgba(0,0,0,0)}#extended.icons-view ul li.entry a:hover,#extended.icons-view ul li.entry a:active:hover,#extended.icons-view ul li.entry a:visited:hover,#extended.icons-view ul li.entry a.hover,#extended.icons-view ul li.entry a:active.hover,#extended.icons-view ul li.entry a:visited.hover{color:#e80;border-color:#eee;background-color:#f6f6f6}#extended.icons-view ul li.entry a .icon,#extended.icons-view ul li.entry a:active .icon,#extended.icons-view ul li.entry a:visited .icon{display:block}#extended.icons-view ul li.entry a .icon img,#extended.icons-view ul li.entry a:active .icon img,#extended.icons-view ul li.entry a:visited .icon img{width:48px;height:48px;margin-bottom:8px}#extended.icons-view ul li.entry a .icon.small,#extended.icons-view ul li.entry a:active .icon.small,#extended.icons-view ul li.entry a:visited .icon.small{display:none}#extended.icons-view ul li.entry a .label,#extended.icons-view ul li.entry a:active .label,#extended.icons-view ul li.entry a:visited .label{display:block;word-wrap:break-word}#extended.icons-view ul li.entry a .date,#extended.icons-view ul li.entry a:active .date,#extended.icons-view ul li.entry a:visited .date,#extended.icons-view ul li.entry a .size,#extended.icons-view ul li.entry a:active .size,#extended.icons-view ul li.entry a:visited .size{display:none}#extended.icons-view ul li.entry.error a,#extended.icons-view ul li.entry.error a:active,#extended.icons-view ul li.entry.error a:visited{color:#aaa;text-decoration:none}#extended.icons-view ul li.entry.error a .label .hint,#extended.icons-view ul li.entry.error a:active .label .hint,#extended.icons-view ul li.entry.error a:visited .label .hint{padding:0 6px;font-size:.9em;color:#c55}#extended.icons-view ul li.entry.error a:hover,#extended.icons-view ul li.entry.error a:active:hover,#extended.icons-view ul li.entry.error a:visited:hover,#extended.icons-view ul li.entry.error a.hover,#extended.icons-view ul li.entry.error a:active.hover,#extended.icons-view ul li.entry.error a:visited.hover{color:#e80;border-color:#eee;background-color:#f6f6f6}#extended.icons-view .empty{padding:16px;height:120px;text-align:center;color:#ddd;font-size:5em;font-weight:bold}#tree{position:fixed;display:none;left:0;top:0;overflow:auto;font-size:.85em;padding:16px 16px 16px 16px;background-color:#f1f1f1;border:2px solid #d2d2d2;border-left:none;-moz-border-radius:0 15px 15px 0;-webkit-border-radius:0 15px 15px 0;border-radius:0 15px 15px 0}#tree>.scrollbar{margin:12px 12px 12px 0;width:6px;background-color:#d2d2d2;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}#tree>.scrollbar .drag{background-color:#b4b4b4;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}#tree>.scrollbar.dragOn .drag{background-color:#969696}#tree .entry .blank,#tree .entry .indicator{display:inline-block;width:16px;height:25px;float:left}#tree .entry .indicator{opacity:.7;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer}#tree .entry .indicator:hover{opacity:1}#tree .entry .indicator img{position:relative;left:0;top:3px;width:12px;height:12px;vertical-align:bottom;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#tree .entry .indicator.open img{-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-webkit-transform:rotate(90deg);transform:rotate(90deg)}#tree .entry .indicator.unknown{opacity:.3}#tree .entry>a,#tree .entry>a:active,#tree .entry>a.visited{margin-left:16px;padding:4px 6px;border:1px solid rgba(0,0,0,0);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;display:block;color:#555;text-decoration:none;opacity:.7}#tree .entry>a:hover,#tree .entry>a:active:hover,#tree .entry>a.visited:hover,#tree .entry>a.hover,#tree .entry>a:active.hover,#tree .entry>a.visited.hover{color:#e80;background-color:rgba(255,255,255,0.5);opacity:1}#tree .entry>a .label,#tree .entry>a:active .label,#tree .entry>a.visited .label{display:inline-block}#tree .entry>a .icon,#tree .entry>a:active .icon,#tree .entry>a.visited .icon{display:inline-block;width:20px}#tree .entry>a .icon img,#tree .entry>a:active .icon img,#tree .entry>a.visited .icon img{width:16px;height:16px;vertical-align:bottom}#tree .entry>a .hint,#tree .entry>a:active .hint,#tree .entry>a.visited .hint{display:inline-block;margin-left:12px;font-size:.9em;color:#ccc}#tree .entry>a .hint img,#tree .entry>a:active .hint img,#tree .entry>a.visited .hint img{width:10px;height:10px;vertical-align:baseline}#tree .entry.file{display:none}#tree .entry.current>a,#tree .entry.current>a:active,#tree .entry.current>a:visited{border:1px solid #ddd;background-color:rgba(255,255,255,0.5);opacity:1}#tree .entry.error>a,#tree .entry.error>a:active,#tree .entry.error>a:visited{color:#999}#tree .entry.error>a:hover,#tree .entry.error>a:active:hover,#tree .entry.error>a:visited:hover,#tree .entry.error>a.hover,#tree .entry.error>a:active.hover,#tree .entry.error>a:visited.hover{color:#e80}#tree .entry.error .hint{color:#c55}#tree .entry .content{list-style:none;margin-left:20px}body>footer{position:fixed;z-index:1;width:100%;left:0;bottom:0;padding:10px 0;background-color:#f1f1f1;border-top:2px solid #d2d2d2;color:#999;font-size:.85em;text-align:center}body>footer a,body>footer a:active,body>footer a:visited{color:#555;text-decoration:none;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}body>footer a:hover,body>footer a:active:hover,body>footer a:visited:hover{color:#e80}#html5{position:absolute;left:6px;bottom:6px;opacity:.4;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#html5 img{width:20px;height:20px}#html5:hover{opacity:.8}
\ No newline at end of file
diff --git a/target/h5ai/footer.html b/target/h5ai/footer.html
deleted file mode 100644
index 3582183f..00000000
--- a/target/h5ai/footer.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-