Rebase dengan menggunakan sqlite

This commit is contained in:
Otang45
2024-12-08 19:38:53 +07:00
parent 0f93ba721f
commit 661da7a0fe
83 changed files with 31217 additions and 762244 deletions

132
public/js/api/main.js Normal file
View File

@@ -0,0 +1,132 @@
/**
* Utility function to calculate the current theme setting.
* Look for a local storage value.
* Fall back to system setting.
* Fall back to light mode.
*/
function calculateSettingAsThemeString({
localStorageTheme,
systemSettingDark,
}) {
if (localStorageTheme !== null) {
return localStorageTheme;
}
if (systemSettingDark.matches) {
return "dark";
}
return "light";
}
/**
* Utility function to update the button text and aria-label.
*/
function updateButton({ buttonEl, isDark }) {
const newCta = isDark ? "Terang" : "Gelap";
// use an aria-label if you are omitting text on the button
// and using a sun/moon icon, for example
buttonEl.innerText = newCta;
}
/**
* Utility function to update the theme setting on the html tag
*/
function updateThemeOnHtmlEl({ theme }) {
document.querySelector("html").setAttribute("data-theme", theme);
}
/**
* On page load:
*/
/**
* 1. Grab what we need from the DOM and system settings on page load
*/
const button = document.querySelector(".theme-toggle");
const localStorageTheme = localStorage.getItem("theme");
const systemSettingDark = window.matchMedia("(prefers-color-scheme: dark)");
/**
* 2. Work out the current site settings
*/
let currentThemeSetting = calculateSettingAsThemeString({
localStorageTheme,
systemSettingDark,
});
/**
* 3. Update the theme setting and button text accoridng to current settings
*/
updateButton({
buttonEl: button,
isDark: currentThemeSetting === "dark",
});
updateThemeOnHtmlEl({ theme: currentThemeSetting });
/**
* 4. Add an event listener to toggle the theme
*/
function changeTheme() {
const newTheme = currentThemeSetting === "dark" ? "light" : "dark";
localStorage.setItem("theme", newTheme);
updateButton({
buttonEl: button,
isDark: newTheme === "dark",
});
updateThemeOnHtmlEl({ theme: newTheme });
currentThemeSetting = newTheme;
}
$(document).ready(function () {
// Header Scroll
$(window).on("scroll", function () {
var scroll = $(window).scrollTop();
if (scroll >= 50) {
$("#header").addClass("fixed");
} else {
$("#header").removeClass("fixed");
}
});
// Page Scroll
var sections = $("section");
nav = $('nav[role="navigation"]');
$(window).on("scroll", function () {
var cur_pos = $(this).scrollTop();
sections.each(function () {
var top = $(this).offset().top - 276;
bottom = top + $(this).outerHeight();
if (cur_pos >= top && cur_pos <= bottom) {
nav.find("a").removeClass("active");
nav.find('a[href="#' + $(this).attr("id") + '"]').addClass("active");
}
});
});
nav.find("a").on("click", function () {
var $el = $(this);
id = $el.attr("href");
$("html, body").animate(
{
scrollTop: $(id).offset().top - 75,
},
500
);
return false;
});
// Mobile Navigation
$(".nav-toggle").on("click", function () {
$(this).toggleClass("close-nav");
nav.toggleClass("open");
return false;
});
nav.find("a").on("click", function () {
$(".nav-toggle").toggleClass("close-nav");
nav.toggleClass("open");
});
});

1697
public/js/bootstrap.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

