diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..bf070f0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: php +php: + - 5.5 + - 5.4 + - 5.3 \ No newline at end of file diff --git a/base.php b/base.php index 38b6b9c..f28d758 100644 --- a/base.php +++ b/base.php @@ -9,6 +9,7 @@ define ("VERSION", "0.7.0beta"); define ("DB", "db"); date_default_timezone_set($config['default_timezone']); + function useServerSideRendering () { global $config; @@ -168,7 +169,7 @@ function localize($phrase, $count=-1) { /* Load the language file as a JSON object and transform it into an associative array */ $translations = json_decode($lang_file_content, true); - /* Clean the array of all translations unfinished */ + /* Clean the array of all unfinished translations */ foreach ($translations as $key => $val) { if (preg_match ("/^##TODO##/", $key)) { unset ($translations [$key]); @@ -286,14 +287,17 @@ class Entry return date (DATE_ATOM, self::$updated); } - public function getContentArray () { - $navlink = "#"; + public function getNavLink () { foreach ($this->linkArray as $link) { if ($link->type != Link::OPDS_NAVIGATION_TYPE) { continue; } - $navlink = $link->hrefXhtml (); + return $link->hrefXhtml (); } - return array ( "title" => $this->title, "content" => $this->content, "navlink" => $navlink ); + return "#"; + } + + public function getContentArray () { + return array ( "title" => $this->title, "content" => $this->content, "navlink" => $this->getNavLink () ); } public function __construct($ptitle, $pid, $pcontent, $pcontentType, $plinkArray) { @@ -664,18 +668,41 @@ class PageRecentBooks extends Page class PageQueryResult extends Page { + const SCOPE_TAG = "tag"; + const SCOPE_SERIES = "series"; + const SCOPE_AUTHOR = "author"; + const SCOPE_BOOK = "book"; + public function InitializeContent () { global $config; - $this->title = str_format (localize ("search.result"), $this->query); - $currentPage = getURLParam ("current", NULL); + $scope = getURLParam ("scope"); + switch ($scope) { + case self::SCOPE_AUTHOR : + $this->title = str_format (localize ("search.result.author"), $this->query); + break; + case self::SCOPE_TAG : + $this->title = str_format (localize ("search.result.tag"), $this->query); + break; + case self::SCOPE_SERIES : + $this->title = str_format (localize ("search.result.series"), $this->query); + break; + case self::SCOPE_BOOK : + $this->title = str_format (localize ("search.result.book"), $this->query); + break; + default: + $this->title = str_format (localize ("search.result"), $this->query); + } + + $crit = "%" . $this->query . "%"; + $bad = "QQQQQ"; // Special case when we are doing a search and no database is selected if (is_array ($config['calibre_directory']) && is_null (GetUrlParam (DB))) { $i = 0; foreach ($config['calibre_directory'] as $key => $value) { Base::clearDb (); - list ($array, $totalNumber) = Book::getBooksByQuery ($this->query, $this->n, $i); + list ($array, $totalNumber) = Book::getBooksByQuery (array ($crit, $crit, $crit, $crit), $this->n, $i); array_push ($this->entryArray, new Entry ($key, DB . ":query:{$i}", str_format (localize ("bookword", count($array)), count($array)), "text", array ( new LinkNavigation ("?" . DB . "={$i}&page=9&query=" . $this->query)))); @@ -683,14 +710,23 @@ class PageQueryResult extends Page } return; } - - switch ($currentPage) { - case Base::PAGE_ALL_AUTHORS : - case Base::PAGE_AUTHORS_FIRST_LETTER : + switch ($scope) { + case self::SCOPE_AUTHOR : $this->entryArray = Author::getAuthorsByStartingLetter ('%' . $this->query); break; + case self::SCOPE_TAG : + $this->entryArray = Tag::getAllTagsByQuery ($this->query); + break; + case self::SCOPE_SERIES : + $this->entryArray = Serie::getAllSeriesByQuery ($this->query); + break; + case self::SCOPE_BOOK : + list ($this->entryArray, $this->totalNumber) = Book::getBooksByQuery ( + array ($bad, $bad, $bad, $crit), $this->n); + break; default: - list ($this->entryArray, $this->totalNumber) = Book::getBooksByQuery ($this->query, $this->n); + list ($this->entryArray, $this->totalNumber) = Book::getBooksByQuery ( + array ($crit, $crit, $crit, $crit), $this->n); } } } diff --git a/book.php b/book.php index 09b1dc4..c5d5cd4 100644 --- a/book.php +++ b/book.php @@ -32,7 +32,11 @@ define ('SQL_BOOKS_BY_LANGUAGE', "select {0} from books_languages_link, books " define ('SQL_BOOKS_BY_CUSTOM', "select {0} from {2}, books " . SQL_BOOKS_LEFT_JOIN . " where {2}.book = books.id and {2}.{3} = ? {1} order by sort"); define ('SQL_BOOKS_QUERY', "select {0} from books " . SQL_BOOKS_LEFT_JOIN . " - where (exists (select null from authors, books_authors_link where book = books.id and author = authors.id and authors.name like ?) or title like ?) {1} order by books.sort"); + where ( + exists (select null from authors, books_authors_link where book = books.id and author = authors.id and authors.name like ?) or + exists (select null from tags, books_tags_link where book = books.id and tag = tags.id and tags.name like ?) or + exists (select null from series, books_series_link on book = books.id and books_series_link.series = series.id and series.name like ?) or + title like ?) {1} order by books.sort"); define ('SQL_BOOKS_RECENT', "select {0} from books " . SQL_BOOKS_LEFT_JOIN . " where 1=1 {1} order by timestamp desc limit "); @@ -524,7 +528,7 @@ where data.book = books.id and data.id = ?'); } public static function getBooksByQuery($query, $n, $database = NULL) { - return self::getEntryArray (self::SQL_BOOKS_QUERY, array ("%" . $query . "%", "%" . $query . "%"), $n, $database); + return self::getEntryArray (self::SQL_BOOKS_QUERY, $query, $n, $database); } public static function getAllBooks() { @@ -570,10 +574,47 @@ function getJson ($complete = false) { global $config; $page = getURLParam ("page", Base::PAGE_INDEX); $query = getURLParam ("query"); + $search = getURLParam ("search"); $qid = getURLParam ("id"); $n = getURLParam ("n", "1"); $database = GetUrlParam (DB); + if ($search) { + $out = array (); + $arrayTag = Tag::getAllTagsByQuery ($query); + $arraySeries = Serie::getAllSeriesByQuery ($query); + $arrayAuthor = Author::getAuthorsByStartingLetter ('%' . $query); + list ($arrayBook, $totalNumber) = Book::getBooksByStartingLetter ('%' . $query, -1); + + foreach (array ("book" => $arrayBook, + "author" => $arrayAuthor, + "series" => $arraySeries, + "tag" => $arrayTag) as $key => $array) { + $i = 0; + $pagequery = Base::PAGE_OPENSEARCH_QUERY; + foreach ($array as $entry) { + if (count($array) > 0) { + // Comment to help the perl i18n script + // str_format (localize("bookword", count($array)) + // str_format (localize("authorword", count($array) + // str_format (localize("seriesword", count($array) + // str_format (localize("tagword", count($array) + array_push ($out, array ("title" => str_format (localize("{$key}word", count($array)), count($array)), + "class" => "tt-header", + "navlink" => "index.php?page={$pagequery}&query={$query}&db={$database}&scope={$key}")); + } + if ($entry instanceof EntryBook) { + array_push ($out, array ("class" => "", "title" => $entry->title, "navlink" => $entry->book->getDetailUrl ())); + } else { + array_push ($out, array ("class" => "", "title" => $entry->title, "navlink" => $entry->getNavLink ())); + } + $i++; + if ($i > 4) { break; }; + } + } + return $out; + } + $currentPage = Page::getPage ($page, $qid, $query, $n); $currentPage->InitializeContent (); diff --git a/config_default.php b/config_default.php index de6ea58..093fd56 100644 --- a/config_default.php +++ b/config_default.php @@ -103,8 +103,8 @@ /* * generate a invalid OPDS stream to allow bad OPDS client to use search - * Example of non compliant OPDS client : FBReader (was working in May 2012), Moon+ Reader - * Example of good OPDS client : Mantano + * Example of non compliant OPDS client : Moon+ Reader + * Example of good OPDS client : Mantano, FBReader * 1 : enable support for non compliant OPDS client * 0 : always generate valid OPDS code */ diff --git a/lang/Localization_ca.json b/lang/Localization_ca.json index 729e17c..0cd2c3c 100644 --- a/lang/Localization_ca.json +++ b/lang/Localization_ca.json @@ -43,12 +43,19 @@ "recent.title":"Els més recents", "##TODO##search.alternate":"Search", "##TODO##search.result":"Search result for *{0}*", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "##TODO##search.sortorder.asc":"Asc", "##TODO##search.sortorder.desc":"Desc", "series.alphabetical.many":"{0} sèries ordenades alfabèticament", "##TODO##series.alphabetical.none":"Alphabetical index of absolutely no series", "series.alphabetical.one":"Índex alfabètic d'una sola sèrie", "series.title":"Sèries", +"seriesword.many":"sèries", +"seriesword.none":"Cap sèrie", +"seriesword.one":"1 sèrie", "##TODO##sort.alternate":"Sort", "splitByLetter.book.other":"Altres llibres", "splitByLetter.letter":"{0} ({1})", @@ -56,6 +63,9 @@ "##TODO##tags.alphabetical.none":"Alphabetical index of absolutely no tag", "tags.alphabetical.one":"Llistat alfabètic de la única etiqueta", "tags.title":"Etiquetes", +"tagword.many":"etiquetes", +"tagword.none":"Cap etiqueta", +"tagword.one":"1 etiqueta", "tagword.title":"Etiquetes", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/lang/Localization_de.json b/lang/Localization_de.json index b36af99..1f7b699 100644 --- a/lang/Localization_de.json +++ b/lang/Localization_de.json @@ -1,5 +1,5 @@ { -"##TODO##about.title":"About COPS", +"about.title":"Über COPS", "allbooks.alphabetical.many":"Alphabetischer Index der {0} Bücher", "##TODO##allbooks.alphabetical.none":"Alphabetical index of absolutely no book", "allbooks.alphabetical.one":"Alphabetischer Index des einzigen Buchs", @@ -16,59 +16,69 @@ "bookword.none":"Kein Buch", "bookword.one":"1 Buch", "bookword.title":"Bücher", -"##TODO##cog.alternate":"Search, sort and filters", +"cog.alternate":"Suche, Sortierung und Filter", "content.series":"Serien: ", "content.series.data":"Buch {0} der {1} - Reihe", "content.summary":"Inhalt: ", -"##TODO##customize.email":"Set your email (to allow book emailing)", -"##TODO##customize.fancybox":"Use a Lightbox", -"##TODO##customize.filter":"Enable tag filtering", -"##TODO##customize.paging":"Max number of books per page (-1 to disable)", -"##TODO##customize.style":"Theme", -"##TODO##customize.title":"Customize COPS UI", -"##TODO##home.alternate":"Home", +"customize.email":"Geben Sie Ihre E-Mail-Adresse an (erlaubt das Zusenden von Büchern)", +"customize.fancybox":"Benutze die Lightbox", +"customize.filter":"Erlaube das Filtern durch Tags", +"customize.paging":"Maximale Anzahl von Büchern pro Seite (-1 zum deaktivieren)", +"customize.style":"Thema", +"customize.title":"Anpassungen an COPS", +"home.alternate":"Startseite", "i18n.coversection":"Umschlag", "language.title":"Sprache", -"##TODO##languages.alphabetical.many":"Alphabetical index of the {0} languages", +"languages.alphabetical.many":"Alphabetischer Index der {0} Sprachen", "##TODO##languages.alphabetical.none":"Alphabetical index of absolutely no language", -"##TODO##languages.alphabetical.one":"Alphabetical index of the single language", -"##TODO##languages.title":"Languages", -"##TODO##mail.messagenotsent":"Message could not be sent.", -"##TODO##mail.messagesent":"Message has been sent", -"##TODO##paging.next.alternate":"Next", -"##TODO##paging.previous.alternate":"Previous", -"##TODO##permalink.alternate":"Permalink", -"##TODO##pubdate.title":"Publication year", +"languages.alphabetical.one":"Alphabetischer Index der einen Sprache", +"languages.title":"Sprachen", +"mail.messagenotsent":"E-Mail konnte nicht gesendet werden.", +"mail.messagesent":"E-Mail wurde gesendet.", +"paging.next.alternate":"Nächste", +"paging.previous.alternate":"Vorherige", +"permalink.alternate":"Permalink", +"pubdate.title":"Veröffentlichung", "recent.list":"{0} neue Bücher", "recent.title":"Neuzugänge", -"##TODO##search.alternate":"Search", +"search.alternate":"Suche", "search.result":"Suchergebnis für", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "search.sortorder.asc":"Auf", "search.sortorder.desc":"Ab", "series.alphabetical.many":"Alphabetischer Index der {0} Serien", "##TODO##series.alphabetical.none":"Alphabetical index of absolutely no series", "series.alphabetical.one":"Alphabetischer Index der Serie", "series.title":"Serien", -"##TODO##sort.alternate":"Sort", +"seriesword.many":"{0} Serien", +"seriesword.none":"Keine Serie", +"seriesword.one":"1 Serie", +"sort.alternate":"Sortierung", "splitByLetter.book.other":"Andere Bücher", "splitByLetter.letter":"{0} unter {1}", "tags.alphabetical.many":"Alphabetischer Index der {0} Schlagwörter", "##TODO##tags.alphabetical.none":"Alphabetical index of absolutely no tag", "tags.alphabetical.one":"Alphabetischer Index des Schlagworts", "tags.title":"Schlagwörter", +"tagword.many":"{0} Schlagwörter", +"tagword.none":"Kein Schlagwort", +"tagword.one":"1 Schlagwort", "tagword.title":"Schlagwörter", -"##TODO##languages.abk":"Abkhaz", -"##TODO##languages.aaf":"Afar", -"##TODO##languages.afr":"Afrikaans", -"##TODO##languages.aka":"Akan", -"##TODO##languages.sqi":"Albanian", -"##TODO##languages.amh":"Amharic", -"##TODO##languages.ara":"Arabic", -"##TODO##languages.arg":"Aragonese", -"##TODO##languages.hye":"Armenian", -"##TODO##languages.asm":"Assamese", -"##TODO##languages.ava":"Avaric", -"##TODO##languages.ave":"Avestan", +"languages.abk":"Abchasisch", +"languages.aaf":"Afar", +"languages.afr":"Afrikaans", +"languages.aka":"Akan", +"languages.sqi":"Albanisch", +"languages.amh":"Amharisch", +"languages.ara":"Arabisch", +"languages.arg":"Aragonisch", +"languages.hye":"Armenisch", +"languages.asm":"Assamesisch", +"languages.ava":"Awarisch", +"languages.ave":"Avestisch", "##TODO##languages.aym":"Aymara", "##TODO##languages.aze":"Azerbaijani", "##TODO##languages.bam":"Bambara", @@ -78,38 +88,38 @@ "##TODO##languages.ben":"Bengali", "##TODO##languages.bih":"Bihari", "##TODO##languages.bis":"Bislama", -"##TODO##languages.bos":"Bosnian", +"languages.bos":"Bosnisch", "##TODO##languages.bre":"Breton", -"##TODO##languages.bul":"Bulgarian", +"languages.bul":"Bulgarisch", "##TODO##languages.mya":"Burmese", "##TODO##languages.cat":"Catalan", "##TODO##languages.cha":"Chamorro", "##TODO##languages.che":"Chechen", "##TODO##languages.nya":"Chichewa", -"##TODO##languages.zho":"Chinese", +"languages.zho":"Chinesisch", "##TODO##languages.chv":"Chuvash", "##TODO##languages.cor":"Cornish", "##TODO##languages.cos":"Corsican", "##TODO##languages.cre":"Cree", -"##TODO##languages.hrv":"Croatian", -"##TODO##languages.ces":"Czech", -"##TODO##languages.dan":"Danish", +"languages.hrv":"Kroatisch", +"languages.ces":"Tschechisch", +"languages.dan":"Dänisch", "##TODO##languages.div":"Divehi", -"##TODO##languages.nld":"Dutch", +"languages.nld":"Niederländisch", "##TODO##languages.dzo":"Dzongkha", -"##TODO##languages.eng":"English", -"##TODO##languages.epo":"Esperanto", +"languages.eng":"Englisch", +"languages.epo":"Esperanto", "##TODO##languages.est":"Estonian", "##TODO##languages.ewe":"Ewe", "##TODO##languages.fao":"Faroese", "##TODO##languages.fij":"Fijian", -"##TODO##languages.fin":"Finnish", -"##TODO##languages.fra":"French", +"languages.fin":"Finnisch", +"languages.fra":"Französisch", "##TODO##languages.ful":"Fula", "##TODO##languages.glg":"Galician", -"##TODO##languages.kat":"Georgian", -"##TODO##languages.deu":"German", -"##TODO##languages.ell":"Greek", +"languages.kat":"Georgisch", +"languages.deu":"Deutsch", +"languages.ell":"Griechisch", "##TODO##languages.grn":"Guaraní", "##TODO##languages.guj":"Gujarati", "##TODO##languages.hat":"Haitian", @@ -118,21 +128,21 @@ "##TODO##languages.her":"Herero", "##TODO##languages.hin":"Hindi", "##TODO##languages.hmo":"Hiri Motu", -"##TODO##languages.hun":"Hungarian", +"languages.hun":"Ungarisch", "##TODO##languages.ina":"Interlingua", -"##TODO##languages.ind":"Indonesian", +"languages.ind":"Indonesisch", "##TODO##languages.ile":"Interlingue", -"##TODO##languages.gle":"Irish", +"languages.gle":"Irisch", "##TODO##languages.ibo":"Igbo", "##TODO##languages.ipk":"Inupiaq", "##TODO##languages.ido":"Ido", -"##TODO##languages.isl":"Icelandic", -"##TODO##languages.ita":"Italian", +"languages.isl":"Isländisch", +"languages.ita":"Italienisch", "##TODO##languages.iku":"Inuktitut", -"##TODO##languages.jpn":"Japanese", +"languages.jpn":"Japanisch", "##TODO##languages.jav":"Javanese", "##TODO##languages.kal":"Kalaallisut", -"##TODO##languages.kan":"Kannada", +"languages.kan":"Kanaresisch", "##TODO##languages.kau":"Kanuri", "##TODO##languages.kas":"Kashmiri", "##TODO##languages.kaz":"Kazakh", @@ -142,11 +152,11 @@ "##TODO##languages.kir":"Kyrgyz", "##TODO##languages.kom":"Komi", "##TODO##languages.kon":"Kongo", -"##TODO##languages.kor":"Korean", +"languages.kor":"Koreanisch", "##TODO##languages.kur":"Kurdish", "##TODO##languages.kua":"Kwanyama", -"##TODO##languages.lat":"Latin", -"##TODO##languages.ltz":"Luxembourgish", +"languages.lat":"Lateinisch", +"languages.ltz":"Luxemburgisch", "##TODO##languages.lug":"Ganda", "##TODO##languages.lim":"Limburgish", "##TODO##languages.lin":"Lingala", @@ -163,7 +173,7 @@ "##TODO##languages.mri":"Māori", "##TODO##languages.mar":"Marathi", "##TODO##languages.mah":"Marshallese", -"##TODO##languages.mon":"Mongolian", +"languages.mon":"Mongolisch", "##TODO##languages.nau":"Nauru", "##TODO##languages.nav":"Navajo", "##TODO##languages.nob":"Norwegian Bokmål", @@ -171,7 +181,7 @@ "##TODO##languages.nep":"Nepali", "##TODO##languages.ndo":"Ndonga", "##TODO##languages.nno":"Norwegian Nynorsk", -"##TODO##languages.nor":"Norwegian", +"languages.nor":"Norwegisch", "##TODO##languages.iii":"Nuosu", "##TODO##languages.nbl":"South Ndebele", "##TODO##languages.oci":"Occitan", @@ -182,22 +192,22 @@ "##TODO##languages.oss":"Ossetian", "##TODO##languages.pan":"Panjabi", "##TODO##languages.pli":"Pāli", -"##TODO##languages.fas":"Persian", -"##TODO##languages.pol":"Polish", +"languages.fas":"Persisch", +"languages.pol":"Polnisch", "##TODO##languages.pus":"Pashto", -"##TODO##languages.por":"Portuguese", +"languages.por":"Portugisisch", "##TODO##languages.que":"Quechua", "##TODO##languages.roh":"Romansh", "##TODO##languages.run":"Kirundi", "##TODO##languages.ron":"Romanian", -"##TODO##languages.rus":"Russian", +"languages.rus":"Russisch", "##TODO##languages.san":"Sanskrit", "##TODO##languages.srd":"Sardinian", "##TODO##languages.snd":"Sindhi", "##TODO##languages.sme":"Northern Sami", "##TODO##languages.smo":"Samoan", "##TODO##languages.sag":"Sango", -"##TODO##languages.srp":"Serbian", +"languages.srp":"Serbisch", "##TODO##languages.gla":"Scottish Gaelic", "##TODO##languages.sna":"Shona", "##TODO##languages.sin":"Sinhala", @@ -205,11 +215,11 @@ "##TODO##languages.slv":"Slovene", "##TODO##languages.som":"Somali", "##TODO##languages.sot":"Southern Sotho", -"##TODO##languages.spa":"Spanish", +"languages.spa":"Spanisch", "##TODO##languages.sun":"Sundanese", "##TODO##languages.swa":"Swahili", "##TODO##languages.ssw":"Swati", -"##TODO##languages.swe":"Swedish", +"languages.swe":"Schwedisch", "##TODO##languages.tam":"Tamil", "##TODO##languages.tel":"Telugu", "##TODO##languages.tgk":"Tajik", @@ -220,17 +230,17 @@ "##TODO##languages.tgl":"Tagalog", "##TODO##languages.tsn":"Tswana", "##TODO##languages.ton":"Tonga", -"##TODO##languages.tur":"Turkish", +"languages.tur":"Türkisch", "##TODO##languages.tso":"Tsonga", "##TODO##languages.tat":"Tatar", "##TODO##languages.twi":"Twi", "##TODO##languages.tah":"Tahitian", "##TODO##languages.uig":"Uighur", -"##TODO##languages.ukr":"Ukrainian", +"languages.ukr":"Ukrainisch", "##TODO##languages.urd":"Urdu", "##TODO##languages.uzb":"Uzbek", "##TODO##languages.ven":"Venda", -"##TODO##languages.vie":"Vietnamese", +"languages.vie":"Vietnamesisch", "##TODO##languages.vol":"Volapük", "##TODO##languages.win":"Walloon", "##TODO##languages.cym":"Welsh", diff --git a/lang/Localization_en.json b/lang/Localization_en.json index dbad2e8..888bf80 100644 --- a/lang/Localization_en.json +++ b/lang/Localization_en.json @@ -43,12 +43,19 @@ "recent.title":"Recent additions", "search.alternate":"Search", "search.result":"Search result for *{0}*", +"search.result.author":"Search result for *{0}* in authors", +"search.result.book":"Search result for *{0}* in books", +"search.result.series":"Search result for *{0}* in series", +"search.result.tag":"Search result for *{0}* in tags", "search.sortorder.asc":"Asc", "search.sortorder.desc":"Desc", "series.alphabetical.many":"Alphabetical index of the {0} series", "series.alphabetical.none":"Alphabetical index of absolutely no series", "series.alphabetical.one":"Alphabetical index of the single series", "series.title":"Series", +"seriesword.many":"{0} series", +"seriesword.none":"No series", +"seriesword.one":"1 series", "sort.alternate":"Sort", "splitByLetter.book.other":"Other books", "splitByLetter.letter":"{0} starting with {1}", @@ -56,6 +63,9 @@ "tags.alphabetical.none":"Alphabetical index of absolutely no tag", "tags.alphabetical.one":"Alphabetical index of the single tag", "tags.title":"Tags", +"tagword.many":"{0} tags", +"tagword.none":"No tag", +"tagword.one":"1 tag", "tagword.title":"Tags", "languages.abk":"Abkhaz", "languages.aaf":"Afar", diff --git a/lang/Localization_es.json b/lang/Localization_es.json index 6d523c1..bb58c37 100644 --- a/lang/Localization_es.json +++ b/lang/Localization_es.json @@ -43,12 +43,19 @@ "recent.title":"Añadidos recientemente", "##TODO##search.alternate":"Search", "##TODO##search.result":"Search result for *{0}*", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "##TODO##search.sortorder.asc":"Asc", "##TODO##search.sortorder.desc":"Desc", "series.alphabetical.many":"Indice alfabético de {0}", "##TODO##series.alphabetical.none":"Alphabetical index of absolutely no series", "series.alphabetical.one":"Indice de una sola serie", "series.title":"Series:", +"seriesword.many":"series", +"seriesword.none":"Sin series", +"seriesword.one":"1 serie", "##TODO##sort.alternate":"Sort", "splitByLetter.book.other":"Otros libros", "splitByLetter.letter":"{0} que empiezan por {1}", @@ -56,6 +63,9 @@ "##TODO##tags.alphabetical.none":"Alphabetical index of absolutely no tag", "tags.alphabetical.one":"Listado Alfabético de la unica etiqueta", "tags.title":"etiquetas", +"tagword.many":"etiquetas", +"tagword.none":"Sin etiquetas", +"tagword.one":"1 etiqueta", "tagword.title":"Etiquetas", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/lang/Localization_fr.json b/lang/Localization_fr.json index fe7743a..19910a9 100644 --- a/lang/Localization_fr.json +++ b/lang/Localization_fr.json @@ -43,12 +43,19 @@ "recent.title":"Ajouts récents", "search.alternate":"Rechercher", "search.result":"Résultats pour *{0}*", +"search.result.author":"Résultats pour *{0}* dans les auteurs", +"search.result.book":"Résultats pour *{0}* dans les livres", +"search.result.series":"Résultats pour *{0}* dans les colllections", +"search.result.tag":"Résultats pour *{0}* dans les étiquettes", "search.sortorder.asc":"Crois.", "search.sortorder.desc":"Décrois.", "series.alphabetical.many":"Index alphabétique de {0} collections", "##TODO##series.alphabetical.none":"Alphabetical index of absolutely no series", "series.alphabetical.one":"Index alphabétique de la seule collection", "series.title":"Collections", +"seriesword.many":"{0} collections", +"seriesword.none":"Pas de collection", +"seriesword.one":"1 collection", "sort.alternate":"Trier", "splitByLetter.book.other":"Autres livres", "splitByLetter.letter":"{0} débutant par {1}", @@ -56,6 +63,9 @@ "##TODO##tags.alphabetical.none":"Alphabetical index of absolutely no tag", "tags.alphabetical.one":"Index alphabétique de la seule étiquette", "tags.title":"Étiquettes", +"tagword.many":"{0} étiquettes", +"tagword.none":"Sans étiquette", +"tagword.one":"1 étiquette", "tagword.title":"Étiquettes", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/lang/Localization_it.json b/lang/Localization_it.json index d19240e..fe3be9d 100644 --- a/lang/Localization_it.json +++ b/lang/Localization_it.json @@ -43,12 +43,19 @@ "recent.title":"Ultime aggiunte", "search.alternate":"Cerca", "search.result":"Risultati per *{0}*", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "search.sortorder.asc":"Asc", "search.sortorder.desc":"Disc", "series.alphabetical.many":"Indice alfabetico di {0} collane", "series.alphabetical.none":"Indice alfabetico indipendente dalla collana", "series.alphabetical.one":"Indice alfabetico di una sola collana", "series.title":"Collane", +"seriesword.many":"{0} collane", +"seriesword.none":"Nessuna collana", +"seriesword.one":"1 collana", "sort.alternate":"Ordina", "splitByLetter.book.other":"Altri libri", "splitByLetter.letter":"{0} che iniziano per {1}", @@ -56,6 +63,9 @@ "tags.alphabetical.none":"Indice alfabetico indipendente dall'argomento", "tags.alphabetical.one":"Indice alfabetico del solo argomento", "tags.title":"Argomenti", +"tagword.many":"{0} argomenti", +"tagword.none":"Senza argomento", +"tagword.one":"1 argomento", "tagword.title":"Argomenti", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/lang/Localization_nb.json b/lang/Localization_nb.json index 991ff70..e937586 100644 --- a/lang/Localization_nb.json +++ b/lang/Localization_nb.json @@ -43,12 +43,19 @@ "recent.title":"Nylig lagt til", "search.alternate":"Søk", "search.result":"Søkeresultat for *{0}*", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "search.sortorder.asc":"Stigende", "search.sortorder.desc":"Synkende", "series.alphabetical.many":"Alfabetisk indeks for {0} serier", "series.alphabetical.none":"Alfabetisk indeks for ingen serier", "series.alphabetical.one":"Alfabetisk indeks for èn enkelt serie", "series.title":"Serier", +"seriesword.many":"{0} serier", +"seriesword.none":"Ingen serier", +"seriesword.one":"1 serie", "sort.alternate":"Sorter", "splitByLetter.book.other":"Andre bøker", "splitByLetter.letter":"{0} begynner med {1}", @@ -56,6 +63,9 @@ "tags.alphabetical.none":"Alfabetisk indeks for ingen stikkord", "tags.alphabetical.one":"Alfabetisk indeks for ett enkelt stikkord", "tags.title":"Stikkord", +"tagword.many":"{0} stikkord", +"tagword.none":"Ingen stikkord", +"tagword.one":"1 stikkord", "tagword.title":"Stikkord", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/lang/Localization_nl.json b/lang/Localization_nl.json index f9d9c59..40b231c 100644 --- a/lang/Localization_nl.json +++ b/lang/Localization_nl.json @@ -43,12 +43,19 @@ "recent.title":"Recent toegevoegde boeken", "search.alternate":"Zoeken", "search.result":"Zoekresultaat voor *{0}*", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "search.sortorder.asc":"A-Z", "search.sortorder.desc":"Z-A", "series.alphabetical.many":"Alfabetische index van {0} series", "series.alphabetical.none":"Alfabetische index van absoluut geen ekele serie", "series.alphabetical.one":"Alfabetische index van 1 serie", "series.title":"Series", +"seriesword.many":"{0} series", +"seriesword.none":"Geen series", +"seriesword.one":"1 serie", "sort.alternate":"Sorteren", "splitByLetter.book.other":"Andere boeken", "splitByLetter.letter":"{0} beginnend met {1}", @@ -56,6 +63,9 @@ "tags.alphabetical.none":"Alfabetische index van absoluut geen enkele tag", "tags.alphabetical.one":"Alfabetische index van 1 tag", "tags.title":"Tags", +"tagword.many":"{0} tags", +"tagword.none":"Geen tag", +"tagword.one":"1 tag", "tagword.title":"Tags", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/lang/Localization_pt.json b/lang/Localization_pt.json index 0aed078..1e8ba9d 100644 --- a/lang/Localization_pt.json +++ b/lang/Localization_pt.json @@ -43,12 +43,19 @@ "recent.title":"Adições recentes", "search.alternate":"Busca", "search.result":"Resultado da busca por *{0}*", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "search.sortorder.asc":"Asc", "search.sortorder.desc":"Desc", "series.alphabetical.many":"Índice alfabético das {0} séries", "series.alphabetical.none":"Índice alfabético de nenhuma série", "series.alphabetical.one":"Índice alfabético de uma série", "series.title":"Séries", +"seriesword.many":"{0} séries", +"seriesword.none":"Sem séries", +"seriesword.one":"1 série", "sort.alternate":"Ordenar", "splitByLetter.book.other":"Outros livros", "splitByLetter.letter":"{0} começando com {1}", @@ -56,6 +63,9 @@ "tags.alphabetical.none":"Índice alfabético de nenhuma etiqueta", "##TODO##tags.alphabetical.one":"Alphabetical index of the single tag", "tags.title":"Etiquetas", +"tagword.many":"{0} etiquetas", +"tagword.none":"Sem etiquetas", +"tagword.one":"1 etiqueta", "tagword.title":"Etiquetas", "languages.abk":"Abcázia", "languages.aaf":"Afar", diff --git a/lang/Localization_ru.json b/lang/Localization_ru.json index b16daca..846ddf7 100644 --- a/lang/Localization_ru.json +++ b/lang/Localization_ru.json @@ -43,12 +43,19 @@ "recent.title":"Недавние поступления", "##TODO##search.alternate":"Search", "##TODO##search.result":"Search result for *{0}*", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "##TODO##search.sortorder.asc":"Asc", "##TODO##search.sortorder.desc":"Desc", "series.alphabetical.many":"Алфавитный указатель для {0} серий", "##TODO##series.alphabetical.none":"Alphabetical index of absolutely no series", "series.alphabetical.one":"Алфавитный указатель для одной серии", "series.title":"Серии", +"seriesword.many":"{0} серий(и)", +"seriesword.none":"Нет серий", +"seriesword.one":"1 серия", "##TODO##sort.alternate":"Sort", "splitByLetter.book.other":"Другие книги", "splitByLetter.letter":"{0} начать с {1}", @@ -56,6 +63,9 @@ "##TODO##tags.alphabetical.none":"Alphabetical index of absolutely no tag", "tags.alphabetical.one":"Алфавитный указатель для одного тэга", "tags.title":"Тэги", +"tagword.many":"{0} тэгов(а)", +"tagword.none":"Нет тэгов", +"tagword.one":"1 тэг", "tagword.title":"Тэги", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/lang/Localization_zh.json b/lang/Localization_zh.json index 12ef64e..51f1642 100644 --- a/lang/Localization_zh.json +++ b/lang/Localization_zh.json @@ -43,12 +43,19 @@ "recent.title":"最近添加", "search.alternate":"搜索", "search.result":"*{0}* 的搜索结果", +"##TODO##search.result.author":"Search result for *{0}* in authors", +"##TODO##search.result.book":"Search result for *{0}* in books", +"##TODO##search.result.series":"Search result for *{0}* in series", +"##TODO##search.result.tag":"Search result for *{0}* in tags", "search.sortorder.asc":"升序", "search.sortorder.desc":"降序", "series.alphabetical.many":"{0} 个系列的字母索引", "series.alphabetical.none":"Alphabetical index of absolutely no series", "series.alphabetical.one":"Alphabetical index of the single series", "series.title":"系列", +"seriesword.many":"{0} 系列", +"seriesword.none":"没有系列", +"seriesword.one":"1 个系列", "sort.alternate":"排序", "splitByLetter.book.other":"其他书籍", "splitByLetter.letter":"{0} 以 {1} 开头", @@ -56,6 +63,9 @@ "tags.alphabetical.none":"Alphabetical index of absolutely no tag", "tags.alphabetical.one":"Alphabetical index of the single tag", "tags.title":"标签", +"tagword.many":"{0} 标签", +"tagword.none":"没有标签", +"tagword.one":"1 个标签", "tagword.title":"标签", "##TODO##languages.abk":"Abkhaz", "##TODO##languages.aaf":"Afar", diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..a1b1ab4 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,23 @@ + + + + + + ./ + + ./resources + + + ./test + + + + + + + + + test + + + \ No newline at end of file diff --git a/resources/Magnific-Popup/jquery.magnific-popup.min.js b/resources/Magnific-Popup/jquery.magnific-popup.min.js index 8e4ce40..5d7c25c 100644 --- a/resources/Magnific-Popup/jquery.magnific-popup.min.js +++ b/resources/Magnific-Popup/jquery.magnific-popup.min.js @@ -1,4 +1,4 @@ -/*! Magnific Popup - v0.9.5 - 2013-08-21 +/*! Magnific Popup - v0.9.6 - 2013-10-01 * http://dimsemenov.com/plugins/magnific-popup/ * Copyright (c) 2013 Dmitry Semenov; */ -(function(e){var t,i,n,o,a,r,s,l="Close",c="BeforeClose",d="AfterClose",u="BeforeAppend",p="MarkupParse",f="Open",m="Change",g="mfp",v="."+g,h="mfp-ready",C="mfp-removing",y="mfp-prevent-close",w=function(){},b=!!window.jQuery,I=e(window),x=function(e,i){t.ev.on(g+e+v,i)},k=function(t,i,n,o){var a=document.createElement("div");return a.className="mfp-"+t,n&&(a.innerHTML=n),o?i&&i.appendChild(a):(a=e(a),i&&a.appendTo(i)),a},T=function(i,n){t.ev.triggerHandler(g+i,n),t.st.callbacks&&(i=i.charAt(0).toLowerCase()+i.slice(1),t.st.callbacks[i]&&t.st.callbacks[i].apply(t,e.isArray(n)?n:[n]))},E=function(){(t.st.focus?t.content.find(t.st.focus).eq(0):t.wrap).focus()},S=function(i){return i===s&&t.currTemplate.closeBtn||(t.currTemplate.closeBtn=e(t.st.closeMarkup.replace("%title%",t.st.tClose)),s=i),t.currTemplate.closeBtn},P=function(){e.magnificPopup.instance||(t=new w,t.init(),e.magnificPopup.instance=t)},_=function(i){if(!e(i).hasClass(y)){var n=t.st.closeOnContentClick,o=t.st.closeOnBgClick;if(n&&o)return!0;if(!t.content||e(i).hasClass("mfp-close")||t.preloader&&i===t.preloader[0])return!0;if(i===t.content[0]||e.contains(t.content[0],i)){if(n)return!0}else if(o&&e.contains(document,i))return!0;return!1}},O=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1};w.prototype={constructor:w,init:function(){var i=navigator.appVersion;t.isIE7=-1!==i.indexOf("MSIE 7."),t.isIE8=-1!==i.indexOf("MSIE 8."),t.isLowIE=t.isIE7||t.isIE8,t.isAndroid=/android/gi.test(i),t.isIOS=/iphone|ipad|ipod/gi.test(i),t.supportsTransition=O(),t.probablyMobile=t.isAndroid||t.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),n=e(document.body),o=e(document),t.popupsCache={}},open:function(i){var n;if(i.isObj===!1){t.items=i.items.toArray(),t.index=0;var a,s=i.items;for(n=0;s.length>n;n++)if(a=s[n],a.parsed&&(a=a.el[0]),a===i.el[0]){t.index=n;break}}else t.items=e.isArray(i.items)?i.items:[i.items],t.index=i.index||0;if(t.isOpen)return t.updateItemHTML(),void 0;t.types=[],r="",t.ev=i.mainEl&&i.mainEl.length?i.mainEl.eq(0):o,i.key?(t.popupsCache[i.key]||(t.popupsCache[i.key]={}),t.currTemplate=t.popupsCache[i.key]):t.currTemplate={},t.st=e.extend(!0,{},e.magnificPopup.defaults,i),t.fixedContentPos="auto"===t.st.fixedContentPos?!t.probablyMobile:t.st.fixedContentPos,t.st.modal&&(t.st.closeOnContentClick=!1,t.st.closeOnBgClick=!1,t.st.showCloseBtn=!1,t.st.enableEscapeKey=!1),t.bgOverlay||(t.bgOverlay=k("bg").on("click"+v,function(){t.close()}),t.wrap=k("wrap").attr("tabindex",-1).on("click"+v,function(e){_(e.target)&&t.close()}),t.container=k("container",t.wrap)),t.contentContainer=k("content"),t.st.preloader&&(t.preloader=k("preloader",t.container,t.st.tLoading));var l=e.magnificPopup.modules;for(n=0;l.length>n;n++){var c=l[n];c=c.charAt(0).toUpperCase()+c.slice(1),t["init"+c].call(t)}T("BeforeOpen"),t.st.showCloseBtn&&(t.st.closeBtnInside?(x(p,function(e,t,i,n){i.close_replaceWith=S(n.type)}),r+=" mfp-close-btn-in"):t.wrap.append(S())),t.st.alignTop&&(r+=" mfp-align-top"),t.fixedContentPos?t.wrap.css({overflow:t.st.overflowY,overflowX:"hidden",overflowY:t.st.overflowY}):t.wrap.css({top:I.scrollTop(),position:"absolute"}),(t.st.fixedBgPos===!1||"auto"===t.st.fixedBgPos&&!t.fixedContentPos)&&t.bgOverlay.css({height:o.height(),position:"absolute"}),t.st.enableEscapeKey&&o.on("keyup"+v,function(e){27===e.keyCode&&t.close()}),I.on("resize"+v,function(){t.updateSize()}),t.st.closeOnContentClick||(r+=" mfp-auto-cursor"),r&&t.wrap.addClass(r);var d=t.wH=I.height(),u={};if(t.fixedContentPos&&t._hasScrollBar(d)){var m=t._getScrollbarSize();m&&(u.paddingRight=m)}t.fixedContentPos&&(t.isIE7?e("body, html").css("overflow","hidden"):u.overflow="hidden");var g=t.st.mainClass;t.isIE7&&(g+=" mfp-ie7"),g&&t._addClassToMFP(g),t.updateItemHTML(),T("BuildControls"),e("html").css(u),t.bgOverlay.add(t.wrap).prependTo(document.body),t._lastFocusedEl=document.activeElement,setTimeout(function(){t.content?(t._addClassToMFP(h),E()):t.bgOverlay.addClass(h),o.on("focusin"+v,function(i){return i.target===t.wrap[0]||e.contains(t.wrap[0],i.target)?void 0:(E(),!1)})},16),t.isOpen=!0,t.updateSize(d),T(f)},close:function(){t.isOpen&&(T(c),t.isOpen=!1,t.st.removalDelay&&!t.isLowIE&&t.supportsTransition?(t._addClassToMFP(C),setTimeout(function(){t._close()},t.st.removalDelay)):t._close())},_close:function(){T(l);var i=C+" "+h+" ";if(t.bgOverlay.detach(),t.wrap.detach(),t.container.empty(),t.st.mainClass&&(i+=t.st.mainClass+" "),t._removeClassFromMFP(i),t.fixedContentPos){var n={paddingRight:""};t.isIE7?e("body, html").css("overflow",""):n.overflow="",e("html").css(n)}o.off("keyup"+v+" focusin"+v),t.ev.off(v),t.wrap.attr("class","mfp-wrap").removeAttr("style"),t.bgOverlay.attr("class","mfp-bg"),t.container.attr("class","mfp-container"),!t.st.showCloseBtn||t.st.closeBtnInside&&t.currTemplate[t.currItem.type]!==!0||t.currTemplate.closeBtn&&t.currTemplate.closeBtn.detach(),t._lastFocusedEl&&e(t._lastFocusedEl).focus(),t.currItem=null,t.content=null,t.currTemplate=null,t.prevHeight=0,T(d)},updateSize:function(e){if(t.isIOS){var i=document.documentElement.clientWidth/window.innerWidth,n=window.innerHeight*i;t.wrap.css("height",n),t.wH=n}else t.wH=e||I.height();t.fixedContentPos||t.wrap.css("height",t.wH),T("Resize")},updateItemHTML:function(){var i=t.items[t.index];t.contentContainer.detach(),t.content&&t.content.detach(),i.parsed||(i=t.parseEl(t.index));var n=i.type;if(T("BeforeChange",[t.currItem?t.currItem.type:"",n]),t.currItem=i,!t.currTemplate[n]){var o=t.st[n]?t.st[n].markup:!1;T("FirstMarkupParse",o),t.currTemplate[n]=o?e(o):!0}a&&a!==i.type&&t.container.removeClass("mfp-"+a+"-holder");var r=t["get"+n.charAt(0).toUpperCase()+n.slice(1)](i,t.currTemplate[n]);t.appendContent(r,n),i.preloaded=!0,T(m,i),a=i.type,t.container.prepend(t.contentContainer),T("AfterChange")},appendContent:function(e,i){t.content=e,e?t.st.showCloseBtn&&t.st.closeBtnInside&&t.currTemplate[i]===!0?t.content.find(".mfp-close").length||t.content.append(S()):t.content=e:t.content="",T(u),t.container.addClass("mfp-"+i+"-holder"),t.contentContainer.append(t.content)},parseEl:function(i){var n=t.items[i],o=n.type;if(n=n.tagName?{el:e(n)}:{data:n,src:n.src},n.el){for(var a=t.types,r=0;a.length>r;r++)if(n.el.hasClass("mfp-"+a[r])){o=a[r];break}n.src=n.el.attr("data-mfp-src"),n.src||(n.src=n.el.attr("href"))}return n.type=o||t.st.type||"inline",n.index=i,n.parsed=!0,t.items[i]=n,T("ElementParse",n),t.items[i]},addGroup:function(e,i){var n=function(n){n.mfpEl=this,t._openClick(n,e,i)};i||(i={});var o="click.magnificPopup";i.mainEl=e,i.items?(i.isObj=!0,e.off(o).on(o,n)):(i.isObj=!1,i.delegate?e.off(o).on(o,i.delegate,n):(i.items=e,e.off(o).on(o,n)))},_openClick:function(i,n,o){var a=void 0!==o.midClick?o.midClick:e.magnificPopup.defaults.midClick;if(a||2!==i.which&&!i.ctrlKey&&!i.metaKey){var r=void 0!==o.disableOn?o.disableOn:e.magnificPopup.defaults.disableOn;if(r)if(e.isFunction(r)){if(!r.call(t))return!0}else if(r>I.width())return!0;i.type&&(i.preventDefault(),t.isOpen&&i.stopPropagation()),o.el=e(i.mfpEl),o.delegate&&(o.items=n.find(o.delegate)),t.open(o)}},updateStatus:function(e,n){if(t.preloader){i!==e&&t.container.removeClass("mfp-s-"+i),n||"loading"!==e||(n=t.st.tLoading);var o={status:e,text:n};T("UpdateStatus",o),e=o.status,n=o.text,t.preloader.html(n),t.preloader.find("a").on("click",function(e){e.stopImmediatePropagation()}),t.container.addClass("mfp-s-"+e),i=e}},_addClassToMFP:function(e){t.bgOverlay.addClass(e),t.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),t.wrap.removeClass(e)},_hasScrollBar:function(e){return(t.isIE7?o.height():document.body.scrollHeight)>(e||I.height())},_parseMarkup:function(t,i,n){var o;n.data&&(i=e.extend(n.data,i)),T(p,[t,i,n]),e.each(i,function(e,i){if(void 0===i||i===!1)return!0;if(o=e.split("_"),o.length>1){var n=t.find(v+"-"+o[0]);if(n.length>0){var a=o[1];"replaceWith"===a?n[0]!==i[0]&&n.replaceWith(i):"img"===a?n.is("img")?n.attr("src",i):n.replaceWith(''):n.attr(o[1],i)}}else t.find(v+"-"+e).html(i)})},_getScrollbarSize:function(){if(void 0===t.scrollbarSize){var e=document.createElement("div");e.id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),t.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return t.scrollbarSize}},e.magnificPopup={instance:null,proto:w.prototype,modules:[],open:function(e,t){return P(),e||(e={}),e.isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return e.magnificPopup.instance.close()},registerModule:function(t,i){i.options&&(e.magnificPopup.defaults[t]=i.options),e.extend(this.proto,i.proto),this.modules.push(t)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},e.fn.magnificPopup=function(i){P();var n=e(this);if("string"==typeof i)if("open"===i){var o,a=b?n.data("magnificPopup"):n[0].magnificPopup,r=parseInt(arguments[1],10)||0;a.items?o=a.items[r]:(o=n,a.delegate&&(o=o.find(a.delegate)),o=o.eq(r)),t._openClick({mfpEl:o},n,a)}else t.isOpen&&t[i].apply(t,Array.prototype.slice.call(arguments,1));else b?n.data("magnificPopup",i):n[0].magnificPopup=i,t.addGroup(n,i);return n};var z,M,B,H="inline",L=function(){B&&(M.after(B.addClass(z)).detach(),B=null)};e.magnificPopup.registerModule(H,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){t.types.push(H),x(l+"."+H,function(){L()})},getInline:function(i,n){if(L(),i.src){var o=t.st.inline,a=e(i.src);if(a.length){var r=a[0].parentNode;r&&r.tagName&&(M||(z=o.hiddenClass,M=k(z),z="mfp-"+z),B=a.after(M).detach().removeClass(z)),t.updateStatus("ready")}else t.updateStatus("error",o.tNotFound),a=e("
");return i.inlineElement=a,a}return t.updateStatus("ready"),t._parseMarkup(n,{},i),n}}});var A,F="ajax",j=function(){A&&n.removeClass(A)};e.magnificPopup.registerModule(F,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){t.types.push(F),A=t.st.ajax.cursor,x(l+"."+F,function(){j(),t.req&&t.req.abort()})},getAjax:function(i){A&&n.addClass(A),t.updateStatus("loading");var o=e.extend({url:i.src,success:function(n,o,a){var r={data:n,xhr:a};T("ParseAjax",r),t.appendContent(e(r.data),F),i.finished=!0,j(),E(),setTimeout(function(){t.wrap.addClass(h)},16),t.updateStatus("ready"),T("AjaxContentAdded")},error:function(){j(),i.finished=i.loadError=!0,t.updateStatus("error",t.st.ajax.tError.replace("%url%",i.src))}},t.st.ajax.settings);return t.req=e.ajax(o),""}}});var N,W=function(i){if(i.data&&void 0!==i.data.title)return i.data.title;var n=t.st.image.titleSrc;if(n){if(e.isFunction(n))return n.call(t,i);if(i.el)return i.el.attr(n)||""}return""};e.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=t.st.image,i=".image";t.types.push("image"),x(f+i,function(){"image"===t.currItem.type&&e.cursor&&n.addClass(e.cursor)}),x(l+i,function(){e.cursor&&n.removeClass(e.cursor),I.off("resize"+v)}),x("Resize"+i,t.resizeImage),t.isLowIE&&x("AfterChange",t.resizeImage)},resizeImage:function(){var e=t.currItem;if(e&&e.img&&t.st.image.verticalFit){var i=0;t.isLowIE&&(i=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",t.wH-i)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,N&&clearInterval(N),e.isCheckingImgSize=!1,T("ImageHasSize",e),e.imgHidden&&(t.content&&t.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(e){var i=0,n=e.img[0],o=function(a){N&&clearInterval(N),N=setInterval(function(){return n.naturalWidth>0?(t._onImageHasSize(e),void 0):(i>200&&clearInterval(N),i++,3===i?o(10):40===i?o(50):100===i&&o(500),void 0)},a)};o(1)},getImage:function(i,n){var o=0,a=function(){i&&(i.img[0].complete?(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("ready")),i.hasSize=!0,i.loaded=!0,T("ImageLoadComplete")):(o++,200>o?setTimeout(a,100):r()))},r=function(){i&&(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("error",s.tError.replace("%url%",i.src))),i.hasSize=!0,i.loaded=!0,i.loadError=!0)},s=t.st.image,l=n.find(".mfp-img");if(l.length){var c=document.createElement("img");c.className="mfp-img",i.img=e(c).on("load.mfploader",a).on("error.mfploader",r),c.src=i.src,l.is("img")&&(i.img=i.img.clone()),i.img[0].naturalWidth>0&&(i.hasSize=!0)}return t._parseMarkup(n,{title:W(i),img_replaceWith:i.img},i),t.resizeImage(),i.hasSize?(N&&clearInterval(N),i.loadError?(n.addClass("mfp-loading"),t.updateStatus("error",s.tError.replace("%url%",i.src))):(n.removeClass("mfp-loading"),t.updateStatus("ready")),n):(t.updateStatus("loading"),i.loading=!0,i.hasSize||(i.imgHidden=!0,n.addClass("mfp-loading"),t.findImageSize(i)),n)}}});var R,Z=function(){return void 0===R&&(R=void 0!==document.createElement("p").style.MozTransform),R};e.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(e){return e.is("img")?e:e.find("img")}},proto:{initZoom:function(){var e=t.st.zoom,i=".zoom";if(e.enabled&&t.supportsTransition){var n,o,a=e.duration,r=function(t){var i=t.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),n="all "+e.duration/1e3+"s "+e.easing,o={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},a="transition";return o["-webkit-"+a]=o["-moz-"+a]=o["-o-"+a]=o[a]=n,i.css(o),i},s=function(){t.content.css("visibility","visible")};x("BuildControls"+i,function(){if(t._allowZoom()){if(clearTimeout(n),t.content.css("visibility","hidden"),image=t._getItemToZoom(),!image)return s(),void 0;o=r(image),o.css(t._getOffset()),t.wrap.append(o),n=setTimeout(function(){o.css(t._getOffset(!0)),n=setTimeout(function(){s(),setTimeout(function(){o.remove(),image=o=null,T("ZoomAnimationEnded")},16)},a)},16)}}),x(c+i,function(){if(t._allowZoom()){if(clearTimeout(n),t.st.removalDelay=a,!image){if(image=t._getItemToZoom(),!image)return;o=r(image)}o.css(t._getOffset(!0)),t.wrap.append(o),t.content.css("visibility","hidden"),setTimeout(function(){o.css(t._getOffset())},16)}}),x(l+i,function(){t._allowZoom()&&(s(),o&&o.remove())})}},_allowZoom:function(){return"image"===t.currItem.type},_getItemToZoom:function(){return t.currItem.hasSize?t.currItem.img:!1},_getOffset:function(i){var n;n=i?t.currItem.img:t.st.zoom.opener(t.currItem.el||t.currItem);var o=n.offset(),a=parseInt(n.css("padding-top"),10),r=parseInt(n.css("padding-bottom"),10);o.top-=e(window).scrollTop()-a;var s={width:n.width(),height:(b?n.innerHeight():n[0].offsetHeight)-r-a};return Z()?s["-moz-transform"]=s.transform="translate("+o.left+"px,"+o.top+"px)":(s.left=o.left,s.top=o.top),s}}});var q="iframe",D="//about:blank",K=function(e){if(t.currTemplate[q]){var i=t.currTemplate[q].find("iframe");i.length&&(e||(i[0].src=D),t.isIE8&&i.css("display",e?"block":"none"))}};e.magnificPopup.registerModule(q,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(q),x("BeforeChange",function(e,t,i){t!==i&&(t===q?K():i===q&&K(!0))}),x(l+"."+q,function(){K()})},getIframe:function(i,n){var o=i.src,a=t.st.iframe;e.each(a.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var r={};return a.srcAction&&(r[a.srcAction]=o),t._parseMarkup(n,r,i),t.updateStatus("ready"),n}}});var Y=function(e){var i=t.items.length;return e>i-1?e-i:0>e?i+e:e},U=function(e,t,i){return e.replace("%curr%",t+1).replace("%total%",i)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var i=t.st.gallery,n=".mfp-gallery",a=Boolean(e.fn.mfpFastClick);return t.direction=!0,i&&i.enabled?(r+=" mfp-gallery",x(f+n,function(){i.navigateByImgClick&&t.wrap.on("click"+n,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+n,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+n,function(e,i){i.text&&(i.text=U(i.text,t.currItem.index,t.items.length))}),x(p+n,function(e,n,o,a){var r=t.items.length;o.counter=r>1?U(i.tCounter,a.index,r):""}),x("BuildControls"+n,function(){if(t.items.length>1&&i.arrows&&!t.arrowLeft){var n=i.arrowMarkup,o=t.arrowLeft=e(n.replace("%title%",i.tPrev).replace("%dir%","left")).addClass(y),r=t.arrowRight=e(n.replace("%title%",i.tNext).replace("%dir%","right")).addClass(y),s=a?"mfpFastClick":"click";o[s](function(){t.prev()}),r[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",r[0],!1,!0),k("a",r[0],!1,!0)),t.container.append(o.add(r))}}),x(m+n,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+n,function(){o.off(n),t.wrap.off("click"+n),t.arrowLeft&&a&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=Y(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=Y(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,i=t.st.gallery.preload,n=Math.min(i[0],t.items.length),o=Math.min(i[1],t.items.length);for(e=1;(t.direction?o:n)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?n:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(i){if(i=Y(i),!t.items[i].preloaded){var n=t.items[i];n.parsed||(n=t.parseEl(i)),T("LazyLoad",n),"image"===n.type&&(n.img=e('').on("load.mfploader",function(){n.hasSize=!0}).on("error.mfploader",function(){n.hasSize=!0,n.loadError=!0,T("LazyLoadError",n)}).attr("src",n.src)),n.preloaded=!0}}}});var G="retina";e.magnificPopup.registerModule(G,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,i=e.ratio;i=isNaN(i)?i():i,i>1&&(x("ImageHasSize."+G,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/i,width:"100%"})}),x("ElementParse."+G,function(t,n){n.src=e.replaceSrc(n,i)}))}}}}),function(){var t=1e3,i="ontouchstart"in window,n=function(){I.off("touchmove"+a+" touchend"+a)},o="mfpFastClick",a="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var r,s=e(this);if(i){var l,c,d,u,p,f;s.on("touchstart"+a,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+a,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,n())}).on("touchend"+a,function(e){n(),u||f>1||(r=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){r=!1},t),o())})})}s.on("click"+a,function(){r||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+a+" click"+a),i&&I.off("touchmove"+a+" touchend"+a)}}()})(window.jQuery||window.Zepto); \ No newline at end of file +(function(e){var t,n,i,o,r,a,s,l="Close",c="BeforeClose",d="AfterClose",u="BeforeAppend",p="MarkupParse",f="Open",m="Change",g="mfp",v="."+g,h="mfp-ready",C="mfp-removing",y="mfp-prevent-close",w=function(){},b=!!window.jQuery,I=e(window),x=function(e,n){t.ev.on(g+e+v,n)},k=function(t,n,i,o){var r=document.createElement("div");return r.className="mfp-"+t,i&&(r.innerHTML=i),o?n&&n.appendChild(r):(r=e(r),n&&r.appendTo(n)),r},T=function(n,i){t.ev.triggerHandler(g+n,i),t.st.callbacks&&(n=n.charAt(0).toLowerCase()+n.slice(1),t.st.callbacks[n]&&t.st.callbacks[n].apply(t,e.isArray(i)?i:[i]))},E=function(){(t.st.focus?t.content.find(t.st.focus).eq(0):t.wrap).focus()},S=function(n){return n===s&&t.currTemplate.closeBtn||(t.currTemplate.closeBtn=e(t.st.closeMarkup.replace("%title%",t.st.tClose)),s=n),t.currTemplate.closeBtn},P=function(){e.magnificPopup.instance||(t=new w,t.init(),e.magnificPopup.instance=t)},_=function(n){if(!e(n).hasClass(y)){var i=t.st.closeOnContentClick,o=t.st.closeOnBgClick;if(i&&o)return!0;if(!t.content||e(n).hasClass("mfp-close")||t.preloader&&n===t.preloader[0])return!0;if(n===t.content[0]||e.contains(t.content[0],n)){if(i)return!0}else if(o&&e.contains(document,n))return!0;return!1}},O=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1};w.prototype={constructor:w,init:function(){var n=navigator.appVersion;t.isIE7=-1!==n.indexOf("MSIE 7."),t.isIE8=-1!==n.indexOf("MSIE 8."),t.isLowIE=t.isIE7||t.isIE8,t.isAndroid=/android/gi.test(n),t.isIOS=/iphone|ipad|ipod/gi.test(n),t.supportsTransition=O(),t.probablyMobile=t.isAndroid||t.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),i=e(document.body),o=e(document),t.popupsCache={}},open:function(n){var i;if(n.isObj===!1){t.items=n.items.toArray(),t.index=0;var r,s=n.items;for(i=0;s.length>i;i++)if(r=s[i],r.parsed&&(r=r.el[0]),r===n.el[0]){t.index=i;break}}else t.items=e.isArray(n.items)?n.items:[n.items],t.index=n.index||0;if(t.isOpen)return t.updateItemHTML(),void 0;t.types=[],a="",t.ev=n.mainEl&&n.mainEl.length?n.mainEl.eq(0):o,n.key?(t.popupsCache[n.key]||(t.popupsCache[n.key]={}),t.currTemplate=t.popupsCache[n.key]):t.currTemplate={},t.st=e.extend(!0,{},e.magnificPopup.defaults,n),t.fixedContentPos="auto"===t.st.fixedContentPos?!t.probablyMobile:t.st.fixedContentPos,t.st.modal&&(t.st.closeOnContentClick=!1,t.st.closeOnBgClick=!1,t.st.showCloseBtn=!1,t.st.enableEscapeKey=!1),t.bgOverlay||(t.bgOverlay=k("bg").on("click"+v,function(){t.close()}),t.wrap=k("wrap").attr("tabindex",-1).on("click"+v,function(e){_(e.target)&&t.close()}),t.container=k("container",t.wrap)),t.contentContainer=k("content"),t.st.preloader&&(t.preloader=k("preloader",t.container,t.st.tLoading));var l=e.magnificPopup.modules;for(i=0;l.length>i;i++){var c=l[i];c=c.charAt(0).toUpperCase()+c.slice(1),t["init"+c].call(t)}T("BeforeOpen"),t.st.showCloseBtn&&(t.st.closeBtnInside?(x(p,function(e,t,n,i){n.close_replaceWith=S(i.type)}),a+=" mfp-close-btn-in"):t.wrap.append(S())),t.st.alignTop&&(a+=" mfp-align-top"),t.fixedContentPos?t.wrap.css({overflow:t.st.overflowY,overflowX:"hidden",overflowY:t.st.overflowY}):t.wrap.css({top:I.scrollTop(),position:"absolute"}),(t.st.fixedBgPos===!1||"auto"===t.st.fixedBgPos&&!t.fixedContentPos)&&t.bgOverlay.css({height:o.height(),position:"absolute"}),t.st.enableEscapeKey&&o.on("keyup"+v,function(e){27===e.keyCode&&t.close()}),I.on("resize"+v,function(){t.updateSize()}),t.st.closeOnContentClick||(a+=" mfp-auto-cursor"),a&&t.wrap.addClass(a);var d=t.wH=I.height(),u={};if(t.fixedContentPos&&t._hasScrollBar(d)){var m=t._getScrollbarSize();m&&(u.paddingRight=m)}t.fixedContentPos&&(t.isIE7?e("body, html").css("overflow","hidden"):u.overflow="hidden");var g=t.st.mainClass;return t.isIE7&&(g+=" mfp-ie7"),g&&t._addClassToMFP(g),t.updateItemHTML(),T("BuildControls"),e("html").css(u),t.bgOverlay.add(t.wrap).prependTo(document.body),t._lastFocusedEl=document.activeElement,setTimeout(function(){t.content?(t._addClassToMFP(h),E()):t.bgOverlay.addClass(h),o.on("focusin"+v,function(n){return n.target===t.wrap[0]||e.contains(t.wrap[0],n.target)?void 0:(E(),!1)})},16),t.isOpen=!0,t.updateSize(d),T(f),n},close:function(){t.isOpen&&(T(c),t.isOpen=!1,t.st.removalDelay&&!t.isLowIE&&t.supportsTransition?(t._addClassToMFP(C),setTimeout(function(){t._close()},t.st.removalDelay)):t._close())},_close:function(){T(l);var n=C+" "+h+" ";if(t.bgOverlay.detach(),t.wrap.detach(),t.container.empty(),t.st.mainClass&&(n+=t.st.mainClass+" "),t._removeClassFromMFP(n),t.fixedContentPos){var i={paddingRight:""};t.isIE7?e("body, html").css("overflow",""):i.overflow="",e("html").css(i)}o.off("keyup"+v+" focusin"+v),t.ev.off(v),t.wrap.attr("class","mfp-wrap").removeAttr("style"),t.bgOverlay.attr("class","mfp-bg"),t.container.attr("class","mfp-container"),!t.st.showCloseBtn||t.st.closeBtnInside&&t.currTemplate[t.currItem.type]!==!0||t.currTemplate.closeBtn&&t.currTemplate.closeBtn.detach(),t._lastFocusedEl&&e(t._lastFocusedEl).focus(),t.currItem=null,t.content=null,t.currTemplate=null,t.prevHeight=0,T(d)},updateSize:function(e){if(t.isIOS){var n=document.documentElement.clientWidth/window.innerWidth,i=window.innerHeight*n;t.wrap.css("height",i),t.wH=i}else t.wH=e||I.height();t.fixedContentPos||t.wrap.css("height",t.wH),T("Resize")},updateItemHTML:function(){var n=t.items[t.index];t.contentContainer.detach(),t.content&&t.content.detach(),n.parsed||(n=t.parseEl(t.index));var i=n.type;if(T("BeforeChange",[t.currItem?t.currItem.type:"",i]),t.currItem=n,!t.currTemplate[i]){var o=t.st[i]?t.st[i].markup:!1;T("FirstMarkupParse",o),t.currTemplate[i]=o?e(o):!0}r&&r!==n.type&&t.container.removeClass("mfp-"+r+"-holder");var a=t["get"+i.charAt(0).toUpperCase()+i.slice(1)](n,t.currTemplate[i]);t.appendContent(a,i),n.preloaded=!0,T(m,n),r=n.type,t.container.prepend(t.contentContainer),T("AfterChange")},appendContent:function(e,n){t.content=e,e?t.st.showCloseBtn&&t.st.closeBtnInside&&t.currTemplate[n]===!0?t.content.find(".mfp-close").length||t.content.append(S()):t.content=e:t.content="",T(u),t.container.addClass("mfp-"+n+"-holder"),t.contentContainer.append(t.content)},parseEl:function(n){var i=t.items[n],o=i.type;if(i=i.tagName?{el:e(i)}:{data:i,src:i.src},i.el){for(var r=t.types,a=0;r.length>a;a++)if(i.el.hasClass("mfp-"+r[a])){o=r[a];break}i.src=i.el.attr("data-mfp-src"),i.src||(i.src=i.el.attr("href"))}return i.type=o||t.st.type||"inline",i.index=n,i.parsed=!0,t.items[n]=i,T("ElementParse",i),t.items[n]},addGroup:function(e,n){var i=function(i){i.mfpEl=this,t._openClick(i,e,n)};n||(n={});var o="click.magnificPopup";n.mainEl=e,n.items?(n.isObj=!0,e.off(o).on(o,i)):(n.isObj=!1,n.delegate?e.off(o).on(o,n.delegate,i):(n.items=e,e.off(o).on(o,i)))},_openClick:function(n,i,o){var r=void 0!==o.midClick?o.midClick:e.magnificPopup.defaults.midClick;if(r||2!==n.which&&!n.ctrlKey&&!n.metaKey){var a=void 0!==o.disableOn?o.disableOn:e.magnificPopup.defaults.disableOn;if(a)if(e.isFunction(a)){if(!a.call(t))return!0}else if(a>I.width())return!0;n.type&&(n.preventDefault(),t.isOpen&&n.stopPropagation()),o.el=e(n.mfpEl),o.delegate&&(o.items=i.find(o.delegate)),t.open(o)}},updateStatus:function(e,i){if(t.preloader){n!==e&&t.container.removeClass("mfp-s-"+n),i||"loading"!==e||(i=t.st.tLoading);var o={status:e,text:i};T("UpdateStatus",o),e=o.status,i=o.text,t.preloader.html(i),t.preloader.find("a").on("click",function(e){e.stopImmediatePropagation()}),t.container.addClass("mfp-s-"+e),n=e}},_addClassToMFP:function(e){t.bgOverlay.addClass(e),t.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),t.wrap.removeClass(e)},_hasScrollBar:function(e){return(t.isIE7?o.height():document.body.scrollHeight)>(e||I.height())},_parseMarkup:function(t,n,i){var o;i.data&&(n=e.extend(i.data,n)),T(p,[t,n,i]),e.each(n,function(e,n){if(void 0===n||n===!1)return!0;if(o=e.split("_"),o.length>1){var i=t.find(v+"-"+o[0]);if(i.length>0){var r=o[1];"replaceWith"===r?i[0]!==n[0]&&i.replaceWith(n):"img"===r?i.is("img")?i.attr("src",n):i.replaceWith(''):i.attr(o[1],n)}}else t.find(v+"-"+e).html(n)})},_getScrollbarSize:function(){if(void 0===t.scrollbarSize){var e=document.createElement("div");e.id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),t.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return t.scrollbarSize}},e.magnificPopup={instance:null,proto:w.prototype,modules:[],open:function(t,n){return P(),t=t?e.extend(!0,{},t):{},t.isObj=!0,t.index=n||0,this.instance.open(t)},close:function(){return e.magnificPopup.instance&&e.magnificPopup.instance.close()},registerModule:function(t,n){n.options&&(e.magnificPopup.defaults[t]=n.options),e.extend(this.proto,n.proto),this.modules.push(t)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},e.fn.magnificPopup=function(n){P();var i=e(this);if("string"==typeof n)if("open"===n){var o,r=b?i.data("magnificPopup"):i[0].magnificPopup,a=parseInt(arguments[1],10)||0;r.items?o=r.items[a]:(o=i,r.delegate&&(o=o.find(r.delegate)),o=o.eq(a)),t._openClick({mfpEl:o},i,r)}else t.isOpen&&t[n].apply(t,Array.prototype.slice.call(arguments,1));else n=e.extend(!0,{},n),b?i.data("magnificPopup",n):i[0].magnificPopup=n,t.addGroup(i,n);return i};var z,M,B,H="inline",L=function(){B&&(M.after(B.addClass(z)).detach(),B=null)};e.magnificPopup.registerModule(H,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){t.types.push(H),x(l+"."+H,function(){L()})},getInline:function(n,i){if(L(),n.src){var o=t.st.inline,r=e(n.src);if(r.length){var a=r[0].parentNode;a&&a.tagName&&(M||(z=o.hiddenClass,M=k(z),z="mfp-"+z),B=r.after(M).detach().removeClass(z)),t.updateStatus("ready")}else t.updateStatus("error",o.tNotFound),r=e("
");return n.inlineElement=r,r}return t.updateStatus("ready"),t._parseMarkup(i,{},n),i}}});var A,F="ajax",j=function(){A&&i.removeClass(A)},N=function(){j(),t.req&&t.req.abort()};e.magnificPopup.registerModule(F,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){t.types.push(F),A=t.st.ajax.cursor,x(l+"."+F,N),x("BeforeChange."+F,N)},getAjax:function(n){A&&i.addClass(A),t.updateStatus("loading");var o=e.extend({url:n.src,success:function(i,o,r){var a={data:i,xhr:r};T("ParseAjax",a),t.appendContent(e(a.data),F),n.finished=!0,j(),E(),setTimeout(function(){t.wrap.addClass(h)},16),t.updateStatus("ready"),T("AjaxContentAdded")},error:function(){j(),n.finished=n.loadError=!0,t.updateStatus("error",t.st.ajax.tError.replace("%url%",n.src))}},t.st.ajax.settings);return t.req=e.ajax(o),""}}});var W,R=function(n){if(n.data&&void 0!==n.data.title)return n.data.title;var i=t.st.image.titleSrc;if(i){if(e.isFunction(i))return i.call(t,n);if(n.el)return n.el.attr(i)||""}return""};e.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=t.st.image,n=".image";t.types.push("image"),x(f+n,function(){"image"===t.currItem.type&&e.cursor&&i.addClass(e.cursor)}),x(l+n,function(){e.cursor&&i.removeClass(e.cursor),I.off("resize"+v)}),x("Resize"+n,t.resizeImage),t.isLowIE&&x("AfterChange",t.resizeImage)},resizeImage:function(){var e=t.currItem;if(e&&e.img&&t.st.image.verticalFit){var n=0;t.isLowIE&&(n=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",t.wH-n)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,W&&clearInterval(W),e.isCheckingImgSize=!1,T("ImageHasSize",e),e.imgHidden&&(t.content&&t.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(e){var n=0,i=e.img[0],o=function(r){W&&clearInterval(W),W=setInterval(function(){return i.naturalWidth>0?(t._onImageHasSize(e),void 0):(n>200&&clearInterval(W),n++,3===n?o(10):40===n?o(50):100===n&&o(500),void 0)},r)};o(1)},getImage:function(n,i){var o=0,r=function(){n&&(n.img[0].complete?(n.img.off(".mfploader"),n===t.currItem&&(t._onImageHasSize(n),t.updateStatus("ready")),n.hasSize=!0,n.loaded=!0,T("ImageLoadComplete")):(o++,200>o?setTimeout(r,100):a()))},a=function(){n&&(n.img.off(".mfploader"),n===t.currItem&&(t._onImageHasSize(n),t.updateStatus("error",s.tError.replace("%url%",n.src))),n.hasSize=!0,n.loaded=!0,n.loadError=!0)},s=t.st.image,l=i.find(".mfp-img");if(l.length){var c=document.createElement("img");c.className="mfp-img",n.img=e(c).on("load.mfploader",r).on("error.mfploader",a),c.src=n.src,l.is("img")&&(n.img=n.img.clone()),n.img[0].naturalWidth>0&&(n.hasSize=!0)}return t._parseMarkup(i,{title:R(n),img_replaceWith:n.img},n),t.resizeImage(),n.hasSize?(W&&clearInterval(W),n.loadError?(i.addClass("mfp-loading"),t.updateStatus("error",s.tError.replace("%url%",n.src))):(i.removeClass("mfp-loading"),t.updateStatus("ready")),i):(t.updateStatus("loading"),n.loading=!0,n.hasSize||(n.imgHidden=!0,i.addClass("mfp-loading"),t.findImageSize(n)),i)}}});var Z,q=function(){return void 0===Z&&(Z=void 0!==document.createElement("p").style.MozTransform),Z};e.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(e){return e.is("img")?e:e.find("img")}},proto:{initZoom:function(){var e,n=t.st.zoom,i=".zoom";if(n.enabled&&t.supportsTransition){var o,r,a=n.duration,s=function(e){var t=e.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),i="all "+n.duration/1e3+"s "+n.easing,o={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},r="transition";return o["-webkit-"+r]=o["-moz-"+r]=o["-o-"+r]=o[r]=i,t.css(o),t},d=function(){t.content.css("visibility","visible")};x("BuildControls"+i,function(){if(t._allowZoom()){if(clearTimeout(o),t.content.css("visibility","hidden"),e=t._getItemToZoom(),!e)return d(),void 0;r=s(e),r.css(t._getOffset()),t.wrap.append(r),o=setTimeout(function(){r.css(t._getOffset(!0)),o=setTimeout(function(){d(),setTimeout(function(){r.remove(),e=r=null,T("ZoomAnimationEnded")},16)},a)},16)}}),x(c+i,function(){if(t._allowZoom()){if(clearTimeout(o),t.st.removalDelay=a,!e){if(e=t._getItemToZoom(),!e)return;r=s(e)}r.css(t._getOffset(!0)),t.wrap.append(r),t.content.css("visibility","hidden"),setTimeout(function(){r.css(t._getOffset())},16)}}),x(l+i,function(){t._allowZoom()&&(d(),r&&r.remove(),e=null)})}},_allowZoom:function(){return"image"===t.currItem.type},_getItemToZoom:function(){return t.currItem.hasSize?t.currItem.img:!1},_getOffset:function(n){var i;i=n?t.currItem.img:t.st.zoom.opener(t.currItem.el||t.currItem);var o=i.offset(),r=parseInt(i.css("padding-top"),10),a=parseInt(i.css("padding-bottom"),10);o.top-=e(window).scrollTop()-r;var s={width:i.width(),height:(b?i.innerHeight():i[0].offsetHeight)-a-r};return q()?s["-moz-transform"]=s.transform="translate("+o.left+"px,"+o.top+"px)":(s.left=o.left,s.top=o.top),s}}});var D="iframe",K="//about:blank",Y=function(e){if(t.currTemplate[D]){var n=t.currTemplate[D].find("iframe");n.length&&(e||(n[0].src=K),t.isIE8&&n.css("display",e?"block":"none"))}};e.magnificPopup.registerModule(D,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(D),x("BeforeChange",function(e,t,n){t!==n&&(t===D?Y():n===D&&Y(!0))}),x(l+"."+D,function(){Y()})},getIframe:function(n,i){var o=n.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(i,a,n),t.updateStatus("ready"),i}}});var U=function(e){var n=t.items.length;return e>n-1?e-n:0>e?n+e:e},G=function(e,t,n){return e.replace("%curr%",t+1).replace("%total%",n)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var n=t.st.gallery,i=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,n&&n.enabled?(a+=" mfp-gallery",x(f+i,function(){n.navigateByImgClick&&t.wrap.on("click"+i,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+i,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+i,function(e,n){n.text&&(n.text=G(n.text,t.currItem.index,t.items.length))}),x(p+i,function(e,i,o,r){var a=t.items.length;o.counter=a>1?G(n.tCounter,r.index,a):""}),x("BuildControls"+i,function(){if(t.items.length>1&&n.arrows&&!t.arrowLeft){var i=n.arrowMarkup,o=t.arrowLeft=e(i.replace("%title%",n.tPrev).replace("%dir%","left")).addClass(y),a=t.arrowRight=e(i.replace("%title%",n.tNext).replace("%dir%","right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+i,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+i,function(){o.off(i),t.wrap.off("click"+i),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=U(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=U(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,n=t.st.gallery.preload,i=Math.min(n[0],t.items.length),o=Math.min(n[1],t.items.length);for(e=1;(t.direction?o:i)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?i:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(n){if(n=U(n),!t.items[n].preloaded){var i=t.items[n];i.parsed||(i=t.parseEl(n)),T("LazyLoad",i),"image"===i.type&&(i.img=e('').on("load.mfploader",function(){i.hasSize=!0}).on("error.mfploader",function(){i.hasSize=!0,i.loadError=!0,T("LazyLoadError",i)}).attr("src",i.src)),i.preloaded=!0}}}});var X="retina";e.magnificPopup.registerModule(X,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,n=e.ratio;n=isNaN(n)?n():n,n>1&&(x("ImageHasSize."+X,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/n,width:"100%"})}),x("ElementParse."+X,function(t,i){i.src=e.replaceSrc(i,n)}))}}}}),function(){var t=1e3,n="ontouchstart"in window,i=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(n){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,i())}).on("touchend"+r,function(e){i(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),n&&I.off("touchmove"+r+" touchend"+r)}}()})(window.jQuery||window.Zepto); \ No newline at end of file diff --git a/resources/Magnific-Popup/magnific-popup.css b/resources/Magnific-Popup/magnific-popup.css index 60391e1..2865003 100644 --- a/resources/Magnific-Popup/magnific-popup.css +++ b/resources/Magnific-Popup/magnific-popup.css @@ -58,8 +58,7 @@ .mfp-ajax-cur { cursor: progress; } -.mfp-zoom-out-cur, -.mfp-zoom-out-cur .mfp-image-holder .mfp-close { +.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { cursor: -moz-zoom-out; cursor: -webkit-zoom-out; cursor: zoom-out; } @@ -97,12 +96,10 @@ left: 8px; right: 8px; z-index: 1044; } - -.mfp-preloader a { - color: #cccccc; } - -.mfp-preloader a:hover { - color: white; } + .mfp-preloader a { + color: #cccccc; } + .mfp-preloader a:hover { + color: white; } .mfp-s-ready .mfp-preloader { display: none; } @@ -110,8 +107,7 @@ .mfp-s-error .mfp-content { display: none; } -button.mfp-close, -button.mfp-arrow { +button.mfp-close, button.mfp-arrow { overflow: visible; cursor: pointer; background: transparent; @@ -122,7 +118,6 @@ button.mfp-arrow { z-index: 1046; -webkit-box-shadow: none; box-shadow: none; } - button::-moz-focus-inner { padding: 0; border: 0; } @@ -176,36 +171,32 @@ button::-moz-focus-inner { 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: medium inset transparent; } -.mfp-arrow:after, -.mfp-arrow .mfp-a { - border-top-width: 13px; - border-bottom-width: 13px; - top: 8px; } -.mfp-arrow:before, -.mfp-arrow .mfp-b { - border-top-width: 21px; - border-bottom-width: 21px; } + .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: medium inset transparent; } + .mfp-arrow:after, + .mfp-arrow .mfp-a { + border-top-width: 13px; + border-bottom-width: 13px; + top: 8px; } + .mfp-arrow:before, + .mfp-arrow .mfp-b { + border-top-width: 21px; + border-bottom-width: 21px; } .mfp-arrow-left { left: 0; } @@ -231,30 +222,27 @@ button::-moz-focus-inner { .mfp-iframe-holder { padding-top: 40px; padding-bottom: 40px; } - -.mfp-iframe-holder .mfp-content { - line-height: 0; - width: 100%; - max-width: 900px; } + .mfp-iframe-holder .mfp-content { + line-height: 0; + width: 100%; + max-width: 900px; } + .mfp-iframe-holder .mfp-close { + top: -40px; } .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; } + .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; } /* Main image in popup */ img.mfp-img { @@ -270,22 +258,26 @@ img.mfp-img { 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); - background: #444444; } - .mfp-figure { line-height: 0; } + .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); + background: #444444; } + .mfp-figure small { + color: #bdbdbd; + display: block; + font-size: 12px; + line-height: 14px; } .mfp-bottom-bar { margin-top: -36px; @@ -302,12 +294,6 @@ img.mfp-img { word-wrap: 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%; } @@ -321,15 +307,16 @@ img.mfp-img { .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-figure { + /* The shadow behind the image */ } + .mfp-img-mobile .mfp-figure:after { + top: 0; + bottom: 0; } + .mfp-img-mobile .mfp-figure small { + display: inline; + margin-left: 5px; } .mfp-img-mobile .mfp-bottom-bar { background: rgba(0, 0, 0, 0.6); bottom: 0; @@ -340,14 +327,11 @@ img.mfp-img { -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-bottom-bar:empty { + padding: 0; } .mfp-img-mobile .mfp-counter { right: 5px; top: 3px; } - .mfp-img-mobile .mfp-close { top: 0; right: 0; @@ -357,11 +341,7 @@ img.mfp-img { 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; } } + padding: 0; } } @media all and (max-width: 900px) { .mfp-arrow { -webkit-transform: scale(0.75); diff --git a/resources/doT/doT.min.js b/resources/doT/doT.min.js index 1f05f62..823cabc 100644 --- a/resources/doT/doT.min.js +++ b/resources/doT/doT.min.js @@ -1,7 +1,8 @@ -/* 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, +/* 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.1",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+"prepare('select series.id as id, series.name as name, series.sort as sort, count(*) as count +from series, books_series_link +where series.id = series and series.name like ? +group by series.id, series.name, series.sort +order by series.sort'); + $entryArray = array(); + $result->execute (array ('%' . $query . '%')); + while ($post = $result->fetchObject ()) + { + $serie = new Serie ($post->id, $post->sort); + array_push ($entryArray, new Entry ($serie->name, $serie->getEntryId (), + str_format (localize("bookword", $post->count), $post->count), "text", + array ( new LinkNavigation ($serie->getUri ())))); + } + return $entryArray; + } } diff --git a/tag.php b/tag.php index 3664b0d..b3d9a23 100644 --- a/tag.php +++ b/tag.php @@ -61,4 +61,22 @@ order by tags.name'); } return $entryArray; } + + public static function getAllTagsByQuery($query) { + $result = parent::getDb ()->prepare('select tags.id as id, tags.name as name, count(*) as count +from tags, books_tags_link +where tags.id = tag and tags.name like ? +group by tags.id, tags.name +order by tags.name'); + $entryArray = array(); + $result->execute (array ('%' . $query . '%')); + while ($post = $result->fetchObject ()) + { + $tag = new Tag ($post->id, $post->name); + array_push ($entryArray, new Entry ($tag->name, $tag->getEntryId (), + str_format (localize("bookword", $post->count), $post->count), "text", + array ( new LinkNavigation ($tag->getUri ())))); + } + return $entryArray; + } } diff --git a/templates/default/header.html b/templates/default/header.html index 13c981b..193a11d 100644 --- a/templates/default/header.html +++ b/templates/default/header.html @@ -17,7 +17,6 @@
- {{? it.databaseId != ""}} diff --git a/test/baseTest.php b/test/baseTest.php new file mode 100644 index 0000000..2e60c99 --- /dev/null +++ b/test/baseTest.php @@ -0,0 +1,14 @@ +assertEquals ("?db=0", addURLParameter ("?", "db", "0")); + $this->assertEquals ("?key=value&db=0", addURLParameter ("?key=value", "db", "0")); + $this->assertEquals ("?key=value&otherKey=&db=0", addURLParameter ("?key=value&otherKey", "db", "0")); + } +} \ No newline at end of file diff --git a/test/bookTest.php b/test/bookTest.php new file mode 100644 index 0000000..c439563 --- /dev/null +++ b/test/bookTest.php @@ -0,0 +1,100 @@ +assertEquals (14, Book::getBookCount ()); + } + + public function testGetCount () + { + $entryArray = Book::getCount (); + $this->assertEquals (2, count($entryArray)); + + $entryAllBooks = $entryArray [0]; + $this->assertEquals ("Alphabetical index of the 14 books", $entryAllBooks->content); + + $entryRecentBooks = $entryArray [1]; + $this->assertEquals ("50 most recent books", $entryRecentBooks->content); + + } + + public function testGetCountRecent () + { + global $config; + $config['cops_recentbooks_limit'] = 0; + $entryArray = Book::getCount (); + + $this->assertEquals (1, count($entryArray)); + + $config['cops_recentbooks_limit'] = 2; + $entryArray = Book::getCount (); + + $entryRecentBooks = $entryArray [1]; + $this->assertEquals ("2 most recent books", $entryRecentBooks->content); + + $config['cops_recentbooks_limit'] = 50; + } + + public function testGetBooksByAuthor () + { + // All book by Arthur Conan Doyle + global $config; + + $config['cops_max_item_per_page'] = 5; + list ($entryArray, $totalNumber) = Book::getBooksByAuthor (1, 1); + $this->assertEquals (5, count($entryArray)); + $this->assertEquals (8, $totalNumber); + + list ($entryArray, $totalNumber) = Book::getBooksByAuthor (1, 2); + $this->assertEquals (3, count($entryArray)); + $this->assertEquals (8, $totalNumber); + + $config['cops_max_item_per_page'] = -1; + list ($entryArray, $totalNumber) = Book::getBooksByAuthor (1, -1); + $this->assertEquals (8, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBooksBySeries () + { + // All book from the Sherlock Holmes series + list ($entryArray, $totalNumber) = Book::getBooksBySeries (1, -1); + $this->assertEquals (7, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBooksByTag () + { + // All book with the Fiction tag + list ($entryArray, $totalNumber) = Book::getBooksByTag (1, -1); + $this->assertEquals (14, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBooksByLanguage () + { + // All english book (= all books) + list ($entryArray, $totalNumber) = Book::getBooksByLanguage (1, -1); + $this->assertEquals (14, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBookById () + { + // also check most of book's class methods + $book = Book::getBookById(2); + $this->assertEquals ("The Return of Sherlock Holmes", $book->getTitle ()); + $this->assertEquals ("urn:uuid:87ddbdeb-1e27-4d06-b79b-4b2a3bfc6a5f", $book->getEntryId ()); + $this->assertEquals ("index.php?page=13&id=2", $book->getDetailUrl ()); + $this->assertEquals ("Doyle, Arthur Conan", $book->getAuthorsName ()); + $this->assertEquals ("Fiction, Mystery & Detective, Short Stories", $book->getTagsName ()); + $this->assertEquals ('

The Return of Sherlock Holmes is a collection of 13 Sherlock Holmes stories, originally published in 1903-1904, by Arthur Conan Doyle.
The book was first published on March 7, 1905 by Georges Newnes, Ltd and in a Colonial edition by Longmans. 30,000 copies were made of the initial print run. The US edition by McClure, Phillips & Co. added another 28,000 to the run.
This was the first Holmes collection since 1893, when Holmes had "died" in "The Adventure of the Final Problem". Having published The Hound of the Baskervilles in 1901–1902 (although setting it before Holmes\' death) Doyle came under intense pressure to revive his famous character.

', $book->getComment (false)); + + } + +} \ No newline at end of file diff --git a/test/config_test.php b/test/config_test.php new file mode 100644 index 0000000..847889b --- /dev/null +++ b/test/config_test.php @@ -0,0 +1,4 @@ +