diff --git a/build.xml b/build.xml index 56662f07..af2a78cc 100644 --- a/build.xml +++ b/build.xml @@ -50,8 +50,8 @@ - - + + diff --git a/src/_h5ai/js/inc/Connector.js b/src/_h5ai/js/inc/Connector.js deleted file mode 100644 index 70d9a7fe..00000000 --- a/src/_h5ai/js/inc/Connector.js +++ /dev/null @@ -1,112 +0,0 @@ - -(function ($, h5ai) { - - var cache = {}, - pathnameStatusCache = {}, - contentTypeRegEx = /^text\/html;h5ai=/, - getPath = function (folder, tableRow) { - - var absHref = h5ai.util.getAbsHref(folder, tableRow), - path = cache[absHref]; - - if (!path) { - path = h5ai.Path(folder, tableRow); - if (!path.isParentFolder) { - cache[path.absHref] = path; - } - } - - return path; - }, - fetchStatus = function (pathname, callback) { - - if (h5ai.settings.folderStatus[pathname]) { - callback(h5ai.settings.folderStatus[pathname]); - return; - } else if (pathnameStatusCache[pathname]) { - callback(pathnameStatusCache[pathname]); - return; - } - - $.ajax({ - url: pathname, - type: 'HEAD', - complete: function (xhr) { - - var status = xhr.status; - - if (status === 200 && contentTypeRegEx.test(xhr.getResponseHeader('Content-Type'))) { - status = 'h5ai'; - } - pathnameStatusCache[pathname] = status; - callback(status); - } - }); - }, - updatePath = function (path) { - - if (path.isFolder && !path.isParentFolder && path.status === undefined) { - fetchStatus(path.absHref, function (status) { - - if (status !== 'h5ai') { - path.status = status; - } - h5ai.html.updateHtml(path); - h5ai.core.linkHoverStates(); - }); - } - }, - updatePaths = function () { - - $.each(cache, function (ref, cached) { - updatePath(cached); - }); - }, - fetchStatusAndContent = function (pathname, includeParent, callback) { - - fetchStatus(pathname, function (status) { - - if (status !== 'h5ai') { - callback(status, {}); - return; - } - - $.ajax({ - url: pathname, - type: 'GET', - dataType: 'html', - error: function (xhr) { - - callback(xhr.status, {}); // since it was checked before this should never happen - }, - success: function (html, status, xhr) { - - var content = {}; - - if (!contentTypeRegEx.test(xhr.getResponseHeader('Content-Type'))) { - callback(xhr.status, {}); // since it was checked before this should never happen - return; - } - - $(html).find('#table td').closest('tr').each(function () { - - var path = getPath(pathname, this); - - if (path.isFolder && (!path.isParentFolder || includeParent)) { - content[path.absHref] = path; - updatePath(path); - } - }); - callback('h5ai', content); - } - }); - }); - }; - - h5ai.connector = { - getPath: getPath, - updatePaths: updatePaths, - fetchStatusAndContent: fetchStatusAndContent - }; - -}(jQuery, h5ai)); diff --git a/src/_h5ai/js/inc/H5ai.js b/src/_h5ai/js/inc/H5ai.js deleted file mode 100644 index 1bc727c6..00000000 --- a/src/_h5ai/js/inc/H5ai.js +++ /dev/null @@ -1,104 +0,0 @@ - -(function ($, config) { -'use strict'; -/*jslint browser: true, confusion: true, regexp: true, vars: true, white: true */ -/*global Modernizr, jQuery, amplify, Base64, H5AI_CONFIG */ - - var defaults = { - store: { - viewmode: 'h5ai.pref.viewmode', - lang: 'h5ai.pref.lang' - }, - callbacks: { - pathClick: [] - }, - - rootAbsHref: '/', - h5aiAbsHref: '/_h5ai/', - customHeader: null, - customFooter: null, - viewmodes: ['details', 'icons'], - sortorder: 'na', - showTree: true, - slideTree: true, - folderStatus: {}, - lang: 'en', - useBrowserLang: true, - setParentFolderLabels: true, - linkHoverStates: true, - dateFormat: 'yyyy-MM-dd HH:mm', - showThumbs: false, - thumbTypes: ['bmp', 'gif', 'ico', 'image', 'jpg', 'png', 'tiff'], - zippedDownload: false, - qrCodesSize: null, - showFilter: false - }, - - initMethods = [], - addInitMethod = function (fn) { - - if ($.isFunction(fn)) { - initMethods.push(fn); - } - }, - init = function () { - - var $html = $('html'); - - h5ai.isJs = $html.hasClass('h5ai-js'); - h5ai.isPhp = $html.hasClass('h5ai-php'); - - if (!h5ai.isJs && !h5ai.isPhp) { - return; - } - - if (h5ai.isJs) { - h5ai.extended.init(); - } - - $.each(initMethods, function (idx, initMethod) { - - initMethod(); - }) - - // h5ai.core.init(); - h5ai.localize.init(); - h5ai.sort.init(); - h5ai.finder.init(); - h5ai.zippedDownload.init(); - h5ai.context.init(); - - if (h5ai.isPhp) { - $('#tree').scrollpanel(); - h5ai.core.shiftTree(false, true); - } - - // publish for testing - window.h5ai = h5ai; - }, - h5ai = function (fn) { - - addInitMethod(fn); - }; - - h5ai.config = config; - h5ai.settings = $.extend({}, defaults, config.options); - - // @include "Util.js" - // @include "Core.js" - // @include "Localize.js" - // @include "Sort.js" - // @include "ZippedDownload.js" - // @include "Finder.js" - // @include "Context.js" - - // @include "Path.js" - // @include "Connector.js" - // @include "Html.js" - // @include "Extended.js" - - // @include "splash.js" - - $(init); - -}(jQuery, H5AI_CONFIG)); diff --git a/src/_h5ai/js/inc/Path.js b/src/_h5ai/js/inc/Path.js deleted file mode 100644 index 0154a2b7..00000000 --- a/src/_h5ai/js/inc/Path.js +++ /dev/null @@ -1,95 +0,0 @@ - -(function (document, $, h5ai) { - - h5ai.Path = function (folder, tableRow) { - - var path = {}, - $tds, $a, date, size, splits; - - // path.parentFolder: undefined - // path.label: undefined - // path.type: undefined - // path.href: undefined - // path.time: undefined - // path.size: undefined - // path.absHref: undefined - // path.isFolder: undefined - // path.isParentFolder: undefined - // path.isCurrentFolder: undefined - // path.isDomain: undefined - - path.status = undefined; // undefined, 'h5ai' or HTTP response code - path.content = undefined; // associative array path.absHref -> path - path.html = { - $crumb: undefined, - $extended: undefined, - $tree: undefined - }; - path.treeOpen = false; - - if (!h5ai.util.pathEndsWithSlash(folder)) { - folder += '/'; - } - - if (tableRow) { - $tds = $(tableRow).find('td'); - $a = $tds.eq(1).find('a'); - date = Date.parse($tds.eq(2).text()); - size = h5ai.util.parseSize($tds.eq(3).text()); - - path.parentFolder = folder; - path.label = $a.text(); - path.type = h5ai.util.pathEndsWithSlash(path.label) ? 'folder' : h5ai.core.getFileType(path.label); - path.href = $a.attr('href'); - path.time = date ? date.getTime() : 0; - path.size = size; - } else { - splits = h5ai.util.splitPath(folder); - - path.parentFolder = splits.parent || ''; - path.label = h5ai.util.checkedDecodeUri(splits.name); - if (path.label === '/') { - path.label = h5ai.util.checkedDecodeUri(document.domain); - } - path.type = 'folder'; - path.href = splits.name; - path.time = 0; - path.size = -1; - } - - if (h5ai.util.pathEndsWithSlash(path.label)) { - path.label = path.label.slice(0, -1); - } - - path.isFolder = (path.type === 'folder'); - path.isParentFolder = (path.label === 'Parent Directory'); - if (path.isParentFolder) { - path.isFolder = true; - path.type = 'folder-parent'; - } - path.absHref = path.isParentFolder ? path.href : path.parentFolder + path.href; - path.isCurrentFolder = (path.absHref === document.location.pathname); - path.isDomain = (path.absHref === '/'); - - if (path.isParentFolder && h5ai.settings.setParentFolderLabels) { - if (path.isDomain) { - path.label = h5ai.util.checkedDecodeUri(document.domain); - } else { - splits = h5ai.util.splitPath(path.parentFolder); - path.label = h5ai.util.checkedDecodeUri(splits.parentname); - } - } - - path.isEmpty = function () { - - return !path.content || $.isEmptyObject(path.content); - }; - path.onClick = function (context) { - - h5ai.core.triggerPathClick(path, context); - }; - - return path; - }; - -}(document, jQuery, h5ai)); diff --git a/src/_h5ai/js/inc/Sort.js b/src/_h5ai/js/inc/Sort.js deleted file mode 100644 index df315301..00000000 --- a/src/_h5ai/js/inc/Sort.js +++ /dev/null @@ -1,155 +0,0 @@ - -(function ($, h5ai) { - - var type = function (entry) { - - var $entry = $(entry); - - if ($entry.hasClass('folder-parent')) { - return 0; - } else if ($entry.hasClass('folder')) { - return 1; - } - return 2; - }, - cmp = function (entry1, entry2, rev, getVal) { - - var res, val1, val2; - - res = type(entry1) - type(entry2); - if (res !== 0) { - return res; - } - - val1 = getVal(entry1); - val2 = getVal(entry2); - if (val1 < val2) { - return rev ? 1 : -1; - } else if (val1 > val2) { - return rev ? -1 : 1; - } - return 0; - }, - cmpName = function (entry1, entry2) { - - return cmp(entry1, entry2, false, function (entry) { - return $(entry).find('.label').text().toLowerCase(); - }); - }, - cmpTime = function (entry1, entry2) { - - return cmp(entry1, entry2, false, function (entry) { - return $(entry).find('.date').data('time'); - }); - }, - cmpSize = function (entry1, entry2) { - - return cmp(entry1, entry2, false, function (entry) { - return $(entry).find('.size').data('bytes'); - }); - }, - cmpNameRev = function (entry1, entry2) { - - return cmp(entry1, entry2, true, function (entry) { - return $(entry).find('.label').text().toLowerCase(); - }); - }, - cmpTimeRev = function (entry1, entry2) { - - return cmp(entry1, entry2, true, function (entry) { - return $(entry).find('.date').data('time'); - }); - }, - cmpSizeRev = function (entry1, entry2) { - - return cmp(entry1, entry2, true, function (entry) { - return $(entry).find('.size').data('bytes'); - }); - }, - sort = function (fn) { - - $('#extended .entry').detach().sort(fn).appendTo($('#extended > ul')); - }, - $all, orders, - sortBy = function (id) { - - var order = orders[id]; - - $all.removeClass('ascending').removeClass('descending'); - order.head.addClass(order.clas); - sort(order.fn); - h5ai.core.hash({sort: id}); - }, - init = function () { - - var $ascending = $('ascending'), - $descending = $('descending'), - initialOrder = h5ai.core.hash('sort'), - $header = $('#extended li.header'), - $label = $header.find('a.label'), - $date = $header.find('a.date'), - $size = $header.find('a.size'); - - $all = $header.find('a.label,a.date,a.size'); - orders = { - na: { - head: $label, - clas: 'ascending', - fn: cmpName - }, - nd: { - head: $label, - clas: 'descending', - fn: cmpNameRev - }, - da: { - head: $date, - clas: 'ascending', - fn: cmpTime - }, - dd: { - head: $date, - clas: 'descending', - fn: cmpTimeRev - }, - sa: { - head: $size, - clas: 'ascending', - fn: cmpSize - }, - sd: { - head: $size, - clas: 'descending', - fn: cmpSizeRev - } - }; - - sortBy(initialOrder ? initialOrder : h5ai.settings.sortorder); - - $label - .append($ascending.clone()).append($descending.clone()) - .click(function (event) { - sortBy('n' + ($label.hasClass('ascending') ? 'd' : 'a')); - event.preventDefault(); - }); - - $date - .prepend($ascending.clone()).prepend($descending.clone()) - .click(function (event) { - sortBy('d' + ($date.hasClass('ascending') ? 'd' : 'a')); - event.preventDefault(); - }); - - $size - .prepend($ascending.clone()).prepend($descending.clone()) - .click(function (event) { - sortBy('s' + ($size.hasClass('ascending') ? 'd' : 'a')); - event.preventDefault(); - }); - }; - - h5ai.sort = { - init: init - }; - -}(jQuery, h5ai)); diff --git a/src/_h5ai/js/inc/Html.js b/src/_h5ai/js/inc/connector.js similarity index 60% rename from src/_h5ai/js/inc/Html.js rename to src/_h5ai/js/inc/connector.js index 6d8e60a9..3f99f5b6 100644 --- a/src/_h5ai/js/inc/Html.js +++ b/src/_h5ai/js/inc/connector.js @@ -1,5 +1,112 @@ -(function ($, h5ai) { +Module.define('conhtml', [jQuery, 'settings', 'path', 'util', 'core', 'localize'], function ($, settings, pathFactory, util, core, localize) { + + var cache = {}, + pathnameStatusCache = {}, + contentTypeRegEx = /^text\/html;h5ai=/, + getPath = function (folder, tableRow) { + + var absHref = util.getAbsHref(folder, tableRow), + path = cache[absHref]; + + if (!path) { + path = pathFactory.create(folder, tableRow); + if (!path.isParentFolder) { + cache[path.absHref] = path; + } + } + + return path; + }, + fetchStatus = function (pathname, callback) { + + if (settings.folderStatus[pathname]) { + callback(settings.folderStatus[pathname]); + return; + } else if (pathnameStatusCache[pathname]) { + callback(pathnameStatusCache[pathname]); + return; + } + + $.ajax({ + url: pathname, + type: 'HEAD', + complete: function (xhr) { + + var status = xhr.status; + + if (status === 200 && contentTypeRegEx.test(xhr.getResponseHeader('Content-Type'))) { + status = 'h5ai'; + } + pathnameStatusCache[pathname] = status; + callback(status); + } + }); + }, + updatePath = function (path) { + + if (path.isFolder && !path.isParentFolder && path.status === undefined) { + fetchStatus(path.absHref, function (status) { + + if (status !== 'h5ai') { + path.status = status; + } + updateHtml(path); + core.linkHoverStates(); + }); + } + }, + updatePaths = function () { + + $.each(cache, function (ref, cached) { + updatePath(cached); + }); + }, + fetchStatusAndContent = function (pathname, includeParent, callback) { + + fetchStatus(pathname, function (status) { + + if (status !== 'h5ai') { + callback(status, {}); + return; + } + + $.ajax({ + url: pathname, + type: 'GET', + dataType: 'html', + error: function (xhr) { + + callback(xhr.status, {}); // since it was checked before this should never happen + }, + success: function (html, status, xhr) { + + var content = {}; + + if (!contentTypeRegEx.test(xhr.getResponseHeader('Content-Type'))) { + callback(xhr.status, {}); // since it was checked before this should never happen + return; + } + + $(html).find('#table td').closest('tr').each(function () { + + var path = getPath(pathname, this); + + if (path.isFolder && (!path.isParentFolder || includeParent)) { + content[path.absHref] = path; + updatePath(path); + } + }); + callback('h5ai', content); + } + }); + }); + }; + + + + + var onClick = function (path, context) { @@ -22,12 +129,12 @@ $a = $html.find("a") .attr("href", path.absHref) .click(function() { onClick(path, "crumb"); }) - .find("img").attr("src", h5ai.core.image("crumb")).end() + .find("img").attr("src", core.image("crumb")).end() .find("span").text(path.label).end(); if (path.isDomain) { $html.addClass("domain"); - $a.find("img").attr("src", h5ai.core.image("home")); + $a.find("img").attr("src", core.image("home")); } if (path.isCurrentFolder) { @@ -36,7 +143,7 @@ if (!isNaN(path.status)) { if (path.status === 200) { - $a.append($("not listable")); + $a.append($("not listable")); } else { $a.append($("(" + path.status + ")")); } @@ -52,10 +159,10 @@ updateExtendedHtml = function (path) { var $html, $a, $label, - formattedDate = path.date ? path.date.toString(h5ai.settings.dateFormat) : "", + formattedDate = path.date ? path.date.toString(settings.dateFormat) : "", imgClass = "", - icon16 = h5ai.core.icon(path.type), - icon48 = h5ai.core.icon(path.type, true); + icon16 = core.icon(path.type), + icon48 = core.icon(path.type, true); if (path.html.$extended && path.html.$extended.data("status") === path.status) { return path.html.$extended; @@ -69,11 +176,11 @@ $html.data("status", path.status); } - if (h5ai.settings.showThumbs === true && $.inArray(path.type, h5ai.settings.thumbTypes) >= 0) { + if (settings.showThumbs === true && $.inArray(path.type, settings.thumbTypes) >= 0) { imgClass = "class='thumb'"; var escapedHref = path.absHref.replace(/'/g, "%27").replace(/"/g, "%22"); - icon16 = h5ai.core.api() + "?action=thumb&href=" + escapedHref + "&width=16&height=16&mode=square"; - icon48 = h5ai.core.api() + "?action=thumb&href=" + escapedHref + "&width=96&height=46&mode=rational"; + icon16 = core.api() + "?action=thumb&href=" + escapedHref + "&width=16&height=16&mode=square"; + icon48 = core.api() + "?action=thumb&href=" + escapedHref + "&width=96&height=46&mode=rational"; } $label = $("" + path.label + ""); @@ -113,7 +220,7 @@ ); if (path.isParentFolder) { - if (!h5ai.settings.setParentFolderLabels) { + if (!settings.setParentFolderLabels) { $label.addClass("l10n-parentDirectory"); } $html.addClass("folder-parent"); @@ -122,8 +229,8 @@ if (!isNaN(path.status)) { if (path.status === 200) { $html.addClass("page"); - $a.find(".icon.small img").attr("src", h5ai.core.icon("folder-page")); - $a.find(".icon.big img").attr("src", h5ai.core.icon("folder-page", true)); + $a.find(".icon.small img").attr("src", core.icon("folder-page")); + $a.find(".icon.big img").attr("src", core.icon("folder-page", true)); } else { $html.addClass("error"); $label.append($(" " + path.status + " ")); @@ -132,7 +239,7 @@ if (path.html.$extended) { path.html.$extended.replaceWith($html); - h5ai.localize.formatDates(); + localize.formatDates(); } path.html.$extended = $html; @@ -152,19 +259,19 @@ .attr("href", path.absHref) .click(function() { onClick(path, "tree"); }) .appendTo($html) - .append($("")) + .append($("")) .append($("" + path.label + "")); if (path.isFolder) { // indicator if (path.status === undefined || !path.isEmpty()) { - $indicator = $("") + $indicator = $("") .click(function (event) { var $entry = $indicator.closest(".entry"); // $html if ($indicator.hasClass("unknown")) { - h5ai.connector.fetchStatusAndContent(path.absHref, false, function (status, content) { + fetchStatusAndContent(path.absHref, false, function (status, content) { path.status = status; path.content = content; @@ -205,13 +312,13 @@ // is path the domain? if (path.isDomain) { $html.addClass("domain"); - $a.find(".icon img").attr("src", h5ai.core.icon("folder-home")); + $a.find(".icon img").attr("src", core.icon("folder-home")); } // is path the current folder? if (path.isCurrentFolder) { $html.addClass("current"); - $a.find(".icon img").attr("src", h5ai.core.icon("folder-open")); + $a.find(".icon img").attr("src", core.icon("folder-open")); } // does it have subfolders? @@ -228,8 +335,8 @@ // reflect folder status if (!isNaN(path.status)) { if (path.status === 200) { - $a.find(".icon img").attr("src", h5ai.core.icon("folder-page")); - $a.append($("")); + $a.find(".icon img").attr("src", core.icon("folder-page")); + $a.append($("")); } else { $html.addClass("error"); $a.append($("" + path.status + "")); @@ -251,11 +358,17 @@ updateTreeHtml(path); }; - h5ai.html = { + + + + return { + getPath: getPath, + updatePaths: updatePaths, + fetchStatusAndContent: fetchStatusAndContent, + updateCrumbHtml: updateCrumbHtml, updateExtendedHtml: updateExtendedHtml, updateTreeHtml: updateTreeHtml, updateHtml: updateHtml }; - -}(jQuery, h5ai)); +}); diff --git a/src/_h5ai/js/inc/Context.js b/src/_h5ai/js/inc/context.js similarity index 87% rename from src/_h5ai/js/inc/Context.js rename to src/_h5ai/js/inc/context.js index f62bbeab..26976eba 100644 --- a/src/_h5ai/js/inc/Context.js +++ b/src/_h5ai/js/inc/context.js @@ -1,5 +1,5 @@ -(function ($, h5ai) { +Module.define('context', [jQuery, 'settings'], function ($, settings) { var $context, qrCodesSize, @@ -18,7 +18,7 @@ }, init = function () { - qrCodesSize = h5ai.settings.qrCodesSize; + qrCodesSize = settings.qrCodesSize; if (!qrCodesSize) { return; } @@ -44,8 +44,7 @@ }); }; - h5ai.context = { + return { init: init }; - -}(jQuery, h5ai)); \ No newline at end of file +}); diff --git a/src/_h5ai/js/inc/Core.js b/src/_h5ai/js/inc/core.js similarity index 97% rename from src/_h5ai/js/inc/Core.js rename to src/_h5ai/js/inc/core.js index 31e9f4db..02f5fb2d 100644 --- a/src/_h5ai/js/inc/Core.js +++ b/src/_h5ai/js/inc/core.js @@ -1,8 +1,7 @@ -(function (window, $, h5ai) { +Module.define('core', [jQuery, 'settings', 'types', 'util'], function ($, settings, types, util) { var $window = $(window), - settings = h5ai.settings, extToFileType = (function (types) { var map = {}; $.each(types, function (type, exts) { @@ -11,7 +10,7 @@ }); }); return map; - }(h5ai.config.types)), + }(types)), hash = function (obj) { if ($.isPlainObject(obj)) { @@ -65,7 +64,7 @@ viewmode = amplify.store(settings.store.viewmode); } viewmode = $.inArray(viewmode, settings.viewmodes) >= 0 ? viewmode : settings.viewmodes[0]; - h5ai.core.hash({view: viewmode}); + hash({view: viewmode}); $viewDetails.add($viewIcons).removeClass("current"); if (viewmode === "details") { @@ -274,7 +273,7 @@ var $this = $(this), bytes = $this.data("bytes"), - formattedSize = bytes >= 0 ? h5ai.util.formatSize(bytes) : ""; + formattedSize = bytes >= 0 ? util.formatSize(bytes) : ""; $this.text(formattedSize); }); @@ -298,7 +297,8 @@ initIndicators(); }; - h5ai.core = { + return { + init: init, hash: hash, api: api, image: image, @@ -308,7 +308,4 @@ initIndicators: initIndicators, getFileType: getFileType }; - - h5ai(init); - -}(window, jQuery, h5ai)); +}); diff --git a/src/_h5ai/js/inc/Extended.js b/src/_h5ai/js/inc/extended.js similarity index 70% rename from src/_h5ai/js/inc/Extended.js rename to src/_h5ai/js/inc/extended.js index da953526..5fac0f57 100644 --- a/src/_h5ai/js/inc/Extended.js +++ b/src/_h5ai/js/inc/extended.js @@ -1,27 +1,27 @@ -(function (document, $, h5ai) { +Module.define('extended', [jQuery, 'settings', 'conhtml', 'util', 'core'], function ($, settings, conhtml, util, core) { var initBreadcrumb = function () { var $ul = $("body > nav ul"), pathname = "/", - path = h5ai.connector.getPath(pathname), + path = conhtml.getPath(pathname), pathnameParts = document.location.pathname.split("/"), lastPart = "", title = document.domain; - $ul.append(h5ai.html.updateCrumbHtml(path)); + $ul.append(conhtml.updateCrumbHtml(path)); $.each(pathnameParts, function (idx, part) { if (part !== "") { pathname += part + "/"; - $ul.append(h5ai.html.updateCrumbHtml(h5ai.connector.getPath(pathname))); + $ul.append(conhtml.updateCrumbHtml(conhtml.getPath(pathname))); lastPart = part + " - "; title += " > " + part; } }); - document.title = h5ai.util.checkedDecodeUri(lastPart + title); + document.title = util.checkedDecodeUri(lastPart + title); }, initExtendedView = function () { @@ -37,8 +37,8 @@ // entries $("#table td").closest("tr").each(function () { - var path = h5ai.connector.getPath(document.location.pathname, this); - $ul.append(h5ai.html.updateExtendedHtml(path)); + var path = conhtml.getPath(document.location.pathname, this); + $ul.append(conhtml.updateExtendedHtml(path)); }); $("#extended").append($ul); @@ -53,9 +53,9 @@ }, customize = function () { - if (h5ai.settings.customHeader) { + if (settings.customHeader) { $.ajax({ - url: h5ai.settings.customHeader, + url: settings.customHeader, dataType: "html", success: function (data) { $("#content > header").append($(data)).show(); @@ -63,9 +63,9 @@ }); } - if (h5ai.settings.customFooter) { + if (settings.customFooter) { $.ajax({ - url: h5ai.settings.customFooter, + url: settings.customFooter, dataType: "html", success: function (data) { $("#content > footer").prepend($(data)).show(); @@ -75,9 +75,9 @@ }, fetchPath = function (pathname, callback) { - h5ai.connector.fetchStatusAndContent(pathname, false, function (status, content) { + conhtml.fetchStatusAndContent(pathname, false, function (status, content) { - var path = h5ai.connector.getPath(pathname); + var path = conhtml.getPath(pathname); path.status = status; path.content = content; @@ -88,7 +88,7 @@ fetchPath(pathname, function (path) { - var parent = h5ai.util.splitPath(pathname).parent; + var parent = util.splitPath(pathname).parent; path.treeOpen = true; if (childPath) { @@ -105,11 +105,11 @@ fetchTree(document.location.pathname, function (path) { $("#tree") - .append(h5ai.html.updateTreeHtml(path)) + .append(conhtml.updateTreeHtml(path)) .scrollpanel() .show(); - h5ai.core.shiftTree(false, true); - h5ai.core.linkHoverStates(); + core.shiftTree(false, true); + core.linkHoverStates(); setTimeout(function () { $("#tree").get(0).updateScrollbar(); }, 1); }); }, @@ -118,14 +118,13 @@ initBreadcrumb(); initExtendedView(); customize(); - h5ai.connector.updatePaths(); - if (h5ai.settings.showTree) { + conhtml.updatePaths(); + if (settings.showTree) { populateTree(); } }; - h5ai.extended = { + return { init: init }; - -}(document, jQuery, h5ai)); +}); diff --git a/src/_h5ai/js/inc/Finder.js b/src/_h5ai/js/inc/finder.js similarity index 86% rename from src/_h5ai/js/inc/Finder.js rename to src/_h5ai/js/inc/finder.js index 1b21a2ce..9122edd3 100644 --- a/src/_h5ai/js/inc/Finder.js +++ b/src/_h5ai/js/inc/finder.js @@ -1,5 +1,5 @@ -(function ($, h5ai) { +Module.define('finder', [jQuery, 'settings', 'util', 'core'], function ($, settings, util, core) { var filter = function (re) { @@ -43,7 +43,7 @@ } else { $filter.removeClass('current'); } - h5ai.core.hash({filter: val}); + core.hash({filter: val}); }, parseFilterSequence = function (sequence) { @@ -53,20 +53,20 @@ sequence = $.map($.trim(sequence).split(/\s+/), function (part) { - return h5ai.util.reEscape(part); + return util.reEscape(part); }).join('|'); return new RegExp(sequence); }, init = function () { - if (h5ai.settings.showFilter) { + if (settings.showFilter) { $('
  • filter
  • ') .on('click', function () { var $input = $(this).find('input'); $input.focus(); }) - .find('img').attr('src', h5ai.core.image('filter')).end() + .find('img').attr('src', core.image('filter')).end() .find('input') .on('focus', function () { @@ -91,7 +91,7 @@ .end() .appendTo($('#navbar')); - var initialFilter = h5ai.core.hash('filter'); + var initialFilter = core.hash('filter'); if (initialFilter) { $('#filter input').val(initialFilter); checkState(false); @@ -99,9 +99,8 @@ } }; - h5ai.finder = { + return { init: init, filter: filter }; - -}(jQuery, h5ai)); \ No newline at end of file +}); diff --git a/src/_h5ai/js/inc/h5ai.js b/src/_h5ai/js/inc/h5ai.js new file mode 100644 index 00000000..526e5dba --- /dev/null +++ b/src/_h5ai/js/inc/h5ai.js @@ -0,0 +1,38 @@ + +Module.define('h5ai', [jQuery, 'core', 'extended', 'localize', 'sort', 'finder', 'zip', 'context', 'splash'], function ($, core, extended, localize, sort, finder, zip, context, splash) { + + var h5ai = {}; + + h5ai.init = function () { + + var $html = $('html'); + + h5ai.isJs = $html.hasClass('h5ai-js'); + h5ai.isPhp = $html.hasClass('h5ai-php'); + h5ai.isSplash = $html.hasClass('h5ai-splash'); + + if (h5ai.isJs || h5ai.isPhp) { + if (h5ai.isJs) { + extended.init(); + } + + core.init(); + localize.init(); + sort.init(); + finder.init(); + zip.init(); + context.init(); + + if (h5ai.isPhp) { + $('#tree').scrollpanel(); + core.shiftTree(false, true); + } + } + + if (h5ai.isSplash) { + splash.init(); + } + }; + + return h5ai; +}); diff --git a/src/_h5ai/js/inc/html.js b/src/_h5ai/js/inc/html.js new file mode 100644 index 00000000..e69de29b diff --git a/src/_h5ai/js/inc/Localize.js b/src/_h5ai/js/inc/localize.js similarity index 88% rename from src/_h5ai/js/inc/Localize.js rename to src/_h5ai/js/inc/localize.js index 27cc6062..18d13c93 100644 --- a/src/_h5ai/js/inc/Localize.js +++ b/src/_h5ai/js/inc/localize.js @@ -1,8 +1,7 @@ -(function ($, h5ai) { +Module.define('localize', [jQuery, 'settings', 'langs', 'core'], function ($, settings, langs, core) { - var settings = h5ai.settings, - currentDateFormat = settings.dateFormat, + var currentDateFormat = settings.dateFormat, formatDates = function (dateFormat) { if (dateFormat) { @@ -48,7 +47,7 @@ $('.lang').text(lang); $('.langOption').removeClass('current'); $('.langOption.' + lang).addClass('current'); - h5ai.core.hash({lang: lang}); + core.hash({lang: lang}); } formatDates(selected.dateFormat || settings.dateFormat); @@ -96,13 +95,13 @@ }, init = function () { - initLangSelector(h5ai.config.langs); - localize(h5ai.config.langs, settings.lang, settings.useBrowserLang); + initLangSelector(langs); + localize(langs, settings.lang, settings.useBrowserLang); }; - h5ai.localize = { + return { init: init, formatDates: formatDates }; -}(jQuery, h5ai)); +}); diff --git a/src/_h5ai/js/inc/main.js b/src/_h5ai/js/inc/main.js new file mode 100644 index 00000000..ee2186ac --- /dev/null +++ b/src/_h5ai/js/inc/main.js @@ -0,0 +1,36 @@ + +(function () { +'use strict'; +/*jslint browser: true, confusion: true, regexp: true, vars: true, white: true */ +/*global Modernizr, jQuery, amplify, Base64, H5AI_CONFIG */ + + // @include "module.js" + + // @include "settings.js" + + // @include "util.js" + // @include "core.js" + // @include "localize.js" + // @include "sort.js" + // @include "zip.js" + // @include "finder.js" + // @include "context.js" + + // @include "path.js" + // @include "connector.js" + // @include "html.js" + // @include "extended.js" + + // @include "splash.js" + + // @include "h5ai.js" + + + jQuery(function () { + + var h5ai = Module.require('h5ai'); + + h5ai.init(); + }); + +}()); diff --git a/src/_h5ai/js/inc/module.js b/src/_h5ai/js/inc/module.js new file mode 100644 index 00000000..c04a16cb --- /dev/null +++ b/src/_h5ai/js/inc/module.js @@ -0,0 +1,133 @@ + +var Module = window.Module = (function ($) { + + var definitions = {}, + modules = {}, + + err = function (message) { + + $.error('module: ' + message); + }, + + uniq = function (array) { + + var set = {}, + uniq = []; + + $.each(array, function (idx, element) { + + if (!set[element]) { + set[element] = true; + uniq.push(element); + } + }); + return uniq; + }, + + deps = function (ids) { + + var self = this; + var deps = []; + + if (typeof ids === 'string') { + + var def = definitions[ids]; + if (def) { + $.each(def.deps, function (idx, id) { + + deps = deps.concat(deps(id)); + }); + deps.push(def.id); + } else { + deps.push(ids); + } + } else if ($.isArray(ids)) { + + $.each(ids, function (idx, id) { + + deps = deps.concat(deps(id)); + }); + } + + return uniq(deps); + }, + + checkedDeps = function (ids) { + + try { + return deps(ids); + } catch (e) { + err('cyclic dependencies for ids "' + ids + '"'); + } + }, + + defs = function () { + + return $.extend({}, definitions); + }, + + mods = function () { + + return $.extend({}, modules); + }, + + define = function (id, deps, fn) { + + if ($.isFunction(deps)) { + fn = deps; + deps = []; + } + if (typeof id !== 'string') { + err('id must be a string "' + id + '"'); + } + if (!$.isArray(deps)) { + err('dependencies must be an array "' + deps + '"'); + } + if (!$.isFunction(fn)) { + err('constructor must be a function "' + fn + '"'); + } + if (definitions[id]) { + err('id already defined "' + id + '"'); + } + + definitions[id] = { + id: id, + deps: deps, + fn: fn + }; + }, + + require = function (id) { + + if (typeof id !== 'string') { + return id; + } + + if (modules[id]) { + return modules[id]; + } + + var def = definitions[id]; + if (!def) { + err('id not defined "' + id + '"'); + } + + var deps = $.map(def.deps, function (depId) { + + return require(depId); + }); + + var obj = def.fn.apply(this, deps); + modules[id] = obj; + return obj; + }; + + return { + deps: checkedDeps, + defs: defs, + mods: mods, + define: define, + require: require + }; + +}(jQuery)); diff --git a/src/_h5ai/js/inc/path.js b/src/_h5ai/js/inc/path.js new file mode 100644 index 00000000..e285b8e3 --- /dev/null +++ b/src/_h5ai/js/inc/path.js @@ -0,0 +1,98 @@ + +Module.define('path', [jQuery, 'settings', 'util', 'core'], function ($, settings, util, core) { + + var create = function (folder, tableRow) { + + var path = {}, + $tds, $a, date, size, splits; + + // path.parentFolder: undefined + // path.label: undefined + // path.type: undefined + // path.href: undefined + // path.time: undefined + // path.size: undefined + // path.absHref: undefined + // path.isFolder: undefined + // path.isParentFolder: undefined + // path.isCurrentFolder: undefined + // path.isDomain: undefined + + path.status = undefined; // undefined, 'h5ai' or HTTP response code + path.content = undefined; // associative array path.absHref -> path + path.html = { + $crumb: undefined, + $extended: undefined, + $tree: undefined + }; + path.treeOpen = false; + + if (!util.pathEndsWithSlash(folder)) { + folder += '/'; + } + + if (tableRow) { + $tds = $(tableRow).find('td'); + $a = $tds.eq(1).find('a'); + date = Date.parse($tds.eq(2).text()); + size = util.parseSize($tds.eq(3).text()); + + path.parentFolder = folder; + path.label = $a.text(); + path.type = util.pathEndsWithSlash(path.label) ? 'folder' : core.getFileType(path.label); + path.href = $a.attr('href'); + path.time = date ? date.getTime() : 0; + path.size = size; + } else { + splits = util.splitPath(folder); + + path.parentFolder = splits.parent || ''; + path.label = util.checkedDecodeUri(splits.name); + if (path.label === '/') { + path.label = util.checkedDecodeUri(document.domain); + } + path.type = 'folder'; + path.href = splits.name; + path.time = 0; + path.size = -1; + } + + if (util.pathEndsWithSlash(path.label)) { + path.label = path.label.slice(0, -1); + } + + path.isFolder = (path.type === 'folder'); + path.isParentFolder = (path.label === 'Parent Directory'); + if (path.isParentFolder) { + path.isFolder = true; + path.type = 'folder-parent'; + } + path.absHref = path.isParentFolder ? path.href : path.parentFolder + path.href; + path.isCurrentFolder = (path.absHref === document.location.pathname); + path.isDomain = (path.absHref === '/'); + + if (path.isParentFolder && settings.setParentFolderLabels) { + if (path.isDomain) { + path.label = util.checkedDecodeUri(document.domain); + } else { + splits = util.splitPath(path.parentFolder); + path.label = util.checkedDecodeUri(splits.parentname); + } + } + + path.isEmpty = function () { + + return !path.content || $.isEmptyObject(path.content); + }; + path.onClick = function (context) { + + core.triggerPathClick(path, context); + }; + + return path; + }; + + return { + create: create + }; +}); diff --git a/src/_h5ai/js/inc/settings.js b/src/_h5ai/js/inc/settings.js new file mode 100644 index 00000000..089ffbe9 --- /dev/null +++ b/src/_h5ai/js/inc/settings.js @@ -0,0 +1,57 @@ + +Module.define('config', [jQuery, H5AI_CONFIG], function ($, config) { + + var defaults = { + store: { + viewmode: 'h5ai.pref.viewmode', + lang: 'h5ai.pref.lang' + }, + callbacks: { + pathClick: [] + }, + + rootAbsHref: '/', + h5aiAbsHref: '/_h5ai/', + customHeader: null, + customFooter: null, + viewmodes: ['details', 'icons'], + sortorder: 'na', + showTree: true, + slideTree: true, + folderStatus: {}, + lang: 'en', + useBrowserLang: true, + setParentFolderLabels: true, + linkHoverStates: true, + dateFormat: 'yyyy-MM-dd HH:mm', + showThumbs: false, + thumbTypes: ['bmp', 'gif', 'ico', 'image', 'jpg', 'png', 'tiff'], + zippedDownload: false, + qrCodesSize: null, + showFilter: false + }; + + return { + settings: $.extend({}, defaults, config.options), + types: $.extend({}, config.types), + langs: $.extend({}, config.langs) + }; +}); + + +Module.define('settings', ['config'], function (config) { + + return config.settings; +}); + + +Module.define('types', ['config'], function (config) { + + return config.types; +}); + + +Module.define('langs', ['config'], function (config) { + + return config.langs; +}); diff --git a/src/_h5ai/js/inc/sort.js b/src/_h5ai/js/inc/sort.js new file mode 100644 index 00000000..2afac511 --- /dev/null +++ b/src/_h5ai/js/inc/sort.js @@ -0,0 +1,134 @@ + +Module.define('sort', [jQuery, 'settings', 'core'], function ($, settings, core) { + + var type = function (entry) { + + var $entry = $(entry); + + if ($entry.hasClass('folder-parent')) { + return 0; + } else if ($entry.hasClass('folder')) { + return 1; + } + return 2; + }, + + cmpFn = function (rev, getVal) { + + return function (entry1, entry2) { + + var res, val1, val2; + + res = type(entry1) - type(entry2); + if (res !== 0) { + return res; + } + + val1 = getVal(entry1); + val2 = getVal(entry2); + if (val1 < val2) { + return rev ? 1 : -1; + } else if (val1 > val2) { + return rev ? -1 : 1; + } + return 0; + }; + }, + + getName = function (entry) { + + return $(entry).find('.label').text().toLowerCase(); + }, + getTime = function (entry) { + + return $(entry).find('.date').data('time'); + }, + getSize = function (entry) { + + return $(entry).find('.size').data('bytes'); + }, + + $all, orders, + + sortBy = function (id) { + + var order = orders[id]; + + $all.removeClass('ascending').removeClass('descending'); + order.head.addClass(order.clas); + $('#extended .entry').detach().sort(order.fn).appendTo($('#extended > ul')); + core.hash({sort: id}); + }, + + init = function () { + + var $ascending = $('ascending'), + $descending = $('descending'), + initialOrder = core.hash('sort'), + $header = $('#extended li.header'), + $label = $header.find('a.label'), + $date = $header.find('a.date'), + $size = $header.find('a.size'); + + $all = $header.find('a.label,a.date,a.size'); + orders = { + na: { + head: $label, + clas: 'ascending', + fn: cmpFn(false, getName) + }, + nd: { + head: $label, + clas: 'descending', + fn: cmpFn(true, getName) + }, + da: { + head: $date, + clas: 'ascending', + fn: cmpFn(false, getTime) + }, + dd: { + head: $date, + clas: 'descending', + fn: cmpFn(true, getTime) + }, + sa: { + head: $size, + clas: 'ascending', + fn: cmpFn(false, getSize) + }, + sd: { + head: $size, + clas: 'descending', + fn: cmpFn(true, getSize) + } + }; + + sortBy(initialOrder || settings.sortorder); + + $label + .append($ascending.clone()).append($descending.clone()) + .click(function (event) { + sortBy('n' + ($label.hasClass('ascending') ? 'd' : 'a')); + event.preventDefault(); + }); + + $date + .prepend($ascending.clone()).prepend($descending.clone()) + .click(function (event) { + sortBy('d' + ($date.hasClass('ascending') ? 'd' : 'a')); + event.preventDefault(); + }); + + $size + .prepend($ascending.clone()).prepend($descending.clone()) + .click(function (event) { + sortBy('s' + ($size.hasClass('ascending') ? 'd' : 'a')); + event.preventDefault(); + }); + }; + + return { + init: init + }; +}); diff --git a/src/_h5ai/js/inc/splash.js b/src/_h5ai/js/inc/splash.js index afc6c9a3..ac56b976 100644 --- a/src/_h5ai/js/inc/splash.js +++ b/src/_h5ai/js/inc/splash.js @@ -1,5 +1,5 @@ -(function ($, h5ai) { +Module.define('splash', [jQuery, 'core'], function ($, core) { var setCheckResult = function (id, result) { @@ -20,7 +20,7 @@ checks = function () { $.ajax({ - url: h5ai.core.api(), + url: core.api(), data: { action: 'checks' }, @@ -38,13 +38,10 @@ }, init = function () { - h5ai.isSplash = $('html').hasClass('h5ai-splash'); - - if (h5ai.isSplash) { - checks(); - } + checks(); }; - $(init); - -}(jQuery, h5ai)); \ No newline at end of file + return { + init: init + }; +}); diff --git a/src/_h5ai/js/inc/Util.js b/src/_h5ai/js/inc/util.js similarity index 97% rename from src/_h5ai/js/inc/Util.js rename to src/_h5ai/js/inc/util.js index 5b40374b..e9e3b454 100644 --- a/src/_h5ai/js/inc/Util.js +++ b/src/_h5ai/js/inc/util.js @@ -1,5 +1,5 @@ -(function ($, h5ai) { +Module.define('util', [jQuery], function ($) { var reSplitPath = /^\/([^\/]+\/?)$/, reSplitPath2 = /^(\/(?:.*\/)*?([^\/]+)\/)([^\/]+\/?)$/, @@ -105,7 +105,7 @@ return sequence.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); }; - h5ai.util = { + return { splitPath: splitPath, pathEndsWithSlash: pathEndsWithSlash, getAbsHref: getAbsHref, @@ -114,5 +114,4 @@ checkedDecodeUri: checkedDecodeUri, reEscape: reEscape }; - -}(jQuery, h5ai)); +}); diff --git a/src/_h5ai/js/inc/ZippedDownload.js b/src/_h5ai/js/inc/zip.js similarity index 92% rename from src/_h5ai/js/inc/ZippedDownload.js rename to src/_h5ai/js/inc/zip.js index 1ed8fd22..cd9e76ae 100644 --- a/src/_h5ai/js/inc/ZippedDownload.js +++ b/src/_h5ai/js/inc/zip.js @@ -1,5 +1,5 @@ -(function ($, h5ai) { +Module.define('zip', [jQuery, 'settings', 'core'], function ($, settings, core) { var x = 0, y = 0, @@ -102,11 +102,11 @@ $download.removeClass('current'); - $img.attr('src', h5ai.core.image("download")); + $img.attr('src', core.image("download")); if (response) { if (response.status === 'ok') { - window.location = h5ai.core.api() + '?action=getzip&id=' + response.id; + window.location = core.api() + '?action=getzip&id=' + response.id; } else { if (response.code === 401) { $downloadAuth @@ -126,9 +126,9 @@ requestZipping = function (hrefsStr) { $download.addClass('current'); - $img.attr('src', h5ai.core.image("loading.gif", true)); + $img.attr('src', core.image("loading.gif", true)); $.ajax({ - url: h5ai.core.api(), + url: core.api(), data: { action: 'zip', hrefs: selectedHrefsStr @@ -156,9 +156,9 @@ }, init = function () { - if (h5ai.settings.zippedDownload) { + if (settings.zippedDownload) { $('
  • downloaddownload
  • ') - .find('img').attr('src', h5ai.core.image('download')).end() + .find('img').attr('src', core.image('download')).end() .find('a').click(function (event) { event.preventDefault(); @@ -181,8 +181,7 @@ } }; - h5ai.zippedDownload = { + return { init: init }; - -}(jQuery, h5ai)); +}); diff --git a/src/_h5ai/js/scripts.js b/src/_h5ai/js/scripts.js index 3482f896..ab4484c9 100644 --- a/src/_h5ai/js/scripts.js +++ b/src/_h5ai/js/scripts.js @@ -16,4 +16,4 @@ // h5ai // ---- -// @include "inc/H5ai.js" +// @include "inc/main.js"