1173
public/js/jquery.flexslider-min.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,87 @@
/**
* jQuery.LocalScroll - Animated scrolling navigation, using anchors.
* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
* Dual licensed under MIT and GPL.
* Date: 3/11/2009
* @author Ariel Flesler
* @version 1.2.7
**/
(function ($) {
var l = location.href.replace(/#.*/, "");
var g = ($.localScroll = function (a) {
$("body").localScroll(a);
});
g.defaults = {
duration: 1e3,
axis: "y",
event: "click",
stop: true,
target: window,
reset: true,
};
g.hash = function (a) {
if (location.hash) {
a = $.extend({}, g.defaults, a);
a.hash = false;
if (a.reset) {
var e = a.duration;
delete a.duration;
$(a.target).scrollTo(0, a);
a.duration = e;
}
i(0, location, a);
}
};
$.fn.localScroll = function (b) {
b = $.extend({}, g.defaults, b);
return b.lazy
? this.bind(b.event, function (a) {
var e = $([a.target, a.target.parentNode]).filter(d)[0];
if (e) i(a, e, b);
})
: this.find("a,area")
.filter(d)
.bind(b.event, function (a) {
i(a, this, b);
})
.end()
.end();
function d() {
return (
!!this.href &&
!!this.hash &&
this.href.replace(this.hash, "") == l &&
(!b.filter || $(this).is(b.filter))
);
}
};
function i(a, e, b) {
var d = e.hash.slice(1),
f = document.getElementById(d) || document.getElementsByName(d)[0];
if (!f) return;
if (a) a.preventDefault();
var h = $(b.target);
if (
(b.lock && h.is(":animated")) ||
(b.onBefore && b.onBefore.call(b, a, f, h) === false)
)
return;
if (b.stop) h.stop(true);
if (b.hash) {
var j = f.id == d ? "id" : "name",
k = $("<a> </a>")
.attr(j, d)
.css({
position: "absolute",
top: $(window).scrollTop(),
left: $(window).scrollLeft(),
});
f[j] = "";
$("body").prepend(k);
location = e.hash;
k.remove();
f[j] = d;
}
h.scrollTo(f, b).trigger("notify.serialScroll", [f]);
}
})(jQuery);

5795
public/js/jquery.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

875
public/js/jquery.prettyPhoto.min.js vendored Normal file
View File

@@ -0,0 +1,875 @@
!(function ($) {
function getHashtag() {
var url = location.href;
return (
(hashtag =
-1 !== url.indexOf("#prettyPhoto")
? decodeURI(
url.substring(url.indexOf("#prettyPhoto") + 1, url.length)
)
: !1),
hashtag && (hashtag = hashtag.replace(/<|>/g, "")),
hashtag
);
}
function setHashtag() {
"undefined" != typeof theRel &&
(location.hash = theRel + "/" + rel_index + "/");
}
function clearHashtag() {
-1 !== location.href.indexOf("#prettyPhoto") &&
(location.hash = "prettyPhoto");
}
function getParam(name, url) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)",
regex = new RegExp(regexS),
results = regex.exec(url);
return null == results ? "" : results[1];
}
($.prettyPhoto = { version: "3.1.6" }),
($.fn.prettyPhoto = function (pp_settings) {
function _showContent() {
$(".pp_loaderIcon").hide(),
(projectedTop =
scroll_pos.scrollTop +
(windowHeight / 2 - pp_dimensions.containerHeight / 2)),
projectedTop < 0 && (projectedTop = 0),
$ppt.fadeTo(settings.animation_speed, 1),
$pp_pic_holder.find(".pp_content").animate(
{
height: pp_dimensions.contentHeight,
width: pp_dimensions.contentWidth,
},
settings.animation_speed
),
$pp_pic_holder.animate(
{
top: projectedTop,
left:
windowWidth / 2 - pp_dimensions.containerWidth / 2 < 0
? 0
: windowWidth / 2 - pp_dimensions.containerWidth / 2,
width: pp_dimensions.containerWidth,
},
settings.animation_speed,
function () {
$pp_pic_holder
.find(".pp_hoverContainer,#fullResImage")
.height(pp_dimensions.height)
.width(pp_dimensions.width),
$pp_pic_holder
.find(".pp_fade")
.fadeIn(settings.animation_speed),
isSet && "image" == _getFileType(pp_images[set_position])
? $pp_pic_holder.find(".pp_hoverContainer").show()
: $pp_pic_holder.find(".pp_hoverContainer").hide(),
settings.allow_expand &&
(pp_dimensions.resized
? $("a.pp_expand,a.pp_contract").show()
: $("a.pp_expand").hide()),
!settings.autoplay_slideshow ||
pp_slideshow ||
pp_open ||
$.prettyPhoto.startSlideshow(),
settings.changepicturecallback(),
(pp_open = !0);
}
),
_insert_gallery(),
pp_settings.ajaxcallback();
}
function _hideContent(callback) {
$pp_pic_holder
.find("#pp_full_res object,#pp_full_res embed")
.css("visibility", "hidden"),
$pp_pic_holder
.find(".pp_fade")
.fadeOut(settings.animation_speed, function () {
$(".pp_loaderIcon").show(), callback();
});
}
function _checkPosition(setCount) {
setCount > 1 ? $(".pp_nav").show() : $(".pp_nav").hide();
}
function _fitToViewport(width, height) {
if (
((resized = !1),
_getDimensions(width, height),
(imageWidth = width),
(imageHeight = height),
(pp_containerWidth > windowWidth ||
pp_containerHeight > windowHeight) &&
doresize &&
settings.allow_resize &&
!percentBased)
) {
for (resized = !0, fitting = !1; !fitting; )
pp_containerWidth > windowWidth
? ((imageWidth = windowWidth - 200),
(imageHeight = (height / width) * imageWidth))
: pp_containerHeight > windowHeight
? ((imageHeight = windowHeight - 200),
(imageWidth = (width / height) * imageHeight))
: (fitting = !0),
(pp_containerHeight = imageHeight),
(pp_containerWidth = imageWidth);
(pp_containerWidth > windowWidth ||
pp_containerHeight > windowHeight) &&
_fitToViewport(pp_containerWidth, pp_containerHeight),
_getDimensions(imageWidth, imageHeight);
}
return {
width: Math.floor(imageWidth),
height: Math.floor(imageHeight),
containerHeight: Math.floor(pp_containerHeight),
containerWidth:
Math.floor(pp_containerWidth) + 2 * settings.horizontal_padding,
contentHeight: Math.floor(pp_contentHeight),
contentWidth: Math.floor(pp_contentWidth),
resized: resized,
};
}
function _getDimensions(width, height) {
(width = parseFloat(width)),
(height = parseFloat(height)),
($pp_details = $pp_pic_holder.find(".pp_details")),
$pp_details.width(width),
(detailsHeight =
parseFloat($pp_details.css("marginTop")) +
parseFloat($pp_details.css("marginBottom"))),
($pp_details = $pp_details
.clone()
.addClass(settings.theme)
.width(width)
.appendTo($("body"))
.css({ position: "absolute", top: -1e4 })),
(detailsHeight += $pp_details.height()),
(detailsHeight = detailsHeight <= 34 ? 36 : detailsHeight),
$pp_details.remove(),
($pp_title = $pp_pic_holder.find(".ppt")),
$pp_title.width(width),
(titleHeight =
parseFloat($pp_title.css("marginTop")) +
parseFloat($pp_title.css("marginBottom"))),
($pp_title = $pp_title
.clone()
.appendTo($("body"))
.css({ position: "absolute", top: -1e4 })),
(titleHeight += $pp_title.height()),
$pp_title.remove(),
(pp_contentHeight = height + detailsHeight),
(pp_contentWidth = width),
(pp_containerHeight =
pp_contentHeight +
titleHeight +
$pp_pic_holder.find(".pp_top").height() +
$pp_pic_holder.find(".pp_bottom").height()),
(pp_containerWidth = width);
}
function _getFileType(itemSrc) {
return itemSrc.match(/youtube\.com\/watch/i) ||
itemSrc.match(/youtu\.be/i)
? "youtube"
: itemSrc.match(/vimeo\.com/i)
? "vimeo"
: itemSrc.match(/\b.mov\b/i)
? "quicktime"
: itemSrc.match(/\b.swf\b/i)
? "flash"
: itemSrc.match(/\biframe=true\b/i)
? "iframe"
: itemSrc.match(/\bajax=true\b/i)
? "ajax"
: itemSrc.match(/\bcustom=true\b/i)
? "custom"
: "#" == itemSrc.substr(0, 1)
? "inline"
: "image";
}
function _center_overlay() {
if (doresize && "undefined" != typeof $pp_pic_holder) {
if (
((scroll_pos = _get_scroll()),
(contentHeight = $pp_pic_holder.height()),
(contentwidth = $pp_pic_holder.width()),
(projectedTop =
windowHeight / 2 + scroll_pos.scrollTop - contentHeight / 2),
projectedTop < 0 && (projectedTop = 0),
contentHeight > windowHeight)
)
return;
$pp_pic_holder.css({
top: projectedTop,
left: windowWidth / 2 + scroll_pos.scrollLeft - contentwidth / 2,
});
}
}
function _get_scroll() {
return self.pageYOffset
? { scrollTop: self.pageYOffset, scrollLeft: self.pageXOffset }
: document.documentElement && document.documentElement.scrollTop
? {
scrollTop: document.documentElement.scrollTop,
scrollLeft: document.documentElement.scrollLeft,
}
: document.body
? {
scrollTop: document.body.scrollTop,
scrollLeft: document.body.scrollLeft,
}
: void 0;
}
function _resize_overlay() {
(windowHeight = $(window).height()),
(windowWidth = $(window).width()),
"undefined" != typeof $pp_overlay &&
$pp_overlay.height($(document).height()).width(windowWidth);
}
function _insert_gallery() {
isSet &&
settings.overlay_gallery &&
"image" == _getFileType(pp_images[set_position])
? ((itemWidth = 57),
(navWidth =
"facebook" == settings.theme || "pp_default" == settings.theme
? 50
: 30),
(itemsPerPage = Math.floor(
(pp_dimensions.containerWidth - 100 - navWidth) / itemWidth
)),
(itemsPerPage =
itemsPerPage < pp_images.length
? itemsPerPage
: pp_images.length),
(totalPage = Math.ceil(pp_images.length / itemsPerPage) - 1),
0 == totalPage
? ((navWidth = 0),
$pp_gallery.find(".pp_arrow_next,.pp_arrow_previous").hide())
: $pp_gallery.find(".pp_arrow_next,.pp_arrow_previous").show(),
(galleryWidth = itemsPerPage * itemWidth),
(fullGalleryWidth = pp_images.length * itemWidth),
$pp_gallery
.css("margin-left", -(galleryWidth / 2 + navWidth / 2))
.find("div:first")
.width(galleryWidth + 5)
.find("ul")
.width(fullGalleryWidth)
.find("li.selected")
.removeClass("selected"),
(goToPage =
Math.floor(set_position / itemsPerPage) < totalPage
? Math.floor(set_position / itemsPerPage)
: totalPage),
$.prettyPhoto.changeGalleryPage(goToPage),
$pp_gallery_li
.filter(":eq(" + set_position + ")")
.addClass("selected"))
: $pp_pic_holder.find(".pp_content").unbind("mouseenter mouseleave");
}
function _build_overlay(caller) {
if (
(settings.social_tools &&
(facebook_like_link = settings.social_tools.replace(
"{location_href}",
encodeURIComponent(location.href)
)),
(settings.markup = settings.markup.replace("{pp_social}", "")),
$("body").append(settings.markup),
($pp_pic_holder = $(".pp_pic_holder")),
($ppt = $(".ppt")),
($pp_overlay = $("div.pp_overlay")),
isSet && settings.overlay_gallery)
) {
(currentGalleryPage = 0), (toInject = "");
for (var i = 0; i < pp_images.length; i++)
pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)
? ((classname = ""), (img_src = pp_images[i]))
: ((classname = "default"), (img_src = "")),
(toInject +=
"<li class='" +
classname +
"'><a href='#'><img src='" +
img_src +
"' width='50' alt='' /></a></li>");
(toInject = settings.gallery_markup.replace(/{gallery}/g, toInject)),
$pp_pic_holder.find("#pp_full_res").after(toInject),
($pp_gallery = $(".pp_pic_holder .pp_gallery")),
($pp_gallery_li = $pp_gallery.find("li")),
$pp_gallery.find(".pp_arrow_next").click(function () {
return (
$.prettyPhoto.changeGalleryPage("next"),
$.prettyPhoto.stopSlideshow(),
!1
);
}),
$pp_gallery.find(".pp_arrow_previous").click(function () {
return (
$.prettyPhoto.changeGalleryPage("previous"),
$.prettyPhoto.stopSlideshow(),
!1
);
}),
$pp_pic_holder.find(".pp_content").hover(
function () {
$pp_pic_holder.find(".pp_gallery:not(.disabled)").fadeIn();
},
function () {
$pp_pic_holder.find(".pp_gallery:not(.disabled)").fadeOut();
}
),
(itemWidth = 57),
$pp_gallery_li.each(function (i) {
$(this)
.find("a")
.click(function () {
return (
$.prettyPhoto.changePage(i),
$.prettyPhoto.stopSlideshow(),
!1
);
});
});
}
settings.slideshow &&
($pp_pic_holder
.find(".pp_nav")
.prepend('<a href="#" class="pp_play">Play</a>'),
$pp_pic_holder.find(".pp_nav .pp_play").click(function () {
return $.prettyPhoto.startSlideshow(), !1;
})),
$pp_pic_holder.attr("class", "pp_pic_holder " + settings.theme),
$pp_overlay
.css({
opacity: 0,
height: $(document).height(),
width: $(window).width(),
})
.bind("click", function () {
settings.modal || $.prettyPhoto.close();
}),
$("a.pp_close").bind("click", function () {
return $.prettyPhoto.close(), !1;
}),
settings.allow_expand &&
$("a.pp_expand").bind("click", function (e) {
return (
$(this).hasClass("pp_expand")
? ($(this).removeClass("pp_expand").addClass("pp_contract"),
(doresize = !1))
: ($(this).removeClass("pp_contract").addClass("pp_expand"),
(doresize = !0)),
_hideContent(function () {
$.prettyPhoto.open();
}),
!1
);
}),
$pp_pic_holder
.find(".pp_previous, .pp_nav .pp_arrow_previous")
.bind("click", function () {
return (
$.prettyPhoto.changePage("previous"),
$.prettyPhoto.stopSlideshow(),
!1
);
}),
$pp_pic_holder
.find(".pp_next, .pp_nav .pp_arrow_next")
.bind("click", function () {
return (
$.prettyPhoto.changePage("next"),
$.prettyPhoto.stopSlideshow(),
!1
);
}),
_center_overlay();
}
pp_settings = jQuery.extend(
{
hook: "rel",
animation_speed: "fast",
ajaxcallback: function () {},
slideshow: 5e3,
autoplay_slideshow: !1,
opacity: 0.8,
show_title: !0,
allow_resize: !0,
allow_expand: !0,
default_width: 500,
default_height: 344,
counter_separator_label: "/",
theme: "pp_default",
horizontal_padding: 20,
hideflash: !1,
wmode: "opaque",
autoplay: !0,
modal: !1,
deeplinking: !0,
overlay_gallery: !0,
overlay_gallery_max: 30,
keyboard_shortcuts: !0,
changepicturecallback: function () {},
callback: function () {},
ie6_fallback: !0,
markup:
'<div class="pp_pic_holder"> <div class="ppt">&nbsp;</div> <div class="pp_top"> <div class="pp_left"></div> <div class="pp_middle"></div> <div class="pp_right"></div> </div> <div class="pp_content_container"> <div class="pp_left"> <div class="pp_right"> <div class="pp_content"> <div class="pp_loaderIcon"></div> <div class="pp_fade"> <a href="#" class="pp_expand" title="Expand the image">Expand</a> <div class="pp_hoverContainer"> <a class="pp_next" href="#">next</a> <a class="pp_previous" href="#">previous</a> </div> <div id="pp_full_res"></div> <div class="pp_details"> <div class="pp_nav"> <a href="#" class="pp_arrow_previous">Previous</a> <p class="currentTextHolder">0/0</p> <a href="#" class="pp_arrow_next">Next</a> </div> <p class="pp_description"></p> <div class="pp_social">{pp_social}</div> <a class="pp_close" href="#">Close</a> </div> </div> </div> </div> </div> </div> <div class="pp_bottom"> <div class="pp_left"></div> <div class="pp_middle"></div> <div class="pp_right"></div> </div> </div> <div class="pp_overlay"></div>',
gallery_markup:
'<div class="pp_gallery"> <a href="#" class="pp_arrow_previous">Previous</a> <div> <ul> {gallery} </ul> </div> <a href="#" class="pp_arrow_next">Next</a> </div>',
image_markup: '<img id="fullResImage" src="{path}" />',
flash_markup:
'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',
quicktime_markup:
'<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object>',
iframe_markup:
'<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',
inline_markup: '<div class="pp_inline">{content}</div>',
custom_markup: "",
social_tools:
'<div class="twitter"><a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="facebook"><iframe src="//www.facebook.com/plugins/like.php?locale=en_US&href={location_href}&amp;layout=button_count&amp;show_faces=true&amp;width=500&amp;action=like&amp;font&amp;colorscheme=light&amp;height=23" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:23px;" allowTransparency="true"></iframe></div>',
},
pp_settings
);
var pp_dimensions,
pp_open,
pp_contentHeight,
pp_contentWidth,
pp_containerHeight,
pp_containerWidth,
pp_slideshow,
matchedObjects = this,
percentBased = !1,
windowHeight = $(window).height(),
windowWidth = $(window).width();
return (
(doresize = !0),
(scroll_pos = _get_scroll()),
$(window)
.unbind("resize.prettyphoto")
.bind("resize.prettyphoto", function () {
_center_overlay(), _resize_overlay();
}),
pp_settings.keyboard_shortcuts &&
$(document)
.unbind("keydown.prettyphoto")
.bind("keydown.prettyphoto", function (e) {
if (
"undefined" != typeof $pp_pic_holder &&
$pp_pic_holder.is(":visible")
)
switch (e.keyCode) {
case 37:
$.prettyPhoto.changePage("previous"), e.preventDefault();
break;
case 39:
$.prettyPhoto.changePage("next"), e.preventDefault();
break;
case 27:
settings.modal || $.prettyPhoto.close(), e.preventDefault();
}
}),
($.prettyPhoto.initialize = function () {
return (
(settings = pp_settings),
"pp_default" == settings.theme &&
(settings.horizontal_padding = 16),
(theRel = $(this).attr(settings.hook)),
(galleryRegExp = /\[(?:.*)\]/),
(isSet = galleryRegExp.exec(theRel) ? !0 : !1),
(pp_images = isSet
? jQuery.map(matchedObjects, function (n, i) {
return -1 != $(n).attr(settings.hook).indexOf(theRel)
? $(n).attr("href")
: void 0;
})
: $.makeArray($(this).attr("href"))),
(pp_titles = isSet
? jQuery.map(matchedObjects, function (n, i) {
return -1 != $(n).attr(settings.hook).indexOf(theRel)
? $(n).find("img").attr("alt")
? $(n).find("img").attr("alt")
: ""
: void 0;
})
: $.makeArray($(this).find("img").attr("alt"))),
(pp_descriptions = isSet
? jQuery.map(matchedObjects, function (n, i) {
return -1 != $(n).attr(settings.hook).indexOf(theRel)
? $(n).attr("title")
? $(n).attr("title")
: ""
: void 0;
})
: $.makeArray($(this).attr("title"))),
pp_images.length > settings.overlay_gallery_max &&
(settings.overlay_gallery = !1),
(set_position = jQuery.inArray($(this).attr("href"), pp_images)),
(rel_index = isSet
? set_position
: $("a[" + settings.hook + "^='" + theRel + "']").index($(this))),
_build_overlay(this),
settings.allow_resize &&
$(window).bind("scroll.prettyphoto", function () {
_center_overlay();
}),
$.prettyPhoto.open(),
!1
);
}),
($.prettyPhoto.open = function (event) {
return (
"undefined" == typeof settings &&
((settings = pp_settings),
(pp_images = $.makeArray(arguments[0])),
(pp_titles = arguments[1]
? $.makeArray(arguments[1])
: $.makeArray("")),
(pp_descriptions = arguments[2]
? $.makeArray(arguments[2])
: $.makeArray("")),
(isSet = pp_images.length > 1 ? !0 : !1),
(set_position = arguments[3] ? arguments[3] : 0),
_build_overlay(event.target)),
settings.hideflash &&
$("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css(
"visibility",
"hidden"
),
_checkPosition($(pp_images).size()),
$(".pp_loaderIcon").show(),
settings.deeplinking && setHashtag(),
settings.social_tools &&
((facebook_like_link = settings.social_tools.replace(
"{location_href}",
encodeURIComponent(location.href)
)),
$pp_pic_holder.find(".pp_social").html(facebook_like_link)),
$ppt.is(":hidden") && $ppt.css("opacity", 0).show(),
$pp_overlay
.show()
.fadeTo(settings.animation_speed, settings.opacity),
$pp_pic_holder
.find(".currentTextHolder")
.text(
set_position +
1 +
settings.counter_separator_label +
$(pp_images).size()
),
"undefined" != typeof pp_descriptions[set_position] &&
"" != pp_descriptions[set_position]
? $pp_pic_holder
.find(".pp_description")
.show()
.html(unescape(pp_descriptions[set_position]))
: $pp_pic_holder.find(".pp_description").hide(),
(movie_width = parseFloat(
getParam("width", pp_images[set_position])
)
? getParam("width", pp_images[set_position])
: settings.default_width.toString()),
(movie_height = parseFloat(
getParam("height", pp_images[set_position])
)
? getParam("height", pp_images[set_position])
: settings.default_height.toString()),
(percentBased = !1),
-1 != movie_height.indexOf("%") &&
((movie_height = parseFloat(
($(window).height() * parseFloat(movie_height)) / 100 - 150
)),
(percentBased = !0)),
-1 != movie_width.indexOf("%") &&
((movie_width = parseFloat(
($(window).width() * parseFloat(movie_width)) / 100 - 150
)),
(percentBased = !0)),
$pp_pic_holder.fadeIn(function () {
switch (
(settings.show_title &&
"" != pp_titles[set_position] &&
"undefined" != typeof pp_titles[set_position]
? $ppt.html(unescape(pp_titles[set_position]))
: $ppt.html("&nbsp;"),
(imgPreloader = ""),
(skipInjection = !1),
_getFileType(pp_images[set_position]))
) {
case "image":
(imgPreloader = new Image()),
(nextImage = new Image()),
isSet &&
set_position < $(pp_images).size() - 1 &&
(nextImage.src = pp_images[set_position + 1]),
(prevImage = new Image()),
isSet &&
pp_images[set_position - 1] &&
(prevImage.src = pp_images[set_position - 1]),
($pp_pic_holder.find("#pp_full_res")[0].innerHTML =
settings.image_markup.replace(
/{path}/g,
pp_images[set_position]
)),
(imgPreloader.onload = function () {
(pp_dimensions = _fitToViewport(
imgPreloader.width,
imgPreloader.height
)),
_showContent();
}),
(imgPreloader.onerror = function () {
alert(
"Image cannot be loaded. Make sure the path is correct and image exist."
),
$.prettyPhoto.close();
}),
(imgPreloader.src = pp_images[set_position]);
break;
case "youtube":
(pp_dimensions = _fitToViewport(movie_width, movie_height)),
(movie_id = getParam("v", pp_images[set_position])),
"" == movie_id &&
((movie_id = pp_images[set_position].split("youtu.be/")),
(movie_id = movie_id[1]),
movie_id.indexOf("?") > 0 &&
(movie_id = movie_id.substr(0, movie_id.indexOf("?"))),
movie_id.indexOf("&") > 0 &&
(movie_id = movie_id.substr(0, movie_id.indexOf("&")))),
(movie = "http://www.youtube.com/embed/" + movie_id),
getParam("rel", pp_images[set_position])
? (movie +=
"?rel=" + getParam("rel", pp_images[set_position]))
: (movie += "?rel=1"),
settings.autoplay && (movie += "&autoplay=1"),
(toInject = settings.iframe_markup
.replace(/{width}/g, pp_dimensions.width)
.replace(/{height}/g, pp_dimensions.height)
.replace(/{wmode}/g, settings.wmode)
.replace(/{path}/g, movie));
break;
case "vimeo":
(pp_dimensions = _fitToViewport(movie_width, movie_height)),
(movie_id = pp_images[set_position]);
var regExp = /http(s?):\/\/(www\.)?vimeo.com\/(\d+)/,
match = movie_id.match(regExp);
(movie =
"http://player.vimeo.com/video/" +
match[3] +
"?title=0&amp;byline=0&amp;portrait=0"),
settings.autoplay && (movie += "&autoplay=1;"),
(vimeo_width =
pp_dimensions.width +
"/embed/?moog_width=" +
pp_dimensions.width),
(toInject = settings.iframe_markup
.replace(/{width}/g, vimeo_width)
.replace(/{height}/g, pp_dimensions.height)
.replace(/{path}/g, movie));
break;
case "quicktime":
(pp_dimensions = _fitToViewport(movie_width, movie_height)),
(pp_dimensions.height += 15),
(pp_dimensions.contentHeight += 15),
(pp_dimensions.containerHeight += 15),
(toInject = settings.quicktime_markup
.replace(/{width}/g, pp_dimensions.width)
.replace(/{height}/g, pp_dimensions.height)
.replace(/{wmode}/g, settings.wmode)
.replace(/{path}/g, pp_images[set_position])
.replace(/{autoplay}/g, settings.autoplay));
break;
case "flash":
(pp_dimensions = _fitToViewport(movie_width, movie_height)),
(flash_vars = pp_images[set_position]),
(flash_vars = flash_vars.substring(
pp_images[set_position].indexOf("flashvars") + 10,
pp_images[set_position].length
)),
(filename = pp_images[set_position]),
(filename = filename.substring(0, filename.indexOf("?"))),
(toInject = settings.flash_markup
.replace(/{width}/g, pp_dimensions.width)
.replace(/{height}/g, pp_dimensions.height)
.replace(/{wmode}/g, settings.wmode)
.replace(/{path}/g, filename + "?" + flash_vars));
break;
case "iframe":
(pp_dimensions = _fitToViewport(movie_width, movie_height)),
(frame_url = pp_images[set_position]),
(frame_url = frame_url.substr(
0,
frame_url.indexOf("iframe") - 1
)),
(toInject = settings.iframe_markup
.replace(/{width}/g, pp_dimensions.width)
.replace(/{height}/g, pp_dimensions.height)
.replace(/{path}/g, frame_url));
break;
case "ajax":
(doresize = !1),
(pp_dimensions = _fitToViewport(movie_width, movie_height)),
(doresize = !0),
(skipInjection = !0),
$.get(pp_images[set_position], function (responseHTML) {
(toInject = settings.inline_markup.replace(
/{content}/g,
responseHTML
)),
($pp_pic_holder.find("#pp_full_res")[0].innerHTML =
toInject),
_showContent();
});
break;
case "custom":
(pp_dimensions = _fitToViewport(movie_width, movie_height)),
(toInject = settings.custom_markup);
break;
case "inline":
(myClone = $(pp_images[set_position])
.clone()
.append('<br clear="all" />')
.css({ width: settings.default_width })
.wrapInner(
'<div id="pp_full_res"><div class="pp_inline"></div></div>'
)
.appendTo($("body"))
.show()),
(doresize = !1),
(pp_dimensions = _fitToViewport(
$(myClone).width(),
$(myClone).height()
)),
(doresize = !0),
$(myClone).remove(),
(toInject = settings.inline_markup.replace(
/{content}/g,
$(pp_images[set_position]).html()
));
}
imgPreloader ||
skipInjection ||
(($pp_pic_holder.find("#pp_full_res")[0].innerHTML = toInject),
_showContent());
}),
!1
);
}),
($.prettyPhoto.changePage = function (direction) {
(currentGalleryPage = 0),
"previous" == direction
? (set_position--,
set_position < 0 && (set_position = $(pp_images).size() - 1))
: "next" == direction
? (set_position++,
set_position > $(pp_images).size() - 1 && (set_position = 0))
: (set_position = direction),
(rel_index = set_position),
doresize || (doresize = !0),
settings.allow_expand &&
$(".pp_contract")
.removeClass("pp_contract")
.addClass("pp_expand"),
_hideContent(function () {
$.prettyPhoto.open();
});
}),
($.prettyPhoto.changeGalleryPage = function (direction) {
"next" == direction
? (currentGalleryPage++,
currentGalleryPage > totalPage && (currentGalleryPage = 0))
: "previous" == direction
? (currentGalleryPage--,
currentGalleryPage < 0 && (currentGalleryPage = totalPage))
: (currentGalleryPage = direction),
(slide_speed =
"next" == direction || "previous" == direction
? settings.animation_speed
: 0),
(slide_to = currentGalleryPage * (itemsPerPage * itemWidth)),
$pp_gallery.find("ul").animate({ left: -slide_to }, slide_speed);
}),
($.prettyPhoto.startSlideshow = function () {
"undefined" == typeof pp_slideshow
? ($pp_pic_holder
.find(".pp_play")
.unbind("click")
.removeClass("pp_play")
.addClass("pp_pause")
.click(function () {
return $.prettyPhoto.stopSlideshow(), !1;
}),
(pp_slideshow = setInterval(
$.prettyPhoto.startSlideshow,
settings.slideshow
)))
: $.prettyPhoto.changePage("next");
}),
($.prettyPhoto.stopSlideshow = function () {
$pp_pic_holder
.find(".pp_pause")
.unbind("click")
.removeClass("pp_pause")
.addClass("pp_play")
.click(function () {
return $.prettyPhoto.startSlideshow(), !1;
}),
clearInterval(pp_slideshow),
(pp_slideshow = void 0);
}),
($.prettyPhoto.close = function () {
$pp_overlay.is(":animated") ||
($.prettyPhoto.stopSlideshow(),
$pp_pic_holder
.stop()
.find("object,embed")
.css("visibility", "hidden"),
$("div.pp_pic_holder,div.ppt,.pp_fade").fadeOut(
settings.animation_speed,
function () {
$(this).remove();
}
),
$pp_overlay.fadeOut(settings.animation_speed, function () {
settings.hideflash &&
$("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css(
"visibility",
"visible"
),
$(this).remove(),
$(window).unbind("scroll.prettyphoto"),
clearHashtag(),
settings.callback(),
(doresize = !0),
(pp_open = !1),
delete settings;
}));
}),
!pp_alreadyInitialized &&
getHashtag() &&
((pp_alreadyInitialized = !0),
(hashIndex = getHashtag()),
(hashRel = hashIndex),
(hashIndex = hashIndex.substring(
hashIndex.indexOf("/") + 1,
hashIndex.length - 1
)),
(hashRel = hashRel.substring(0, hashRel.indexOf("/"))),
setTimeout(function () {
$(
"a[" +
pp_settings.hook +
"^='" +
hashRel +
"']:eq(" +
hashIndex +
")"
).trigger("click");
}, 50)),
this.unbind("click.prettyphoto").bind(
"click.prettyphoto",
$.prettyPhoto.initialize
)
);
});
})(jQuery);
var pp_alreadyInitialized = !1;

