Browse Source

Switched to featherlight from fancybox, organised private functions to make them easier to find, prefixed all private variables with _ for easy distinction, moved pretty print from iframe eval to properly using prettify

dom111 8 years ago
parent
commit
e559fc9ad0

+ 16 - 2
README.md

@@ -11,8 +11,22 @@ Implementations
 ---------------
 ---------------
 Add this to your Bookmarks Bar:
 Add this to your Bookmarks Bar:
 
 
-    javascript:!function(){var e=document.getElementsByTagName('head')[0],t=function(t,a){var s=document.createElement('script');s.src=t,s.type='text/javascript',a&&(s.onload=a),e.appendChild(s)},a=function(t){var a=document.createElement('link');a.href=t,a.rel='stylesheet',e.appendChild(a)};t('https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js',function(){['https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js','https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.js','https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.css','https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style-min.css'].forEach(function(e){e.match(/js$/)?t(e):a(e)})})}()
+    javascript:!function(){var t=document.getElementsByTagName("head")[0],e=function(e,s){var a=document.createElement("script");a.src=e,a.type="text/javascript",s&&(a.onload=s),t.appendChild(a)},s=function(e){var s=document.createElement("link");s.href=e,s.rel="stylesheet",t.appendChild(s)};e("https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js",function(){["https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.js","https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?autorun=false","https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.js","https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js"].forEach(function(t){t.match(/css$/)?s(t):e(t)})})}()
 
 
 Another use could be to implement the above bookmarklet in-line using `Apache`'s `Indexes` option using the `HeaderName` directive.
 Another use could be to implement the above bookmarklet in-line using `Apache`'s `Indexes` option using the `HeaderName` directive.
 
 
-[Blog post](https://dom.hastin.gs/blog/uncategorized/wevdav-js-update/475)
+[Blog post](https://dom.hastin.gs/blog/uncategorized/wevdav-js-update/475)
+
+
+## Supports
+
+ - Browsing WebDAV shares by folder
+ - Previewing font, image, video, audio and anything supplied by the server with `text/` mime-types
+ - Directory creation
+ - Drag and drop file upload
+
+
+## TODO
+
+ - jsTree navigation for Copy/Move
+ - jsDoc

File diff suppressed because it is too large
+ 0 - 0
assets/css/style-min.css


+ 10 - 5
assets/css/style.css

@@ -4,19 +4,16 @@ body,
 ul {
 ul {
     margin: 0;
     margin: 0;
     padding: 0;
     padding: 0;
+    font-family: Helvetica, Arial, Sans-serif;
 }
 }
 
 
 li {
 li {
     list-style: none;
     list-style: none;
 }
 }
 
 
-* {
-    font-family: Helvetica, Arial, Sans-serif;
-    color: inherit;
-}
-
 a {
 a {
     text-decoration: none;
     text-decoration: none;
+    color: inherit;
 }
 }
 
 
 .loading > * {
 .loading > * {
@@ -24,6 +21,14 @@ a {
     background: url(../img/loading.gif) center center no-repeat;
     background: url(../img/loading.gif) center center no-repeat;
 }
 }
 
 
+.featherlight-content {
+    max-width: 90%;
+}
+
+.featherlight-content pre {
+    overflow-x: scroll;
+}
+
 /* Items */
 /* Items */
 div.content {
 div.content {
     padding: 20px;
     padding: 20px;

+ 1 - 1
examples/apache-directory-list/header.html

@@ -1 +1 @@
-<script type="text/javascript">!function(){var e=document.getElementsByTagName("head")[0],t=function(t,a){var s=document.createElement("script");s.src=t,s.type="text/javascript",a&&(s.onload=a),e.appendChild(s)},a=function(t){var a=document.createElement("link");a.href=t,a.rel="stylesheet",e.appendChild(a)};t("https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js",function(){["https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js","https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.js","https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.css","https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style-min.css"].forEach(function(e){e.match(/js$/)?t(e):a(e)})})}()</script>
+<script type="text/javascript">!function(){var t=document.getElementsByTagName("head")[0],e=function(e,s){var a=document.createElement("script");a.src=e,a.type="text/javascript",s&&(a.onload=s),t.appendChild(a)},s=function(e){var s=document.createElement("link");s.href=e,s.rel="stylesheet",t.appendChild(s)};e("https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js",function(){["https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.js","https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?autorun=false","https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.js","https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js"].forEach(function(t){t.match(/css$/)?s(t):e(t)})})}()</script>

+ 10 - 8
examples/apache-directory-list/webdav.conf

@@ -1,21 +1,23 @@
 ServerName webdav.server.com
 ServerName webdav.server.com
 DocumentRoot /path/to/webdav/root
 DocumentRoot /path/to/webdav/root
 
 
-# This prevents indexes from being parsed
+# This prevents indexes from being parsed (unless they're called the below...)
 AccessFileName ASDFADSHADFHAESDFDSAFDASGASDFASDFASDFSA
 AccessFileName ASDFADSHADFHAESDFDSAFDASGASDFASDFASDFSA
 DirectoryIndex ASDFASDFASDFASDFASDFASDFASDFASDFSADFSDD
 DirectoryIndex ASDFASDFASDFASDFASDFASDFASDFASDFSADFSDD
 
 
-Alias /__header /path/to/header.html
+Alias /header.html /path/to/header.html
 
 
-HeaderName /__header
+HeaderName /header.html
 
 
 <Location />
 <Location />
     DAV on
     DAV on
 
 
-    ForceType text/plain
-</Location>
+    Options +Indexes
+    HeaderName /header.html
+
+    # the below only needed on a server configured with PHP
+    RemoveType .php
 
 
-<Location /__header>
-    # without this, you get a <pre> block in your directory listing
-    ForceType text/html
+    RemoveHandler .php
+    AddType text/plain .php
 </Location>
 </Location>

+ 3 - 6
examples/bookmarklet/README.md

@@ -1,8 +1,5 @@
-To use this bookmarklet, simply add the following to your bookmarks:
+To use this bookmarklet, add the following to your bookmarks:
 
 
-```javascript:(function(){var k=document.getElementsByTagName("head")[0],h=document.getElementsByTagName("body")[0],l=document.createElement("script"),j=document.createElement("link");var e=j.cloneNode(),f=j.cloneNode();e.href="https://raw.github.com/dom111/webdav-js/master/assets/css/style-min.css";f.href="https://raw.github.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.css?v=2.0.6";f.rel=e.rel="stylesheet";f.type=e.type="text/css";f.media=e.media="screen";k.appendChild(e);k.appendChild(f);var b=l.cloneNode(),c=l.cloneNode(),a=l.cloneNode();b.src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js";c.src="https://raw.github.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.js?v=2.0.6";a.src="https://raw.github.com/dom111/webdav-js/master/src/webdav-min.js";b.type=c.type=a.type="text/javascript";k.appendChild(b);k.appendChild(c);var g='<div class="content">    <div style="display: none;">',m='    </div> <!-- hider --></div> <!-- .content --><div class="upload">    Drop files here to upload or <a href="#createDirectory" class="create-directory">create a new directory</a></div>',i=h.innerHTML;h.innerHTML=g+i+m;var d=window.setInterval(function(){if(typeof jQuery!="undefined"){k.appendChild(a);window.clearInterval(d)}},100)})();```
+    javascript:!function(){var t=document.getElementsByTagName("head")[0],e=function(e,s){var a=document.createElement("script");a.src=e,a.type="text/javascript",s&&(a.onload=s),t.appendChild(a)},s=function(e){var s=document.createElement("link");s.href=e,s.rel="stylesheet",t.appendChild(s)};e("https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js",function(){["https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.js","https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?autorun=false","https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.js","https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js"].forEach(function(t){t.match(/css$/)?s(t):e(t)})})}()
 
 
-then browse to your WebDAV location in your favourite browser (currently only
-Chrome or Firefox are supported), click the button and upload files/view images
-at your leisure. Unfortunately I haven't found an easy way to have the syntax
-highlighting working via a bookmarklet. I'll keep looking!
+then browse to your WebDAV location in your favourite browser (currently only Chrome or Firefox are supported), click the button and upload/browse at your leisure.

+ 1 - 1
examples/bookmarklet/source-min.js

@@ -1 +1 @@
-!function(){var t=document.getElementsByTagName("head")[0],e=function(e,a){var s=document.createElement("script");s.src=e,s.type="text/javascript",a&&(s.onload=a),t.appendChild(s)},a=function(e){var a=document.createElement("link");a.href=e,a.rel="stylesheet",t.appendChild(a)};e("https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js",function(){["https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.pack.js","https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.min.js","https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js","https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.css","https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style-min.css"].forEach(function(t){t.match(/js$/)?e(t):a(t)})})}()
+javascript:!function(){var t=document.getElementsByTagName("head")[0],e=function(e,s){var a=document.createElement("script");a.src=e,a.type="text/javascript",s&&(a.onload=s),t.appendChild(a)},s=function(e){var s=document.createElement("link");s.href=e,s.rel="stylesheet",t.appendChild(s)};e("https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js",function(){["https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.js","https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?autorun=false","https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.js","https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js"].forEach(function(t){t.match(/css$/)?s(t):e(t)})})}()

+ 3 - 4
examples/bookmarklet/source.js

@@ -18,10 +18,9 @@ javascript:(function() {
         head.appendChild(element);
         head.appendChild(element);
     };
     };
 
 
-    _createScript('https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js', function() {
-        ['https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.js', 'https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.js', 'https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav.js', 'https://cdn.rawgit.com/dom111/webdav-js/master/external/fancybox/jquery.fancybox.css', 'https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style.css'].forEach(function(file) {
-            file.match(/js$/) ? _createScript(file) : _createStyle(file);
+    _createScript('https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js', function() {
+        ['https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.js', 'https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?autorun=false', 'https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.js', 'https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.css', 'https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style.min.css', 'https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js'].forEach(function(file) {
+            file.match(/css$/) ? _createStyle(file) : _createScript(file);
         });
         });
     });
     });
 })();
 })();
-

BIN
external/fancybox/blank.gif


BIN
external/fancybox/fancybox_loading.gif


BIN
external/fancybox/fancybox_sprite.png


BIN
external/fancybox/helpers/fancybox_buttons.png


+ 0 - 85
external/fancybox/helpers/jquery.fancybox-buttons.css

@@ -1,85 +0,0 @@
-#fancybox-buttons {
-	position: fixed;
-	left: 0;
-	width: 100%;
-	z-index: 8050;
-}
-
-#fancybox-buttons.top {
-	top: 10px;
-}
-
-#fancybox-buttons.bottom {
-	bottom: 10px;
-}
-
-#fancybox-buttons ul {
-	display: block;
-	width: 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;
-}

