Merge again
This commit is contained in:
commit
eac4944429
31
.htaccess
31
.htaccess
|
@ -25,6 +25,37 @@ RewriteRule ^download/(\d*)/.*\.kepub\.epub$ fetch.php?data=$1&type=epub [L]
|
||||||
RewriteRule ^download/(\d*)/.*\.(.*)$ fetch.php?data=$1&type=$2 [L]
|
RewriteRule ^download/(\d*)/.*\.(.*)$ fetch.php?data=$1&type=$2 [L]
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
|
<IfModule mod_expires.c>
|
||||||
|
ExpiresActive on
|
||||||
|
|
||||||
|
# Data
|
||||||
|
ExpiresByType text/xml "access plus 0 seconds"
|
||||||
|
ExpiresByType application/xml "access plus 0 seconds"
|
||||||
|
ExpiresByType application/json "access plus 0 seconds"
|
||||||
|
ExpiresByType application/xhtml+xml "access plus 0 seconds"
|
||||||
|
|
||||||
|
# Favicon (cannot be renamed)
|
||||||
|
ExpiresByType image/x-icon "access plus 1 week"
|
||||||
|
|
||||||
|
# Media: images
|
||||||
|
ExpiresByType image/png "access plus 1 month"
|
||||||
|
ExpiresByType image/jpg "access plus 1 month"
|
||||||
|
ExpiresByType image/jpeg "access plus 1 month"
|
||||||
|
|
||||||
|
# Webfonts
|
||||||
|
ExpiresByType font/truetype "access plus 1 month"
|
||||||
|
ExpiresByType font/opentype "access plus 1 month"
|
||||||
|
ExpiresByType application/x-font-woff "access plus 1 month"
|
||||||
|
ExpiresByType image/svg+xml "access plus 1 month"
|
||||||
|
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
|
||||||
|
|
||||||
|
# CSS and JavaScript
|
||||||
|
ExpiresByType text/css "access plus 1 year"
|
||||||
|
ExpiresByType application/javascript "access plus 1 year"
|
||||||
|
ExpiresByType text/javascript "access plus 1 year"
|
||||||
|
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
###########################################
|
###########################################
|
||||||
# Uncomment if you wish to protect access with a password
|
# Uncomment if you wish to protect access with a password
|
||||||
###########################################
|
###########################################
|
||||||
|
|
27
base.php
27
base.php
|
@ -11,7 +11,7 @@ define ("DB", "db");
|
||||||
date_default_timezone_set($config['default_timezone']);
|
date_default_timezone_set($config['default_timezone']);
|
||||||
|
|
||||||
function getURLParam ($name, $default = NULL) {
|
function getURLParam ($name, $default = NULL) {
|
||||||
if (!empty ($_GET) && isset($_GET[$name])) {
|
if (!empty ($_GET) && isset($_GET[$name]) && $_GET[$name] != "") {
|
||||||
return $_GET[$name];
|
return $_GET[$name];
|
||||||
}
|
}
|
||||||
return $default;
|
return $default;
|
||||||
|
@ -208,7 +208,7 @@ class Link
|
||||||
}
|
}
|
||||||
|
|
||||||
public function hrefXhtml () {
|
public function hrefXhtml () {
|
||||||
return str_replace ("&", "&", $this->href);
|
return $this->href;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,7 +218,7 @@ class LinkNavigation extends Link
|
||||||
parent::__construct ($phref, Link::OPDS_NAVIGATION_TYPE, $prel, $ptitle);
|
parent::__construct ($phref, Link::OPDS_NAVIGATION_TYPE, $prel, $ptitle);
|
||||||
if (!is_null (GetUrlParam (DB))) $this->href = addURLParameter ($this->href, DB, GetUrlParam (DB));
|
if (!is_null (GetUrlParam (DB))) $this->href = addURLParameter ($this->href, DB, GetUrlParam (DB));
|
||||||
if (!preg_match ("#^\?(.*)#", $this->href) && !empty ($this->href)) $this->href = "?" . $this->href;
|
if (!preg_match ("#^\?(.*)#", $this->href) && !empty ($this->href)) $this->href = "?" . $this->href;
|
||||||
if (preg_match ("/bookdetail.php/", $_SERVER["SCRIPT_NAME"])) {
|
if (preg_match ("/(bookdetail|getJSON).php/", $_SERVER["SCRIPT_NAME"])) {
|
||||||
$this->href = "index.php" . $this->href;
|
$this->href = "index.php" . $this->href;
|
||||||
} else {
|
} else {
|
||||||
$this->href = $_SERVER["SCRIPT_NAME"] . $this->href;
|
$this->href = $_SERVER["SCRIPT_NAME"] . $this->href;
|
||||||
|
@ -266,6 +266,16 @@ class Entry
|
||||||
return date (DATE_ATOM, self::$updated);
|
return date (DATE_ATOM, self::$updated);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getContentArray () {
|
||||||
|
$navlink = "#";
|
||||||
|
foreach ($this->linkArray as $link) {
|
||||||
|
if ($link->type != Link::OPDS_NAVIGATION_TYPE) { continue; }
|
||||||
|
|
||||||
|
$navlink = $link->hrefXhtml ();
|
||||||
|
}
|
||||||
|
return array ( "title" => $this->title, "content" => $this->content, "navlink" => $navlink );
|
||||||
|
}
|
||||||
|
|
||||||
public function __construct($ptitle, $pid, $pcontent, $pcontentType, $plinkArray) {
|
public function __construct($ptitle, $pid, $pcontent, $pcontentType, $plinkArray) {
|
||||||
global $config;
|
global $config;
|
||||||
$this->title = $ptitle;
|
$this->title = $ptitle;
|
||||||
|
@ -299,6 +309,12 @@ class EntryBook extends Entry
|
||||||
$this->localUpdated = $pbook->timestamp;
|
$this->localUpdated = $pbook->timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getContentArray () {
|
||||||
|
$entry = array ( "title" => $this->title);
|
||||||
|
$entry ["book"] = $this->book->getContentArray ();
|
||||||
|
return $entry;
|
||||||
|
}
|
||||||
|
|
||||||
public function getCoverThumbnail () {
|
public function getCoverThumbnail () {
|
||||||
foreach ($this->linkArray as $link) {
|
foreach ($this->linkArray as $link) {
|
||||||
if ($link->rel == Link::OPDS_THUMBNAIL_TYPE)
|
if ($link->rel == Link::OPDS_THUMBNAIL_TYPE)
|
||||||
|
@ -325,6 +341,7 @@ class Page
|
||||||
public $query;
|
public $query;
|
||||||
public $favicon;
|
public $favicon;
|
||||||
public $n;
|
public $n;
|
||||||
|
public $book;
|
||||||
public $totalNumber = -1;
|
public $totalNumber = -1;
|
||||||
public $entryArray = array();
|
public $entryArray = array();
|
||||||
|
|
||||||
|
@ -660,8 +677,8 @@ class PageBookDetail extends Page
|
||||||
{
|
{
|
||||||
public function InitializeContent ()
|
public function InitializeContent ()
|
||||||
{
|
{
|
||||||
$book = Book::getBookById ($this->idGet);
|
$this->book = Book::getBookById ($this->idGet);
|
||||||
$this->title = $book->title;
|
$this->title = $this->book->title;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
76
book.php
76
book.php
|
@ -102,16 +102,78 @@ class Book extends Base {
|
||||||
return "?page=".parent::PAGE_BOOK_DETAIL."&id=$this->id";
|
return "?page=".parent::PAGE_BOOK_DETAIL."&id=$this->id";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getContentArray () {
|
||||||
|
global $config;
|
||||||
|
$i = 0;
|
||||||
|
$preferedData = array ();
|
||||||
|
foreach ($config['cops_prefered_format'] as $format)
|
||||||
|
{
|
||||||
|
if ($i == 2) { break; }
|
||||||
|
if ($data = $this->getDataFormat ($format)) {
|
||||||
|
$i++;
|
||||||
|
array_push ($preferedData, array ("url" => $data->getHtmlLink (), "name" => $format));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$serie = $this->getSerie ();
|
||||||
|
if (is_null ($serie)) {
|
||||||
|
$sn = "";
|
||||||
|
$scn = "";
|
||||||
|
$su = "";
|
||||||
|
} else {
|
||||||
|
$sn = $serie->name;
|
||||||
|
$scn = str_format (localize ("content.series.data"), $this->seriesIndex, $serie->name);
|
||||||
|
$link = new LinkNavigation ($serie->getUri ());
|
||||||
|
$su = $link->hrefXhtml ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return array ("id" => $this->id,
|
||||||
|
"hasCover" => $this->hasCover,
|
||||||
|
"preferedData" => $preferedData,
|
||||||
|
"rating" => $this->getRating (),
|
||||||
|
"pubDate" => $this->getPubDate (),
|
||||||
|
"languagesName" => $this->getLanguages (),
|
||||||
|
"authorsName" => $this->getAuthorsName (),
|
||||||
|
"tagsName" => $this->getTagsName (),
|
||||||
|
"seriesName" => $sn,
|
||||||
|
"seriesCompleteName" => $scn,
|
||||||
|
"seriesurl" => $su);
|
||||||
|
|
||||||
|
}
|
||||||
|
public function getFullContentArray () {
|
||||||
|
global $config;
|
||||||
|
$out = $this->getContentArray ();
|
||||||
|
|
||||||
|
$out ["coverurl"] = Data::getLink ($this, "jpg", "image/jpeg", Link::OPDS_IMAGE_TYPE, "cover.jpg", NULL)->hrefXhtml ();
|
||||||
|
$out ["thumbnailurl"] = Data::getLink ($this, "jpg", "image/jpeg", Link::OPDS_THUMBNAIL_TYPE, "cover.jpg", NULL, NULL, 150)->hrefXhtml ();
|
||||||
|
$out ["content"] = $this->getComment (false);
|
||||||
|
$out ["datas"] = array ();
|
||||||
|
$dataKindle = $this->GetMostInterestingDataToSendToKindle ();
|
||||||
|
foreach ($this->getDatas() as $data) {
|
||||||
|
$tab = array ("id" => $data->id, "format" => $data->format, "url" => $data->getHtmlLink (), "mail" => 0);
|
||||||
|
if (!empty ($config['cops_mail_configuration']) && !is_null ($dataKindle) && $data->id == $dataKindle->id) {
|
||||||
|
$tab ["mail"] = 1;
|
||||||
|
}
|
||||||
|
array_push ($out ["datas"], $tab);
|
||||||
|
}
|
||||||
|
$out ["authors"] = array ();
|
||||||
|
foreach ($this->getAuthors () as $author) {
|
||||||
|
$link = new LinkNavigation ($author->getUri ());
|
||||||
|
array_push ($out ["authors"], array ("name" => $author->name, "url" => $link->hrefXhtml ()));
|
||||||
|
}
|
||||||
|
$out ["tags"] = array ();
|
||||||
|
foreach ($this->getTags () as $tag) {
|
||||||
|
$link = new LinkNavigation ($tag->getUri ());
|
||||||
|
array_push ($out ["tags"], array ("name" => $tag->name, "url" => $link->hrefXhtml ()));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
public function getDetailUrl ($permalink = false) {
|
public function getDetailUrl ($permalink = false) {
|
||||||
global $config;
|
global $config;
|
||||||
$urlParam = $this->getUri ();
|
$urlParam = $this->getUri ();
|
||||||
if (!is_null (GetUrlParam (DB))) $urlParam = addURLParameter ($urlParam, DB, GetUrlParam (DB));
|
if (!is_null (GetUrlParam (DB))) $urlParam = addURLParameter ($urlParam, DB, GetUrlParam (DB));
|
||||||
$urlParam = str_replace ("&", "&", $urlParam);
|
return 'index.php' . $urlParam;
|
||||||
if ($permalink || getCurrentOption ('use_fancyapps') == 0) {
|
|
||||||
return 'index.php' . $urlParam;
|
|
||||||
} else {
|
|
||||||
return 'bookdetail.php' . $urlParam;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTitle () {
|
public function getTitle () {
|
||||||
|
@ -207,7 +269,7 @@ class Book extends Base {
|
||||||
|
|
||||||
public function GetMostInterestingDataToSendToKindle ()
|
public function GetMostInterestingDataToSendToKindle ()
|
||||||
{
|
{
|
||||||
$bestFormatForKindle = array ("PDF", "MOBI");
|
$bestFormatForKindle = array ("EPUB", "PDF", "MOBI");
|
||||||
$bestRank = -1;
|
$bestRank = -1;
|
||||||
$bestData = NULL;
|
$bestData = NULL;
|
||||||
foreach ($this->getDatas () as $data) {
|
foreach ($this->getDatas () as $data) {
|
||||||
|
|
103
bookdetail.php
103
bookdetail.php
|
@ -1,103 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* COPS (Calibre OPDS PHP Server) book detail script
|
|
||||||
*
|
|
||||||
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
|
|
||||||
* @author Sébastien Lucas <sebastien@slucas.fr>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once ("config.php");
|
|
||||||
require_once ("book.php");
|
|
||||||
|
|
||||||
$book = Book::getBookById($_GET["id"]);
|
|
||||||
$authors = $book->getAuthors ();
|
|
||||||
$tags = $book->getTags ();
|
|
||||||
$serie = $book->getSerie ();
|
|
||||||
$book->getLinkArray ();
|
|
||||||
|
|
||||||
?>
|
|
||||||
<article class="bookpopup">
|
|
||||||
<span class="cover">
|
|
||||||
<?php
|
|
||||||
if ($book->hasCover) {
|
|
||||||
?>
|
|
||||||
<a href="<?php echo Data::getLink ($book, "jpg", "image/jpeg", Link::OPDS_IMAGE_TYPE, "cover.jpg", NULL)->hrefXhtml () ?>">
|
|
||||||
<img src="<?php echo Data::getLink ($book, "jpg", "image/jpeg", Link::OPDS_THUMBNAIL_TYPE, "cover.jpg", NULL, NULL, 150)->hrefXhtml () ?>" alt="<?php echo localize("i18n.coversection") ?>" />
|
|
||||||
</a>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</span>
|
|
||||||
<?php
|
|
||||||
foreach ($book->getDatas() as $data)
|
|
||||||
{
|
|
||||||
?>
|
|
||||||
<h2 class="download"><a href="<?php echo $data->getHtmlLink () ?>"><?php echo $data->format ?></a></h2>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<h1><a rel="bookmark" href="<?php echo $book->getDetailUrl (true) ?>"><img src="<?php echo getUrlWithVersion("images/Link.png") ?>" alt="<?php echo localize ("permalink.alternate") ?>" /></a><?php echo htmlspecialchars ($book->title) ?></h1>
|
|
||||||
<p class="popupless">
|
|
||||||
<h3><?php echo localize("authors.title") ?>: </h3>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
$i = 0;
|
|
||||||
foreach ($authors as $author) {
|
|
||||||
if ($i > 0) echo ", ";
|
|
||||||
?>
|
|
||||||
<a href="<?php $link = new LinkNavigation ($author->getUri ()); echo $link->hrefXhtml () ?>"><?php echo htmlspecialchars ($author->name) ?></a>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</p>
|
|
||||||
<?php
|
|
||||||
if (count ($tags) > 0) {
|
|
||||||
?>
|
|
||||||
<p class="popupless">
|
|
||||||
<h3><?php echo localize("tags.title") ?>: </h3>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
$i = 0;
|
|
||||||
foreach ($tags as $tag) {
|
|
||||||
if ($i > 0) echo ", ";
|
|
||||||
?>
|
|
||||||
<a href="<?php $link = new LinkNavigation ($tag->getUri ()); echo $link->hrefXhtml () ?>"><?php echo htmlspecialchars ($tag->name) ?></a>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</p>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
if (!is_null ($serie))
|
|
||||||
{
|
|
||||||
?>
|
|
||||||
<p class="popupless">
|
|
||||||
<h3><a href="<?php $link = new LinkNavigation ($serie->getUri ()); echo $link->hrefXhtml () ?>"><?php echo localize("series.title") ?></a>: </h3>
|
|
||||||
<?php echo str_format (localize ("content.series.data"), $book->seriesIndex, htmlspecialchars ($serie->name)) ?>
|
|
||||||
</p>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
if ($book->getPubDate() != "")
|
|
||||||
{
|
|
||||||
?>
|
|
||||||
<p class="popupless">
|
|
||||||
<h3><?php echo localize("pubdate.title") ?>: </h3>
|
|
||||||
<?php echo $book->getPubDate() ?>
|
|
||||||
</p>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
if ($book->getLanguages () != "")
|
|
||||||
{
|
|
||||||
?>
|
|
||||||
<p class="popupless">
|
|
||||||
<h3><?php echo localize("language.title") ?>: </h3>
|
|
||||||
<?php echo $book->getLanguages () ?>
|
|
||||||
</p>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<br />
|
|
||||||
<h4><?php echo localize("content.summary") ?></h4>
|
|
||||||
<div <?php if (!isset ($page)) echo 'style="max-width:700px;"' ?> ><?php echo $book->getComment (false) ?></div>
|
|
||||||
</article>
|
|
|
@ -24,8 +24,8 @@
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title><?php echo localize ("customize.title") ?></title>
|
<title><?php echo localize ("customize.title") ?></title>
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("js/jquery-1.9.1.min.js") ?>"></script>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/jQuery/jquery-1.9.1.min.js") ?>"></script>
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("js/jquery.cookies.js") ?>"></script>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/jquery-cookie/jquery.cookies.js") ?>"></script>
|
||||||
<link rel='stylesheet' type='text/css' href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,800,300,400italic,600,600italic,700,700italic,800italic' />
|
<link rel='stylesheet' type='text/css' href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,800,300,400italic,600,600italic,700,700italic,800italic' />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion(getCurrentCss ()) ?>" media="screen" />
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion(getCurrentCss ()) ?>" media="screen" />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/normalize/normalize.css") ?>" />
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/normalize/normalize.css") ?>" />
|
||||||
|
|
2
data.php
2
data.php
|
@ -105,7 +105,7 @@ class Data extends Base {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return str_replace ("&", "&", self::getLink ($this->book, $this->extension, $this->getMimeType (), NULL, $this->getFilename (), $this->id, NULL)->href);
|
return self::getLink ($this->book, $this->extension, $this->getMimeType (), NULL, $this->getFilename (), $this->id, NULL)->href;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
101
getJSON.php
Normal file
101
getJSON.php
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* COPS (Calibre OPDS PHP Server) HTML main script
|
||||||
|
*
|
||||||
|
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
|
||||||
|
* @author Sébastien Lucas <sebastien@slucas.fr>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once ("config.php");
|
||||||
|
require_once ("base.php");
|
||||||
|
require_once ("author.php");
|
||||||
|
require_once ("serie.php");
|
||||||
|
require_once ("tag.php");
|
||||||
|
require_once ("language.php");
|
||||||
|
require_once ("customcolumn.php");
|
||||||
|
require_once ("book.php");
|
||||||
|
|
||||||
|
header ("Content-Type:application/json;charset=utf-8");
|
||||||
|
$page = getURLParam ("page", Base::PAGE_INDEX);
|
||||||
|
$query = getURLParam ("query");
|
||||||
|
$qid = getURLParam ("id");
|
||||||
|
$n = getURLParam ("n", "1");
|
||||||
|
$database = GetUrlParam (DB);
|
||||||
|
|
||||||
|
$currentPage = Page::getPage ($page, $qid, $query, $n);
|
||||||
|
$currentPage->InitializeContent ();
|
||||||
|
|
||||||
|
$out = array ( "title" => $currentPage->title);
|
||||||
|
$entries = array ();
|
||||||
|
foreach ($currentPage->entryArray as $entry) {
|
||||||
|
array_push ($entries, $entry->getContentArray ());
|
||||||
|
}
|
||||||
|
if (!is_null ($currentPage->book)) {
|
||||||
|
$out ["book"] = $currentPage->book->getFullContentArray ();
|
||||||
|
}
|
||||||
|
$out ["databaseId"] = GetUrlParam (DB, "");
|
||||||
|
$out ["databaseName"] = Base::getDbName ();
|
||||||
|
$out ["page"] = $page;
|
||||||
|
$out ["entries"] = $entries;
|
||||||
|
$out ["isPaginated"] = 0;
|
||||||
|
if ($currentPage->isPaginated ()) {
|
||||||
|
$prevLink = $currentPage->getPrevLink ();
|
||||||
|
$nextLink = $currentPage->getNextLink ();
|
||||||
|
$out ["isPaginated"] = 1;
|
||||||
|
$out ["prevLink"] = "";
|
||||||
|
if (!is_null ($prevLink)) {
|
||||||
|
$out ["prevLink"] = $prevLink->hrefXhtml ();
|
||||||
|
}
|
||||||
|
$out ["nextLink"] = "";
|
||||||
|
if (!is_null ($nextLink)) {
|
||||||
|
$out ["nextLink"] = $nextLink->hrefXhtml ();
|
||||||
|
}
|
||||||
|
$out ["maxPage"] = $currentPage->getMaxPage ();
|
||||||
|
$out ["currentPage"] = $currentPage->n;
|
||||||
|
}
|
||||||
|
if (!is_null (getURLParam ("complete"))) {
|
||||||
|
$out ["const"] = array ("version" => VERSION, "i18n" => array (
|
||||||
|
"coverAlt" => localize("i18n.coversection"),
|
||||||
|
"authorsTitle" => localize("authors.title"),
|
||||||
|
"bookwordTitle" => localize("bookword.title"),
|
||||||
|
"tagsTitle" => localize("tags.title"),
|
||||||
|
"seriesTitle" => localize("series.title"),
|
||||||
|
"customizeTitle" => localize ("customize.title"),
|
||||||
|
"aboutTitle" => localize ("about.title"),
|
||||||
|
"previousAlt" => localize ("paging.previous.alternate"),
|
||||||
|
"nextAlt" => localize ("paging.next.alternate"),
|
||||||
|
"searchAlt" => localize ("search.alternate"),
|
||||||
|
"sortAlt" => localize ("sort.alternate"),
|
||||||
|
"homeAlt" => localize ("home.alternate"),
|
||||||
|
"permalinkAlt" => localize ("permalink.alternate"),
|
||||||
|
"pubdateTitle" => localize("pubdate.title"),
|
||||||
|
"languagesTitle" => localize("language.title"),
|
||||||
|
"contentTitle" => localize("content.summary"),
|
||||||
|
"sortorderAsc" => localize("search.sortorder.asc"),
|
||||||
|
"sortorderDesc" => localize("search.sortorder.desc")),
|
||||||
|
"url" => array (
|
||||||
|
"detailUrl" => "index.php?page=13&id={0}&db={1}",
|
||||||
|
"coverUrl" => "fetch.php?id={0}&db={1}",
|
||||||
|
"thumbnailUrl" => "fetch.php?height=70&id={0}&db={1}"),
|
||||||
|
"config" => array (
|
||||||
|
"use_fancyapps" => $config ["cops_use_fancyapps"],
|
||||||
|
"max_item_per_page" => $config['cops_max_item_per_page']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$out ["containsBook"] = 0;
|
||||||
|
if ($currentPage->containsBook ()) {
|
||||||
|
$out ["containsBook"] = 1;
|
||||||
|
}
|
||||||
|
$out["abouturl"] = "about.html";
|
||||||
|
if (getCurrentOption ('use_fancyapps') == 0) {
|
||||||
|
$out["abouturl"] = "index.php" . addURLParameter ("?page=16", DB, $database);
|
||||||
|
}
|
||||||
|
|
||||||
|
$out ["homeurl"] = "index.php";
|
||||||
|
if ($page != Base::PAGE_INDEX && !is_null ($database)) $out ["homeurl"] = $out ["homeurl"] . "?" . addURLParameter ("", DB, $database);
|
||||||
|
|
||||||
|
|
||||||
|
echo json_encode ($out);
|
||||||
|
|
||||||
|
?>
|
BIN
images/mail-send.png
Normal file
BIN
images/mail-send.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
295
index.php
295
index.php
|
@ -22,294 +22,73 @@
|
||||||
exit ();
|
exit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
$withToolbar = false;
|
header ("Content-Type:text/html;charset=utf-8");
|
||||||
if (!isset($_COOKIE['toolbar'])) $withToolbar = true;
|
|
||||||
|
|
||||||
header ("Content-Type:application/xhtml+xml;charset=utf-8");
|
|
||||||
$page = getURLParam ("page", Base::PAGE_INDEX);
|
$page = getURLParam ("page", Base::PAGE_INDEX);
|
||||||
$query = getURLParam ("query");
|
$query = getURLParam ("query");
|
||||||
$qid = getURLParam ("id");
|
$qid = getURLParam ("id");
|
||||||
$n = getURLParam ("n", "1");
|
$n = getURLParam ("n", "1");
|
||||||
$database = GetUrlParam (DB);
|
$database = GetUrlParam (DB);
|
||||||
|
|
||||||
$currentPage = Page::getPage ($page, $qid, $query, $n);
|
|
||||||
$currentPage->InitializeContent ();
|
|
||||||
|
|
||||||
/* Test to see if pages are opened on an Eink screen
|
|
||||||
* test Kindle, Kobo Touch and Sony PRS-T1 Ereader.
|
|
||||||
* HTTP_USER_AGENT = "Mozilla/5.0 (Linux; U; en-us; EBRD1101; EXT) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (preg_match("/(Kobo|Kindle\/3.0|EBRD1101)/", $_SERVER['HTTP_USER_AGENT'])) {
|
|
||||||
$isEink = 1;
|
|
||||||
} else {
|
|
||||||
$isEink = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title><?php echo htmlspecialchars ($currentPage->title) ?></title>
|
<title>COPS</title>
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("js/jquery-1.9.1.min.js") ?>"></script>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/jQuery/jquery-1.9.1.min.js") ?>"></script>
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("js/jquery.cookies.js") ?>"></script>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/jquery-cookie/jquery.cookies.js") ?>"></script>
|
||||||
<?php if (getCurrentOption ('use_fancyapps') == 1) { ?>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/Magnific-Popup/jquery.magnific-popup.min.js") ?>"></script>
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/fancybox/jquery.fancybox.pack.js") ?>"></script>
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/Magnific-Popup/magnific-popup.css") ?>" media="screen" />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/fancybox/jquery.fancybox.css") ?>" media="screen" />
|
|
||||||
<?php } ?>
|
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("js/jquery.sortElements.js") ?>"></script>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("js/jquery.sortElements.js") ?>"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/doT/doT.min.js") ?>"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/lru/lru.js") ?>"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("util.js") ?>"></script>
|
||||||
<link rel="related" href="<?php echo $config['cops_full_url'] ?>feed.php" type="application/atom+xml;profile=opds-catalog" title="<?php echo $config['cops_title_default']; ?>" />
|
<link rel="related" href="<?php echo $config['cops_full_url'] ?>feed.php" type="application/atom+xml;profile=opds-catalog" title="<?php echo $config['cops_title_default']; ?>" />
|
||||||
<link rel="icon" type="image/vnd.microsoft.icon" href="<?php echo $currentPage->favicon ?>" />
|
<link rel="icon" type="image/vnd.microsoft.icon" href="favicon.ico" />
|
||||||
<link rel='stylesheet' type='text/css' href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,800,300,400italic,600,600italic,700,700italic,800italic' />
|
<link rel='stylesheet' type='text/css' href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,800,300,400italic,600,600italic,700,700italic,800italic' />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion(getCurrentCss ()) ?>" media="screen" />
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion(getCurrentCss ()) ?>" media="screen" />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/normalize/normalize.css") ?>" />
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/normalize/normalize.css") ?>" />
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
// Handler for .ready() called.
|
// Handler for .ready() called.
|
||||||
|
|
||||||
$("#sort").click(function(){
|
var url = "<?php echo "getJSON.php?" . addURLParameter ($_SERVER["QUERY_STRING"], "complete", 1); ?>";
|
||||||
$('.books').sortElements(function(a, b){
|
|
||||||
var test = 1;
|
|
||||||
if ($("#sortorder").val() == "desc")
|
|
||||||
{
|
|
||||||
test = -1;
|
|
||||||
}
|
|
||||||
return $(a).find ("." + $("#sortchoice").val()).text() > $(b).find ("." + $("#sortchoice").val()).text() ? test : -test;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
<?php if (getCurrentOption ('use_fancyapps') == 1) { ?>
|
$.when($.get('templates/default/header.html'),
|
||||||
$(".fancycover").fancybox({
|
$.get('templates/default/footer.html'),
|
||||||
'type' : 'image',
|
$.get('templates/default/bookdetail.html'),
|
||||||
prevEffect : 'none',
|
$.get('templates/default/main.html'),
|
||||||
nextEffect : 'none'
|
$.get('templates/default/page.html'),
|
||||||
<?php if ($isEink) echo ", openEffect : 'none', closeEffect : 'none', helpers : {overlay : null}"; ?>
|
$.getJSON(url)).done(function(header, footer, bookdetail, main, page, data){
|
||||||
});
|
templateBookDetail = doT.template (bookdetail [0]);
|
||||||
|
|
||||||
$(".fancyabout").fancybox({
|
var defMain = {
|
||||||
'type' : 'ajax',
|
bookdetail: bookdetail [0]
|
||||||
title : 'COPS <?php echo VERSION ?>',
|
};
|
||||||
prevEffect : 'none',
|
|
||||||
nextEffect : 'none'
|
|
||||||
<?php if ($isEink) echo ", openEffect : 'none', closeEffect : 'none', helpers : {overlay : null}"; ?>
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".fancydetail").fancybox({
|
templateMain = doT.template (main [0], undefined, defMain);
|
||||||
'type' : 'ajax',
|
|
||||||
prevEffect : 'none',
|
|
||||||
nextEffect : 'none'
|
|
||||||
<?php if ($isEink) echo ", openEffect : 'none', closeEffect : 'none', helpers : {overlay : null}"; ?>
|
|
||||||
});
|
|
||||||
<?php } ?>
|
|
||||||
|
|
||||||
$(".headright").click(function(){
|
var defPage = {
|
||||||
if ($("#tool").is(":hidden")) {
|
header: header [0],
|
||||||
$("#tool").slideDown("slow");
|
footer: footer [0],
|
||||||
$.cookie('toolbar', '1');
|
main : main [0],
|
||||||
} else {
|
bookdetail: bookdetail [0]
|
||||||
$("#tool").slideUp();
|
};
|
||||||
$.removeCookie('toolbar');
|
|
||||||
}
|
templatePage = doT.template (page [0], undefined, defPage);
|
||||||
|
currentData = data [0];
|
||||||
|
|
||||||
|
updatePage (data [0]);
|
||||||
|
cache.put (url, data [0]);
|
||||||
|
history.replaceState(url, "", window.location);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
<?php
|
|
||||||
if ($currentPage->isPaginated ()) {
|
|
||||||
$prevLink = $currentPage->getPrevLink ();
|
|
||||||
$nextLink = $currentPage->getNextLink ();
|
|
||||||
?>
|
|
||||||
$(document).keydown(function(e){
|
|
||||||
<?php
|
|
||||||
if (!is_null ($prevLink)) {
|
|
||||||
echo "if (e.keyCode == 37) {\$(location).attr('href','" . $prevLink->hrefXhtml () . "');}";
|
|
||||||
}
|
|
||||||
if (!is_null ($nextLink)) {
|
|
||||||
echo "if (e.keyCode == 39) {\$(location).attr('href','" . $nextLink->hrefXhtml () . "');}";
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
||||||
});
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
|
||||||
<header>
|
|
||||||
<a class="headleft" href="<?php echo $_SERVER["SCRIPT_NAME"]; if ($page != Base::PAGE_INDEX && !is_null ($database)) echo "?" . addURLParameter ("", DB, $database); ?>">
|
|
||||||
<img src="<?php echo getUrlWithVersion("images/home.png") ?>" alt="<?php echo localize ("home.alternate") ?>" />
|
|
||||||
</a>
|
|
||||||
<img class="headright" id="searchImage" src="<?php echo getUrlWithVersion("images/setting64.png") ?>" alt="Settings and menu" />
|
|
||||||
<div class="headcenter">
|
|
||||||
<h1><?php echo htmlspecialchars ($currentPage->title) ?></h1>
|
|
||||||
</div>
|
|
||||||
<div id="tool" <?php if ($withToolbar) echo 'style="display: none"' ?>>
|
|
||||||
<div style="float: left; width: 60%">
|
|
||||||
<form action="index.php" method="get">
|
|
||||||
<div style="float: right">
|
|
||||||
<input type="image" src="images/search32.png" alt="<?php echo localize ("search.alternate") ?>" />
|
|
||||||
</div>
|
|
||||||
<div class="stop">
|
|
||||||
<input type="hidden" name="current" value="<?php echo $page ?>" />
|
|
||||||
<input type="hidden" name="page" value="9" />
|
|
||||||
<?php if (!is_null ($database)) { ?>
|
|
||||||
<input type="hidden" name="<?php echo DB ?>" value="<?php echo $database ?>" />
|
|
||||||
<?php } ?>
|
|
||||||
<input type="search" name="query" />
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<?php if ($currentPage->containsBook ()) { ?>
|
|
||||||
<div style="float: right; width: 35%">
|
|
||||||
<div style="float: right">
|
|
||||||
<img id="sort" src="images/sort32.png" alt="<?php echo localize ("sort.alternate") ?>" />
|
|
||||||
</div>
|
|
||||||
<div class="stop">
|
|
||||||
<select id="sortchoice">
|
|
||||||
<option value="st"><?php echo localize("bookword.title") ?></option>
|
|
||||||
<option value="sa"><?php echo localize("authors.title") ?></option>
|
|
||||||
<option value="ss"><?php echo localize("series.title") ?></option>
|
|
||||||
<option value="sp"><?php echo localize("content.published") ?></option>
|
|
||||||
</select>
|
|
||||||
<select id="sortorder">
|
|
||||||
<option value="asc"><?php echo localize("search.sortorder.asc") ?></option>
|
|
||||||
<option value="desc"><?php echo localize("search.sortorder.desc") ?></option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php } ?>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div id="content" style="display: none;"></div>
|
|
||||||
<section>
|
|
||||||
<?php
|
|
||||||
if ($page == Base::PAGE_BOOK_DETAIL) {
|
|
||||||
include ("bookdetail.php");
|
|
||||||
} else if ($page == Base::PAGE_ABOUT) {
|
|
||||||
readfile ("about.xml");
|
|
||||||
}
|
|
||||||
foreach ($currentPage->entryArray as $entry) {
|
|
||||||
if (get_class ($entry) != "EntryBook") {
|
|
||||||
?>
|
|
||||||
<article>
|
|
||||||
<div class="frontpage">
|
|
||||||
<?php foreach ($entry->linkArray as $link) { if ($link->type != Link::OPDS_NAVIGATION_TYPE) { continue; } ?> <a href="<?php echo $link->hrefXhtml () ?>">
|
|
||||||
<h2><?php echo htmlspecialchars ($entry->title) ?></h2>
|
|
||||||
<?php } ?>
|
|
||||||
<h4><?php echo htmlspecialchars ($entry->content) ?></h4>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
?>
|
|
||||||
<article class="books">
|
|
||||||
<span class="cover">
|
|
||||||
<?php
|
|
||||||
if ($entry->book->hasCover) {
|
|
||||||
?>
|
|
||||||
<a data-fancybox-group="group" class="fancycover" href="<?php echo $entry->getCover () ?>"><img src="<?php echo $entry->getCoverThumbnail () ?>" alt="<?php echo localize("i18n.coversection") ?>" /></a>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</span>
|
|
||||||
<h2 class="download">
|
|
||||||
<?php
|
|
||||||
$i = 0;
|
|
||||||
foreach ($config['cops_prefered_format'] as $format)
|
|
||||||
{
|
|
||||||
if ($i == 2) { break; }
|
|
||||||
if ($data = $entry->book->getDataFormat ($format)) {
|
|
||||||
$i++;
|
|
||||||
?>
|
|
||||||
<a href="<?php echo $data->getHtmlLink () ?>"><?php echo $format ?></a><br />
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</h2>
|
|
||||||
<a class="fancydetail" href="<?php echo $entry->book->getDetailUrl () ?>">
|
|
||||||
<div class="fullclickpopup">
|
|
||||||
<h2><span class="st"><?php echo htmlspecialchars ($entry->title) ?></span>
|
|
||||||
<?php
|
|
||||||
if ($entry->book->getPubDate() != "")
|
|
||||||
{
|
|
||||||
?>
|
|
||||||
<span class="sp">(<?php echo $entry->book->getPubDate() ?>)</span>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<?php
|
|
||||||
if (!is_null ($entry->book->rating)) {
|
|
||||||
?>
|
|
||||||
<span class="sr"><?php echo $entry->book->getRating () ?></span>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</h2>
|
|
||||||
<h4><?php echo localize("authors.title") . " : " ?></h4><span class="sa"><?php echo htmlspecialchars ($entry->book->getAuthorsName ()) ?></span><br />
|
|
||||||
<?php
|
|
||||||
$tags = $entry->book->getTagsName ();
|
|
||||||
if (!empty ($tags)) {
|
|
||||||
?>
|
|
||||||
<h4><?php echo localize("tags.title") . " : </h4>" . htmlspecialchars ($tags) ?><br />
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<?php
|
|
||||||
$serie = $entry->book->getSerie ();
|
|
||||||
if (!is_null ($serie)) {
|
|
||||||
?>
|
|
||||||
<h4><?php echo localize("series.title") . " : " ?></h4><span class="ss"><?php echo htmlspecialchars ($serie->name) . " (" . $entry->book->seriesIndex . ")" ?></span><br />
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</div></a>
|
|
||||||
</article>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</section>
|
|
||||||
<footer>
|
|
||||||
<div class="footleft">
|
|
||||||
<a href="customize.php"><img src="<?php echo getUrlWithVersion("images/theme.png") ?>" alt="<?php echo localize ("customize.title") ?>" /></a>
|
|
||||||
</div>
|
|
||||||
<div class="footright">
|
|
||||||
<a class="fancyabout" href="<?php if (getCurrentOption ('use_fancyapps') == 1) { echo "about.xml"; } else { echo $_SERVER["SCRIPT_NAME"] . str_replace ("&", "&", addURLParameter ("?page=16", DB, $database)); } ?>"><img src="<?php echo getUrlWithVersion("images/info.png") ?>" alt="<?php echo localize ("about.title") ?>" /></a>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
if ($currentPage->isPaginated ()) {
|
|
||||||
?>
|
|
||||||
|
|
||||||
<div class="footcenter">
|
|
||||||
<?php
|
|
||||||
if (!is_null ($prevLink)) {
|
|
||||||
?>
|
|
||||||
<a href="<?php echo $prevLink->hrefXhtml () ?>" ><img src="<?php echo getUrlWithVersion("images/previous.png") ?>" alt="<?php echo localize ("paging.previous.alternate") ?>" /></a>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<p><?php echo " " . $currentPage->n . " / " . $currentPage->getMaxPage () . " " ?></p>
|
|
||||||
<?php
|
|
||||||
if (!is_null ($nextLink)) {
|
|
||||||
?>
|
|
||||||
<a href="<?php echo $nextLink->hrefXhtml () ?>" ><img src="<?php echo getUrlWithVersion("images/next.png") ?>" alt="<?php echo localize ("paging.next.alternate") ?>" /></a>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery Cookie Plugin
|
|
||||||
* https://github.com/carhartl/jquery-cookie
|
|
||||||
* Copyright 2011, Klaus Hartl
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
|
||||||
* http://www.opensource.org/licenses/GPL-2.0
|
|
||||||
* Last update: Sun, 03 Mar 2013 06:56:32 +0000
|
|
||||||
*/
|
|
||||||
(function(factory){if(typeof define==='function'&&define.amd){define(['jquery'],factory)}else{factory(jQuery)}}(function($){var pluses=/\+/g;function raw(s){return s}function decoded(s){return decodeURIComponent(s.replace(pluses,' '))}function converted(s){if(s.indexOf('"')===0){s=s.slice(1,-1).replace(/\\"/g, '"').replace(/\\\\/g,'\\');}try{return config.json?JSON.parse(s):s}catch(er){}}var config=$.cookie=function(key,value,options){if(value!==undefined){options=$.extend({},config.defaults,options);if(typeof options.expires==='number'){var days=options.expires,t=options.expires=new Date();t.setDate(t.getDate()+days)}value=config.json?JSON.stringify(value):String(value);return(document.cookie=[config.raw?key:encodeURIComponent(key),'=',config.raw?value:encodeURIComponent(value),options.expires?'; expires='+options.expires.toUTCString():'',options.path?'; path='+options.path:'',options.domain?'; domain='+options.domain:'',options.secure?'; secure':''].join(''))}var decode=config.raw?raw:decoded;var cookies=document.cookie.split('; ');var result=key?undefined:{};for(var i=0,l=cookies.length;i<l;i++){var parts=cookies[i].split('=');var name=decode(parts.shift());var cookie=decode(parts.join('='));if(key&&key===name){result=converted(cookie);break}if(!key){result[name]=converted(cookie)}}return result};config.defaults={};$.removeCookie=function(key,options){if($.cookie(key)!==undefined){$.cookie(key,'',$.extend(options,{expires:-1}));return true}return false}}));
|
|
4
resources/Magnific-Popup/jquery.magnific-popup.min.js
vendored
Normal file
4
resources/Magnific-Popup/jquery.magnific-popup.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
395
resources/Magnific-Popup/magnific-popup.css
Normal file
395
resources/Magnific-Popup/magnific-popup.css
Normal file
|
@ -0,0 +1,395 @@
|
||||||
|
/* Magnific Popup CSS */
|
||||||
|
.mfp-bg {
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 502;
|
||||||
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
background: #0b0b0b;
|
||||||
|
opacity: 0.8;
|
||||||
|
filter: alpha(opacity=80); }
|
||||||
|
|
||||||
|
.mfp-wrap {
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 503;
|
||||||
|
position: fixed;
|
||||||
|
outline: none !important;
|
||||||
|
-webkit-backface-visibility: hidden; }
|
||||||
|
|
||||||
|
.mfp-container {
|
||||||
|
height: 100%;
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
padding: 0 8px;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
|
||||||
|
.mfp-container:before {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
height: 100%;
|
||||||
|
vertical-align: middle; }
|
||||||
|
|
||||||
|
.mfp-align-top .mfp-container:before {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.mfp-content {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: left;
|
||||||
|
z-index: 505; }
|
||||||
|
|
||||||
|
.mfp-inline-holder .mfp-content,
|
||||||
|
.mfp-ajax-holder .mfp-content {
|
||||||
|
width: 100%;
|
||||||
|
cursor: auto; }
|
||||||
|
|
||||||
|
.mfp-ajax-cur {
|
||||||
|
cursor: progress; }
|
||||||
|
|
||||||
|
.mfp-zoom-out-cur,
|
||||||
|
.mfp-zoom-out-cur .mfp-image-holder .mfp-close {
|
||||||
|
cursor: -moz-zoom-out;
|
||||||
|
cursor: -webkit-zoom-out;
|
||||||
|
cursor: zoom-out; }
|
||||||
|
|
||||||
|
.mfp-zoom {
|
||||||
|
cursor: pointer;
|
||||||
|
cursor: -webkit-zoom-in;
|
||||||
|
cursor: -moz-zoom-in;
|
||||||
|
cursor: zoom-in; }
|
||||||
|
|
||||||
|
.mfp-auto-cursor .mfp-content {
|
||||||
|
cursor: auto; }
|
||||||
|
|
||||||
|
.mfp-close,
|
||||||
|
.mfp-arrow,
|
||||||
|
.mfp-preloader,
|
||||||
|
.mfp-counter {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
user-select: none; }
|
||||||
|
|
||||||
|
.mfp-loading.mfp-figure {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.mfp-hide {
|
||||||
|
display: none !important; }
|
||||||
|
|
||||||
|
.mfp-preloader {
|
||||||
|
color: #cccccc;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
width: auto;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: -0.8em;
|
||||||
|
left: 8px;
|
||||||
|
right: 8px;
|
||||||
|
z-index: 504; }
|
||||||
|
|
||||||
|
.mfp-preloader a {
|
||||||
|
color: #cccccc; }
|
||||||
|
|
||||||
|
.mfp-preloader a:hover {
|
||||||
|
color: white; }
|
||||||
|
|
||||||
|
.mfp-s-ready .mfp-preloader {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.mfp-s-error .mfp-content {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
button.mfp-close,
|
||||||
|
button.mfp-arrow {
|
||||||
|
overflow: visible;
|
||||||
|
cursor: pointer;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
display: block;
|
||||||
|
padding: 0;
|
||||||
|
z-index: 506; }
|
||||||
|
|
||||||
|
button::-moz-focus-inner {
|
||||||
|
padding: 0;
|
||||||
|
border: 0; }
|
||||||
|
|
||||||
|
.mfp-close {
|
||||||
|
width: 44px;
|
||||||
|
height: 44px;
|
||||||
|
line-height: 44px;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
text-decoration: none;
|
||||||
|
text-align: center;
|
||||||
|
opacity: 0.65;
|
||||||
|
padding: 0 0 18px 10px;
|
||||||
|
color: white;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 28px;
|
||||||
|
font-family: Arial, Baskerville, monospace; }
|
||||||
|
.mfp-close:hover, .mfp-close:focus {
|
||||||
|
opacity: 1; }
|
||||||
|
.mfp-close:active {
|
||||||
|
top: 1px; }
|
||||||
|
|
||||||
|
.mfp-close-btn-in .mfp-close {
|
||||||
|
color: #333333; }
|
||||||
|
|
||||||
|
.mfp-image-holder .mfp-close,
|
||||||
|
.mfp-iframe-holder .mfp-close {
|
||||||
|
color: white;
|
||||||
|
right: -6px;
|
||||||
|
text-align: right;
|
||||||
|
padding-right: 6px;
|
||||||
|
width: 100%; }
|
||||||
|
|
||||||
|
.mfp-counter {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
color: #cccccc;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 18px; }
|
||||||
|
|
||||||
|
.mfp-arrow {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
opacity: 0.65;
|
||||||
|
margin: 0;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -55px;
|
||||||
|
padding: 0;
|
||||||
|
width: 90px;
|
||||||
|
height: 110px;
|
||||||
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
|
||||||
|
|
||||||
|
.mfp-arrow:active {
|
||||||
|
margin-top: -54px; }
|
||||||
|
|
||||||
|
.mfp-arrow:hover,
|
||||||
|
.mfp-arrow:focus {
|
||||||
|
opacity: 1; }
|
||||||
|
|
||||||
|
.mfp-arrow:before, .mfp-arrow:after,
|
||||||
|
.mfp-arrow .mfp-b,
|
||||||
|
.mfp-arrow .mfp-a {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
margin-top: 35px;
|
||||||
|
margin-left: 35px;
|
||||||
|
border: solid transparent; }
|
||||||
|
.mfp-arrow:after,
|
||||||
|
.mfp-arrow .mfp-a {
|
||||||
|
opacity: 0.8;
|
||||||
|
border-top-width: 12px;
|
||||||
|
border-bottom-width: 12px;
|
||||||
|
top: 8px; }
|
||||||
|
.mfp-arrow:before,
|
||||||
|
.mfp-arrow .mfp-b {
|
||||||
|
border-top-width: 20px;
|
||||||
|
border-bottom-width: 20px; }
|
||||||
|
|
||||||
|
.mfp-arrow-left {
|
||||||
|
left: 0; }
|
||||||
|
.mfp-arrow-left:after,
|
||||||
|
.mfp-arrow-left .mfp-a {
|
||||||
|
border-right: 12px solid black;
|
||||||
|
left: 5px; }
|
||||||
|
.mfp-arrow-left:before,
|
||||||
|
.mfp-arrow-left .mfp-b {
|
||||||
|
border-right: 20px solid white; }
|
||||||
|
|
||||||
|
.mfp-arrow-right {
|
||||||
|
right: 0; }
|
||||||
|
.mfp-arrow-right:after,
|
||||||
|
.mfp-arrow-right .mfp-a {
|
||||||
|
border-left: 12px solid black;
|
||||||
|
left: 3px; }
|
||||||
|
.mfp-arrow-right:before,
|
||||||
|
.mfp-arrow-right .mfp-b {
|
||||||
|
border-left: 20px solid white; }
|
||||||
|
|
||||||
|
.mfp-iframe-holder {
|
||||||
|
padding-top: 40px;
|
||||||
|
padding-bottom: 40px; }
|
||||||
|
|
||||||
|
.mfp-iframe-holder .mfp-content {
|
||||||
|
line-height: 0;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 900px; }
|
||||||
|
|
||||||
|
.mfp-iframe-scaler {
|
||||||
|
width: 100%;
|
||||||
|
height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
padding-top: 56.25%; }
|
||||||
|
|
||||||
|
.mfp-iframe-scaler iframe {
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
|
||||||
|
background: black; }
|
||||||
|
|
||||||
|
.mfp-iframe-holder .mfp-close {
|
||||||
|
top: -40px; }
|
||||||
|
|
||||||
|
/* Main image in popup */
|
||||||
|
img.mfp-img {
|
||||||
|
width: auto;
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
line-height: 0;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 40px 0 40px;
|
||||||
|
margin: 0 auto; }
|
||||||
|
|
||||||
|
/* The shadow behind the image */
|
||||||
|
.mfp-figure:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 40px;
|
||||||
|
bottom: 40px;
|
||||||
|
display: block;
|
||||||
|
right: 0;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
z-index: -1;
|
||||||
|
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); }
|
||||||
|
|
||||||
|
.mfp-figure {
|
||||||
|
line-height: 0; }
|
||||||
|
|
||||||
|
.mfp-bottom-bar {
|
||||||
|
margin-top: -36px;
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
cursor: auto; }
|
||||||
|
|
||||||
|
.mfp-title {
|
||||||
|
text-align: left;
|
||||||
|
line-height: 18px;
|
||||||
|
color: #f3f3f3;
|
||||||
|
word-break: break-word;
|
||||||
|
padding-right: 36px; }
|
||||||
|
|
||||||
|
.mfp-figure small {
|
||||||
|
color: #bdbdbd;
|
||||||
|
display: block;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 14px; }
|
||||||
|
|
||||||
|
.mfp-image-holder .mfp-content {
|
||||||
|
max-width: 100%; }
|
||||||
|
|
||||||
|
.mfp-gallery .mfp-image-holder .mfp-figure {
|
||||||
|
cursor: pointer; }
|
||||||
|
|
||||||
|
@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
|
||||||
|
/**
|
||||||
|
* Remove all paddings around the image on small screen
|
||||||
|
*/
|
||||||
|
.mfp-img-mobile .mfp-image-holder {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0; }
|
||||||
|
|
||||||
|
.mfp-img-mobile img.mfp-img {
|
||||||
|
padding: 0; }
|
||||||
|
|
||||||
|
/* The shadow behind the image */
|
||||||
|
.mfp-img-mobile .mfp-figure:after {
|
||||||
|
top: 0;
|
||||||
|
bottom: 0; }
|
||||||
|
|
||||||
|
.mfp-img-mobile .mfp-bottom-bar {
|
||||||
|
background: rgba(0, 0, 0, 0.6);
|
||||||
|
bottom: 0;
|
||||||
|
margin: 0;
|
||||||
|
top: auto;
|
||||||
|
padding: 3px 5px;
|
||||||
|
position: fixed;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
|
||||||
|
.mfp-img-mobile .mfp-bottom-bar:empty {
|
||||||
|
padding: 0; }
|
||||||
|
|
||||||
|
.mfp-img-mobile .mfp-counter {
|
||||||
|
right: 5px;
|
||||||
|
top: 3px; }
|
||||||
|
|
||||||
|
.mfp-img-mobile .mfp-close {
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 35px;
|
||||||
|
height: 35px;
|
||||||
|
line-height: 35px;
|
||||||
|
background: rgba(0, 0, 0, 0.6);
|
||||||
|
position: fixed;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0; }
|
||||||
|
|
||||||
|
.mfp-img-mobile .mfp-figure small {
|
||||||
|
display: inline;
|
||||||
|
margin-left: 5px; } }
|
||||||
|
@media all and (max-width: 800px) {
|
||||||
|
.mfp-arrow {
|
||||||
|
-webkit-transform: scale(0.75);
|
||||||
|
transform: scale(0.75); }
|
||||||
|
|
||||||
|
.mfp-arrow-left {
|
||||||
|
-webkit-transform-origin: 0;
|
||||||
|
transform-origin: 0; }
|
||||||
|
|
||||||
|
.mfp-arrow-right {
|
||||||
|
-webkit-transform-origin: 100%;
|
||||||
|
transform-origin: 100%; }
|
||||||
|
|
||||||
|
.mfp-container {
|
||||||
|
padding-left: 6px;
|
||||||
|
padding-right: 6px; } }
|
||||||
|
.mfp-ie7 .mfp-img {
|
||||||
|
padding: 0; }
|
||||||
|
.mfp-ie7 .mfp-bottom-bar {
|
||||||
|
width: 600px;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -300px;
|
||||||
|
margin-top: 5px;
|
||||||
|
padding-bottom: 5px; }
|
||||||
|
.mfp-ie7 .mfp-container {
|
||||||
|
padding: 0; }
|
||||||
|
.mfp-ie7 .mfp-content {
|
||||||
|
padding-top: 44px; }
|
||||||
|
.mfp-ie7 .mfp-close {
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
padding-top: 0; }
|
7
resources/doT/doT.min.js
vendored
Normal file
7
resources/doT/doT.min.js
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/* Laura Doktorova https://github.com/olado/doT */(function(){function o(){var a={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},b=/&(?!#?\w+;)|<|>|"|'|\//g;return function(){return this?this.replace(b,function(c){return a[c]||c}):this}}function p(a,b,c){return(typeof b==="string"?b:b.toString()).replace(a.define||i,function(l,e,f,g){if(e.indexOf("def.")===0)e=e.substring(4);if(!(e in c))if(f===":"){a.defineParams&&g.replace(a.defineParams,function(n,h,d){c[e]={arg:h,text:d}});e in c||(c[e]=g)}else(new Function("def","def['"+
|
||||||
|
e+"']="+g))(c);return""}).replace(a.use||i,function(l,e){if(a.useParams)e=e.replace(a.useParams,function(g,n,h,d){if(c[h]&&c[h].arg&&d){g=(h+":"+d).replace(/'|\\/g,"_");c.__exp=c.__exp||{};c.__exp[g]=c[h].text.replace(RegExp("(^|[^\\w$])"+c[h].arg+"([^\\w$])","g"),"$1"+d+"$2");return n+"def.__exp['"+g+"']"}});var f=(new Function("def","return "+e))(c);return f?p(a,f,c):f})}function m(a){return a.replace(/\\('|\\)/g,"$1").replace(/[\r\t\n]/g," ")}var j={version:"1.0.0",templateSettings:{evaluate:/\{\{([\s\S]+?\}?)\}\}/g,
|
||||||
|
interpolate:/\{\{=([\s\S]+?)\}\}/g,encode:/\{\{!([\s\S]+?)\}\}/g,use:/\{\{#([\s\S]+?)\}\}/g,useParams:/(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g,define:/\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,defineParams:/^\s*([\w$]+):([\s\S]+)/,conditional:/\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g,iterate:/\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g,varname:"it",strip:true,append:true,selfcontained:false},template:undefined,
|
||||||
|
compile:undefined};if(typeof module!=="undefined"&&module.exports)module.exports=j;else if(typeof define==="function"&&define.amd)define(function(){return j});else(function(){return this||(0,eval)("this")})().doT=j;String.prototype.encodeHTML=o();var q={append:{start:"'+(",end:")+'",endencode:"||'').toString().encodeHTML()+'"},split:{start:"';out+=(",end:");out+='",endencode:"||'').toString().encodeHTML();out+='"}},i=/$^/;j.template=function(a,b,c){b=b||j.templateSettings;var l=b.append?q.append:
|
||||||
|
q.split,e,f=0,g;a=b.use||b.define?p(b,a,c||{}):a;a=("var out='"+(b.strip?a.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ").replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""):a).replace(/'|\\/g,"\\$&").replace(b.interpolate||i,function(h,d){return l.start+m(d)+l.end}).replace(b.encode||i,function(h,d){e=true;return l.start+m(d)+l.endencode}).replace(b.conditional||i,function(h,d,k){return d?k?"';}else if("+m(k)+"){out+='":"';}else{out+='":k?"';if("+m(k)+"){out+='":"';}out+='"}).replace(b.iterate||i,function(h,
|
||||||
|
d,k,r){if(!d)return"';} } out+='";f+=1;g=r||"i"+f;d=m(d);return"';var arr"+f+"="+d+";if(arr"+f+"){var "+k+","+g+"=-1,l"+f+"=arr"+f+".length-1;while("+g+"<l"+f+"){"+k+"=arr"+f+"["+g+"+=1];out+='"}).replace(b.evaluate||i,function(h,d){return"';"+m(d)+"out+='"})+"';return out;").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r").replace(/(\s|;|\}|^|\{)out\+='';/g,"$1").replace(/\+''/g,"").replace(/(\s|;|\}|^|\{)out\+=''\+/g,"$1out+=");if(e&&b.selfcontained)a="String.prototype.encodeHTML=("+
|
||||||
|
o.toString()+"());"+a;try{return new Function(b.varname,a)}catch(n){typeof console!=="undefined"&&console.log("Could not create a template function: "+a);throw n;}};j.compile=function(a,b){return j.template(a,null,b)}})();
|
Binary file not shown.
Before Width: | Height: | Size: 43 B |
Binary file not shown.
Before Width: | Height: | Size: 3.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1,003 B |
Binary file not shown.
Before Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,96 +0,0 @@
|
||||||
#fancybox-buttons {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
z-index: 8050;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons.top {
|
|
||||||
top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons.bottom {
|
|
||||||
bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons ul {
|
|
||||||
display: block;
|
|
||||||
width: 166px;
|
|
||||||
height: 30px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
border: 1px solid #111;
|
|
||||||
border-radius: 3px;
|
|
||||||
-webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
|
|
||||||
-moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
|
|
||||||
box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
|
|
||||||
background: rgb(50,50,50);
|
|
||||||
background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%);
|
|
||||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51)));
|
|
||||||
background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
|
|
||||||
background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
|
|
||||||
background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
|
|
||||||
background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
|
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons ul li {
|
|
||||||
float: left;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a {
|
|
||||||
display: block;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
text-indent: -9999px;
|
|
||||||
background-image: url('fancybox_buttons.png');
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
outline: none;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a:hover {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnPrev {
|
|
||||||
background-position: 5px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnNext {
|
|
||||||
background-position: -33px 0;
|
|
||||||
border-right: 1px solid #3e3e3e;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnPlay {
|
|
||||||
background-position: 0 -30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnPlayOn {
|
|
||||||
background-position: -30px -30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnToggle {
|
|
||||||
background-position: 3px -60px;
|
|
||||||
border-left: 1px solid #111;
|
|
||||||
border-right: 1px solid #3e3e3e;
|
|
||||||
width: 35px
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnToggleOn {
|
|
||||||
background-position: -27px -60px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnClose {
|
|
||||||
border-left: 1px solid #111;
|
|
||||||
width: 35px;
|
|
||||||
background-position: -56px 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-buttons a.btnDisabled {
|
|
||||||
opacity : 0.4;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
|
@ -1,121 +0,0 @@
|
||||||
/*!
|
|
||||||
* Buttons helper for fancyBox
|
|
||||||
* version: 1.0.5 (Mon, 15 Oct 2012)
|
|
||||||
* @requires fancyBox v2.0 or later
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
* $(".fancybox").fancybox({
|
|
||||||
* helpers : {
|
|
||||||
* buttons: {
|
|
||||||
* position : 'top'
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
(function ($) {
|
|
||||||
//Shortcut for fancyBox object
|
|
||||||
var F = $.fancybox;
|
|
||||||
|
|
||||||
//Add helper object
|
|
||||||
F.helpers.buttons = {
|
|
||||||
defaults : {
|
|
||||||
skipSingle : false, // disables if gallery contains single image
|
|
||||||
position : 'top', // 'top' or 'bottom'
|
|
||||||
tpl : '<div id="fancybox-buttons"><ul><li><a class="btnPrev" title="Previous" href="javascript:;"></a></li><li><a class="btnPlay" title="Start slideshow" href="javascript:;"></a></li><li><a class="btnNext" title="Next" href="javascript:;"></a></li><li><a class="btnToggle" title="Toggle size" href="javascript:;"></a></li><li><a class="btnClose" title="Close" href="javascript:jQuery.fancybox.close();"></a></li></ul></div>'
|
|
||||||
},
|
|
||||||
|
|
||||||
list : null,
|
|
||||||
buttons: null,
|
|
||||||
|
|
||||||
beforeLoad: function (opts, obj) {
|
|
||||||
//Remove self if gallery do not have at least two items
|
|
||||||
|
|
||||||
if (opts.skipSingle && obj.group.length < 2) {
|
|
||||||
obj.helpers.buttons = false;
|
|
||||||
obj.closeBtn = true;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Increase top margin to give space for buttons
|
|
||||||
obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30;
|
|
||||||
},
|
|
||||||
|
|
||||||
onPlayStart: function () {
|
|
||||||
if (this.buttons) {
|
|
||||||
this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onPlayEnd: function () {
|
|
||||||
if (this.buttons) {
|
|
||||||
this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
afterShow: function (opts, obj) {
|
|
||||||
var buttons = this.buttons;
|
|
||||||
|
|
||||||
if (!buttons) {
|
|
||||||
this.list = $(opts.tpl).addClass(opts.position).appendTo('body');
|
|
||||||
|
|
||||||
buttons = {
|
|
||||||
prev : this.list.find('.btnPrev').click( F.prev ),
|
|
||||||
next : this.list.find('.btnNext').click( F.next ),
|
|
||||||
play : this.list.find('.btnPlay').click( F.play ),
|
|
||||||
toggle : this.list.find('.btnToggle').click( F.toggle )
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Prev
|
|
||||||
if (obj.index > 0 || obj.loop) {
|
|
||||||
buttons.prev.removeClass('btnDisabled');
|
|
||||||
} else {
|
|
||||||
buttons.prev.addClass('btnDisabled');
|
|
||||||
}
|
|
||||||
|
|
||||||
//Next / Play
|
|
||||||
if (obj.loop || obj.index < obj.group.length - 1) {
|
|
||||||
buttons.next.removeClass('btnDisabled');
|
|
||||||
buttons.play.removeClass('btnDisabled');
|
|
||||||
|
|
||||||
} else {
|
|
||||||
buttons.next.addClass('btnDisabled');
|
|
||||||
buttons.play.addClass('btnDisabled');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.buttons = buttons;
|
|
||||||
|
|
||||||
this.onUpdate(opts, obj);
|
|
||||||
},
|
|
||||||
|
|
||||||
onUpdate: function (opts, obj) {
|
|
||||||
var toggle;
|
|
||||||
|
|
||||||
if (!this.buttons) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn');
|
|
||||||
|
|
||||||
//Size toggle button
|
|
||||||
if (obj.canShrink) {
|
|
||||||
toggle.addClass('btnToggleOn');
|
|
||||||
|
|
||||||
} else if (!obj.canExpand) {
|
|
||||||
toggle.addClass('btnDisabled');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeClose: function () {
|
|
||||||
if (this.list) {
|
|
||||||
this.list.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.list = null;
|
|
||||||
this.buttons = null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}(jQuery));
|
|
|
@ -1,196 +0,0 @@
|
||||||
/*!
|
|
||||||
* Media helper for fancyBox
|
|
||||||
* version: 1.0.5 (Tue, 23 Oct 2012)
|
|
||||||
* @requires fancyBox v2.0 or later
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
* $(".fancybox").fancybox({
|
|
||||||
* helpers : {
|
|
||||||
* media: true
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* Set custom URL parameters:
|
|
||||||
* $(".fancybox").fancybox({
|
|
||||||
* helpers : {
|
|
||||||
* media: {
|
|
||||||
* youtube : {
|
|
||||||
* params : {
|
|
||||||
* autoplay : 0
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* Or:
|
|
||||||
* $(".fancybox").fancybox({,
|
|
||||||
* helpers : {
|
|
||||||
* media: true
|
|
||||||
* },
|
|
||||||
* youtube : {
|
|
||||||
* autoplay: 0
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* Supports:
|
|
||||||
*
|
|
||||||
* Youtube
|
|
||||||
* http://www.youtube.com/watch?v=opj24KnzrWo
|
|
||||||
* http://www.youtube.com/embed/opj24KnzrWo
|
|
||||||
* http://youtu.be/opj24KnzrWo
|
|
||||||
* Vimeo
|
|
||||||
* http://vimeo.com/40648169
|
|
||||||
* http://vimeo.com/channels/staffpicks/38843628
|
|
||||||
* http://vimeo.com/groups/surrealism/videos/36516384
|
|
||||||
* http://player.vimeo.com/video/45074303
|
|
||||||
* Metacafe
|
|
||||||
* http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/
|
|
||||||
* http://www.metacafe.com/watch/7635964/
|
|
||||||
* Dailymotion
|
|
||||||
* http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people
|
|
||||||
* Twitvid
|
|
||||||
* http://twitvid.com/QY7MD
|
|
||||||
* Twitpic
|
|
||||||
* http://twitpic.com/7p93st
|
|
||||||
* Instagram
|
|
||||||
* http://instagr.am/p/IejkuUGxQn/
|
|
||||||
* http://instagram.com/p/IejkuUGxQn/
|
|
||||||
* Google maps
|
|
||||||
* http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17
|
|
||||||
* http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
|
|
||||||
* http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56
|
|
||||||
*/
|
|
||||||
(function ($) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
//Shortcut for fancyBox object
|
|
||||||
var F = $.fancybox,
|
|
||||||
format = function( url, rez, params ) {
|
|
||||||
params = params || '';
|
|
||||||
|
|
||||||
if ( $.type( params ) === "object" ) {
|
|
||||||
params = $.param(params, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
$.each(rez, function(key, value) {
|
|
||||||
url = url.replace( '$' + key, value || '' );
|
|
||||||
});
|
|
||||||
|
|
||||||
if (params.length) {
|
|
||||||
url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params;
|
|
||||||
}
|
|
||||||
|
|
||||||
return url;
|
|
||||||
};
|
|
||||||
|
|
||||||
//Add helper object
|
|
||||||
F.helpers.media = {
|
|
||||||
defaults : {
|
|
||||||
youtube : {
|
|
||||||
matcher : /(youtube\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i,
|
|
||||||
params : {
|
|
||||||
autoplay : 1,
|
|
||||||
autohide : 1,
|
|
||||||
fs : 1,
|
|
||||||
rel : 0,
|
|
||||||
hd : 1,
|
|
||||||
wmode : 'opaque',
|
|
||||||
enablejsapi : 1
|
|
||||||
},
|
|
||||||
type : 'iframe',
|
|
||||||
url : '//www.youtube.com/embed/$3'
|
|
||||||
},
|
|
||||||
vimeo : {
|
|
||||||
matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/,
|
|
||||||
params : {
|
|
||||||
autoplay : 1,
|
|
||||||
hd : 1,
|
|
||||||
show_title : 1,
|
|
||||||
show_byline : 1,
|
|
||||||
show_portrait : 0,
|
|
||||||
fullscreen : 1
|
|
||||||
},
|
|
||||||
type : 'iframe',
|
|
||||||
url : '//player.vimeo.com/video/$1'
|
|
||||||
},
|
|
||||||
metacafe : {
|
|
||||||
matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/,
|
|
||||||
params : {
|
|
||||||
autoPlay : 'yes'
|
|
||||||
},
|
|
||||||
type : 'swf',
|
|
||||||
url : function( rez, params, obj ) {
|
|
||||||
obj.swf.flashVars = 'playerVars=' + $.param( params, true );
|
|
||||||
|
|
||||||
return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dailymotion : {
|
|
||||||
matcher : /dailymotion.com\/video\/(.*)\/?(.*)/,
|
|
||||||
params : {
|
|
||||||
additionalInfos : 0,
|
|
||||||
autoStart : 1
|
|
||||||
},
|
|
||||||
type : 'swf',
|
|
||||||
url : '//www.dailymotion.com/swf/video/$1'
|
|
||||||
},
|
|
||||||
twitvid : {
|
|
||||||
matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i,
|
|
||||||
params : {
|
|
||||||
autoplay : 0
|
|
||||||
},
|
|
||||||
type : 'iframe',
|
|
||||||
url : '//www.twitvid.com/embed.php?guid=$1'
|
|
||||||
},
|
|
||||||
twitpic : {
|
|
||||||
matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i,
|
|
||||||
type : 'image',
|
|
||||||
url : '//twitpic.com/show/full/$1/'
|
|
||||||
},
|
|
||||||
instagram : {
|
|
||||||
matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
|
|
||||||
type : 'image',
|
|
||||||
url : '//$1/p/$2/media/'
|
|
||||||
},
|
|
||||||
google_maps : {
|
|
||||||
matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i,
|
|
||||||
type : 'iframe',
|
|
||||||
url : function( rez ) {
|
|
||||||
return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeLoad : function(opts, obj) {
|
|
||||||
var url = obj.href || '',
|
|
||||||
type = false,
|
|
||||||
what,
|
|
||||||
item,
|
|
||||||
rez,
|
|
||||||
params;
|
|
||||||
|
|
||||||
for (what in opts) {
|
|
||||||
item = opts[ what ];
|
|
||||||
rez = url.match( item.matcher );
|
|
||||||
|
|
||||||
if (rez) {
|
|
||||||
type = item.type;
|
|
||||||
params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null));
|
|
||||||
|
|
||||||
url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params );
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type) {
|
|
||||||
obj.href = url;
|
|
||||||
obj.type = type;
|
|
||||||
|
|
||||||
obj.autoHeight = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}(jQuery));
|
|
|
@ -1,54 +0,0 @@
|
||||||
#fancybox-thumbs {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
z-index: 8050;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs.bottom {
|
|
||||||
bottom: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs.top {
|
|
||||||
top: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs ul {
|
|
||||||
position: relative;
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs ul li {
|
|
||||||
float: left;
|
|
||||||
padding: 1px;
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs ul li.active {
|
|
||||||
opacity: 0.75;
|
|
||||||
padding: 0;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs ul li:hover {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs ul li a {
|
|
||||||
display: block;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
border: 1px solid #222;
|
|
||||||
background: #111;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-thumbs ul li img {
|
|
||||||
display: block;
|
|
||||||
position: relative;
|
|
||||||
border: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
|
@ -1,162 +0,0 @@
|
||||||
/*!
|
|
||||||
* Thumbnail helper for fancyBox
|
|
||||||
* version: 1.0.7 (Mon, 01 Oct 2012)
|
|
||||||
* @requires fancyBox v2.0 or later
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
* $(".fancybox").fancybox({
|
|
||||||
* helpers : {
|
|
||||||
* thumbs: {
|
|
||||||
* width : 50,
|
|
||||||
* height : 50
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
(function ($) {
|
|
||||||
//Shortcut for fancyBox object
|
|
||||||
var F = $.fancybox;
|
|
||||||
|
|
||||||
//Add helper object
|
|
||||||
F.helpers.thumbs = {
|
|
||||||
defaults : {
|
|
||||||
width : 50, // thumbnail width
|
|
||||||
height : 50, // thumbnail height
|
|
||||||
position : 'bottom', // 'top' or 'bottom'
|
|
||||||
source : function ( item ) { // function to obtain the URL of the thumbnail image
|
|
||||||
var href;
|
|
||||||
|
|
||||||
if (item.element) {
|
|
||||||
href = $(item.element).find('img').attr('src');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!href && item.type === 'image' && item.href) {
|
|
||||||
href = item.href;
|
|
||||||
}
|
|
||||||
|
|
||||||
return href;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
wrap : null,
|
|
||||||
list : null,
|
|
||||||
width : 0,
|
|
||||||
|
|
||||||
init: function (opts, obj) {
|
|
||||||
var that = this,
|
|
||||||
list,
|
|
||||||
thumbWidth = opts.width,
|
|
||||||
thumbHeight = opts.height,
|
|
||||||
thumbSource = opts.source;
|
|
||||||
|
|
||||||
//Build list structure
|
|
||||||
list = '';
|
|
||||||
|
|
||||||
for (var n = 0; n < obj.group.length; n++) {
|
|
||||||
list += '<li><a style="width:' + thumbWidth + 'px;height:' + thumbHeight + 'px;" href="javascript:jQuery.fancybox.jumpto(' + n + ');"></a></li>';
|
|
||||||
}
|
|
||||||
|
|
||||||
this.wrap = $('<div id="fancybox-thumbs"></div>').addClass(opts.position).appendTo('body');
|
|
||||||
this.list = $('<ul>' + list + '</ul>').appendTo(this.wrap);
|
|
||||||
|
|
||||||
//Load each thumbnail
|
|
||||||
$.each(obj.group, function (i) {
|
|
||||||
var href = thumbSource( obj.group[ i ] );
|
|
||||||
|
|
||||||
if (!href) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$("<img />").load(function () {
|
|
||||||
var width = this.width,
|
|
||||||
height = this.height,
|
|
||||||
widthRatio, heightRatio, parent;
|
|
||||||
|
|
||||||
if (!that.list || !width || !height) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Calculate thumbnail width/height and center it
|
|
||||||
widthRatio = width / thumbWidth;
|
|
||||||
heightRatio = height / thumbHeight;
|
|
||||||
|
|
||||||
parent = that.list.children().eq(i).find('a');
|
|
||||||
|
|
||||||
if (widthRatio >= 1 && heightRatio >= 1) {
|
|
||||||
if (widthRatio > heightRatio) {
|
|
||||||
width = Math.floor(width / heightRatio);
|
|
||||||
height = thumbHeight;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
width = thumbWidth;
|
|
||||||
height = Math.floor(height / widthRatio);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this).css({
|
|
||||||
width : width,
|
|
||||||
height : height,
|
|
||||||
top : Math.floor(thumbHeight / 2 - height / 2),
|
|
||||||
left : Math.floor(thumbWidth / 2 - width / 2)
|
|
||||||
});
|
|
||||||
|
|
||||||
parent.width(thumbWidth).height(thumbHeight);
|
|
||||||
|
|
||||||
$(this).hide().appendTo(parent).fadeIn(300);
|
|
||||||
|
|
||||||
}).attr('src', href);
|
|
||||||
});
|
|
||||||
|
|
||||||
//Set initial width
|
|
||||||
this.width = this.list.children().eq(0).outerWidth(true);
|
|
||||||
|
|
||||||
this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)));
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeLoad: function (opts, obj) {
|
|
||||||
//Remove self if gallery do not have at least two items
|
|
||||||
if (obj.group.length < 2) {
|
|
||||||
obj.helpers.thumbs = false;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Increase bottom margin to give space for thumbs
|
|
||||||
obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15);
|
|
||||||
},
|
|
||||||
|
|
||||||
afterShow: function (opts, obj) {
|
|
||||||
//Check if exists and create or update list
|
|
||||||
if (this.list) {
|
|
||||||
this.onUpdate(opts, obj);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
this.init(opts, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Set active element
|
|
||||||
this.list.children().removeClass('active').eq(obj.index).addClass('active');
|
|
||||||
},
|
|
||||||
|
|
||||||
//Center list
|
|
||||||
onUpdate: function (opts, obj) {
|
|
||||||
if (this.list) {
|
|
||||||
this.list.stop(true).animate({
|
|
||||||
'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))
|
|
||||||
}, 150);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeClose: function () {
|
|
||||||
if (this.wrap) {
|
|
||||||
this.wrap.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.wrap = null;
|
|
||||||
this.list = null;
|
|
||||||
this.width = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}(jQuery));
|
|
249
resources/fancybox/jquery.fancybox.css
vendored
249
resources/fancybox/jquery.fancybox.css
vendored
|
@ -1,249 +0,0 @@
|
||||||
/*! fancyBox v2.1.4 fancyapps.com | fancyapps.com/fancybox/#license */
|
|
||||||
.fancybox-wrap,
|
|
||||||
.fancybox-skin,
|
|
||||||
.fancybox-outer,
|
|
||||||
.fancybox-inner,
|
|
||||||
.fancybox-image,
|
|
||||||
.fancybox-wrap iframe,
|
|
||||||
.fancybox-wrap object,
|
|
||||||
.fancybox-nav,
|
|
||||||
.fancybox-nav span,
|
|
||||||
.fancybox-tmp
|
|
||||||
{
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
outline: none;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-wrap {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 8020;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-skin {
|
|
||||||
position: relative;
|
|
||||||
background: #f9f9f9;
|
|
||||||
color: #444;
|
|
||||||
text-shadow: none;
|
|
||||||
-webkit-border-radius: 4px;
|
|
||||||
-moz-border-radius: 4px;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-opened {
|
|
||||||
z-index: 8030;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-opened .fancybox-skin {
|
|
||||||
-webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
|
|
||||||
-moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
|
|
||||||
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-outer, .fancybox-inner {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-inner {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-type-iframe .fancybox-inner {
|
|
||||||
-webkit-overflow-scrolling: touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-error {
|
|
||||||
color: #444;
|
|
||||||
font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
|
|
||||||
margin: 0;
|
|
||||||
padding: 15px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-image, .fancybox-iframe {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-image {
|
|
||||||
max-width: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
|
|
||||||
background-image: url('fancybox_sprite.png');
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-loading {
|
|
||||||
position: fixed;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
margin-top: -22px;
|
|
||||||
margin-left: -22px;
|
|
||||||
background-position: 0 -108px;
|
|
||||||
opacity: 0.8;
|
|
||||||
cursor: pointer;
|
|
||||||
z-index: 8060;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fancybox-loading div {
|
|
||||||
width: 44px;
|
|
||||||
height: 44px;
|
|
||||||
background: url('fancybox_loading.gif') center center no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-close {
|
|
||||||
position: absolute;
|
|
||||||
top: -18px;
|
|
||||||
right: -18px;
|
|
||||||
width: 36px;
|
|
||||||
height: 36px;
|
|
||||||
cursor: pointer;
|
|
||||||
z-index: 8040;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-nav {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
width: 40%;
|
|
||||||
height: 100%;
|
|
||||||
cursor: pointer;
|
|
||||||
text-decoration: none;
|
|
||||||
background: transparent url('blank.gif'); /* helps IE */
|
|
||||||
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
|
||||||
z-index: 8040;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-prev {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-next {
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-nav span {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
width: 36px;
|
|
||||||
height: 34px;
|
|
||||||
margin-top: -18px;
|
|
||||||
cursor: pointer;
|
|
||||||
z-index: 8040;
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-prev span {
|
|
||||||
left: 10px;
|
|
||||||
background-position: 0 -36px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-next span {
|
|
||||||
right: 10px;
|
|
||||||
background-position: 0 -72px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-nav:hover span {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-tmp {
|
|
||||||
position: absolute;
|
|
||||||
top: -99999px;
|
|
||||||
left: -99999px;
|
|
||||||
visibility: hidden;
|
|
||||||
max-width: 99999px;
|
|
||||||
max-height: 99999px;
|
|
||||||
overflow: visible !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Overlay helper */
|
|
||||||
|
|
||||||
.fancybox-lock {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-overlay {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
display: none;
|
|
||||||
z-index: 8010;
|
|
||||||
background: url('fancybox_overlay.png');
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-overlay-fixed {
|
|
||||||
position: fixed;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-lock .fancybox-overlay {
|
|
||||||
overflow: auto;
|
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Title helper */
|
|
||||||
|
|
||||||
.fancybox-title {
|
|
||||||
visibility: hidden;
|
|
||||||
font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
|
|
||||||
position: relative;
|
|
||||||
text-shadow: none;
|
|
||||||
z-index: 8050;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-opened .fancybox-title {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-title-float-wrap {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
right: 50%;
|
|
||||||
margin-bottom: -35px;
|
|
||||||
z-index: 8050;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-title-float-wrap .child {
|
|
||||||
display: inline-block;
|
|
||||||
margin-right: -100%;
|
|
||||||
padding: 2px 20px;
|
|
||||||
background: transparent; /* Fallback for web browsers that doesn't support RGBa */
|
|
||||||
background: rgba(0, 0, 0, 0.8);
|
|
||||||
-webkit-border-radius: 15px;
|
|
||||||
-moz-border-radius: 15px;
|
|
||||||
border-radius: 15px;
|
|
||||||
text-shadow: 0 1px 2px #222;
|
|
||||||
color: #FFF;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 24px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-title-outside-wrap {
|
|
||||||
position: relative;
|
|
||||||
margin-top: 10px;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-title-inside-wrap {
|
|
||||||
padding-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancybox-title-over-wrap {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
color: #fff;
|
|
||||||
padding: 10px;
|
|
||||||
background: #000;
|
|
||||||
background: rgba(0, 0, 0, .8);
|
|
||||||
}
|
|
File diff suppressed because one or more lines are too long
8
resources/jquery-cookie/jquery.cookies.js
Normal file
8
resources/jquery-cookie/jquery.cookies.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
/*!
|
||||||
|
* jQuery Cookie Plugin v1.3.1
|
||||||
|
* https://github.com/carhartl/jquery-cookie
|
||||||
|
*
|
||||||
|
* Copyright 2013 Klaus Hartl
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
(function(a,b,c){function e(a){return a}function f(a){return g(decodeURIComponent(a.replace(d," ")))}function g(a){return 0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")),a}function h(a){return i.json?JSON.parse(a):a}var d=/\+/g,i=a.cookie=function(d,g,j){if(g!==c){if(j=a.extend({},i.defaults,j),null===g&&(j.expires=-1),"number"==typeof j.expires){var k=j.expires,l=j.expires=new Date;l.setDate(l.getDate()+k)}return g=i.json?JSON.stringify(g):g+"",b.cookie=[encodeURIComponent(d),"=",i.raw?g:encodeURIComponent(g),j.expires?"; expires="+j.expires.toUTCString():"",j.path?"; path="+j.path:"",j.domain?"; domain="+j.domain:"",j.secure?"; secure":""].join("")}for(var m=i.raw?e:f,n=b.cookie.split("; "),o=d?null:{},p=0,q=n.length;q>p;p++){var r=n[p].split("="),s=m(r.shift()),t=m(r.join("="));if(d&&d===s){o=h(t);break}d||(o[s]=h(t))}return o};i.defaults={},a.removeCookie=function(b,c){return null!==a.cookie(b)?(a.cookie(b,null,c),!0):!1}})(jQuery,document);
|
249
resources/lru/lru.js
Normal file
249
resources/lru/lru.js
Normal file
|
@ -0,0 +1,249 @@
|
||||||
|
/**
|
||||||
|
* A doubly linked list-based Least Recently Used (LRU) cache. Will keep most
|
||||||
|
* recently used items while discarding least recently used items when its limit
|
||||||
|
* is reached.
|
||||||
|
*
|
||||||
|
* Licensed under MIT. Copyright (c) 2010 Rasmus Andersson <http://hunch.se/>
|
||||||
|
* See README.md for details.
|
||||||
|
*
|
||||||
|
* Illustration of the design:
|
||||||
|
*
|
||||||
|
* entry entry entry entry
|
||||||
|
* ______ ______ ______ ______
|
||||||
|
* | head |.newer => | |.newer => | |.newer => | tail |
|
||||||
|
* | A | | B | | C | | D |
|
||||||
|
* |______| <= older.|______| <= older.|______| <= older.|______|
|
||||||
|
*
|
||||||
|
* removed <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- added
|
||||||
|
*/
|
||||||
|
function LRUCache (limit) {
|
||||||
|
// Current size of the cache. (Read-only).
|
||||||
|
this.size = 0;
|
||||||
|
// Maximum number of items this cache can hold.
|
||||||
|
this.limit = limit;
|
||||||
|
this._keymap = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put <value> into the cache associated with <key>. Returns the entry which was
|
||||||
|
* removed to make room for the new entry. Otherwise undefined is returned
|
||||||
|
* (i.e. if there was enough room already).
|
||||||
|
*/
|
||||||
|
LRUCache.prototype.put = function(key, value) {
|
||||||
|
var entry = {key:key, value:value};
|
||||||
|
// Note: No protection agains replacing, and thus orphan entries. By design.
|
||||||
|
this._keymap[key] = entry;
|
||||||
|
if (this.tail) {
|
||||||
|
// link previous tail to the new tail (entry)
|
||||||
|
this.tail.newer = entry;
|
||||||
|
entry.older = this.tail;
|
||||||
|
} else {
|
||||||
|
// we're first in -- yay
|
||||||
|
this.head = entry;
|
||||||
|
}
|
||||||
|
// add new entry to the end of the linked list -- it's now the freshest entry.
|
||||||
|
this.tail = entry;
|
||||||
|
if (this.size === this.limit) {
|
||||||
|
// we hit the limit -- remove the head
|
||||||
|
return this.shift();
|
||||||
|
} else {
|
||||||
|
// increase the size counter
|
||||||
|
this.size++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purge the least recently used (oldest) entry from the cache. Returns the
|
||||||
|
* removed entry or undefined if the cache was empty.
|
||||||
|
*
|
||||||
|
* If you need to perform any form of finalization of purged items, this is a
|
||||||
|
* good place to do it. Simply override/replace this function:
|
||||||
|
*
|
||||||
|
* var c = new LRUCache(123);
|
||||||
|
* c.shift = function() {
|
||||||
|
* var entry = LRUCache.prototype.shift.call(this);
|
||||||
|
* doSomethingWith(entry);
|
||||||
|
* return entry;
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
LRUCache.prototype.shift = function() {
|
||||||
|
// todo: handle special case when limit == 1
|
||||||
|
var entry = this.head;
|
||||||
|
if (entry) {
|
||||||
|
if (this.head.newer) {
|
||||||
|
this.head = this.head.newer;
|
||||||
|
this.head.older = undefined;
|
||||||
|
} else {
|
||||||
|
this.head = undefined;
|
||||||
|
}
|
||||||
|
// Remove last strong reference to <entry> and remove links from the purged
|
||||||
|
// entry being returned:
|
||||||
|
entry.newer = entry.older = undefined;
|
||||||
|
// delete is slow, but we need to do this to avoid uncontrollable growth:
|
||||||
|
delete this._keymap[entry.key];
|
||||||
|
}
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get and register recent use of <key>. Returns the value associated with <key>
|
||||||
|
* or undefined if not in cache.
|
||||||
|
*/
|
||||||
|
LRUCache.prototype.get = function(key, returnEntry) {
|
||||||
|
// First, find our cache entry
|
||||||
|
var entry = this._keymap[key];
|
||||||
|
if (entry === undefined) return; // Not cached. Sorry.
|
||||||
|
// As <key> was found in the cache, register it as being requested recently
|
||||||
|
if (entry === this.tail) {
|
||||||
|
// Already the most recenlty used entry, so no need to update the list
|
||||||
|
return entry.value;
|
||||||
|
}
|
||||||
|
// HEAD--------------TAIL
|
||||||
|
// <.older .newer>
|
||||||
|
// <--- add direction --
|
||||||
|
// A B C <D> E
|
||||||
|
if (entry.newer) {
|
||||||
|
if (entry === this.head)
|
||||||
|
this.head = entry.newer;
|
||||||
|
entry.newer.older = entry.older; // C <-- E.
|
||||||
|
}
|
||||||
|
if (entry.older)
|
||||||
|
entry.older.newer = entry.newer; // C. --> E
|
||||||
|
entry.newer = undefined; // D --x
|
||||||
|
entry.older = this.tail; // D. --> E
|
||||||
|
if (this.tail)
|
||||||
|
this.tail.newer = entry; // E. <-- D
|
||||||
|
this.tail = entry;
|
||||||
|
return returnEntry ? entry : entry.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Following code is optional and can be removed without breaking the core
|
||||||
|
// functionality.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if <key> is in the cache without registering recent use. Feasible if
|
||||||
|
* you do not want to chage the state of the cache, but only "peek" at it.
|
||||||
|
* Returns the entry associated with <key> if found, or undefined if not found.
|
||||||
|
*/
|
||||||
|
LRUCache.prototype.find = function(key) {
|
||||||
|
return this._keymap[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the value of entry with <key>. Returns the old value, or undefined if
|
||||||
|
* entry was not in the cache.
|
||||||
|
*/
|
||||||
|
LRUCache.prototype.set = function(key, value) {
|
||||||
|
var oldvalue, entry = this.get(key, true);
|
||||||
|
if (entry) {
|
||||||
|
oldvalue = entry.value;
|
||||||
|
entry.value = value;
|
||||||
|
} else {
|
||||||
|
oldvalue = this.put(key, value);
|
||||||
|
if (oldvalue) oldvalue = oldvalue.value;
|
||||||
|
}
|
||||||
|
return oldvalue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove entry <key> from cache and return its value. Returns undefined if not
|
||||||
|
* found.
|
||||||
|
*/
|
||||||
|
LRUCache.prototype.remove = function(key) {
|
||||||
|
var entry = this._keymap[key];
|
||||||
|
if (!entry) return;
|
||||||
|
delete this._keymap[entry.key]; // need to do delete unfortunately
|
||||||
|
if (entry.newer && entry.older) {
|
||||||
|
// relink the older entry with the newer entry
|
||||||
|
entry.older.newer = entry.newer;
|
||||||
|
entry.newer.older = entry.older;
|
||||||
|
} else if (entry.newer) {
|
||||||
|
// remove the link to us
|
||||||
|
entry.newer.older = undefined;
|
||||||
|
// link the newer entry to head
|
||||||
|
this.head = entry.newer;
|
||||||
|
} else if (entry.older) {
|
||||||
|
// remove the link to us
|
||||||
|
entry.older.newer = undefined;
|
||||||
|
// link the newer entry to head
|
||||||
|
this.tail = entry.older;
|
||||||
|
} else {// if(entry.older === undefined && entry.newer === undefined) {
|
||||||
|
this.head = this.tail = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.size--;
|
||||||
|
return entry.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Removes all entries */
|
||||||
|
LRUCache.prototype.removeAll = function() {
|
||||||
|
// This should be safe, as we never expose strong refrences to the outside
|
||||||
|
this.head = this.tail = undefined;
|
||||||
|
this.size = 0;
|
||||||
|
this._keymap = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array containing all keys of entries stored in the cache object, in
|
||||||
|
* arbitrary order.
|
||||||
|
*/
|
||||||
|
if (typeof Object.keys === 'function') {
|
||||||
|
LRUCache.prototype.keys = function() { return Object.keys(this._keymap); }
|
||||||
|
} else {
|
||||||
|
LRUCache.prototype.keys = function() {
|
||||||
|
var keys = [];
|
||||||
|
for (var k in this._keymap) keys.push(k);
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call `fun` for each entry. Starting with the newest entry if `desc` is a true
|
||||||
|
* value, otherwise starts with the oldest (head) enrty and moves towards the
|
||||||
|
* tail.
|
||||||
|
*
|
||||||
|
* `fun` is called with 3 arguments in the context `context`:
|
||||||
|
* `fun.call(context, Object key, Object value, LRUCache self)`
|
||||||
|
*/
|
||||||
|
LRUCache.prototype.forEach = function(fun, context, desc) {
|
||||||
|
if (context === true) { desc = true; context = undefined; }
|
||||||
|
else if (typeof context !== 'object') context = this;
|
||||||
|
if (desc) {
|
||||||
|
var entry = this.tail;
|
||||||
|
while (entry) {
|
||||||
|
fun.call(context, entry.key, entry.value, this);
|
||||||
|
entry = entry.older;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var entry = this.head;
|
||||||
|
while (entry) {
|
||||||
|
fun.call(context, entry.key, entry.value, this);
|
||||||
|
entry = entry.newer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a JSON (array) representation */
|
||||||
|
LRUCache.prototype.toJSON = function() {
|
||||||
|
var s = [], entry = this.head;
|
||||||
|
while (entry) {
|
||||||
|
s.push({key:entry.key.toJSON(), value:entry.value.toJSON()});
|
||||||
|
entry = entry.newer;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a String representation */
|
||||||
|
LRUCache.prototype.toString = function() {
|
||||||
|
var s = '', entry = this.head;
|
||||||
|
while (entry) {
|
||||||
|
s += String(entry.key)+':'+entry.value;
|
||||||
|
if (entry = entry.newer)
|
||||||
|
s += ' < ';
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export ourselves
|
||||||
|
if (typeof this === 'object') this.LRUCache = LRUCache;
|
|
@ -46,6 +46,16 @@ a:hover { color:#000; text-decoration: none; }
|
||||||
.books:hover { width: 100%; background-color: #778899; }
|
.books:hover { width: 100%; background-color: #778899; }
|
||||||
.link a:hover { display:inline-block; width: 100%; background-color: #778899; /*Dirty IE Hack*/ zoom: 1; *display: inline;}
|
.link a:hover { display:inline-block; width: 100%; background-color: #778899; /*Dirty IE Hack*/ zoom: 1; *display: inline;}
|
||||||
|
|
||||||
|
.mfp-content .bookpopup {
|
||||||
|
position: relative;
|
||||||
|
background: #FFF;
|
||||||
|
padding: 20px;
|
||||||
|
width: auto;
|
||||||
|
max-width: 700px;
|
||||||
|
margin: 20px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
img
|
img
|
||||||
{
|
{
|
||||||
margin:0;
|
margin:0;
|
||||||
|
@ -156,8 +166,12 @@ max-width:800px;
|
||||||
text-decoration : none;
|
text-decoration : none;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding: 5px 10px 5px 10px;
|
padding: 5px 10px 5px 10px;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.download img {
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
|
||||||
.books h4{
|
.books h4{
|
||||||
display: inline;
|
display: inline;
|
||||||
|
|
53
templates/default/bookdetail.html
Normal file
53
templates/default/bookdetail.html
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<article class="bookpopup">
|
||||||
|
<span class="cover">
|
||||||
|
{{? it.book.hasCover == 1}}
|
||||||
|
<a href="{{=it.book.coverurl}}">
|
||||||
|
<img src="{{=it.book.thumbnailurl}}" alt="{{=it.const.i18n.coverAlt}}" />
|
||||||
|
</a>
|
||||||
|
{{?}}
|
||||||
|
</span>
|
||||||
|
<h2 class="download">
|
||||||
|
{{~it.book.datas:data:i}}
|
||||||
|
<a href="{{=data.url}}">{{=data.format}}</a>
|
||||||
|
{{? data.mail == 1}}
|
||||||
|
<a href="customize.php" onclick="sendToMailAddress (this, {{=data.id}}); return false;"><img src="images/mail-send.png?v={{=it.const.version}}" alt="Mail" /></a>
|
||||||
|
{{?}}
|
||||||
|
<br />
|
||||||
|
{{~}}
|
||||||
|
</h2>
|
||||||
|
<h1><a rel="bookmark" href="{{=strformat (it.const.url.detailUrl, it.book.id, it.databaseId)}}"><img src="images/Link.png?v={{=it.const.version}}" alt="{{=it.const.i18n.permalinkAlt}}" /></a>{{=htmlEscape (it.title)}}</h1>
|
||||||
|
<p class="popupless">
|
||||||
|
<h3>{{=it.const.i18n.authorsTitle}}: </h3>
|
||||||
|
{{~it.book.authors:author:j}}
|
||||||
|
{{? j > 0}}, {{?}}<a href="{{=author.url}}">{{=htmlEscape (author.name)}}</a>
|
||||||
|
{{~}}
|
||||||
|
</p>
|
||||||
|
{{? it.book.tagsName != ""}}
|
||||||
|
<p class="popupless">
|
||||||
|
<h3>{{=it.const.i18n.tagsTitle}}: </h3>
|
||||||
|
{{~it.book.tags:tag:k}}
|
||||||
|
{{? k > 0}}, {{?}}<a href="{{=tag.url}}">{{=htmlEscape (tag.name)}}</a>
|
||||||
|
{{~}}
|
||||||
|
</p>
|
||||||
|
{{?}}
|
||||||
|
{{? it.book.seriesName != ""}}
|
||||||
|
<p class="popupless">
|
||||||
|
<h3><a href="{{=it.book.seriesurl}}">{{=it.const.i18n.seriesTitle}}</a> : </h3>{{=htmlEscape (it.book.seriesCompleteName)}}
|
||||||
|
</p>
|
||||||
|
{{?}}
|
||||||
|
{{? it.book.pubDate != ""}}
|
||||||
|
<p class="popupless">
|
||||||
|
<h3>{{=it.const.i18n.pubdateTitle}}: </h3>{{=it.book.pubDate}}
|
||||||
|
</p>
|
||||||
|
{{?}}
|
||||||
|
{{? it.book.languagesName != ""}}
|
||||||
|
<p class="popupless">
|
||||||
|
<h3>{{=it.const.i18n.languagesTitle}}: </h3>{{=it.book.languagesName}}
|
||||||
|
</p>
|
||||||
|
{{?}}
|
||||||
|
{{? it.book.content != ""}}
|
||||||
|
<br />
|
||||||
|
<h4>{{=it.const.i18n.contentTitle}}</h4>
|
||||||
|
<div>{{=it.book.content}}</div>
|
||||||
|
{{?}}
|
||||||
|
</article>
|
15
templates/default/footer.html
Normal file
15
templates/default/footer.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<footer>
|
||||||
|
<div class="footleft">
|
||||||
|
<a href="customize.php"><img src="images/theme.png?v={{=it.const.version}}" alt="{{=it.const.i18n.customizeTitle}}" /></a>
|
||||||
|
</div>
|
||||||
|
<div class="footright">
|
||||||
|
<a class="fancyabout" href="{{=it.abouturl}}"><img src="images/info.png?v={{=it.const.version}}" alt="{{=it.const.i18n.aboutTitle}}" /></a>
|
||||||
|
</div>
|
||||||
|
{{? it.isPaginated == 1}}
|
||||||
|
<div class="footcenter">
|
||||||
|
{{? it.prevLink != ""}}<a id="prevLink" href="{{=it.prevLink}}" ><img src="images/previous.png?v={{=it.const.version}}" alt="{{=it.const.i18n.previousAlt}}" /></a>{{?}}
|
||||||
|
<p> {{=it.currentPage}} / {{=it.maxPage}} </p>
|
||||||
|
{{? it.nextLink != ""}}<a id="nextLink" href="{{=it.nextLink}}" ><img src="images/next.png?v={{=it.const.version}}" alt="{{=it.const.i18n.nextAlt}}" /></a>{{?}}
|
||||||
|
</div>
|
||||||
|
{{?}}
|
||||||
|
</footer>
|
43
templates/default/header.html
Normal file
43
templates/default/header.html
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<header>
|
||||||
|
<a class="headleft" href="{{=it.homeurl}}">
|
||||||
|
<img src="images/home.png?v={{=it.const.version}}" alt="{{=it.const.i18n.homeAlt}}" />
|
||||||
|
</a>
|
||||||
|
<img class="headright" id="searchImage" src="images/setting64.png?v={{=it.const.version}}" alt="Settings and menu" />
|
||||||
|
<div class="headcenter">
|
||||||
|
<h1>{{=it.title}}</h1>
|
||||||
|
</div>
|
||||||
|
<div id="tool" style="display: none">
|
||||||
|
<div style="float: left; width: 60%">
|
||||||
|
<form id="searchForm" action="index.php" method="get">
|
||||||
|
<div style="float: right">
|
||||||
|
<input type="image" src="images/search32.png?v={{=it.const.version}}" alt="{{=it.const.i18n.searchAlt}}" />
|
||||||
|
</div>
|
||||||
|
<div class="stop">
|
||||||
|
<input type="hidden" name="current" value="{{=it.page}}" />
|
||||||
|
<input type="hidden" name="page" value="9" />
|
||||||
|
{{? it.databaseId != ""}}
|
||||||
|
<input type="hidden" name="db" value="{{=it.databaseId}}" />
|
||||||
|
{{?}}
|
||||||
|
<input type="search" name="query" />
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div id="sortForm" style="float: right; width: 35%; display: none">
|
||||||
|
<div style="float: right">
|
||||||
|
<img id="sort" src="images/sort32.png?v={{=it.const.version}}" alt="{{=it.const.i18n.sortAlt}}" />
|
||||||
|
</div>
|
||||||
|
<div class="stop">
|
||||||
|
<select id="sortchoice">
|
||||||
|
<option value="st">{{=it.const.i18n.bookwordTitle}}</option>
|
||||||
|
<option value="sa">{{=it.const.i18n.authorsTitle}}</option>
|
||||||
|
<option value="ss">{{=it.const.i18n.seriesTitle}}</option>
|
||||||
|
<option value="sp">{{=it.const.i18n.pubdateTitle}}</option>
|
||||||
|
</select>
|
||||||
|
<select id="sortorder">
|
||||||
|
<option value="asc">{{=it.const.i18n.sortorderAsc}}</option>
|
||||||
|
<option value="desc">{{=it.const.i18n.sortorderDesc}}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
43
templates/default/main.html
Normal file
43
templates/default/main.html
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<section>
|
||||||
|
{{? it.page == 13}}
|
||||||
|
{{#def.bookdetail}}
|
||||||
|
{{??}}
|
||||||
|
{{~it.entries:entry:i}}
|
||||||
|
{{? it.containsBook == 0}}
|
||||||
|
<article>
|
||||||
|
<div class="frontpage">
|
||||||
|
<a href="{{=entry.navlink}}">
|
||||||
|
<h2>{{=htmlEscape (entry.title)}}</h2>
|
||||||
|
<h4>{{=entry.content}}</h4>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{??}}
|
||||||
|
<article class="books">
|
||||||
|
<span class="cover">
|
||||||
|
{{? entry.book.hasCover == 1}}
|
||||||
|
<a data-fancybox-group="group" class="fancycover" href="{{=strformat (it.const.url.coverUrl, entry.book.id, it.databaseId)}}">
|
||||||
|
<img src="{{=strformat (it.const.url.thumbnailUrl, entry.book.id, it.databaseId)}}" alt="{{=it.const.i18n.coverAlt}}" />
|
||||||
|
</a>
|
||||||
|
{{?}}
|
||||||
|
</span>
|
||||||
|
<h2 class="download">
|
||||||
|
{{~entry.book.preferedData:data:j}}
|
||||||
|
<a href="{{=data.url}}">{{=data.name}}</a><br />
|
||||||
|
{{~}}
|
||||||
|
</h2>
|
||||||
|
<a class="fancydetail" href="{{=strformat (it.const.url.detailUrl, entry.book.id, it.databaseId)}}">
|
||||||
|
<div class="fullclickpopup">
|
||||||
|
<h2><span class="st">{{=htmlEscape (entry.title)}}</span>
|
||||||
|
{{? entry.book.pubDate != ""}}<span class="sp">({{=entry.book.pubDate}})</span>{{?}}
|
||||||
|
{{? entry.book.rating != ""}}<span class="sr">{{=entry.book.rating}}</span>{{?}}
|
||||||
|
</h2>
|
||||||
|
<h4>{{=it.const.i18n.authorsTitle}} : </h4><span class="sa">{{=htmlEscape (entry.book.authorsName)}}</span><br />
|
||||||
|
{{? entry.book.tagsName != ""}}<h4>{{=it.const.i18n.tagsTitle}} : </h4>{{=htmlEscape (entry.book.tagsName)}}<br />{{?}}
|
||||||
|
{{? entry.book.seriesName != ""}}<h4>{{=it.const.i18n.seriesTitle}} : </h4><span class="ss">{{=htmlEscape (entry.book.seriesName)}}</span><br />{{?}}
|
||||||
|
</div></a>
|
||||||
|
</article>
|
||||||
|
{{?}}
|
||||||
|
{{~}}
|
||||||
|
{{?}}
|
||||||
|
</section>
|
5
templates/default/page.html
Normal file
5
templates/default/page.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<div class="container">
|
||||||
|
{{#def.header}}
|
||||||
|
{{#def.main}}
|
||||||
|
{{#def.footer}}
|
||||||
|
</div>
|
201
util.js
Normal file
201
util.js
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
var templatePage, templateBookDetail, templateMain, currentData, before;
|
||||||
|
|
||||||
|
var cache = new LRUCache(30);
|
||||||
|
|
||||||
|
var DEBUG = true;
|
||||||
|
var isEink = /Kobo|Kindle|EBRD1101/i.test(navigator.userAgent);
|
||||||
|
var isPushStateEnabled = window.history && window.history.pushState && window.history.replaceState &&
|
||||||
|
// pushState isn't reliable on iOS until 5.
|
||||||
|
!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]|WebApps\/.+CFNetwork)/);
|
||||||
|
|
||||||
|
function debug_log(text) {
|
||||||
|
if ( DEBUG ) {
|
||||||
|
console.log(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function elapsed () {
|
||||||
|
var elapsed = new Date () - before;
|
||||||
|
return "Elapsed : " + elapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
function retourMail(data, textStatus, jqXHR ) {
|
||||||
|
alert (data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendToMailAddress (component, dataid) {
|
||||||
|
$toto = $.cookie ('email');
|
||||||
|
if (!$.cookie ('email')) {
|
||||||
|
var email = window.prompt ("Please enter your email : ", "");
|
||||||
|
$.cookie ('email', email);
|
||||||
|
}
|
||||||
|
email = $.cookie ('email');
|
||||||
|
var url = 'sendtomail.php';
|
||||||
|
if (currentData.databaseId) url = url + '?db=' + currentData.databaseId;
|
||||||
|
$.ajax ({url: url, type: 'post', data: { data: dataid, email: email }, success: retourMail});
|
||||||
|
}
|
||||||
|
|
||||||
|
function strformat () {
|
||||||
|
var s = arguments[0];
|
||||||
|
for (var i = 0; i < arguments.length - 1; i++) {
|
||||||
|
var reg = new RegExp("\\{" + i + "\\}", "gm");
|
||||||
|
s = s.replace(reg, arguments[i + 1]);
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isDefined(x) {
|
||||||
|
var undefined;
|
||||||
|
return x !== undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentOption (option) {
|
||||||
|
if (!$.cookie (option)) {
|
||||||
|
if (currentData && currentData.const && currentData.const.config && currentData.const.config [option]) {
|
||||||
|
return currentData.const.config [option];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $.cookie (option);
|
||||||
|
}
|
||||||
|
|
||||||
|
function htmlEscape(str) {
|
||||||
|
return String(str)
|
||||||
|
.replace(/&/g, '&')
|
||||||
|
.replace(/"/g, '"')
|
||||||
|
.replace(/'/g, ''')
|
||||||
|
.replace(/</g, '<')
|
||||||
|
.replace(/>/g, '>');
|
||||||
|
}
|
||||||
|
|
||||||
|
function navigateTo (url) {
|
||||||
|
before = new Date ();
|
||||||
|
var jsonurl = url.replace ("index", "getJSON");
|
||||||
|
var cachedData = cache.get (jsonurl);
|
||||||
|
if (cachedData) {
|
||||||
|
history.pushState(jsonurl, "", url);
|
||||||
|
updatePage (cachedData);
|
||||||
|
} else {
|
||||||
|
$.getJSON(jsonurl, function(data) {
|
||||||
|
history.pushState(jsonurl, "", url);
|
||||||
|
cache.put (jsonurl, data);
|
||||||
|
updatePage (data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updatePage (data) {
|
||||||
|
var result;
|
||||||
|
data ["const"] = currentData ["const"];
|
||||||
|
if (false && $("section").length && currentData.isPaginated == 0 && data.isPaginated == 0) {
|
||||||
|
// Partial update (for now disabled)
|
||||||
|
debug_log ("Partial update");
|
||||||
|
result = templateMain (data);
|
||||||
|
$("h1").html (data.title);
|
||||||
|
$("section").html (result);
|
||||||
|
} else {
|
||||||
|
// Full update
|
||||||
|
result = templatePage (data);
|
||||||
|
$("body").html (result);
|
||||||
|
}
|
||||||
|
document.title = data.title;
|
||||||
|
currentData = data;
|
||||||
|
|
||||||
|
debug_log (elapsed ());
|
||||||
|
|
||||||
|
if ($.cookie('toolbar') == 1) $("#tool").show ();
|
||||||
|
if (currentData.containsBook == 1) {
|
||||||
|
$("#sortForm").show ();
|
||||||
|
} else {
|
||||||
|
$("#sortForm").hide ();
|
||||||
|
}
|
||||||
|
|
||||||
|
ajaxifyLinks ();
|
||||||
|
|
||||||
|
$("#sort").click(function(){
|
||||||
|
$('.books').sortElements(function(a, b){
|
||||||
|
var test = 1;
|
||||||
|
if ($("#sortorder").val() == "desc")
|
||||||
|
{
|
||||||
|
test = -1;
|
||||||
|
}
|
||||||
|
return $(a).find ("." + $("#sortchoice").val()).text() > $(b).find ("." + $("#sortchoice").val()).text() ? test : -test;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".headright").click(function(){
|
||||||
|
if ($("#tool").is(":hidden")) {
|
||||||
|
$("#tool").slideDown("slow");
|
||||||
|
$.cookie('toolbar', '1');
|
||||||
|
} else {
|
||||||
|
$("#tool").slideUp();
|
||||||
|
$.removeCookie('toolbar');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (getCurrentOption ("use_fancyapps") == 1) {
|
||||||
|
$(".fancydetail").click(function(event){
|
||||||
|
event.preventDefault();
|
||||||
|
before = new Date ();
|
||||||
|
var url = $(this).attr("href");
|
||||||
|
var jsonurl = url.replace ("index", "getJSON");
|
||||||
|
$.getJSON(jsonurl, function(data) {
|
||||||
|
data ["const"] = currentData ["const"];
|
||||||
|
var detail = templateBookDetail (data);
|
||||||
|
$.magnificPopup.open({
|
||||||
|
items: {
|
||||||
|
src: detail,
|
||||||
|
type: 'inline'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
debug_log (elapsed ());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$('section').magnificPopup({
|
||||||
|
delegate: '.fancycover', // child items selector, by clicking on it popup will open
|
||||||
|
type: 'image',
|
||||||
|
gallery:{enabled:true, preload: [0,2]}
|
||||||
|
// other options
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$('.fancyabout').magnificPopup({ type: 'ajax' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ajaxifyLinks () {
|
||||||
|
if (isPushStateEnabled) {
|
||||||
|
var links = $("a[href^='index']");
|
||||||
|
if (getCurrentOption ("use_fancyapps") == 1) links = links.not (".fancydetail");
|
||||||
|
links.click (function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var url = $(this).attr('href');
|
||||||
|
navigateTo (url);
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#searchForm").submit (function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var url = strformat ("index.php?page=9¤t={0}&query={1}&db={2}", currentData.page, $("input[name=query]").val (), currentData.databaseId);
|
||||||
|
navigateTo (url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onpopstate = function(event) {
|
||||||
|
before = new Date ();
|
||||||
|
var data = cache.get (event.state)
|
||||||
|
updatePage (data);
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).keydown(function(e){
|
||||||
|
if (e.keyCode == 37 && $("#prevLink").length > 0) {
|
||||||
|
navigateTo ($("#prevLink").attr('href'));
|
||||||
|
}
|
||||||
|
if (e.keyCode == 39 && $("#nextLink").length > 0) {
|
||||||
|
navigateTo ($("#nextLink").attr('href'));
|
||||||
|
}
|
||||||
|
});
|
Loading…
Reference in a new issue