diff --git a/bookdetail.php b/bookdetail.php new file mode 100644 index 0000000..b8ac8f6 --- /dev/null +++ b/bookdetail.php @@ -0,0 +1,40 @@ + + * + */ + +require_once ("config.php"); +require_once ("book.php"); + +$book = Book::getBookById($_GET["id"]); +$authors = $book->getAuthors (); + +?> +
+
+
+ cover +
+
title) ?>
+
+ 0) echo ", "; +?> + getUri ()) ?>">name ?> + +
+
+
+
+
+ getComment () ?> +
+
\ No newline at end of file diff --git a/fancybox/blank.gif b/fancybox/blank.gif new file mode 100644 index 0000000..35d42e8 Binary files /dev/null and b/fancybox/blank.gif differ diff --git a/fancybox/fancybox_loading.gif b/fancybox/fancybox_loading.gif new file mode 100644 index 0000000..0158617 Binary files /dev/null and b/fancybox/fancybox_loading.gif differ diff --git a/fancybox/fancybox_sprite.png b/fancybox/fancybox_sprite.png new file mode 100644 index 0000000..a1aae1a Binary files /dev/null and b/fancybox/fancybox_sprite.png differ diff --git a/fancybox/helpers/fancybox_buttons.png b/fancybox/helpers/fancybox_buttons.png new file mode 100644 index 0000000..e0e1ea8 Binary files /dev/null and b/fancybox/helpers/fancybox_buttons.png differ diff --git a/fancybox/helpers/jquery.fancybox-buttons.css b/fancybox/helpers/jquery.fancybox-buttons.css new file mode 100644 index 0000000..0cff8a3 --- /dev/null +++ b/fancybox/helpers/jquery.fancybox-buttons.css @@ -0,0 +1,85 @@ +#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: 170px; + height: 30px; + margin: 0 auto; + padding: 0; + list-style: none; + background: #111; + -webkit-box-shadow: 0 1px 3px #000,0 0 0 1px rgba(0,0,0,.7),inset 0 0 0 1px rgba(255,255,255,.05); + -moz-box-shadow: 0 1px 3px #000,0 0 0 1px rgba(0,0,0,.7),inset 0 0 0 1px rgba(255,255,255,.05); + background: #111 -webkit-gradient(linear,0% 0%,0% 100%,from(rgba(255,255,255,.2)),color-stop(.5,rgba(255,255,255,.15)),color-stop(.5,rgba(255,255,255,.1)),to(rgba(255,255,255,.15))); + background: #111 -moz-linear-gradient(top,rgba(255,255,255,.2) 0%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.1) 50%,rgba(255,255,255,.15) 100%); + border-radius: 3px; +} + +#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; +} + +#fancybox-buttons a.btnPrev { + width: 32px; + background-position: 6px 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: 38px; + background-position: -57px 0px; +} + +#fancybox-buttons a.btnDisabled { + opacity : 0.5; + cursor: default; +} \ No newline at end of file diff --git a/fancybox/helpers/jquery.fancybox-buttons.js b/fancybox/helpers/jquery.fancybox-buttons.js new file mode 100644 index 0000000..e116e38 --- /dev/null +++ b/fancybox/helpers/jquery.fancybox-buttons.js @@ -0,0 +1,115 @@ + /*! + * Buttons helper for fancyBox + * version: 1.0.2 + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * buttons: { + * position : 'top' + * } + * }); + * + * Options: + * tpl - HTML template + * position - 'top' or 'bottom' + * + */ +(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.buttons = { + tpl: '
', + list: null, + buttons: {}, + + update: function () { + var toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn'); + + //Size toggle button + if (F.current.canShrink) { + toggle.addClass('btnToggleOn'); + + } else if (!F.current.canExpand) { + toggle.addClass('btnDisabled'); + } + }, + + beforeLoad: function (opts) { + //Remove self if gallery do not have at least two items + if (F.group.length < 2) { + F.coming.helpers.buttons = false; + F.coming.closeBtn = true; + + return; + } + + //Increase top margin to give space for buttons + F.coming.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30; + }, + + onPlayStart: function () { + if (this.list) { + this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn'); + } + }, + + onPlayEnd: function () { + if (this.list) { + this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn'); + } + }, + + afterShow: function (opts) { + var buttons; + + if (!this.list) { + this.list = $(opts.tpl || this.tpl).addClass(opts.position || 'top').appendTo('body'); + + this.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 ) + } + } + + buttons = this.buttons; + + //Prev + if (F.current.index > 0 || F.current.loop) { + buttons.prev.removeClass('btnDisabled'); + } else { + buttons.prev.addClass('btnDisabled'); + } + + //Next / Play + if (F.current.loop || F.current.index < F.group.length - 1) { + buttons.next.removeClass('btnDisabled'); + buttons.play.removeClass('btnDisabled'); + + } else { + buttons.next.addClass('btnDisabled'); + buttons.play.addClass('btnDisabled'); + } + + this.update(); + }, + + onUpdate: function () { + this.update(); + }, + + beforeClose: function () { + if (this.list) { + this.list.remove(); + } + + this.list = null; + this.buttons = {}; + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/fancybox/helpers/jquery.fancybox-media.js b/fancybox/helpers/jquery.fancybox-media.js new file mode 100644 index 0000000..be5f586 --- /dev/null +++ b/fancybox/helpers/jquery.fancybox-media.js @@ -0,0 +1,85 @@ + /*! + * Media helper for fancyBox + * version: 1.0.0 + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * media: {} + * }); + * + * Supports: + * Youtube + * http://www.youtube.com/watch?v=opj24KnzrWo + * http://youtu.be/opj24KnzrWo + * Vimeo + * http://vimeo.com/25634903 + * 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 ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.media = { + beforeLoad : function(opts, obj) { + var href = obj.href || '', + type = false, + rez; + + if ((rez = href.match(/(youtube\.com|youtu\.be)\/(v\/|u\/|embed\/|watch\?v=)?([^#\&\?]*).*/i))) { + href = '//www.youtube.com/embed/' + rez[3] + '?autoplay=1&autohide=1&fs=1&rel=0&enablejsapi=1'; + type = 'iframe'; + + } else if ((rez = href.match(/vimeo.com\/(\d+)\/?(.*)/))) { + href = '//player.vimeo.com/video/' + rez[1] + '?hd=1&autoplay=1&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1'; + type = 'iframe'; + + } else if ((rez = href.match(/metacafe.com\/watch\/(\d+)\/?(.*)/))) { + href = '//www.metacafe.com/fplayer/' + rez[1] + '/.swf?playerVars=autoPlay=yes'; + type = 'swf'; + + } else if ((rez = href.match(/dailymotion.com\/video\/(.*)\/?(.*)/))) { + href = '//www.dailymotion.com/swf/video/' + rez[1] + '?additionalInfos=0&autoStart=1'; + type = 'swf'; + + } else if ((rez = href.match(/twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i))) { + href = '//www.twitvid.com/embed.php?autoplay=0&guid=' + rez[1]; + type = 'iframe'; + + } else if ((rez = href.match(/twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i))) { + href = '//twitpic.com/show/full/' + rez[1]; + type = 'image'; + + } else if ((rez = href.match(/(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i))) { + href = '//' + rez[1] + '/p/' + rez[2] + '/media/?size=l'; + type = 'image'; + + } else if ((rez = href.match(/maps\.google\.com\/(\?ll=|maps\/?\?q=)(.*)/i))) { + href = '//maps.google.com/' + rez[1] + '' + rez[2] + '&output=' + (rez[2].indexOf('layer=c') ? 'svembed' : 'embed'); + type = 'iframe'; + } + + if (type) { + obj.href = href; + obj.type = type; + } + } + } + +}(jQuery)); \ No newline at end of file diff --git a/fancybox/helpers/jquery.fancybox-thumbs.css b/fancybox/helpers/jquery.fancybox-thumbs.css new file mode 100644 index 0000000..e40ae82 --- /dev/null +++ b/fancybox/helpers/jquery.fancybox-thumbs.css @@ -0,0 +1,54 @@ +#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; +} \ No newline at end of file diff --git a/fancybox/helpers/jquery.fancybox-thumbs.js b/fancybox/helpers/jquery.fancybox-thumbs.js new file mode 100644 index 0000000..a1b2bb7 --- /dev/null +++ b/fancybox/helpers/jquery.fancybox-thumbs.js @@ -0,0 +1,157 @@ + /*! + * Thumbnail helper for fancyBox + * version: 1.0.4 + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * thumbs: { + * width : 50, + * height : 50 + * } + * }); + * + * Options: + * width - thumbnail width + * height - thumbnail height + * source - function to obtain the URL of the thumbnail image + * position - 'top' or 'bottom' + * + */ +(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.thumbs = { + wrap: null, + list: null, + width: 0, + + //Default function to obtain the URL of the thumbnail image + source: function (el) { + var img; + + if ($.type(el) === 'string') { + return el; + } + + img = $(el).find('img'); + + return img.length ? img.attr('src') : el.href; + }, + + init: function (opts) { + var that = this, + list, + thumbWidth = opts.width || 50, + thumbHeight = opts.height || 50, + thumbSource = opts.source || this.source; + + //Build list structure + list = ''; + + for (var n = 0; n < F.group.length; n++) { + list += '
  • '; + } + + this.wrap = $('
    ').addClass(opts.position || 'bottom').appendTo('body'); + this.list = $('').appendTo(this.wrap); + + //Load each thumbnail + $.each(F.group, function (i) { + $("").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', thumbSource( F.group[ i ] )); + }); + + //Set initial width + this.width = this.list.children().eq(0).outerWidth(true); + + this.list.width(this.width * (F.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (F.current.index * this.width + this.width * 0.5))); + }, + + //Center list + update: function (opts) { + if (this.list) { + this.list.stop(true).animate({ + 'left': Math.floor($(window).width() * 0.5 - (F.current.index * this.width + this.width * 0.5)) + }, 150); + } + }, + + beforeLoad: function (opts) { + //Remove self if gallery do not have at least two items + if (F.group.length < 2) { + F.coming.helpers.thumbs = false; + + return; + } + + //Increase bottom margin to give space for thumbs + F.coming.margin[ opts.position === 'top' ? 0 : 2 ] = opts.height + 30; + }, + + afterShow: function (opts) { + //Check if exists and create or update list + if (this.list) { + this.update(opts); + + } else { + this.init(opts); + } + + //Set active element + this.list.children().removeClass('active').eq(F.current.index).addClass('active'); + }, + + onUpdate: function () { + this.update(); + }, + + beforeClose: function () { + if (this.wrap) { + this.wrap.remove(); + } + + this.wrap = null; + this.list = null; + this.width = 0; + } + } + +}(jQuery)); \ No newline at end of file diff --git a/fancybox/jquery.fancybox.css b/fancybox/jquery.fancybox.css new file mode 100644 index 0000000..783d02f --- /dev/null +++ b/fancybox/jquery.fancybox.css @@ -0,0 +1,234 @@ +/*! fancyBox v2.0.6 fancyapps.com | fancyapps.com/fancybox/#license */ +.fancybox-tmp iframe, .fancybox-tmp object { + vertical-align: top; + padding: 0; + margin: 0; +} + +.fancybox-wrap { + position: absolute; + top: 0; + left: 0; + z-index: 8020; +} + +.fancybox-skin { + position: relative; + padding: 0; + margin: 0; + 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 { + padding: 0; + margin: 0; + position: relative; + outline: none; +} + +.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: 10px; +} + +.fancybox-image, .fancybox-iframe { + display: block; + width: 100%; + height: 100%; + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.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: 8020; +} + +#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; + 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: 20px; + background-position: 0 -36px; +} + +.fancybox-next span { + right: 20px; + background-position: 0 -72px; +} + +.fancybox-nav:hover span { + visibility: visible; +} + +.fancybox-tmp { + position: absolute; + top: -9999px; + left: -9999px; + padding: 0; + overflow: visible; + visibility: hidden; +} + +/* Overlay helper */ + +#fancybox-overlay { + position: absolute; + top: 0; + left: 0; + overflow: hidden; + display: none; + z-index: 8010; + background: #000; +} + +#fancybox-overlay.overlay-fixed { + position: fixed; + bottom: 0; + right: 0; +} + +/* 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: 8030; + 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 { + margin-top: 10px; +} + +.fancybox-title-over-wrap { + position: absolute; + bottom: 0; + left: 0; + color: #fff; + padding: 10px; + background: #000; + background: rgba(0, 0, 0, .8); +} \ No newline at end of file diff --git a/fancybox/jquery.fancybox.js b/fancybox/jquery.fancybox.js new file mode 100644 index 0000000..704d95c --- /dev/null +++ b/fancybox/jquery.fancybox.js @@ -0,0 +1,1463 @@ +/*! + * fancyBox - jQuery Plugin + * version: 2.0.6 (16/04/2012) + * @requires jQuery v1.6 or later + * + * Examples at http://fancyapps.com/fancybox/ + * License: www.fancyapps.com/fancybox/#license + * + * Copyright 2012 Janis Skarnelis - janis@fancyapps.com + * + */ + +(function (window, document, $, undefined) { + "use strict"; + + var W = $(window), + D = $(document), + F = $.fancybox = function () { + F.open.apply( this, arguments ); + }, + didResize = false, + resizeTimer = null, + isTouch = document.createTouch !== undefined, + isString = function(str) { + return $.type(str) === "string"; + }, + isPercentage = function(str) { + return isString(str) && str.indexOf('%') > 0; + }, + getValue = function(value, dim) { + if (dim && isPercentage(value)) { + value = F.getViewport()[ dim ] / 100 * parseInt(value, 10); + } + + return Math.round(value) + 'px'; + }; + + $.extend(F, { + // The current version of fancyBox + version: '2.0.5', + + defaults: { + padding: 15, + margin: 20, + + width: 800, + height: 600, + minWidth: 100, + minHeight: 100, + maxWidth: 9999, + maxHeight: 9999, + + autoSize: true, + autoResize: !isTouch, + autoCenter : !isTouch, + fitToView: true, + aspectRatio: false, + topRatio: 0.5, + + fixed: false, + scrolling: 'auto', // 'auto', 'yes' or 'no' + wrapCSS: '', + + arrows: true, + closeBtn: true, + closeClick: false, + nextClick : false, + mouseWheel: true, + autoPlay: false, + playSpeed: 3000, + preload : 3, + + modal: false, + loop: true, + ajax: { dataType: 'html', headers: { 'X-fancyBox': true } }, + keys: { + next: [13, 32, 34, 39, 40], // enter, space, page down, right arrow, down arrow + prev: [8, 33, 37, 38], // backspace, page up, left arrow, up arrow + close: [27] // escape key + }, + + // Override some properties + index: 0, + type: null, + href: null, + content: null, + title: null, + + // HTML templates + tpl: { + wrap: '
    ', + image: '', + iframe: '', + swf: '', + error: '

    The requested content cannot be loaded.
    Please try again later.

    ', + closeBtn: '
    ', + next: '', + prev: '' + }, + + // Properties for each animation type + // Opening fancyBox + openEffect: 'fade', // 'elastic', 'fade' or 'none' + openSpeed: 300, + openEasing: 'swing', + openOpacity: true, + openMethod: 'zoomIn', + + // Closing fancyBox + closeEffect: 'fade', // 'elastic', 'fade' or 'none' + closeSpeed: 300, + closeEasing: 'swing', + closeOpacity: true, + closeMethod: 'zoomOut', + + // Changing next gallery item + nextEffect: 'elastic', // 'elastic', 'fade' or 'none' + nextSpeed: 300, + nextEasing: 'swing', + nextMethod: 'changeIn', + + // Changing previous gallery item + prevEffect: 'elastic', // 'elastic', 'fade' or 'none' + prevSpeed: 300, + prevEasing: 'swing', + prevMethod: 'changeOut', + + // Enabled helpers + helpers: { + overlay: { + speedIn: 0, + speedOut: 300, + opacity: 0.8, + css: { + cursor: 'pointer' + }, + closeClick: true + }, + title: { + type: 'float' // 'float', 'inside', 'outside' or 'over' + } + }, + + // Callbacks + onCancel: $.noop, // If canceling + beforeLoad: $.noop, // Before loading + afterLoad: $.noop, // After loading + beforeShow: $.noop, // Before changing in current item + afterShow: $.noop, // After opening + beforeClose: $.noop, // Before closing + afterClose: $.noop // After closing + }, + + //Current state + group: {}, // Selected group + opts: {}, // Group options + coming: null, // Element being loaded + current: null, // Currently loaded element + isOpen: false, // Is currently open + isOpened: false, // Have been fully opened at least once + wrap: null, + skin: null, + outer: null, + inner: null, + + player: { + timer: null, + isActive: false + }, + + // Loaders + ajaxLoad: null, + imgPreload: null, + + // Some collections + transitions: {}, + helpers: {}, + + /* + * Static methods + */ + + open: function (group, opts) { + //Kill existing instances + F.close(true); + + //Normalize group + if (group && !$.isArray(group)) { + group = group instanceof $ ? $(group).get() : [group]; + } + + F.isActive = true; + + //Extend the defaults + F.opts = $.extend(true, {}, F.defaults, opts); + + //All options are merged recursive except keys + if ($.isPlainObject(opts) && opts.keys !== undefined) { + F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false; + } + + F.group = group; + + F._start(F.opts.index || 0); + }, + + cancel: function () { + if (F.coming && false === F.trigger('onCancel')) { + return; + } + + F.coming = null; + + F.hideLoading(); + + if (F.ajaxLoad) { + F.ajaxLoad.abort(); + } + + F.ajaxLoad = null; + + if (F.imgPreload) { + F.imgPreload.onload = F.imgPreload.onabort = F.imgPreload.onerror = null; + } + }, + + close: function (a) { + F.cancel(); + + if (!F.current || false === F.trigger('beforeClose')) { + return; + } + + F.unbindEvents(); + + //If forced or is still opening then remove immediately + if (!F.isOpen || (a && a[0] === true)) { + $('.fancybox-wrap').stop().trigger('onReset').remove(); + + F._afterZoomOut(); + + } else { + F.isOpen = F.isOpened = false; + + $('.fancybox-item, .fancybox-nav').remove(); + + F.wrap.stop(true).removeClass('fancybox-opened'); + F.inner.css('overflow', 'hidden'); + + F.transitions[F.current.closeMethod](); + } + }, + + // Start/stop slideshow + play: function (a) { + var clear = function () { + clearTimeout(F.player.timer); + }, + set = function () { + clear(); + + if (F.current && F.player.isActive) { + F.player.timer = setTimeout(F.next, F.current.playSpeed); + } + }, + stop = function () { + clear(); + + $('body').unbind('.player'); + + F.player.isActive = false; + + F.trigger('onPlayEnd'); + }, + start = function () { + if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) { + F.player.isActive = true; + + $('body').bind({ + 'afterShow.player onUpdate.player': set, + 'onCancel.player beforeClose.player': stop, + 'beforeLoad.player': clear + }); + + set(); + + F.trigger('onPlayStart'); + } + }; + + if (F.player.isActive || (a && a[0] === false)) { + stop(); + } else { + start(); + } + }, + + next: function () { + if (F.current) { + F.jumpto(F.current.index + 1); + } + }, + + prev: function () { + if (F.current) { + F.jumpto(F.current.index - 1); + } + }, + + jumpto: function (index) { + if (!F.current) { + return; + } + + index = parseInt(index, 10); + + if (F.group.length > 1 && F.current.loop) { + if (index >= F.group.length) { + index = 0; + + } else if (index < 0) { + index = F.group.length - 1; + } + } + + if (F.group[index] !== undefined) { + F.cancel(); + + F._start(index); + } + }, + + reposition: function (e, onlyAbsolute) { + var pos; + + if (F.isOpen) { + pos = F._getPosition(onlyAbsolute); + + if (e && e.type === 'scroll') { + delete pos.position; + + F.wrap.stop(true, true).animate(pos, 200); + + } else { + F.wrap.css(pos); + } + } + }, + + update: function (e) { + if (!F.isOpen) { + return; + } + + // Run this code after a delay for better performance + if (!didResize) { + resizeTimer = setTimeout(function () { + var current = F.current, anyway = !e || (e && e.type === 'orientationchange'); + + if (didResize) { + didResize = false; + + if (!current) { + return; + } + + if ((!e || e.type !== 'scroll') || anyway) { + if (current.autoSize && current.type !== 'iframe') { + F.inner.height('auto'); + current.height = F.inner.height(); + } + + if (current.autoResize || anyway) { + F._setDimension(); + } + + if (current.canGrow && current.type !== 'iframe') { + F.inner.height('auto'); + } + } + + if (current.autoCenter || anyway) { + F.reposition(e); + } + + F.trigger('onUpdate'); + } + }, 200); + } + + didResize = true; + }, + + toggle: function () { + if (F.isOpen) { + F.current.fitToView = !F.current.fitToView; + + F.update(); + } + }, + + hideLoading: function () { + D.unbind('keypress.fb'); + + $('#fancybox-loading').remove(); + }, + + showLoading: function () { + F.hideLoading(); + + //If user will press the escape-button, the request will be canceled + D.bind('keypress.fb', function(e) { + if (e.keyCode === 27) { + e.preventDefault(); + F.cancel(); + } + }); + + $('
    ').click(F.cancel).appendTo('body'); + }, + + getViewport: function () { + // See http://bugs.jquery.com/ticket/6724 + return { + x: W.scrollLeft(), + y: W.scrollTop(), + w: isTouch && window.innerWidth ? window.innerWidth : W.width(), + h: isTouch && window.innerHeight ? window.innerHeight : W.height() + }; + }, + + // Unbind the keyboard / clicking actions + unbindEvents: function () { + if (F.wrap) { + F.wrap.unbind('.fb'); + } + + D.unbind('.fb'); + W.unbind('.fb'); + }, + + bindEvents: function () { + var current = F.current, + keys = current.keys; + + if (!current) { + return; + } + + W.bind('resize.fb orientationchange.fb' + (current.autoCenter && !current.fixed ? ' scroll.fb' : ''), F.update); + + if (keys) { + D.bind('keydown.fb', function (e) { + var code, target = e.target || e.srcElement; + + // Ignore key combinations and key events within form elements + if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) { + code = e.keyCode; + + if ($.inArray(code, keys.close) > -1) { + F.close(); + e.preventDefault(); + + } else if ($.inArray(code, keys.next) > -1) { + F.next(); + e.preventDefault(); + + } else if ($.inArray(code, keys.prev) > -1) { + F.prev(); + e.preventDefault(); + } + } + }); + } + + if ($.fn.mousewheel && current.mouseWheel && F.group.length > 1) { + F.wrap.bind('mousewheel.fb', function (e, delta) { + var target = e.target || null; + + if (delta !== 0 && (!target || target.clientHeight === 0 || (target.scrollHeight === target.clientHeight && target.scrollWidth === target.clientWidth))) { + e.preventDefault(); + + F[delta > 0 ? 'prev' : 'next'](); + } + }); + } + }, + + trigger: function (event, o) { + var ret, obj = o || F[ $.inArray(event, ['onCancel', 'beforeLoad', 'afterLoad']) > -1 ? 'coming' : 'current' ]; + + if (!obj) { + return; + } + + if ($.isFunction( obj[event] )) { + ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1)); + } + + if (ret === false) { + return false; + } + + if (obj.helpers) { + $.each(obj.helpers, function (helper, opts) { + if (opts && $.isPlainObject(F.helpers[helper]) && $.isFunction(F.helpers[helper][event])) { + F.helpers[helper][event](opts, obj); + } + }); + } + + $.event.trigger(event + '.fb'); + }, + + isImage: function (str) { + return isString(str) && str.match(/\.(jpe?g|gif|png|bmp)((\?|#).*)?$/i); + }, + + isSWF: function (str) { + return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i); + }, + + _start: function (index) { + var coming = {}, + element = F.group[index] || null, + isDom, + href, + type, + rez, + hrefParts; + + if (element && (element.nodeType || element instanceof $)) { + isDom = true; + + if ($.metadata) { + coming = $(element).metadata(); + } + } + + coming = $.extend(true, {}, F.opts, {index : index, element : element}, ($.isPlainObject(element) ? element : coming)); + + // Re-check overridable options + $.each(['href', 'title', 'content', 'type'], function(i,v) { + coming[v] = F.opts[ v ] || (isDom && $(element).attr( v )) || coming[ v ] || null; + }); + + // Convert margin property to array - top, right, bottom, left + if (typeof coming.margin === 'number') { + coming.margin = [coming.margin, coming.margin, coming.margin, coming.margin]; + } + + // 'modal' propery is just a shortcut + if (coming.modal) { + $.extend(true, coming, { + closeBtn : false, + closeClick: false, + nextClick : false, + arrows : false, + mouseWheel : false, + keys : null, + helpers: { + overlay : { + css: { + cursor : 'auto' + }, + closeClick : false + } + } + }); + } + + //Give a chance for callback or helpers to update coming item (type, title, etc) + F.coming = coming; + + if (false === F.trigger('beforeLoad')) { + F.coming = null; + return; + } + + type = coming.type; + href = coming.href || element; + + ///Check if content type is set, if not, try to get + if (!type) { + if (isDom) { + type = $(element).data('fancybox-type'); + + if (!type) { + rez = element.className.match(/fancybox\.(\w+)/); + type = rez ? rez[1] : null; + } + } + + if (!type && isString(href)) { + if (F.isImage(href)) { + type = 'image'; + + } else if (F.isSWF(href)) { + type = 'swf'; + + } else if (href.match(/^#/)) { + type = 'inline'; + } + } + + // ...if not - display element itself + if (!type) { + type = isDom ? 'inline' : 'html'; + } + + coming.type = type; + } + + // Check before try to load; 'inline' and 'html' types need content, others - href + if (type === 'inline' || type === 'html') { + if (!coming.content) { + if (type === 'inline') { + coming.content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7 + + } else { + coming.content = element; + } + } + + if (!coming.content || !coming.content.length) { + type = null; + } + + } else if (!href) { + type = null; + } + + /* + * Add reference to the group, so it`s possible to access from callbacks, example: + * afterLoad : function() { + * this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : ''); + * } + */ + + if (type === 'ajax' && isString(href)) { + hrefParts = href.split(/\s+/, 2); + + href = hrefParts.shift(); + coming.selector = hrefParts.shift(); + } + + coming.href = href; + coming.group = F.group; + coming.isDom = isDom; + + switch (type) { + case 'image': + F._loadImage(); + break; + + case 'ajax': + F._loadAjax(); + break; + + case 'inline': + case 'iframe': + case 'swf': + case 'html': + F._afterLoad(); + break; + + default: + F._error( 'type' ); + } + }, + + _error: function ( type ) { + F.hideLoading(); + + $.extend(F.coming, { + type : 'html', + autoSize : true, + minWidth : 0, + minHeight : 0, + padding : 15, + hasError : type, + content : F.coming.tpl.error + }); + + F._afterLoad(); + }, + + _loadImage: function () { + // Reset preload image so it is later possible to check "complete" property + var img = F.imgPreload = new Image(); + + img.onload = function () { + this.onload = this.onerror = null; + + F.coming.width = this.width; + F.coming.height = this.height; + + F._afterLoad(); + }; + + img.onerror = function () { + this.onload = this.onerror = null; + + F._error( 'image' ); + }; + + img.src = F.coming.href; + + if (img.complete === undefined || !img.complete) { + F.showLoading(); + } + }, + + _loadAjax: function () { + F.showLoading(); + + F.ajaxLoad = $.ajax($.extend({}, F.coming.ajax, { + url: F.coming.href, + error: function (jqXHR, textStatus) { + if (F.coming && textStatus !== 'abort') { + F._error( 'ajax', jqXHR ); + + } else { + F.hideLoading(); + } + }, + success: function (data, textStatus) { + if (textStatus === 'success') { + F.coming.content = data; + + F._afterLoad(); + } + } + })); + }, + + _preloadImages: function() { + var group = F.group, + current = F.current, + len = group.length, + item, + href, + i, + cnt = Math.min(current.preload, len - 1); + + if (!current.preload || group.length < 2) { + return; + } + + for (i = 1; i <= cnt; i += 1) { + item = group[ (current.index + i ) % len ]; + href = item.href || $( item ).attr('href') || item; + + if (item.type === 'image' || F.isImage(href)) { + new Image().src = href; + } + } + }, + + _afterLoad: function () { + F.hideLoading(); + + if (!F.coming || false === F.trigger('afterLoad', F.current)) { + F.coming = false; + + return; + } + + if (F.isOpened) { + $('.fancybox-item, .fancybox-nav').remove(); + + F.wrap.stop(true).removeClass('fancybox-opened'); + F.inner.css('overflow', 'hidden'); + + F.transitions[F.current.prevMethod](); + + } else { + $('.fancybox-wrap').stop().trigger('onReset').remove(); + + F.trigger('afterClose'); + } + + F.unbindEvents(); + + F.isOpen = false; + F.current = F.coming; + + //Build the neccessary markup + F.wrap = $(F.current.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + F.current.type + ' fancybox-tmp ' + F.current.wrapCSS).appendTo('body'); + F.skin = $('.fancybox-skin', F.wrap).css('padding', getValue(F.current.padding)); + F.outer = $('.fancybox-outer', F.wrap); + F.inner = $('.fancybox-inner', F.wrap); + + F._setContent(); + }, + + _setContent: function () { + var current = F.current, + content = current.content, + type = current.type, + minWidth = current.minWidth, + minHeight = current.minHeight, + maxWidth = current.maxWidth, + maxHeight = current.maxHeight, + loadingBay; + + switch (type) { + case 'inline': + case 'ajax': + case 'html': + if (current.selector) { + content = $('
    ').html(content).find(current.selector); + + } else if (content instanceof $) { + if (content.parent().hasClass('fancybox-inner')) { + content.parents('.fancybox-wrap').unbind('onReset'); + } + + content = content.show().detach(); + + $(F.wrap).bind('onReset', function () { + content.appendTo('body').hide(); + }); + } + + if (current.autoSize) { + loadingBay = $('
    ') + .appendTo('body') + .css({ + minWidth : getValue(minWidth, 'w'), + minHeight : getValue(minHeight, 'h'), + maxWidth : getValue(maxWidth, 'w'), + maxHeight : getValue(maxHeight, 'h') + }) + .append(content); + + current.width = loadingBay.width(); + current.height = loadingBay.height(); + + // Re-check to fix 1px bug in some browsers + loadingBay.width( F.current.width ); + + if (loadingBay.height() > current.height) { + loadingBay.width(current.width + 1); + + current.width = loadingBay.width(); + current.height = loadingBay.height(); + } + + content = loadingBay.contents().detach(); + + loadingBay.remove(); + } + + break; + + case 'image': + content = current.tpl.image.replace('{href}', current.href); + + current.aspectRatio = true; + break; + + case 'swf': + content = current.tpl.swf.replace(/\{width\}/g, current.width).replace(/\{height\}/g, current.height).replace(/\{href\}/g, current.href); + break; + + case 'iframe': + content = $(current.tpl.iframe.replace('{rnd}', new Date().getTime()) ) + .attr('scrolling', current.scrolling) + .attr('src', current.href); + + current.scrolling = isTouch ? 'scroll' : 'auto'; + + break; + } + + if (type === 'image' || type === 'swf') { + current.autoSize = false; + current.scrolling = 'visible'; + } + + if (type === 'iframe' && current.autoSize) { + F.showLoading(); + + F._setDimension(); + + F.inner.css('overflow', current.scrolling); + + content.bind({ + onCancel : function() { + $(this).unbind(); + + F._afterZoomOut(); + }, + load : function() { + F.hideLoading(); + + try { + if (this.contentWindow.document.location) { + F.current.height = $(this).contents().find('body').height(); + } + } catch (e) { + F.current.autoSize = false; + } + + F[ F.isOpen ? '_afterZoomIn' : '_beforeShow'](); + } + }).appendTo(F.inner); + + } else { + F.inner.append(content); + + F._beforeShow(); + } + }, + + _beforeShow : function() { + F.coming = null; + + //Give a chance for helpers or callbacks to update elements + F.trigger('beforeShow'); + + //Set initial dimensions and hide + F._setDimension(); + F.wrap.hide().removeClass('fancybox-tmp'); + + F.bindEvents(); + + F._preloadImages(); + + F.transitions[ F.isOpened ? F.current.nextMethod : F.current.openMethod ](); + }, + + _setDimension: function () { + var wrap = F.wrap, + inner = F.inner, + current = F.current, + viewport = F.getViewport(), + margin = current.margin, + padding2 = current.padding * 2, + width = current.width, + height = current.height, + maxWidth = current.maxWidth + padding2, + maxHeight = current.maxHeight + padding2, + minWidth = current.minWidth + padding2, + minHeight = current.minHeight + padding2, + ratio, + height_; + + viewport.w -= (margin[1] + margin[3]); + viewport.h -= (margin[0] + margin[2]); + + if (isPercentage(width)) { + width = (((viewport.w - padding2) * parseFloat(width)) / 100); + } + + if (isPercentage(height)) { + height = (((viewport.h - padding2) * parseFloat(height)) / 100); + } + + ratio = width / height; + width += padding2; + height += padding2; + + if (current.fitToView) { + maxWidth = Math.min(viewport.w, maxWidth); + maxHeight = Math.min(viewport.h, maxHeight); + } + + if (current.aspectRatio) { + if (width > maxWidth) { + width = maxWidth; + height = ((width - padding2) / ratio) + padding2; + } + + if (height > maxHeight) { + height = maxHeight; + width = ((height - padding2) * ratio) + padding2; + } + + if (width < minWidth) { + width = minWidth; + height = ((width - padding2) / ratio) + padding2; + } + + if (height < minHeight) { + height = minHeight; + width = ((height - padding2) * ratio) + padding2; + } + + } else { + width = Math.max(minWidth, Math.min(width, maxWidth)); + height = Math.max(minHeight, Math.min(height, maxHeight)); + } + + width = Math.round(width); + height = Math.round(height); + + //Reset dimensions + $(wrap.add(inner)).width('auto').height('auto'); + + inner.width(width - padding2).height(height - padding2); + wrap.width(width); + + height_ = wrap.height(); // Real wrap height + + //Fit wrapper inside + if (width > maxWidth || height_ > maxHeight) { + while ((width > maxWidth || height_ > maxHeight) && width > minWidth && height_ > minHeight) { + height = height - 10; + + if (current.aspectRatio) { + width = Math.round(((height - padding2) * ratio) + padding2); + + if (width < minWidth) { + width = minWidth; + height = ((width - padding2) / ratio) + padding2; + } + + } else { + width = width - 10; + } + + inner.width(width - padding2).height(height - padding2); + wrap.width(width); + + height_ = wrap.height(); + } + } + + current.dim = { + width : getValue(width), + height : getValue(height_) + }; + + current.canGrow = current.autoSize && height > minHeight && height < maxHeight; + current.canShrink = false; + current.canExpand = false; + + if ((width - padding2) < current.width || (height - padding2) < current.height) { + current.canExpand = true; + + } else if ((width > viewport.w || height_ > viewport.h) && width > minWidth && height > minHeight) { + current.canShrink = true; + } + + F.innerSpace = height_ - padding2 - inner.height(); + }, + + _getPosition: function (onlyAbsolute) { + var current = F.current, + viewport = F.getViewport(), + margin = current.margin, + width = F.wrap.width() + margin[1] + margin[3], + height = F.wrap.height() + margin[0] + margin[2], + rez = { + position: 'absolute', + top : margin[0] + viewport.y, + left : margin[3] + viewport.x + }; + + if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) { + rez = { + position: 'fixed', + top : margin[0], + left : margin[3] + }; + } + + rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio))); + rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * 0.5))); + + return rez; + }, + + _afterZoomIn: function () { + var current = F.current, scrolling = current ? current.scrolling : 'no'; + + if (!current) { + return; + } + + F.isOpen = F.isOpened = true; + + F.wrap.addClass('fancybox-opened'); + + F.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling)); + + F.trigger('afterShow'); + + F.update(); + + //Assign a click event + if (current.closeClick || current.nextClick) { + F.inner.css('cursor', 'pointer').bind('click.fb', function(e) { + if (!$(e.target).is('a') && !$(e.target).parent().is('a')) { + F[ current.closeClick ? 'close' : 'next' ](); + } + }); + } + + //Create a close button + if (current.closeBtn) { + $(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', F.close); + } + + //Create navigation arrows + if (current.arrows && F.group.length > 1) { + if (current.loop || current.index > 0) { + $(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev); + } + + if (current.loop || current.index < F.group.length - 1) { + $(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next); + } + } + + if (F.opts.autoPlay && !F.player.isActive) { + F.opts.autoPlay = false; + + F.play(); + } + }, + + _afterZoomOut: function () { + var current = F.current; + + F.wrap.trigger('onReset').remove(); + + $.extend(F, { + group: {}, + opts: {}, + current: null, + isActive: false, + isOpened: false, + isOpen: false, + wrap: null, + skin: null, + outer: null, + inner: null + }); + + F.trigger('afterClose', current); + } + }); + + /* + * Default transitions + */ + + F.transitions = { + getOrigPosition: function () { + var current = F.current, + element = current.element, + padding = current.padding, + orig = $(current.orig), + pos = {}, + width = 50, + height = 50, + viewport; + + if (!orig.length && current.isDom && $(element).is(':visible')) { + orig = $(element).find('img:first'); + + if (!orig.length) { + orig = $(element); + } + } + + if (orig.length) { + pos = orig.offset(); + + if (orig.is('img')) { + width = orig.outerWidth(); + height = orig.outerHeight(); + } + + } else { + viewport = F.getViewport(); + + pos.top = viewport.y + (viewport.h - height) * 0.5; + pos.left = viewport.x + (viewport.w - width) * 0.5; + } + + pos = { + top : getValue(pos.top - padding), + left : getValue(pos.left - padding), + width : getValue(width + padding * 2), + height : getValue(height + padding * 2) + }; + + return pos; + }, + + step: function (now, fx) { + var prop = fx.prop, value, ratio; + + if (prop === 'width' || prop === 'height') { + value = Math.ceil(now - (F.current.padding * 2)); + + if (prop === 'height') { + ratio = (now - fx.start) / (fx.end - fx.start); + + if (fx.start > fx.end) { + ratio = 1 - ratio; + } + + value -= F.innerSpace * ratio; + } + + F.inner[prop](value); + } + }, + + zoomIn: function () { + var wrap = F.wrap, + current = F.current, + effect = current.openEffect, + elastic = effect === 'elastic', + dim = current.dim, + startPos = $.extend({}, dim, F._getPosition( elastic )), + endPos = $.extend({opacity : 1}, startPos); + + //Remove "position" property that breaks older IE + delete endPos.position; + + if (elastic) { + startPos = this.getOrigPosition(); + + if (current.openOpacity) { + startPos.opacity = 0; + } + + F.outer.add(F.inner).width('auto').height('auto'); + + } else if (effect === 'fade') { + startPos.opacity = 0; + } + + wrap.css(startPos) + .show() + .animate(endPos, { + duration : effect === 'none' ? 0 : current.openSpeed, + easing : current.openEasing, + step : elastic ? this.step : null, + complete : F._afterZoomIn + }); + }, + + zoomOut: function () { + var wrap = F.wrap, + current = F.current, + effect = current.openEffect, + elastic = effect === 'elastic', + endPos = {opacity : 0}; + + if (elastic) { + if (wrap.css('position') === 'fixed') { + wrap.css(F._getPosition(true)); + } + + endPos = this.getOrigPosition(); + + if (current.closeOpacity) { + endPos.opacity = 0; + } + } + + wrap.animate(endPos, { + duration : effect === 'none' ? 0 : current.closeSpeed, + easing : current.closeEasing, + step : elastic ? this.step : null, + complete : F._afterZoomOut + }); + }, + + changeIn: function () { + var wrap = F.wrap, + current = F.current, + effect = current.nextEffect, + elastic = effect === 'elastic', + startPos = F._getPosition( elastic ), + endPos = { opacity : 1 }; + + startPos.opacity = 0; + + if (elastic) { + startPos.top = getValue(parseInt(startPos.top, 10) - 200); + endPos.top = '+=200px'; + } + + wrap.css(startPos) + .show() + .animate(endPos, { + duration : effect === 'none' ? 0 : current.nextSpeed, + easing : current.nextEasing, + complete : F._afterZoomIn + }); + }, + + changeOut: function () { + var wrap = F.wrap, + current = F.current, + effect = current.prevEffect, + endPos = { opacity : 0 }, + cleanUp = function () { + $(this).trigger('onReset').remove(); + }; + + wrap.removeClass('fancybox-opened'); + + if (effect === 'elastic') { + endPos.top = '+=200px'; + } + + wrap.animate(endPos, { + duration : effect === 'none' ? 0 : current.prevSpeed, + easing : current.prevEasing, + complete : cleanUp + }); + } + }; + + /* + * Overlay helper + */ + + F.helpers.overlay = { + overlay: null, + + update: function () { + var width, scrollWidth, offsetWidth; + + //Reset width/height so it will not mess + this.overlay.width('100%').height('100%'); + + if ($.browser.msie || isTouch) { + scrollWidth = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth); + offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth); + + width = scrollWidth < offsetWidth ? W.width() : scrollWidth; + + } else { + width = D.width(); + } + + this.overlay.width(width).height(D.height()); + }, + + beforeShow: function (opts) { + if (this.overlay) { + return; + } + + opts = $.extend(true, {}, F.defaults.helpers.overlay, opts); + + this.overlay = $('
    ').css(opts.css).appendTo('body'); + + if (opts.closeClick) { + this.overlay.bind('click.fb', F.close); + } + + if (F.current.fixed && !isTouch) { + this.overlay.addClass('overlay-fixed'); + + } else { + this.update(); + + this.onUpdate = function () { + this.update(); + }; + } + + this.overlay.fadeTo(opts.speedIn, opts.opacity); + }, + + afterClose: function (opts) { + if (this.overlay) { + this.overlay.fadeOut(opts.speedOut || 0, function () { + $(this).remove(); + }); + } + + this.overlay = null; + } + }; + + /* + * Title helper + */ + + F.helpers.title = { + beforeShow: function (opts) { + var title, text = F.current.title; + + if (text) { + title = $('
    ' + text + '
    ').appendTo('body'); + + if (opts.type === 'float') { + //This helps for some browsers + title.width(title.width()); + + title.wrapInner(''); + + //Increase bottom margin so this title will also fit into viewport + F.current.margin[2] += Math.abs(parseInt(title.css('margin-bottom'), 10)); + } + + title.appendTo(opts.type === 'over' ? F.inner : (opts.type === 'outside' ? F.wrap : F.skin)); + } + } + }; + + // jQuery plugin initialization + $.fn.fancybox = function (options) { + var that = $(this), + selector = this.selector || '', + index, + run = function(e) { + var what = this, idx = index, relType, relVal; + + if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !$(what).is('.fancybox-wrap')) { + e.preventDefault(); + + relType = options.groupAttr || 'data-fancybox-group'; + relVal = $(what).attr(relType); + + if (!relVal) { + relType = 'rel'; + relVal = what[ relType ]; + } + + if (relVal && relVal !== '' && relVal !== 'nofollow') { + what = selector.length ? $(selector) : that; + what = what.filter('[' + relType + '="' + relVal + '"]'); + idx = what.index(this); + } + + options.index = idx; + + F.open(what, options); + } + }; + + options = options || {}; + index = options.index || 0; + + if (selector) { + D.undelegate(selector, 'click.fb-start').delegate(selector, 'click.fb-start', run); + + } else { + that.unbind('click.fb-start').bind('click.fb-start', run); + } + + return this; + }; + + // Test for fixedPosition needs a body at doc ready + $(document).ready(function() { + F.defaults.fixed = $.support.fixedPosition || (!($.browser.msie && $.browser.version <= 6) && !isTouch); + }); + +}(window, document, jQuery)); \ No newline at end of file diff --git a/fancybox/jquery.fancybox.pack.js b/fancybox/jquery.fancybox.pack.js new file mode 100644 index 0000000..6521c21 --- /dev/null +++ b/fancybox/jquery.fancybox.pack.js @@ -0,0 +1,35 @@ +/*! fancyBox v2.0.6 fancyapps.com | fancyapps.com/fancybox/#license */ +(function(s,l,d,t){var m=d(s),q=d(l),a=d.fancybox=function(){a.open.apply(this,arguments)},u=!1,k=l.createTouch!==t,o=function(a){return"string"===d.type(a)},n=function(b,c){c&&o(b)&&0
    ',image:'',iframe:'",swf:'',error:'

    The requested content cannot be loaded.
    Please try again later.

    ', +closeBtn:'
    ',next:'',prev:''},openEffect:"fade",openSpeed:300,openEasing:"swing",openOpacity:!0,openMethod:"zoomIn",closeEffect:"fade",closeSpeed:300,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:300,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic", +prevSpeed:300,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:{speedIn:0,speedOut:300,opacity:0.8,css:{cursor:"pointer"},closeClick:!0},title:{type:"float"}}},group:{},opts:{},coming:null,current:null,isOpen:!1,isOpened:!1,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(b,c){a.close(!0);b&&!d.isArray(b)&&(b=b instanceof d?d(b).get():[b]);a.isActive=!0;a.opts=d.extend(!0,{},a.defaults,c);d.isPlainObject(c)&&c.keys!==t&&(a.opts.keys=c.keys? +d.extend({},a.defaults.keys,c.keys):!1);a.group=b;a._start(a.opts.index||0)},cancel:function(){a.coming&&!1===a.trigger("onCancel")||(a.coming=null,a.hideLoading(),a.ajaxLoad&&a.ajaxLoad.abort(),a.ajaxLoad=null,a.imgPreload&&(a.imgPreload.onload=a.imgPreload.onabort=a.imgPreload.onerror=null))},close:function(b){a.cancel();a.current&&!1!==a.trigger("beforeClose")&&(a.unbindEvents(),!a.isOpen||b&&!0===b[0]?(d(".fancybox-wrap").stop().trigger("onReset").remove(),a._afterZoomOut()):(a.isOpen=a.isOpened= +!1,d(".fancybox-item, .fancybox-nav").remove(),a.wrap.stop(!0).removeClass("fancybox-opened"),a.inner.css("overflow","hidden"),a.transitions[a.current.closeMethod]()))},play:function(b){var c=function(){clearTimeout(a.player.timer)},e=function(){c();a.current&&a.player.isActive&&(a.player.timer=setTimeout(a.next,a.current.playSpeed))},f=function(){c();d("body").unbind(".player");a.player.isActive=!1;a.trigger("onPlayEnd")};if(a.player.isActive||b&&!1===b[0])f();else if(a.current&&(a.current.loop|| +a.current.index=a.group.length?b=0:0>b&&(b=a.group.length-1)),a.group[b]!==t&&(a.cancel(),a._start(b)))},reposition:function(b, +c){var e;a.isOpen&&(e=a._getPosition(c),b&&"scroll"===b.type?(delete e.position,a.wrap.stop(!0,!0).animate(e,200)):a.wrap.css(e))},update:function(b){a.isOpen&&(u||setTimeout(function(){var c=a.current,e=!b||b&&"orientationchange"===b.type;if(u&&(u=!1,c)){if(!b||"scroll"!==b.type||e)c.autoSize&&"iframe"!==c.type&&(a.inner.height("auto"),c.height=a.inner.height()),(c.autoResize||e)&&a._setDimension(),c.canGrow&&"iframe"!==c.type&&a.inner.height("auto");(c.autoCenter||e)&&a.reposition(b);a.trigger("onUpdate")}}, +200),u=!0)},toggle:function(){a.isOpen&&(a.current.fitToView=!a.current.fitToView,a.update())},hideLoading:function(){q.unbind("keypress.fb");d("#fancybox-loading").remove()},showLoading:function(){a.hideLoading();q.bind("keypress.fb",function(b){27===b.keyCode&&(b.preventDefault(),a.cancel())});d('
    ').click(a.cancel).appendTo("body")},getViewport:function(){return{x:m.scrollLeft(),y:m.scrollTop(),w:k&&s.innerWidth?s.innerWidth:m.width(),h:k&&s.innerHeight? +s.innerHeight:m.height()}},unbindEvents:function(){a.wrap&&a.wrap.unbind(".fb");q.unbind(".fb");m.unbind(".fb")},bindEvents:function(){var b=a.current,c=b.keys;b&&(m.bind("resize.fb orientationchange.fb"+(b.autoCenter&&!b.fixed?" scroll.fb":""),a.update),c&&q.bind("keydown.fb",function(b){var f;f=b.target||b.srcElement;if(!b.ctrlKey&&!b.altKey&&!b.shiftKey&&!b.metaKey&&(!f||!f.type&&!d(f).is("[contenteditable]")))f=b.keyCode,-1b.length))for(i=1;i<=h;i+=1)if(f=b[(c.index+i)%e],g=f.href||d(f).attr("href")||f,"image"===f.type||a.isImage(g))(new Image).src=g},_afterLoad:function(){a.hideLoading(); +!a.coming||!1===a.trigger("afterLoad",a.current)?a.coming=!1:(a.isOpened?(d(".fancybox-item, .fancybox-nav").remove(),a.wrap.stop(!0).removeClass("fancybox-opened"),a.inner.css("overflow","hidden"),a.transitions[a.current.prevMethod]()):(d(".fancybox-wrap").stop().trigger("onReset").remove(),a.trigger("afterClose")),a.unbindEvents(),a.isOpen=!1,a.current=a.coming,a.wrap=d(a.current.tpl.wrap).addClass("fancybox-"+(k?"mobile":"desktop")+" fancybox-type-"+a.current.type+" fancybox-tmp "+a.current.wrapCSS).appendTo("body"), +a.skin=d(".fancybox-skin",a.wrap).css("padding",n(a.current.padding)),a.outer=d(".fancybox-outer",a.wrap),a.inner=d(".fancybox-inner",a.wrap),a._setContent())},_setContent:function(){var b=a.current,c=b.content,e=b.type,f=b.minWidth,g=b.minHeight,i=b.maxWidth,h=b.maxHeight;switch(e){case "inline":case "ajax":case "html":b.selector?c=d("
    ").html(c).find(b.selector):c instanceof d&&(c.parent().hasClass("fancybox-inner")&&c.parents(".fancybox-wrap").unbind("onReset"),c=c.show().detach(),d(a.wrap).bind("onReset", +function(){c.appendTo("body").hide()}));b.autoSize&&(f=d('
    ').appendTo("body").css({minWidth:n(f,"w"),minHeight:n(g,"h"),maxWidth:n(i,"w"),maxHeight:n(h,"h")}).append(c),b.width=f.width(),b.height=f.height(),f.width(a.current.width),f.height()>b.height&&(f.width(b.width+1),b.width=f.width(),b.height=f.height()),c=f.contents().detach(),f.remove());break;case "image":c=b.tpl.image.replace("{href}",b.href);b.aspectRatio=!0;break;case "swf":c= +b.tpl.swf.replace(/\{width\}/g,b.width).replace(/\{height\}/g,b.height).replace(/\{href\}/g,b.href);break;case "iframe":c=d(b.tpl.iframe.replace("{rnd}",(new Date).getTime())).attr("scrolling",b.scrolling).attr("src",b.href),b.scrolling=k?"scroll":"auto"}if("image"===e||"swf"===e)b.autoSize=!1,b.scrolling="visible";"iframe"===e&&b.autoSize?(a.showLoading(),a._setDimension(),a.inner.css("overflow",b.scrolling),c.bind({onCancel:function(){d(this).unbind();a._afterZoomOut()},load:function(){a.hideLoading(); +try{this.contentWindow.document.location&&(a.current.height=d(this).contents().find("body").height())}catch(b){a.current.autoSize=!1}a[a.isOpen?"_afterZoomIn":"_beforeShow"]()}}).appendTo(a.inner)):(a.inner.append(c),a._beforeShow())},_beforeShow:function(){a.coming=null;a.trigger("beforeShow");a._setDimension();a.wrap.hide().removeClass("fancybox-tmp");a.bindEvents();a._preloadImages();a.transitions[a.isOpened?a.current.nextMethod:a.current.openMethod]()},_setDimension:function(){var b=a.wrap,c= +a.inner,e=a.current,f=a.getViewport(),g=e.margin,i=2*e.padding,h=e.width,j=e.height,r=e.maxWidth+i,k=e.maxHeight+i,l=e.minWidth+i,m=e.minHeight+i,p;f.w-=g[1]+g[3];f.h-=g[0]+g[2];o(h)&&0r&&(h=r,j=(h-i)/g+i),j>k&&(j=k,h=(j-i)*g+i),hr||p>k)for(;(h>r||p>k)&&h>l&&p>m;)j-=10,e.aspectRatio?(h=Math.round((j-i)*g+i),hm&&jf.w||p>f.h)&&h>l&&j>m)e.canShrink=!0;a.innerSpace=p-i- +c.height()},_getPosition:function(b){var c=a.current,e=a.getViewport(),f=c.margin,d=a.wrap.width()+f[1]+f[3],i=a.wrap.height()+f[0]+f[2],h={position:"absolute",top:f[0]+e.y,left:f[3]+e.x};c.autoCenter&&c.fixed&&!b&&i<=e.h&&d<=e.w&&(h={position:"fixed",top:f[0],left:f[3]});h.top=n(Math.max(h.top,h.top+(e.h-i)*c.topRatio));h.left=n(Math.max(h.left,h.left+0.5*(e.w-d)));return h},_afterZoomIn:function(){var b=a.current,c=b?b.scrolling:"no";if(b&&(a.isOpen=a.isOpened=!0,a.wrap.addClass("fancybox-opened"), +a.inner.css("overflow","yes"===c?"scroll":"no"===c?"hidden":c),a.trigger("afterShow"),a.update(),(b.closeClick||b.nextClick)&&a.inner.css("cursor","pointer").bind("click.fb",function(c){if(!d(c.target).is("a")&&!d(c.target).parent().is("a"))a[b.closeClick?"close":"next"]()}),b.closeBtn&&d(b.tpl.closeBtn).appendTo(a.skin).bind("click.fb",a.close),b.arrows&&1c.end&&(g=1-g),d-=a.innerSpace*g),a.inner[e](d)},zoomIn:function(){var b=a.wrap,c=a.current,e=c.openEffect,f="elastic"===e,g=d.extend({},c.dim, +a._getPosition(f)),i=d.extend({opacity:1},g);delete i.position;f?(g=this.getOrigPosition(),c.openOpacity&&(g.opacity=0),a.outer.add(a.inner).width("auto").height("auto")):"fade"===e&&(g.opacity=0);b.css(g).show().animate(i,{duration:"none"===e?0:c.openSpeed,easing:c.openEasing,step:f?this.step:null,complete:a._afterZoomIn})},zoomOut:function(){var b=a.wrap,c=a.current,d=c.openEffect,f="elastic"===d,g={opacity:0};f&&("fixed"===b.css("position")&&b.css(a._getPosition(!0)),g=this.getOrigPosition(),c.closeOpacity&& +(g.opacity=0));b.animate(g,{duration:"none"===d?0:c.closeSpeed,easing:c.closeEasing,step:f?this.step:null,complete:a._afterZoomOut})},changeIn:function(){var b=a.wrap,c=a.current,d=c.nextEffect,f="elastic"===d,g=a._getPosition(f),i={opacity:1};g.opacity=0;f&&(g.top=n(parseInt(g.top,10)-200),i.top="+=200px");b.css(g).show().animate(i,{duration:"none"===d?0:c.nextSpeed,easing:c.nextEasing,complete:a._afterZoomIn})},changeOut:function(){var b=a.wrap,c=a.current,e=c.prevEffect,f={opacity:0};b.removeClass("fancybox-opened"); +"elastic"===e&&(f.top="+=200px");b.animate(f,{duration:"none"===e?0:c.prevSpeed,easing:c.prevEasing,complete:function(){d(this).trigger("onReset").remove()}})}};a.helpers.overlay={overlay:null,update:function(){var a,c;this.overlay.width("100%").height("100%");d.browser.msie||k?(a=Math.max(l.documentElement.scrollWidth,l.body.scrollWidth),c=Math.max(l.documentElement.offsetWidth,l.body.offsetWidth),a=a
    ').css(b.css).appendTo("body"),b.closeClick&&this.overlay.bind("click.fb",a.close),a.current.fixed&&!k?this.overlay.addClass("overlay-fixed"):(this.update(),this.onUpdate=function(){this.update()}),this.overlay.fadeTo(b.speedIn,b.opacity))},afterClose:function(a){this.overlay&&this.overlay.fadeOut(a.speedOut||0,function(){d(this).remove()});this.overlay=null}};a.helpers.title={beforeShow:function(b){var c; +if(c=a.current.title)c=d('
    '+c+"
    ").appendTo("body"),"float"===b.type&&(c.width(c.width()),c.wrapInner(''),a.current.margin[2]+=Math.abs(parseInt(c.css("margin-bottom"),10))),c.appendTo("over"===b.type?a.inner:"outside"===b.type?a.wrap:a.skin)}};d.fn.fancybox=function(b){var c=d(this),e=this.selector||"",f,g=function(g){var h=this,j=f,k;!g.ctrlKey&&!g.altKey&&!g.shiftKey&&!g.metaKey&&!d(h).is(".fancybox-wrap")&& +(g.preventDefault(),g=b.groupAttr||"data-fancybox-group",k=d(h).attr(g),k||(g="rel",k=h[g]),k&&""!==k&&"nofollow"!==k&&(h=e.length?d(e):c,h=h.filter("["+g+'="'+k+'"]'),j=h.index(this)),b.index=j,a.open(h,b))},b=b||{};f=b.index||0;e?q.undelegate(e,"click.fb-start").delegate(e,"click.fb-start",g):c.unbind("click.fb-start").bind("click.fb-start",g);return this};d(l).ready(function(){a.defaults.fixed=d.support.fixedPosition||!(d.browser.msie&&6>=d.browser.version)&&!k})})(window,document,jQuery); \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..e9a7d75 --- /dev/null +++ b/index.php @@ -0,0 +1,158 @@ + + * + */ + + require_once ("config.php"); + require_once ("base.php"); + require_once ("author.php"); + require_once ("serie.php"); + require_once ("tag.php"); + require_once ("book.php"); + + header ("Content-Type:application/xhtml+xml"); + $page = getURLParam ("page", Base::PAGE_INDEX); + $query = getURLParam ("query"); + $qid = getURLParam ("id"); + + $currentPage = Page::getPage ($page, $qid, $query); + $currentPage->InitializeContent (); +?> + + + + + + + <?php echo $currentPage->title ?> + + + + + + + +
    +

    waiting Please Wait

    +
    +
    +
    +
    + "> + Home + +
    +
    + Search +
    +
    +

    title ?>

    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..2cac319 --- /dev/null +++ b/style.css @@ -0,0 +1,153 @@ +html +{ +font-family: sans-serif; +font-size: 1em; +padding:0px; +margin:0px; +background-color:lightgray; +} + +.container +{ +margin:auto; +width:100%; +max-width:800px; +background-color:white; +} + +.head +{ +color:white; +background-color:black; +width:100%; +height:64px; +} + +img +{ +margin:0; +padding:0; +border:0; +} + +.headleft +{ +float:left; +height:64px; +} + +.headright +{ +float:right; +height:64px; +} + +.headcenter +{ +margin:auto; +text-align:center; +font-size: 1.5em; +font-weight:bold; +height:64px; +display:table; +} + +.headcenter p +{ +display: table-cell; +vertical-align: middle; +text-align: center; +line-height: 100%; +} + +.clearer +{ +clear:both; +} + +.entries +{ +background-color:lightgray; +} + +.entry +{ +background-color:white; +border-bottom:1px double black; +display:block; +padding:2px; +cursor: pointer; +margin-bottom:5px; +} + +.book +{ +background-color:white; +border-bottom:1px double black; +min-height:80px; +margin-bottom:5px; +} + +.navigation +{ +display:none; +} + +.entryTitle +{ +font-weight:bold; +font-size: 1.1em; +} + +.entryContent +{ +font-style:italic; +font-size: 0.9em; +margin-left: 10px; +} + +.cover +{ +float:left; +padding:5px 10px; +} + +.download +{ +float:right; +} + +.button +{ +border-radius: 6px; +background-color:darkgray; +text-shadow: 0 3px 3px rgba(0, 0, 0, 0.7); +height:36px; +display: table; +width:80px; +margin:2px; +} + +.button p, .button a +{ +display: table-cell; +vertical-align: middle; +text-align: center; +text-decoration:none; +color:white; +} + +#loading +{ +display:none; +position:fixed; +left:0; +top:0; +width:100%; +height:100%; +background-color: #ccc; +filter: alpha(opacity=70); +opacity: 0.70; +text-align: center; +padding-top: 120px; +}