+ 0 - 115
external/fancybox/helpers/jquery.fancybox-buttons.js

@@ -1,115 +0,0 @@
- /*!
- * 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: '<div id="fancybox-buttons"><ul><li><a class="btnPrev" title="Previous" href="javascript:;"></a></li><li><a class="btnPlay" title="Start slideshow" href="javascript:;"></a></li><li><a class="btnNext" title="Next" href="javascript:;"></a></li><li><a class="btnToggle" title="Toggle size" href="javascript:;"></a></li><li><a class="btnClose" title="Close" href="javascript:jQuery.fancybox.close();"></a></li></ul></div>',
-		list: null,
-		buttons: {},
-
-		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));

+ 0 - 85
external/fancybox/helpers/jquery.fancybox-media.js

@@ -1,85 +0,0 @@
- /*!
- * 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));

+ 0 - 54
external/fancybox/helpers/jquery.fancybox-thumbs.css

@@ -1,54 +0,0 @@
-#fancybox-thumbs {
-	position: fixed;
-	left: 0;
-	width: 100%;
-	overflow: hidden;
-	z-index: 8050;
-}
-
-#fancybox-thumbs.bottom {
-	bottom: 2px;
-}
-
-#fancybox-thumbs.top {
-	top: 2px;
-}
-
-#fancybox-thumbs ul {
-	position: relative;
-	list-style: none;
-	margin: 0;
-	padding: 0;
-}
-
-#fancybox-thumbs ul li {
-	float: left;
-	padding: 1px;
-	opacity: 0.5;
-}
-
-#fancybox-thumbs ul li.active {
-	opacity: 0.75;
-	padding: 0;
-	border: 1px solid #fff;
-}
-
-#fancybox-thumbs ul li:hover {
-	opacity: 1;
-}
-
-#fancybox-thumbs ul li a {
-	display: block;
-	position: relative;
-	overflow: hidden;
-	border: 1px solid #222;
-	background: #111;
-	outline: none;
-}
-
-#fancybox-thumbs ul li img {
-	display: block;
-	position: relative;
-	border: 0;
-	padding: 0;
-}

+ 0 - 157
external/fancybox/helpers/jquery.fancybox-thumbs.js

@@ -1,157 +0,0 @@
- /*!
- * 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 += '<li><a style="width:' + thumbWidth + 'px;height:' + thumbHeight + 'px;" href="javascript:jQuery.fancybox.jumpto(' + n + ');"></a></li>';
-			}
-
-			this.wrap = $('<div id="fancybox-thumbs"></div>').addClass(opts.position || 'bottom').appendTo('body');
-			this.list = $('<ul>' + list + '</ul>').appendTo(this.wrap);
-
-			//Load each thumbnail
-			$.each(F.group, function (i) {
-				$("<img />").load(function () {
-					var width = this.width,
-						height = this.height,
-						widthRatio, heightRatio, parent;
-
-					if (!that.list || !width || !height) {
-						return;
-					}
-
-					//Calculate thumbnail width/height and center it
-					widthRatio = width / thumbWidth;
-					heightRatio = height / thumbHeight;
-					parent = that.list.children().eq(i).find('a');
-
-					if (widthRatio >= 1 && heightRatio >= 1) {
-						if (widthRatio > heightRatio) {
-							width = Math.floor(width / heightRatio);
-							height = thumbHeight;
-
-						} else {
-							width = thumbWidth;
-							height = Math.floor(height / widthRatio);
-						}
-					}
-
-					$(this).css({
-						width: width,
-						height: height,
-						top: Math.floor(thumbHeight / 2 - height / 2),
-						left: Math.floor(thumbWidth / 2 - width / 2)
-					});
-
-					parent.width(thumbWidth).height(thumbHeight);
-
-					$(this).hide().appendTo(parent).fadeIn(300);
-
-				}).attr('src', 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));

File diff suppressed because it is too large
+ 0 - 1
external/fancybox/jquery-1.7.2.min.js


+ 0 - 234
external/fancybox/jquery.fancybox.css

@@ -1,234 +0,0 @@
-/*! 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);
-}

+ 0 - 1463
external/fancybox/jquery.fancybox.js

@@ -1,1463 +0,0 @@
-/*!
- * 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: '<div class="fancybox-wrap"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',
-				image: '<img class="fancybox-image" src="{href}" alt="" />',
-				iframe: '<iframe class="fancybox-iframe" name="fancybox-frame{rnd}" frameborder="0" hspace="0"' + ($.browser.msie ? ' allowtransparency="true"' : '') + '></iframe>',
-				swf: '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="wmode" value="transparent" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{href}" /><embed src="{href}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="100%" height="100%" wmode="transparent"></embed></object>',
-				error: '<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',
-				closeBtn: '<div title="Close" class="fancybox-item fancybox-close"></div>',
-				next: '<a title="Next" class="fancybox-nav fancybox-next"><span></span></a>',
-				prev: '<a title="Previous" class="fancybox-nav fancybox-prev"><span></span></a>'
-			},
-
-			// 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();
-				}
-			});
-
-			$('<div id="fancybox-loading"><div></div></div>').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 = $('<div>').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 = $('<div class="fancybox-wrap ' + F.current.wrapCSS + ' fancybox-tmp"></div>')
-							.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 = $('<div id="fancybox-overlay"></div>').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 = $('<div class="fancybox-title fancybox-title-' + opts.type + '-wrap">' + text + '</div>').appendTo('body');
-
-				if (opts.type === 'float') {
-					//This helps for some browsers
-					title.width(title.width());
-
-					title.wrapInner('<span class="child"></span>');
-
-					//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));

+ 0 - 35
external/fancybox/jquery.fancybox.pack.js

@@ -1,35 +0,0 @@
-/*! 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<b.indexOf("%")&&(b=a.getViewport()[c]/100*parseInt(b,10));return Math.round(b)+"px"};d.extend(a,{version:"2.0.5",defaults:{padding:15,margin:20,width:800,height:600,minWidth:100,minHeight:100,maxWidth:9999,maxHeight:9999,autoSize:!0,autoResize:!k,autoCenter:!k,fitToView:!0,aspectRatio:!1,topRatio:0.5,fixed:!1,scrolling:"auto",
-wrapCSS:"",arrows:!0,closeBtn:!0,closeClick:!1,nextClick:!1,mouseWheel:!0,autoPlay:!1,playSpeed:3E3,preload:3,modal:!1,loop:!0,ajax:{dataType:"html",headers:{"X-fancyBox":!0}},keys:{next:[13,32,34,39,40],prev:[8,33,37,38],close:[27]},tpl:{wrap:'<div class="fancybox-wrap"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',image:'<img class="fancybox-image" src="{href}" alt="" />',iframe:'<iframe class="fancybox-iframe" name="fancybox-frame{rnd}" frameborder="0" hspace="0"'+
-(d.browser.msie?' allowtransparency="true"':"")+"></iframe>",swf:'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="wmode" value="transparent" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{href}" /><embed src="{href}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="100%" height="100%" wmode="transparent"></embed></object>',error:'<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',
-closeBtn:'<div title="Close" class="fancybox-item fancybox-close"></div>',next:'<a title="Next" class="fancybox-nav fancybox-next"><span></span></a>',prev:'<a title="Previous" class="fancybox-nav fancybox-prev"><span></span></a>'},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-1))a.player.isActive=!0,d("body").bind({"afterShow.player onUpdate.player":e,"onCancel.player beforeClose.player":f,"beforeLoad.player":c}),e(),a.trigger("onPlayStart")},next:function(){a.current&&a.jumpto(a.current.index+1)},prev:function(){a.current&&a.jumpto(a.current.index-1)},jumpto:function(b){a.current&&(b=parseInt(b,10),1<a.group.length&&a.current.loop&&(b>=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('<div id="fancybox-loading"><div></div></div>').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,-1<d.inArray(f,c.close)?(a.close(),b.preventDefault()):-1<d.inArray(f,c.next)?
-(a.next(),b.preventDefault()):-1<d.inArray(f,c.prev)&&(a.prev(),b.preventDefault())}),d.fn.mousewheel&&b.mouseWheel&&1<a.group.length&&a.wrap.bind("mousewheel.fb",function(b,c){var d=b.target||null;if(0!==c&&(!d||0===d.clientHeight||d.scrollHeight===d.clientHeight&&d.scrollWidth===d.clientWidth))b.preventDefault(),a[0<c?"prev":"next"]()}))},trigger:function(b,c){var e,f=c||a[-1<d.inArray(b,["onCancel","beforeLoad","afterLoad"])?"coming":"current"];if(f){d.isFunction(f[b])&&(e=f[b].apply(f,Array.prototype.slice.call(arguments,
-1)));if(!1===e)return!1;f.helpers&&d.each(f.helpers,function(c,e){if(e&&d.isPlainObject(a.helpers[c])&&d.isFunction(a.helpers[c][b]))a.helpers[c][b](e,f)});d.event.trigger(b+".fb")}},isImage:function(a){return o(a)&&a.match(/\.(jpe?g|gif|png|bmp)((\?|#).*)?$/i)},isSWF:function(a){return o(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(b){var c={},e=a.group[b]||null,f,g,i;if(e&&(e.nodeType||e instanceof d))f=!0,d.metadata&&(c=d(e).metadata());c=d.extend(!0,{},a.opts,{index:b,element:e},d.isPlainObject(e)?
-e:c);d.each(["href","title","content","type"],function(b,g){c[g]=a.opts[g]||f&&d(e).attr(g)||c[g]||null});"number"===typeof c.margin&&(c.margin=[c.margin,c.margin,c.margin,c.margin]);c.modal&&d.extend(!0,c,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,mouseWheel:!1,keys:null,helpers:{overlay:{css:{cursor:"auto"},closeClick:!1}}});a.coming=c;if(!1===a.trigger("beforeLoad"))a.coming=null;else{g=c.type;b=c.href||e;g||(f&&(g=d(e).data("fancybox-type"),g||(g=(g=e.className.match(/fancybox\.(\w+)/))?
-g[1]:null)),!g&&o(b)&&(a.isImage(b)?g="image":a.isSWF(b)?g="swf":b.match(/^#/)&&(g="inline")),g||(g=f?"inline":"html"),c.type=g);if("inline"===g||"html"===g){if(c.content||(c.content="inline"===g?d(o(b)?b.replace(/.*(?=#[^\s]+$)/,""):b):e),!c.content||!c.content.length)g=null}else b||(g=null);"ajax"===g&&o(b)&&(i=b.split(/\s+/,2),b=i.shift(),c.selector=i.shift());c.href=b;c.group=a.group;c.isDom=f;switch(g){case "image":a._loadImage();break;case "ajax":a._loadAjax();break;case "inline":case "iframe":case "swf":case "html":a._afterLoad();
-break;default:a._error("type")}}},_error:function(b){a.hideLoading();d.extend(a.coming,{type:"html",autoSize:!0,minWidth:0,minHeight:0,padding:15,hasError:b,content:a.coming.tpl.error});a._afterLoad()},_loadImage:function(){var b=a.imgPreload=new Image;b.onload=function(){this.onload=this.onerror=null;a.coming.width=this.width;a.coming.height=this.height;a._afterLoad()};b.onerror=function(){this.onload=this.onerror=null;a._error("image")};b.src=a.coming.href;(b.complete===t||!b.complete)&&a.showLoading()},
-_loadAjax:function(){a.showLoading();a.ajaxLoad=d.ajax(d.extend({},a.coming.ajax,{url:a.coming.href,error:function(b,c){a.coming&&"abort"!==c?a._error("ajax",b):a.hideLoading()},success:function(b,c){"success"===c&&(a.coming.content=b,a._afterLoad())}}))},_preloadImages:function(){var b=a.group,c=a.current,e=b.length,f,g,i,h=Math.min(c.preload,e-1);if(c.preload&&!(2>b.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("<div>").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('<div class="fancybox-wrap '+a.current.wrapCSS+' fancybox-tmp"></div>').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)&&0<h.indexOf("%")&&(h=(f.w-i)*parseFloat(h)/100);o(j)&&0<j.indexOf("%")&&(j=(f.h-i)*parseFloat(j)/100);g=h/j;h+=i;j+=i;e.fitToView&&(r=Math.min(f.w,r),k=Math.min(f.h,k));if(e.aspectRatio){if(h>r&&(h=r,j=(h-i)/g+i),j>k&&(j=k,h=(j-i)*g+i),h<l&&(h=l,j=(h-i)/g+i),j<m)j=m,h=(j-i)*g+i}else h=Math.max(l,Math.min(h,r)),j=Math.max(m,
-Math.min(j,k));h=Math.round(h);j=Math.round(j);d(b.add(c)).width("auto").height("auto");c.width(h-i).height(j-i);b.width(h);p=b.height();if(h>r||p>k)for(;(h>r||p>k)&&h>l&&p>m;)j-=10,e.aspectRatio?(h=Math.round((j-i)*g+i),h<l&&(h=l,j=(h-i)/g+i)):h-=10,c.width(h-i).height(j-i),b.width(h),p=b.height();e.dim={width:n(h),height:n(p)};e.canGrow=e.autoSize&&j>m&&j<k;e.canShrink=!1;e.canExpand=!1;if(h-i<e.width||j-i<e.height)e.canExpand=!0;else if((h>f.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&&1<a.group.length&&((b.loop||0<b.index)&&d(b.tpl.prev).appendTo(a.outer).bind("click.fb",a.prev),(b.loop||b.index<a.group.length-1)&&d(b.tpl.next).appendTo(a.outer).bind("click.fb",
-a.next)),a.opts.autoPlay&&!a.player.isActive))a.opts.autoPlay=!1,a.play()},_afterZoomOut:function(){var b=a.current;a.wrap.trigger("onReset").remove();d.extend(a,{group:{},opts:{},current:null,isActive:!1,isOpened:!1,isOpen:!1,wrap:null,skin:null,outer:null,inner:null});a.trigger("afterClose",b)}});a.transitions={getOrigPosition:function(){var b=a.current,c=b.element,e=b.padding,f=d(b.orig),g={},i=50,h=50;!f.length&&b.isDom&&d(c).is(":visible")&&(f=d(c).find("img:first"),f.length||(f=d(c)));f.length?
-(g=f.offset(),f.is("img")&&(i=f.outerWidth(),h=f.outerHeight())):(b=a.getViewport(),g.top=b.y+0.5*(b.h-h),g.left=b.x+0.5*(b.w-i));return g={top:n(g.top-e),left:n(g.left-e),width:n(i+2*e),height:n(h+2*e)}},step:function(b,c){var e=c.prop,d,g;if("width"===e||"height"===e)d=Math.ceil(b-2*a.current.padding),"height"===e&&(g=(b-c.start)/(c.end-c.start),c.start>c.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<c?m.width():a):a=q.width();this.overlay.width(a).height(q.height())},beforeShow:function(b){this.overlay||
-(b=d.extend(!0,{},a.defaults.helpers.overlay,b),this.overlay=d('<div id="fancybox-overlay"></div>').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('<div class="fancybox-title fancybox-title-'+b.type+'-wrap">'+c+"</div>").appendTo("body"),"float"===b.type&&(c.width(c.width()),c.wrapInner('<span class="child"></span>'),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);

+ 0 - 13
external/fancybox/jquery.mousewheel-3.0.6.pack.js

@@ -1,13 +0,0 @@
-/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
- * Licensed under the MIT License (LICENSE.txt).
- *
- * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
- * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
- * Thanks to: Seamus Leahy for adding deltaX and deltaY
- *
- * Version: 3.0.6
- * 
- * Requires: 1.2.2+
- */
-(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;b.axis!==void 0&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);b.wheelDeltaY!==void 0&&(g=b.wheelDeltaY/120);b.wheelDeltaX!==void 0&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=
-d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,false);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);