637
public/js/lightbox.js Normal file
View File

@@ -0,0 +1,637 @@
/*!
* Lightbox v2.11.4
* by Lokesh Dhakar
*
* More info:
* http://lokeshdhakar.com/projects/lightbox2/
*
* Copyright Lokesh Dhakar
* Released under the MIT license
* https://github.com/lokesh/lightbox2/blob/master/LICENSE
*
* @preserve
*/
// Uses Node, AMD or browser globals to create a module.
(function (root, factory) {
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define(["jquery"], factory);
} else if (typeof exports === "object") {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
// Browser globals (root is window)
root.lightbox = factory(root.jQuery);
}
})(this, function ($) {
function Lightbox(options) {
this.album = [];
this.currentImageIndex = void 0;
this.init();
// options
this.options = $.extend({}, this.constructor.defaults);
this.option(options);
}
// Descriptions of all options available on the demo site:
// http://lokeshdhakar.com/projects/lightbox2/index.html#options
Lightbox.defaults = {
albumLabel: "Image %1 of %2",
alwaysShowNavOnTouchDevices: false,
fadeDuration: 600,
fitImagesInViewport: true,
imageFadeDuration: 600,
// maxWidth: 800,
// maxHeight: 600,
positionFromTop: 50,
resizeDuration: 700,
showImageNumberLabel: true,
wrapAround: false,
disableScrolling: false,
/*
Sanitize Title
If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
This will free you to add html tags, such as links, in the caption.
If the caption data is user submitted or from some other untrusted source, then set this to true
to prevent xss and other injection attacks.
*/
sanitizeTitle: false,
};
Lightbox.prototype.option = function (options) {
$.extend(this.options, options);
};
Lightbox.prototype.imageCountLabel = function (currentImageNum, totalImages) {
return this.options.albumLabel
.replace(/%1/g, currentImageNum)
.replace(/%2/g, totalImages);
};
Lightbox.prototype.init = function () {
var self = this;
// Both enable and build methods require the body tag to be in the DOM.
$(document).ready(function () {
self.enable();
self.build();
});
};
// Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
// that contain 'lightbox'. When these are clicked, start lightbox.
Lightbox.prototype.enable = function () {
var self = this;
$("body").on(
"click",
"a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]",
function (event) {
self.start($(event.currentTarget));
return false;
}
);
};
// Build html for the lightbox and the overlay.
// Attach event handlers to the new DOM elements. click click click
Lightbox.prototype.build = function () {
if ($("#lightbox").length > 0) {
return;
}
var self = this;
// The two root notes generated, #lightboxOverlay and #lightbox are given
// tabindex attrs so they are focusable. We attach our keyboard event
// listeners to these two elements, and not the document. Clicking anywhere
// while Lightbox is opened will keep the focus on or inside one of these
// two elements.
//
// We do this so we can prevent propogation of the Esc keypress when
// Lightbox is open. This prevents it from intefering with other components
// on the page below.
//
// Github issue: https://github.com/lokesh/lightbox2/issues/663
$(
'<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" role="button" tabindex="0" aria-label="Previous image" href="" ></a><a class="lb-next" role="button" tabindex="0" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel" role="button" tabindex="0"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close" role="button" tabindex="0"></a></div></div></div></div>'
).appendTo($("body"));
// Cache jQuery objects
this.$lightbox = $("#lightbox");
this.$overlay = $("#lightboxOverlay");
this.$outerContainer = this.$lightbox.find(".lb-outerContainer");
this.$container = this.$lightbox.find(".lb-container");
this.$image = this.$lightbox.find(".lb-image");
this.$nav = this.$lightbox.find(".lb-nav");
// Store css values for future lookup
this.containerPadding = {
top: parseInt(this.$container.css("padding-top"), 10),
right: parseInt(this.$container.css("padding-right"), 10),
bottom: parseInt(this.$container.css("padding-bottom"), 10),
left: parseInt(this.$container.css("padding-left"), 10),
};
this.imageBorderWidth = {
top: parseInt(this.$image.css("border-top-width"), 10),
right: parseInt(this.$image.css("border-right-width"), 10),
bottom: parseInt(this.$image.css("border-bottom-width"), 10),
left: parseInt(this.$image.css("border-left-width"), 10),
};
// Attach event handlers to the newly minted DOM elements
this.$overlay.hide().on("click", function () {
self.end();
return false;
});
this.$lightbox.hide().on("click", function (event) {
if ($(event.target).attr("id") === "lightbox") {
self.end();
}
});
this.$outerContainer.on("click", function (event) {
if ($(event.target).attr("id") === "lightbox") {
self.end();
}
return false;
});
this.$lightbox.find(".lb-prev").on("click", function () {
if (self.currentImageIndex === 0) {
self.changeImage(self.album.length - 1);
} else {
self.changeImage(self.currentImageIndex - 1);
}
return false;
});
this.$lightbox.find(".lb-next").on("click", function () {
if (self.currentImageIndex === self.album.length - 1) {
self.changeImage(0);
} else {
self.changeImage(self.currentImageIndex + 1);
}
return false;
});
/*
Show context menu for image on right-click
There is a div containing the navigation that spans the entire image and lives above of it. If
you right-click, you are right clicking this div and not the image. This prevents users from
saving the image or using other context menu actions with the image.
To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
set pointer-events to none on the nav div. This is so that the upcoming right-click event on
the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
we set the pointer events back to auto for the nav div so it can capture hover and left-click
events as usual.
*/
this.$nav.on("mousedown", function (event) {
if (event.which === 3) {
self.$nav.css("pointer-events", "none");
self.$lightbox.one("contextmenu", function () {
setTimeout(
function () {
this.$nav.css("pointer-events", "auto");
}.bind(self),
0
);
});
}
});
this.$lightbox
.find(".lb-loader, .lb-close")
.on("click keyup", function (e) {
// If mouse click OR 'enter' or 'space' keypress, close LB
if (
e.type === "click" ||
(e.type === "keyup" && (e.which === 13 || e.which === 32))
) {
self.end();
return false;
}
});
};
// Show overlay and lightbox. If the image is part of a set, add siblings to album array.
Lightbox.prototype.start = function ($link) {
var self = this;
var $window = $(window);
$window.on("resize", $.proxy(this.sizeOverlay, this));
this.sizeOverlay();
this.album = [];
var imageNumber = 0;
function addToAlbum($link) {
self.album.push({
alt: $link.attr("data-alt"),
link: $link.attr("href"),
title: $link.attr("data-title") || $link.attr("title"),
});
}
// Support both data-lightbox attribute and rel attribute implementations
var dataLightboxValue = $link.attr("data-lightbox");
var $links;
if (dataLightboxValue) {
$links = $(
$link.prop("tagName") + '[data-lightbox="' + dataLightboxValue + '"]'
);
for (var i = 0; i < $links.length; i = ++i) {
addToAlbum($($links[i]));
if ($links[i] === $link[0]) {
imageNumber = i;
}
}
} else {
if ($link.attr("rel") === "lightbox") {
// If image is not part of a set
addToAlbum($link);
} else {
// If image is part of a set
$links = $($link.prop("tagName") + '[rel="' + $link.attr("rel") + '"]');
for (var j = 0; j < $links.length; j = ++j) {
addToAlbum($($links[j]));
if ($links[j] === $link[0]) {
imageNumber = j;
}
}
}
}
// Position Lightbox
var top = $window.scrollTop() + this.options.positionFromTop;
var left = $window.scrollLeft();
this.$lightbox
.css({
top: top + "px",
left: left + "px",
})
.fadeIn(this.options.fadeDuration);
// Disable scrolling of the page while open
if (this.options.disableScrolling) {
$("body").addClass("lb-disable-scrolling");
}
this.changeImage(imageNumber);
};
// Hide most UI elements in preparation for the animated resizing of the lightbox.
Lightbox.prototype.changeImage = function (imageNumber) {
var self = this;
var filename = this.album[imageNumber].link;
var filetype = filename.split(".").slice(-1)[0];
var $image = this.$lightbox.find(".lb-image");
// Disable keyboard nav during transitions
this.disableKeyboardNav();
// Show loading state
this.$overlay.fadeIn(this.options.fadeDuration);
$(".lb-loader").fadeIn("slow");
this.$lightbox
.find(
".lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption"
)
.hide();
this.$outerContainer.addClass("animating");
// When image to show is preloaded, we send the width and height to sizeContainer()
var preloader = new Image();
preloader.onload = function () {
var $preloader;
var imageHeight;
var imageWidth;
var maxImageHeight;
var maxImageWidth;
var windowHeight;
var windowWidth;
$image.attr({
alt: self.album[imageNumber].alt,
src: filename,
});
$preloader = $(preloader);
$image.width(preloader.width);
$image.height(preloader.height);
var aspectRatio = preloader.width / preloader.height;
windowWidth = $(window).width();
windowHeight = $(window).height();
// Calculate the max image dimensions for the current viewport.
// Take into account the border around the image and an additional 10px gutter on each side.
maxImageWidth =
windowWidth -
self.containerPadding.left -
self.containerPadding.right -
self.imageBorderWidth.left -
self.imageBorderWidth.right -
20;
maxImageHeight =
windowHeight -
self.containerPadding.top -
self.containerPadding.bottom -
self.imageBorderWidth.top -
self.imageBorderWidth.bottom -
self.options.positionFromTop -
70;
/*
Since many SVGs have small intrinsic dimensions, but they support scaling
up without quality loss because of their vector format, max out their
size inside the viewport.
*/
if (filetype === "svg") {
if (aspectRatio >= 1) {
imageWidth = maxImageWidth;
imageHeight = parseInt(maxImageWidth / aspectRatio, 10);
} else {
imageWidth = parseInt(maxImageHeight / aspectRatio, 10);
imageHeight = maxImageHeight;
}
$image.width(imageWidth);
$image.height(imageHeight);
} else {
// Fit image inside the viewport.
if (self.options.fitImagesInViewport) {
// Check if image size is larger then maxWidth|maxHeight in settings
if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
maxImageWidth = self.options.maxWidth;
}
if (
self.options.maxHeight &&
self.options.maxHeight < maxImageHeight
) {
maxImageHeight = self.options.maxHeight;
}
} else {
maxImageWidth =
self.options.maxWidth || preloader.width || maxImageWidth;
maxImageHeight =
self.options.maxHeight || preloader.height || maxImageHeight;
}
// Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
// option than we need to size down while maintaining the aspect ratio.
if (
preloader.width > maxImageWidth ||
preloader.height > maxImageHeight
) {
if (
preloader.width / maxImageWidth >
preloader.height / maxImageHeight
) {
imageWidth = maxImageWidth;
imageHeight = parseInt(
preloader.height / (preloader.width / imageWidth),
10
);
$image.width(imageWidth);
$image.height(imageHeight);
} else {
imageHeight = maxImageHeight;
imageWidth = parseInt(
preloader.width / (preloader.height / imageHeight),
10
);
$image.width(imageWidth);
$image.height(imageHeight);
}
}
}
self.sizeContainer($image.width(), $image.height());
};
// Preload image before showing
preloader.src = this.album[imageNumber].link;
this.currentImageIndex = imageNumber;
};
// Stretch overlay to fit the viewport
Lightbox.prototype.sizeOverlay = function () {
var self = this;
/*
We use a setTimeout 0 to pause JS execution and let the rendering catch-up.
Why do this? If the `disableScrolling` option is set to true, a class is added to the body
tag that disables scrolling and hides the scrollbar. We want to make sure the scrollbar is
hidden before we measure the document width, as the presence of the scrollbar will affect the
number.
*/
setTimeout(function () {
self.$overlay.width($(document).width()).height($(document).height());
}, 0);
};
// Animate the size of the lightbox to fit the image we are showing
// This method also shows the the image.
Lightbox.prototype.sizeContainer = function (imageWidth, imageHeight) {
var self = this;
var oldWidth = this.$outerContainer.outerWidth();
var oldHeight = this.$outerContainer.outerHeight();
var newWidth =
imageWidth +
this.containerPadding.left +
this.containerPadding.right +
this.imageBorderWidth.left +
this.imageBorderWidth.right;
var newHeight =
imageHeight +
this.containerPadding.top +
this.containerPadding.bottom +
this.imageBorderWidth.top +
this.imageBorderWidth.bottom;
function postResize() {
self.$lightbox.find(".lb-dataContainer").width(newWidth);
self.$lightbox.find(".lb-prevLink").height(newHeight);
self.$lightbox.find(".lb-nextLink").height(newHeight);
// Set focus on one of the two root nodes so keyboard events are captured.
self.$overlay.trigger("focus");
self.showImage();
}
if (oldWidth !== newWidth || oldHeight !== newHeight) {
this.$outerContainer.animate(
{
width: newWidth,
height: newHeight,
},
this.options.resizeDuration,
"swing",
function () {
postResize();
}
);
} else {
postResize();
}
};
// Display the image and its details and begin preload neighboring images.
Lightbox.prototype.showImage = function () {
this.$lightbox.find(".lb-loader").stop(true).hide();
this.$lightbox.find(".lb-image").fadeIn(this.options.imageFadeDuration);
this.updateNav();
this.updateDetails();
this.preloadNeighboringImages();
this.enableKeyboardNav();
};
// Display previous and next navigation if appropriate.
Lightbox.prototype.updateNav = function () {
// Check to see if the browser supports touch events. If so, we take the conservative approach
// and assume that mouse hover events are not supported and always show prev/next navigation
// arrows in image sets.
var alwaysShowNav = false;
try {
document.createEvent("TouchEvent");
alwaysShowNav = this.options.alwaysShowNavOnTouchDevices ? true : false;
} catch (e) {}
this.$lightbox.find(".lb-nav").show();
if (this.album.length > 1) {
if (this.options.wrapAround) {
if (alwaysShowNav) {
this.$lightbox.find(".lb-prev, .lb-next").css("opacity", "1");
}
this.$lightbox.find(".lb-prev, .lb-next").show();
} else {
if (this.currentImageIndex > 0) {
this.$lightbox.find(".lb-prev").show();
if (alwaysShowNav) {
this.$lightbox.find(".lb-prev").css("opacity", "1");
}
}
if (this.currentImageIndex < this.album.length - 1) {
this.$lightbox.find(".lb-next").show();
if (alwaysShowNav) {
this.$lightbox.find(".lb-next").css("opacity", "1");
}
}
}
}
};
// Display caption, image number, and closing button.
Lightbox.prototype.updateDetails = function () {
var self = this;
// Enable anchor clicks in the injected caption html.
// Thanks Nate Wright for the fix. @https://github.com/NateWr
if (
typeof this.album[this.currentImageIndex].title !== "undefined" &&
this.album[this.currentImageIndex].title !== ""
) {
var $caption = this.$lightbox.find(".lb-caption");
if (this.options.sanitizeTitle) {
$caption.text(this.album[this.currentImageIndex].title);
} else {
$caption.html(this.album[this.currentImageIndex].title);
}
$caption.fadeIn("fast");
}
if (this.album.length > 1 && this.options.showImageNumberLabel) {
var labelText = this.imageCountLabel(
this.currentImageIndex + 1,
this.album.length
);
this.$lightbox.find(".lb-number").text(labelText).fadeIn("fast");
} else {
this.$lightbox.find(".lb-number").hide();
}
this.$outerContainer.removeClass("animating");
this.$lightbox
.find(".lb-dataContainer")
.fadeIn(this.options.resizeDuration, function () {
return self.sizeOverlay();
});
};
// Preload previous and next images in set.
Lightbox.prototype.preloadNeighboringImages = function () {
if (this.album.length > this.currentImageIndex + 1) {
var preloadNext = new Image();
preloadNext.src = this.album[this.currentImageIndex + 1].link;
}
if (this.currentImageIndex > 0) {
var preloadPrev = new Image();
preloadPrev.src = this.album[this.currentImageIndex - 1].link;
}
};
Lightbox.prototype.enableKeyboardNav = function () {
this.$lightbox.on("keyup.keyboard", $.proxy(this.keyboardAction, this));
this.$overlay.on("keyup.keyboard", $.proxy(this.keyboardAction, this));
};
Lightbox.prototype.disableKeyboardNav = function () {
this.$lightbox.off(".keyboard");
this.$overlay.off(".keyboard");
};
Lightbox.prototype.keyboardAction = function (event) {
var KEYCODE_ESC = 27;
var KEYCODE_LEFTARROW = 37;
var KEYCODE_RIGHTARROW = 39;
var keycode = event.keyCode;
if (keycode === KEYCODE_ESC) {
// Prevent bubbling so as to not affect other components on the page.
event.stopPropagation();
this.end();
} else if (keycode === KEYCODE_LEFTARROW) {
if (this.currentImageIndex !== 0) {
this.changeImage(this.currentImageIndex - 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(this.album.length - 1);
}
} else if (keycode === KEYCODE_RIGHTARROW) {
if (this.currentImageIndex !== this.album.length - 1) {
this.changeImage(this.currentImageIndex + 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(0);
}
}
};
// Closing time. :-(
Lightbox.prototype.end = function () {
this.disableKeyboardNav();
$(window).off("resize", this.sizeOverlay);
this.$lightbox.fadeOut(this.options.fadeDuration);
this.$overlay.fadeOut(this.options.fadeDuration);
if (this.options.disableScrolling) {
$("body").removeClass("lb-disable-scrolling");
}
};
return new Lightbox();
});

1447
public/js/modernizr.js Normal file

File diff suppressed because it is too large Load Diff

2054
public/js/owl.carousel.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

126
public/js/retina.min.js vendored Normal file
View File

@@ -0,0 +1,126 @@
/*!
* Retina.js v1.3.0
*
* Copyright 2014 Imulus, LLC
* Released under the MIT license
*
* Retina.js is an open source script that makes it easy to serve
* high-resolution images to devices with retina displays.
*/
!(function () {
function a() {}
function b(a) {
return f.retinaImageSuffix + a;
}
function c(a, c) {
if (((this.path = a || ""), "undefined" != typeof c && null !== c))
(this.at_2x_path = c), (this.perform_check = !1);
else {
if (void 0 !== document.createElement) {
var d = document.createElement("a");
(d.href = this.path),
(d.pathname = d.pathname.replace(g, b)),
(this.at_2x_path = d.href);
} else {
var e = this.path.split("?");
(e[0] = e[0].replace(g, b)), (this.at_2x_path = e.join("?"));
}
this.perform_check = !0;
}
}
function d(a) {
(this.el = a),
(this.path = new c(
this.el.getAttribute("src"),
this.el.getAttribute("data-at2x")
));
var b = this;
this.path.check_2x_variant(function (a) {
a && b.swap();
});
}
var e = "undefined" == typeof exports ? window : exports,
f = {
retinaImageSuffix: "@2x",
check_mime_type: !0,
force_original_dimensions: !0,
};
(e.Retina = a),
(a.configure = function (a) {
null === a && (a = {});
for (var b in a) a.hasOwnProperty(b) && (f[b] = a[b]);
}),
(a.init = function (a) {
null === a && (a = e);
var b = a.onload || function () {};
a.onload = function () {
var a,
c,
e = document.getElementsByTagName("img"),
f = [];
for (a = 0; a < e.length; a += 1)
(c = e[a]), c.getAttributeNode("data-no-retina") || f.push(new d(c));
b();
};
}),
(a.isRetina = function () {
var a =
"(-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-resolution: 1.5dppx)";
return e.devicePixelRatio > 1
? !0
: e.matchMedia && e.matchMedia(a).matches
? !0
: !1;
});
var g = /\.\w+$/;
(e.RetinaImagePath = c),
(c.confirmed_paths = []),
(c.prototype.is_external = function () {
return !(
!this.path.match(/^https?\:/i) ||
this.path.match("//" + document.domain)
);
}),
(c.prototype.check_2x_variant = function (a) {
var b,
d = this;
return this.is_external()
? a(!1)
: this.perform_check ||
"undefined" == typeof this.at_2x_path ||
null === this.at_2x_path
? this.at_2x_path in c.confirmed_paths
? a(!0)
: ((b = new XMLHttpRequest()),
b.open("HEAD", this.at_2x_path),
(b.onreadystatechange = function () {
if (4 !== b.readyState) return a(!1);
if (b.status >= 200 && b.status <= 399) {
if (f.check_mime_type) {
var e = b.getResponseHeader("Content-Type");
if (null === e || !e.match(/^image/i)) return a(!1);
}
return c.confirmed_paths.push(d.at_2x_path), a(!0);
}
return a(!1);
}),
b.send(),
void 0)
: a(!0);
}),
(e.RetinaImage = d),
(d.prototype.swap = function (a) {
function b() {
c.el.complete
? (f.force_original_dimensions &&
(c.el.setAttribute("width", c.el.offsetWidth),
c.el.setAttribute("height", c.el.offsetHeight)),
c.el.setAttribute("src", a))
: setTimeout(b, 5);
}
"undefined" == typeof a && (a = this.path.at_2x_path);
var c = this;
b();
}),
a.isRetina() && a.init(e);
})();