File diff suppressed because it is too large
+ 16 - 23
src/webdav-min.js


+ 326 - 265
src/webdav.js

@@ -37,97 +37,8 @@
     }
     }
 
 
     var WebDAV = (function() {
     var WebDAV = (function() {
-        var _request = function(type, url, headers, allowCache) {
-            // could add support for other versions here. lazy
-            var xhr =  new XMLHttpRequest();
-
-            // bust some cache
-            if (!allowCache) {
-                url += (url.indexOf('?') > -1 ? '&' : '?') + '_=' + Date.now();
-            }
-
-            xhr.open(type, url, true);
-
-            if (headers) {
-                Object.keys(headers).forEach(function(header) {
-                    xhr.setRequestHeader(header, headers[header]);
-                });
-            }
-
-            return xhr;
-        },
-        _showSize = function(i) {
-            var size = '';
-
-            ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'].forEach(function(text, index) {
-                if (!size && (i < Math.pow(1024, index + 1))) {
-                    size += (i / Math.pow(1024, index)).toFixed((index > 0) ? 1 : 0) + ' ' + ((i == 1) ? 'byte' : text);
-                }
-            });
-
-            return size;
-        },
-        _sortFiles = function() {
-            if (files.length) {
-                files.sort(function(a, b) {
-                    if (a.directory == b.directory) {
-                        return a.name.replace(/\/$/, '') < b.name.replace(/\/$/, '') ? -1 : 1;
-                    }
-                    else {
-                        return a.directory ? -1 : 1;
-                    }
-                });
-            }
-
-            $.each(files, function(i) {
-                this.index = i;
-            });
-
-            return files;
-        },
-        _createListItem = function(file) {
-            file.item = $('<li/>').data('file', file);
-
-            if (file.directory) {
-                file.item.addClass('directory');
-            }
-            else {
-                file.item.addClass('file');
-
-                if (file.type) {
-                    file.item.addClass(file.type);
-                }
-                else {
-                    file.item.addClass('unknown');
-                }
-            }
-
-            if (!file.directory) {
-                file.item.addClass(file.name.replace(/^.+\.([^\.]+)$/, '$1'));
-            }
-
-            file.item.append('<a href="' + file.path + file.name + '" class="title">' + file.title + '</a>');
-
-            if (!file.directory) {
-                file.item.append('<span class="size">' + _showSize(file.size) + '</span>');
-            }
-
-            // parent folder doesn't have a 'name'
-            if (file.name) {
-                if (file['delete']) {
-                    file.item.append('<a href="#delete" title="Delete" class="delete">&times;</a>');
-                    file.item.append('<a href="#move" title="Move" class="move">move</a>');
-                }
-
-                file.item.append('<a href="#rename" title="Rename" class="rename">rename</a>');
-                file.item.append('<a href="#copy" title="Copy" class="copy">copy</a>');
-            }
-
-            _bindEvents(file);
-
-            return file;
-        },
-        _bindEvents = function(file) {
+        // internal methods
+        var _bindEvents = function(file) {
             if (file.directory) {
             if (file.directory) {
                 file.item.find('.title').on('click', function() {
                 file.item.find('.title').on('click', function() {
                     history.pushState(history.state, file.path + file.name, file.path + file.name);
                     history.pushState(history.state, file.path + file.name, file.path + file.name);
@@ -140,19 +51,22 @@
                 file.item.find('.title').on('click', function(event) {
                 file.item.find('.title').on('click', function(event) {
                     event.stopPropagation();
                     event.stopPropagation();
 
 
-                    var options = {
-                        href: file.path + file.name
-                    };
-
                     if (file.type == 'video') {
                     if (file.type == 'video') {
-                        options.wrapCSS = 'fancybox-video';
-                        options.content = '<style type="text/css">.fancybox-video{width:auto !important;height:auto !important}.fancybox-inner{width:auto !important;height:auto !important}video{max-width:90%;max-height:90%}</style><video autoplay controls><source src="' + file.path + file.name + '"/></video>';
-                        options.afterShow = function() {
-                            $.fancybox.update();
-                        };
+                        $.featherlight('<video autoplay controls><source src="' + file.path + file.name + '"/></video>');
+
+                        event.preventDefault();
                     }
                     }
                     else if (file.type == 'audio') {
                     else if (file.type == 'audio') {
-                        options.content = '<audio autoplay controls><source src="' + file.path + file.name + '"/></audio>';
+                        $.featherlight('<audio autoplay controls><source src="' + file.path + file.name + '"/></audio>');
+
+                        event.preventDefault();
+                    }
+                    else if (file.type == 'image') {
+                        $.featherlight({
+                            image: file.path + file.name
+                        });
+
+                        event.preventDefault();
                     }
                     }
                     else if (file.type == 'font') {
                     else if (file.type == 'font') {
                         var formats = {
                         var formats = {
@@ -160,38 +74,50 @@
                             otf: 'opentype',
                             otf: 'opentype',
                             ttf: 'truetype'
                             ttf: 'truetype'
                         },
                         },
-                        extension = file.name.replace(/^.+\.([^\.]+)$/, '$1');
+                        extension = file.name.replace(/^.+\.([^\.]+)$/, '$1'),
+                        fontName = (file.path + file.name).replace(/\W+/g, '_'),
+                        demoText = 'The quick brown fox jumps over the lazy dog. 0123456789<br/>Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz';
+
+                        if (!$('[data-path="' + (file.path + file.name) + '"]').is('style')) {
+                            $('body').appendChild('<style type="text/css" data-path="' + (file.path + file.name) + '">@font-face{font-family:"' + fontName + '";src:url("' + file.path + file.name + '") format("' + (formats[extension] || extension) + '")}</style>');
+                        }
 
 
-                        options.content = '<style>@font-face{font-family:"f";src:url("' + file.path + file.name + '") format("' + (formats[extension] || extension) + '")}.fancybox-inner *{font-family:"f"}.a:before{content:"The quick brown fox jumps over the lazy dog. 0123456789";display:block;padding:0 0 .5em}.a:after{content:"Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz"}.l{font-size:2em}</style><h1>' + file.name + '</h1><p class="l"><span class="a"></span></p><p><span class="a"></span></p><p><strong class="a"></strong></p><p><em class="a"></em></p>';
+                        $.featherlight('<h1 style="font-family:"' + fontName + '">' + file.name + '</h1><p style="font-family:\'' + fontName + '\';font-size:1.5em">' + demoText + '</p><p style="font-family:\'' + fontName + '\'">' + a + '</p><p style="font-family:\'' + fontName + '\'"><strong>' + demoText + '</strong></p><p style="font-family:\'' + fontName + '\'"><em>' + demoText + '</em></p><p><a href="' + file.path + file.name + '" style="display:inline-block;padding:.5em;background:#000;font-family:sans-serif;border-radius:.5em;color:#fff">Download</a></p>');
+
+                        event.preventDefault();
                     }
                     }
                     else if (file.type == 'text') {
                     else if (file.type == 'text') {
-                        options.type = 'iframe';
-
-                        // the following will only work if you're using the apache solution
-                        options.beforeShow = function() {
-                            // access the frame's document object
-                            var w = $('.fancybox-iframe').prop('contentWindow'),
-                            d = w.document;
-                            $('pre', d).addClass('prettyprint').addClass('lang-' + file.name.replace(/^.+\.([^\.]+)$/, '$1'));
-
-                            // if we haven't loaded the script yet, lets just exit quietly
-                            if (!prettyPrint) {
-                                $.get('https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js', function(code) {
-                                    prettyPrint = code;
-
-                                    w.eval(code);
-                                });
-                            }
-                            else {
-                                w.eval(prettyPrint);
-                            }
-                        };
-                    }
+                        if (!('code' in $.featherlight.contentFilters)) {
+                            $.extend($.featherlight.contentFilters, {
+                                code: {
+                                    process: function(url) {
+                                        var deferred = $.Deferred(),
+                                        $container = $('<pre class="prettyprint"></pre>');
+                                        $.ajax(url, {
+                                            complete: function(response, status) {
+                                                if ( status !== "error" ) {
+                                                    $container.text(response.responseText);
+                                                    deferred.resolve($container);
+
+                                                    // prettify the code
+                                                    PR.prettyPrint();
+                                                }
+
+                                                deferred.fail();
+                                            }
+                                        });
+
+                                        return deferred.promise();
+                                    }
+                                }
+                            }); 
+                        }
 
 
-                    if (file.type != 'unknown') {
-                        $.fancybox(options);
+                        $.featherlight({
+                            code: file.path + file.name
+                        });
 
 
-                        return false;
+                        event.preventDefault();
                     }
                     }
                 });
                 });
             }
             }
@@ -241,25 +167,10 @@
 
 
             return file.item;
             return file.item;
         },
         },
-        _renderFiles = function() {
-            _sortFiles();
-
-            list.empty();
-
-            $.each(files, function(i, file) {
-                if (!file) {
-                    return;
-                }
-
-                list.append(file.item);
-            });
-
-            return list;
-        },
         _checkFile = function(file) {
         _checkFile = function(file) {
             var r = false;
             var r = false;
 
 
-            $.each(files, function() {
+            $.each(_files, function() {
                 if (this.name == file.name) {
                 if (this.name == file.name) {
                     r = this;
                     r = this;
 
 
@@ -269,6 +180,72 @@
 
 
             return r;
             return r;
         },
         },
+        _createListItem = function(file) {
+            file.item = $('<li/>').data('file', file);
+
+            if (file.directory) {
+                file.item.addClass('directory');
+            }
+            else {
+                file.item.addClass('file');
+
+                if (file.type) {
+                    file.item.addClass(file.type);
+                }
+                else {
+                    file.item.addClass('unknown');
+                }
+            }
+
+            if (!file.directory) {
+                file.item.addClass(file.name.replace(/^.+\.([^\.]+)$/, '$1'));
+            }
+
+            file.item.append('<a href="' + file.path + file.name + '" target="_blank" class="title">' + file.title + '</a>');
+
+            if (!file.directory) {
+                file.item.append('<span class="size">' + _showSize(file.size) + '</span>');
+            }
+
+            // parent folder doesn't have a 'name'
+            if (file.name) {
+                if (file['delete']) {
+                    file.item.append('<a href="#delete" title="Delete" class="delete">&times;</a>');
+                    file.item.append('<a href="#move" title="Move" class="move">move</a>');
+                }
+
+                file.item.append('<a href="#rename" title="Rename" class="rename">rename</a>');
+                file.item.append('<a href="#copy" title="Copy" class="copy">copy</a>');
+            }
+
+            _bindEvents(file);
+
+            return file;
+        },
+        _getFileName = function(path) {
+            path = path.replace(/\/$/, '');
+
+            return path.split('/').pop();
+        },
+        _getTag = function(doc, tag) {
+            if (doc.querySelector) {
+                return doc.querySelector(tag);
+            }
+
+            return doc.getElementsByTagName(tag)[0];
+        },
+        _getTagContent = function(doc, tag) {
+            var node = _getTag(doc, tag);
+
+            return node ? node.textContent : '';
+        },
+        _getTags = function(doc, tag) {
+            if (doc.querySelectorAll) {
+                return Array.from(doc.querySelectorAll(tag));
+            }
+
+            return Array.from(doc.getElementsByTagName(tag));
+        },
         _getType = function(file) {
         _getType = function(file) {
             if (file.mimeType && file.mimeType.split('/').shift()) {
             if (file.mimeType && file.mimeType.split('/').shift()) {
                 return file.mimeType.split('/').shift();
                 return file.mimeType.split('/').shift();
@@ -296,36 +273,18 @@
 
 
             return type;
             return type;
         },
         },
-        _getTag = function(doc, tag) {
-            if (doc.querySelector) {
-                return doc.querySelector(tag);
-            }
-
-            return doc.getElementsByTagName(tag)[0];
-        },
-        _getTagContent = function(doc, tag) {
-            var node = _getTag(doc, tag);
+        _listContents = function(path, events) {
+            var req = _request('PROPFIND', path, {
+                Depth: 1
+            });
 
 
-            return node ? node.textContent : '';
-        },
-        _getTags = function(doc, tag) {
-            if (doc.querySelectorAll) {
-                return Array.from(doc.querySelectorAll(tag));
-            }
+            Object.keys(events).forEach(function(event) {
+                req.addEventListener(event, events[event], true);
+            });
 
 
-            return Array.from(doc.getElementsByTagName(tag));
-        },
-        _updateDisplay = function() {
-            _sortFiles();
-            _renderFiles();
-        },
-        _refreshDisplay = function() {
-            return WebDAV.list(path);
-        },
-        _getFileName = function(path) {
-            path = path.replace(/\/$/, '');
+            req.send(null);
 
 
-            return path.split('/').pop();
+            return req;
         },
         },
         _message = function(message, type) {
         _message = function(message, type) {
             if ('notify' in $) {
             if ('notify' in $) {
@@ -337,50 +296,132 @@
                 console.log(message);
                 console.log(message);
             }
             }
         },
         },
-        list = $('<ul class="list"/>'),
-        dropper,
-        path = window.location.pathname,
-        files = [],
-        prettyPrint = '',
+        _refreshDisplay = function() {
+            return WebDAV.list(_path);
+        },
+        _renderFiles = function() {
+            _sortFiles();
+
+            _list.empty();
+
+            $.each(_files, function(i, file) {
+                if (!file) {
+                    return;
+                }
+
+                _list.append(file.item);
+            });
+
+            return _list;
+        },
+        _request = function(type, url, headers, allowCache) {
+            // could add support for other versions here. lazy
+            var xhr =  new XMLHttpRequest();
 
 
+            // bust some cache
+            if (!allowCache) {
+                url += (url.indexOf('?') > -1 ? '&' : '?') + '_=' + Date.now();
+            }
+
+            xhr.addEventListener('loadstart', function() {
+                _busy = true;
+            });
+
+            xhr.addEventListener('loadend', function() {
+                _busy = true;
+            });
+
+            xhr.open(type, url, true);
+
+            if (headers) {
+                Object.keys(headers).forEach(function(header) {
+                    xhr.setRequestHeader(header, headers[header]);
+                });
+            }
+
+            return xhr;
+        },
+        _showSize = function(i) {
+            var size = '';
+
+            ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'].forEach(function(text, index) {
+                if (!size && (i < Math.pow(1024, index + 1))) {
+                    size += (i / Math.pow(1024, index)).toFixed((index > 0) ? 1 : 0) + ' ' + ((i == 1) ? 'byte' : text);
+                }
+            });
+
+            return size;
+        },
+        _sortFiles = function() {
+            if (_files.length) {
+                _files.sort(function(a, b) {
+                    if (a.directory == b.directory) {
+                        return a.name.replace(/\/$/, '') < b.name.replace(/\/$/, '') ? -1 : 1;
+                    }
+                    else {
+                        return a.directory ? -1 : 1;
+                    }
+                });
+            }
+
+            $.each(_files, function(i) {
+                this.index = i;
+            });
+
+            return _files;
+        },
+        _updateDisplay = function() {
+            _sortFiles();
+            _renderFiles();
+        },
+
+        // private vars
+        _busy = false,
+        _cache = {},
+        _dropper,
+        _files = [],
+        _list = $('<ul class="list"/>'),
+        _path = window.location.pathname,
+
+        // exposed API
         WebDAV = {
         WebDAV = {
             init: function() {
             init: function() {
                 $('<div class="content"></div><div class="upload">Drop files here to upload or <a href="#createDirectory" class="create-directory">create a new directory</a></div>').appendTo($('body').empty());
                 $('<div class="content"></div><div class="upload">Drop files here to upload or <a href="#createDirectory" class="create-directory">create a new directory</a></div>').appendTo($('body').empty());
 
 
-                $('div.content').append(list);
+                $('div.content').append(_list);
 
 
-                dropper = $('div.upload');
+                _dropper = $('div.upload');
 
 
-                this.list(path);
+                WebDAV.list(_path);
 
 
                 // render the nice list
                 // render the nice list
                 _renderFiles();
                 _renderFiles();
 
 
                 // drag and drop area
                 // drag and drop area
-                dropper.on('dragover', function() {
-                    dropper.addClass('active');
+                _dropper.on('dragover', function() {
+                    _dropper.addClass('active');
 
 
                     return false;
                     return false;
                 });
                 });
 
 
-                dropper.on('dragend dragleave', function(event) {
-                    dropper.removeClass('active');
+                _dropper.on('dragend dragleave', function(event) {
+                    _dropper.removeClass('active');
 
 
                     return false;
                     return false;
                 });
                 });
 
 
-                dropper.on('drop', function(event) {
-                    dropper.removeClass('active');
-
+                _dropper.on('drop', function(event) {
                     var newFiles = event.originalEvent.target.files || event.originalEvent.dataTransfer.files;
                     var newFiles = event.originalEvent.target.files || event.originalEvent.dataTransfer.files;
 
 
+                    _dropper.removeClass('active');
+
                     $.each(newFiles, function(i, file) {
                     $.each(newFiles, function(i, file) {
                         if (existingFile = _checkFile(file)) {
                         if (existingFile = _checkFile(file)) {
                             if (!confirm('A file called "' + existingFile.name + '" already exists, would you like to overwrite it?')) {
                             if (!confirm('A file called "' + existingFile.name + '" already exists, would you like to overwrite it?')) {
                                 return false;
                                 return false;
                             }
                             }
                             else {
                             else {
-                                delete files[existingFile.index];
+                                delete _files[existingFile.index];
                             }
                             }
                         }
                         }
 
 
@@ -438,7 +479,7 @@
                         directory: true,
                         directory: true,
                         name: name,
                         name: name,
                         title: name + '/',
                         title: name + '/',
-                        path: path,
+                        path: _path,
                         modified: Date.now(),
                         modified: Date.now(),
                         size: false,
                         size: false,
                         type: _getType(name),
                         type: _getType(name),
@@ -460,7 +501,7 @@
                     }, false);
                     }, false);
 
 
                     file.request.addEventListener('error', function(event) {
                     file.request.addEventListener('error', function(event) {
-                        delete files[file.index];
+                        delete _files[file.index];
 
 
                         _updateDisplay();
                         _updateDisplay();
 
 
@@ -468,14 +509,14 @@
                     }, false);
                     }, false);
 
 
                     file.request.addEventListener('abort', function(event) {
                     file.request.addEventListener('abort', function(event) {
-                        delete files[file.index];
+                        delete _files[file.index];
 
 
                         _updateDisplay();
                         _updateDisplay();
 
 
                         _message('Aborted as requested.', 'success');
                         _message('Aborted as requested.', 'success');
                     }, false);
                     }, false);
 
 
-                    files.push(_createListItem(file));
+                    _files.push(_createListItem(file));
 
 
                     _updateDisplay();
                     _updateDisplay();
 
 
@@ -487,84 +528,104 @@
                 $(window).on("popstate", function(e) {
                 $(window).on("popstate", function(e) {
                     WebDAV.list(window.location.pathname);
                     WebDAV.list(window.location.pathname);
                 });
                 });
-            },
-            list: function(_path) {
-                var list;
 
 
-                _path = _path.match(/\/$/) ? _path : _path + '/'; // ensure we have a trailing slash for some platforms
-                files = [];
-                list = _request('PROPFIND', _path, {
-                    Depth: 1
-                });
+                // replace refresh key with force reload
+                $(document).on('keydown', function(e) {
+                    var keyCode = e.which || e.keyCode;
 
 
-                list.addEventListener('loadstart', function(event) {
-                    $('div.content').addClass('loading');
-                }, false);
+                    if ((keyCode == 116) || ((keyCode == 82) && (e.metaKey || e.ctrlKey))) {
+                        e.preventDefault();
 
 
-                list.addEventListener('load', function(event) {
-                    var parser = new DOMParser(),
-                    xml = parser.parseFromString(list.responseText, 'application/xml');
-
-                    path = _path;
-
-                    _getTags(xml, 'response').forEach(function(entry, i) {
-                        var file = _getTagContent(entry, 'href'),
-                        name = _getFileName(file);
-
-                        if (!i) {
-                            if (_path != '/') {
-                                files.push(_createListItem({
-                                    directory: true,
-                                    name: '',
-                                    title: '&larr;',
-                                    path: _path.replace(/[^\/]+\/?$/, ''),
-                                    modified: '',
-                                    size: '',
-                                    type: '',
-                                    mimeType: '',
-                                    request: null,
-                                    item: null,
-                                    data: null,
-                                    delete: false
-                                }));
-                            }
-                            return;
-                        }
+                        WebDAV.list(_path, true);
 
 
-                        files.push(_createListItem({
-                            directory: !!_getTag(entry, 'collection'),
-                            name: name,
-                            title: name,
-                            path: path,
-                            modified: new Date(_getTagContent(entry, 'getlastmodified')),
-                            size: _getTagContent(entry, 'getcontentlength'),
-                            type: _getType(name),
-                            mimeType: _getTagContent(entry, 'getcontenttype'),
-                            request: null,
-                            item: null,
-                            data: null,
-                            delete: true
-                        }));
-                    });
+                        return false;
+                    }
 
 
-                    _updateDisplay();
+                    return true;
+                });
+            },
+            list: function(path, refresh) {
+                path = path.match(/\/$/) ? path : path + '/'; // ensure we have a trailing slash for some platforms
 
 
-                    $('div.content').removeClass('loading');
-                }, false);
+                if ((path in _cache) && !refresh) {
+                    _files = [];
 
 
-                list.addEventListener('error', function(event) {
-                    _message('There was an error getting details for ' + _path + '.');
+                    _cache[_path = path].forEach(function(file) {
+                        // events need to be re-bound
+                        _files.push(_createListItem(file));
+                    });
 
 
-                    $('div.content').removeClass('loading');
-                }, false);
+                    return _updateDisplay();
+                }
 
 
-                list.addEventListener('abort', function(event) {
-                    _message('Aborted as requested. ' + _path, 'success');
-    
-                    $('div.content').removeClass('loading');
-                }, false);
+                _listContents(path, {
+                    loadstart: function() {
+                        $('div.content').addClass('loading');
+                    },
+                    loadend: function() {
+                        $('div.content').removeClass('loading');
+                    },
+                    load: function(event) {
+                        var list = event.target,
+                        parser = new DOMParser(),
+                        xml = parser.parseFromString(list.responseText, 'application/xml');
+
+                        _path = path;
+                        _files = [];
+
+                        _getTags(xml, 'response').forEach(function(entry, i) {
+                            var file = _getTagContent(entry, 'href'),
+                            name = _getFileName(file);
+
+                            if (!i) {
+                                if (path != '/') {
+                                    _files.push(_createListItem({
+                                        directory: true,
+                                        name: '',
+                                        title: '&larr;',
+                                        path: path.replace(/[^\/]+\/?$/, ''),
+                                        modified: '',
+                                        size: '',
+                                        type: '',
+                                        mimeType: '',
+                                        request: null,
+                                        item: null,
+                                        data: null,
+                                        delete: false
+                                    }));
+                                }
+                                return;
+                            }
 
 
-                list.send(null);
+                            _files.push(_createListItem({
+                                directory: !!_getTag(entry, 'collection'),
+                                name: name,
+                                title: name,
+                                path: _path,
+                                modified: new Date(_getTagContent(entry, 'getlastmodified')),
+                                size: _getTagContent(entry, 'getcontentlength'),
+                                type: _getType(name),
+                                mimeType: _getTagContent(entry, 'getcontenttype'),
+                                request: null,
+                                item: null,
+                                data: null,
+                                delete: true
+                            }));
+                        });
+
+                        _files.timestamp = Date.now();
+
+                        _cache[_path] = _files;
+
+                        _updateDisplay();
+                    },
+                    error: function() {
+                        _message('There was an error getting details for ' + path + '.');
+                    },
+                    abort: function() {
+                        _message('Aborted as requested. ' + path, 'success');
+                    }
+                });
             },
             },
             upload: function(file) {
             upload: function(file) {
                 if (!file.name) {
                 if (!file.name) {
@@ -574,7 +635,7 @@
                 file = $.extend({
                 file = $.extend({
                     directory: false,
                     directory: false,
                     title: file.name,
                     title: file.name,
-                    path: this.path(),
+                    path: _path,
                     modified: new Date(),
                     modified: new Date(),
                     size: file.data.length,
                     size: file.data.length,
                     request: null,
                     request: null,
@@ -605,7 +666,7 @@
                 }, false);
                 }, false);
 
 
                 file.request.addEventListener('error', function(event) {
                 file.request.addEventListener('error', function(event) {
-                    delete files[file.index];
+                    delete _files[file.index];
 
 
                     _updateDisplay();
                     _updateDisplay();
 
 
@@ -613,14 +674,14 @@
                 }, false);
                 }, false);
 
 
                 file.request.addEventListener('abort', function(event) {
                 file.request.addEventListener('abort', function(event) {
-                    delete files[file.index];
+                    delete _files[file.index];
 
 
                     _updateDisplay();
                     _updateDisplay();
 
 
                     _message('Aborted as requested.', 'sucess');
                     _message('Aborted as requested.', 'sucess');
                 }, false);
                 }, false);
 
 
-                files.push(_createListItem(file));
+                _files.push(_createListItem(file));
 
 
                 _updateDisplay();
                 _updateDisplay();
 
 
@@ -634,13 +695,13 @@
                 }
                 }
 
 
                 if (!('path' in file)) {
                 if (!('path' in file)) {
-                    file.path = this.path();
+                    file.path = _path;
                 }
                 }
 
 
                 file.request = _request('DELETE', file.path + file.name);
                 file.request = _request('DELETE', file.path + file.name);
 
 
                 file.request.addEventListener('load', function(event) {
                 file.request.addEventListener('load', function(event) {
-                    delete files[file.index];
+                    delete _files[file.index];
 
 
                     _refreshDisplay();
                     _refreshDisplay();
                 }, false);
                 }, false);

Some files were not shown because too many files changed in this diff