diff --git a/images/loop_alt4_gd_16x12.png b/images/loop_alt4_gd_16x12.png new file mode 100644 index 0000000..82928e9 Binary files /dev/null and b/images/loop_alt4_gd_16x12.png differ diff --git a/images/loop_alt4_gl_16x12.png b/images/loop_alt4_gl_16x12.png new file mode 100644 index 0000000..113222d Binary files /dev/null and b/images/loop_alt4_gl_16x12.png differ diff --git a/images/volume_gd_12x9.png b/images/volume_gd_12x9.png new file mode 100644 index 0000000..3f1f02f Binary files /dev/null and b/images/volume_gd_12x9.png differ diff --git a/images/volume_gl_12x9.png b/images/volume_gl_12x9.png new file mode 100644 index 0000000..49e4102 Binary files /dev/null and b/images/volume_gl_12x9.png differ diff --git a/images/volume_mute_gd_12x9.png b/images/volume_mute_gd_12x9.png new file mode 100644 index 0000000..b4b5706 Binary files /dev/null and b/images/volume_mute_gd_12x9.png differ diff --git a/images/volume_mute_gl_12x9.png b/images/volume_mute_gl_12x9.png new file mode 100644 index 0000000..202e29d Binary files /dev/null and b/images/volume_mute_gl_12x9.png differ diff --git a/index.html b/index.html index 161c4fa..a1e4c1f 100755 --- a/index.html +++ b/index.html @@ -9,7 +9,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -41,9 +41,10 @@
|
-
+
Empty @@ -124,13 +124,13 @@
+ + New
-
- + New - Delete - Save - - Remove Song(s) +
@@ -174,6 +174,21 @@
0 song(s), 00:00:00 total time
+
+
+ +
+
***Opens new window to the video URL... +
+
+ + + +
+
+
+
+
Reset @@ -190,7 +205,7 @@

-
+

@@ -201,7 +216,6 @@
  • Spacebar Play/Pause
  • Next Track
  • Previous Track
  • -
  • -/_ Volume Down =/+ Volume Up
  • @@ -255,7 +269,7 @@
    Local Storage
    -
    +
    @@ -280,8 +294,15 @@ - --> +
  • 11/1/2012 - 2.3.1 + - Autopilot & Auto Playlists will use the currently selected Music Folder + - Volume slider, mute button added + - Added Created Date to Albums + - Click song notification to skip to next track +
  • 10/30/2012 - 2.2.7 - Added Shortcuts! + - Upgraded to FancyBox2 - Switched to jPlayer for HTML5/Flash audio+video, video support coming soon!
  • 10/26/2012 - 2.2.6 @@ -439,11 +460,17 @@
  • -
    -
      +
      +
      • +
      • + + + + +
      diff --git a/js/app.js b/js/app.js index 37a70fa..ab03107 100755 --- a/js/app.js +++ b/js/app.js @@ -3,14 +3,13 @@ var debug = false; var audio = null; var hostURL = location.href; var baseURL; -var version; +var apiVersion; var username; var password; var passwordenc; var server; var smwidth; -var volume = 50; -var currentVersion = '2.2.7'; +var currentVersion = '2.3.1'; function getCookie(value) { if ($.cookie(value)) { @@ -88,13 +87,14 @@ if (getCookie('password')) { setCookie('passwordenc', 'enc:' + HexEncode(getCookie('password'))); setCookie('password', null); } -if (getCookie('Volume')) { - volume = parseInt(getCookie('Volume')); -} -var version = '1.6.0'; +var apiVersion = '1.6.0'; function loadTabContent(tab) { - if (username && password) { + var tabid = '#action_' + tab.substring(1, tab.length); + $("ul.tabs li a").removeClass("active"); //Remove any "active" class + $(tabid).addClass("active"); //Add "active" class to selected tab + $(".tabcontent").hide(); //Hide all tab content + window.location.hash = tab; switch (tab) { case '#tabLibrary': if (debug) { console.log("TAG LIBRARY"); } @@ -105,8 +105,8 @@ function loadTabContent(tab) { } getMusicFolders(); break; - case '#tabCurrent': - if (debug) { console.log("TAG CURRENT"); } + case '#tabQueue': + if (debug) { console.log("TAG QUEUE"); } var header = generateSongHeaderHTML(); $('#CurrentPlaylistContainer thead').html(header); var count = $('#CurrentPlaylistContainer tbody tr.song').size(); @@ -141,7 +141,7 @@ function loadTabContent(tab) { default: break; } - } + $(tab).fadeIn('fast'); //Fade in the active ID content } diff --git a/js/fancybox/fancy_close.png b/js/fancybox/fancy_close.png deleted file mode 100644 index 0703530..0000000 Binary files a/js/fancybox/fancy_close.png and /dev/null differ diff --git a/js/fancybox/fancy_loading.png b/js/fancybox/fancy_loading.png deleted file mode 100644 index 2503017..0000000 Binary files a/js/fancybox/fancy_loading.png and /dev/null differ diff --git a/js/fancybox/fancy_nav_left.png b/js/fancybox/fancy_nav_left.png deleted file mode 100644 index ebaa6a4..0000000 Binary files a/js/fancybox/fancy_nav_left.png and /dev/null differ diff --git a/js/fancybox/fancy_nav_right.png b/js/fancybox/fancy_nav_right.png deleted file mode 100644 index 873294e..0000000 Binary files a/js/fancybox/fancy_nav_right.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_e.png b/js/fancybox/fancy_shadow_e.png deleted file mode 100644 index 2eda089..0000000 Binary files a/js/fancybox/fancy_shadow_e.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_n.png b/js/fancybox/fancy_shadow_n.png deleted file mode 100644 index 69aa10e..0000000 Binary files a/js/fancybox/fancy_shadow_n.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_ne.png b/js/fancybox/fancy_shadow_ne.png deleted file mode 100644 index 79f6980..0000000 Binary files a/js/fancybox/fancy_shadow_ne.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_nw.png b/js/fancybox/fancy_shadow_nw.png deleted file mode 100644 index 7182cd9..0000000 Binary files a/js/fancybox/fancy_shadow_nw.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_s.png b/js/fancybox/fancy_shadow_s.png deleted file mode 100644 index d8858bf..0000000 Binary files a/js/fancybox/fancy_shadow_s.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_se.png b/js/fancybox/fancy_shadow_se.png deleted file mode 100644 index 541e3ff..0000000 Binary files a/js/fancybox/fancy_shadow_se.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_sw.png b/js/fancybox/fancy_shadow_sw.png deleted file mode 100644 index b451689..0000000 Binary files a/js/fancybox/fancy_shadow_sw.png and /dev/null differ diff --git a/js/fancybox/fancy_shadow_w.png b/js/fancybox/fancy_shadow_w.png deleted file mode 100644 index 8a4e4a8..0000000 Binary files a/js/fancybox/fancy_shadow_w.png and /dev/null differ diff --git a/js/fancybox/fancy_title_left.png b/js/fancybox/fancy_title_left.png deleted file mode 100644 index 6049223..0000000 Binary files a/js/fancybox/fancy_title_left.png and /dev/null differ diff --git a/js/fancybox/fancy_title_main.png b/js/fancybox/fancy_title_main.png deleted file mode 100644 index 8044271..0000000 Binary files a/js/fancybox/fancy_title_main.png and /dev/null differ diff --git a/js/fancybox/fancy_title_over.png b/js/fancybox/fancy_title_over.png deleted file mode 100644 index d9f458f..0000000 Binary files a/js/fancybox/fancy_title_over.png and /dev/null differ diff --git a/js/fancybox/fancy_title_right.png b/js/fancybox/fancy_title_right.png deleted file mode 100644 index e36d9db..0000000 Binary files a/js/fancybox/fancy_title_right.png and /dev/null differ diff --git a/js/fancybox/fancybox-x.png b/js/fancybox/fancybox-x.png deleted file mode 100644 index c2130f8..0000000 Binary files a/js/fancybox/fancybox-x.png and /dev/null differ diff --git a/js/fancybox/fancybox-y.png b/js/fancybox/fancybox-y.png deleted file mode 100644 index 7ef399b..0000000 Binary files a/js/fancybox/fancybox-y.png and /dev/null differ diff --git a/js/fancybox/fancybox.png b/js/fancybox/fancybox.png deleted file mode 100644 index 65e14f6..0000000 Binary files a/js/fancybox/fancybox.png and /dev/null differ diff --git a/js/fancybox/fancybox_loading.gif b/js/fancybox/fancybox_loading.gif new file mode 100644 index 0000000..0158617 Binary files /dev/null and b/js/fancybox/fancybox_loading.gif differ diff --git a/js/fancybox/fancybox_overlay.png b/js/fancybox/fancybox_overlay.png new file mode 100644 index 0000000..a439139 Binary files /dev/null and b/js/fancybox/fancybox_overlay.png differ diff --git a/js/fancybox/fancybox_sprite.png b/js/fancybox/fancybox_sprite.png new file mode 100644 index 0000000..fd8d5ca Binary files /dev/null and b/js/fancybox/fancybox_sprite.png differ diff --git a/js/fancybox/helpers/fancybox_buttons.png b/js/fancybox/helpers/fancybox_buttons.png new file mode 100644 index 0000000..0787207 Binary files /dev/null and b/js/fancybox/helpers/fancybox_buttons.png differ diff --git a/js/fancybox/helpers/jquery.fancybox-buttons.css b/js/fancybox/helpers/jquery.fancybox-buttons.css new file mode 100644 index 0000000..9453b46 --- /dev/null +++ b/js/fancybox/helpers/jquery.fancybox-buttons.css @@ -0,0 +1,96 @@ +#fancybox-buttons { + position: fixed; + left: 0; + width: 100%; + z-index: 8050; +} + +#fancybox-buttons.top { + top: 10px; +} + +#fancybox-buttons.bottom { + bottom: 10px; +} + +#fancybox-buttons ul { + display: block; + width: 166px; + height: 30px; + margin: 0 auto; + padding: 0; + list-style: none; + border: 1px solid #111; + border-radius: 3px; + -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + background: rgb(50,50,50); + background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51))); + background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 ); +} + +#fancybox-buttons ul li { + float: left; + margin: 0; + padding: 0; +} + +#fancybox-buttons a { + display: block; + width: 30px; + height: 30px; + text-indent: -9999px; + background-image: url('fancybox_buttons.png'); + background-repeat: no-repeat; + outline: none; + opacity: 0.8; +} + +#fancybox-buttons a:hover { + opacity: 1; +} + +#fancybox-buttons a.btnPrev { + background-position: 5px 0; +} + +#fancybox-buttons a.btnNext { + background-position: -33px 0; + border-right: 1px solid #3e3e3e; +} + +#fancybox-buttons a.btnPlay { + background-position: 0 -30px; +} + +#fancybox-buttons a.btnPlayOn { + background-position: -30px -30px; +} + +#fancybox-buttons a.btnToggle { + background-position: 3px -60px; + border-left: 1px solid #111; + border-right: 1px solid #3e3e3e; + width: 35px +} + +#fancybox-buttons a.btnToggleOn { + background-position: -27px -60px; +} + +#fancybox-buttons a.btnClose { + border-left: 1px solid #111; + width: 35px; + background-position: -56px 0px; +} + +#fancybox-buttons a.btnDisabled { + opacity : 0.4; + cursor: default; +} \ No newline at end of file diff --git a/js/fancybox/helpers/jquery.fancybox-buttons.js b/js/fancybox/helpers/jquery.fancybox-buttons.js new file mode 100644 index 0000000..50baeca --- /dev/null +++ b/js/fancybox/helpers/jquery.fancybox-buttons.js @@ -0,0 +1,121 @@ + /*! + * Buttons helper for fancyBox + * version: 1.0.5 (Mon, 15 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * buttons: { + * position : 'top' + * } + * } + * }); + * + */ +(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.buttons = { + defaults : { + skipSingle : false, // disables if gallery contains single image + position : 'top', // 'top' or 'bottom' + tpl : '
      ' + }, + + list : null, + buttons: null, + + beforeLoad: function (opts, obj) { + //Remove self if gallery do not have at least two items + + if (opts.skipSingle && obj.group.length < 2) { + obj.helpers.buttons = false; + obj.closeBtn = true; + + return; + } + + //Increase top margin to give space for buttons + obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30; + }, + + onPlayStart: function () { + if (this.buttons) { + this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn'); + } + }, + + onPlayEnd: function () { + if (this.buttons) { + this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn'); + } + }, + + afterShow: function (opts, obj) { + var buttons = this.buttons; + + if (!buttons) { + this.list = $(opts.tpl).addClass(opts.position).appendTo('body'); + + buttons = { + prev : this.list.find('.btnPrev').click( F.prev ), + next : this.list.find('.btnNext').click( F.next ), + play : this.list.find('.btnPlay').click( F.play ), + toggle : this.list.find('.btnToggle').click( F.toggle ) + } + } + + //Prev + if (obj.index > 0 || obj.loop) { + buttons.prev.removeClass('btnDisabled'); + } else { + buttons.prev.addClass('btnDisabled'); + } + + //Next / Play + if (obj.loop || obj.index < obj.group.length - 1) { + buttons.next.removeClass('btnDisabled'); + buttons.play.removeClass('btnDisabled'); + + } else { + buttons.next.addClass('btnDisabled'); + buttons.play.addClass('btnDisabled'); + } + + this.buttons = buttons; + + this.onUpdate(opts, obj); + }, + + onUpdate: function (opts, obj) { + var toggle; + + if (!this.buttons) { + return; + } + + toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn'); + + //Size toggle button + if (obj.canShrink) { + toggle.addClass('btnToggleOn'); + + } else if (!obj.canExpand) { + toggle.addClass('btnDisabled'); + } + }, + + beforeClose: function () { + if (this.list) { + this.list.remove(); + } + + this.list = null; + this.buttons = null; + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/js/fancybox/helpers/jquery.fancybox-media.js b/js/fancybox/helpers/jquery.fancybox-media.js new file mode 100644 index 0000000..4b5e783 --- /dev/null +++ b/js/fancybox/helpers/jquery.fancybox-media.js @@ -0,0 +1,196 @@ +/*! + * Media helper for fancyBox + * version: 1.0.5 (Tue, 23 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * media: true + * } + * }); + * + * Set custom URL parameters: + * $(".fancybox").fancybox({ + * helpers : { + * media: { + * youtube : { + * params : { + * autoplay : 0 + * } + * } + * } + * } + * }); + * + * Or: + * $(".fancybox").fancybox({, + * helpers : { + * media: true + * }, + * youtube : { + * autoplay: 0 + * } + * }); + * + * Supports: + * + * Youtube + * http://www.youtube.com/watch?v=opj24KnzrWo + * http://www.youtube.com/embed/opj24KnzrWo + * http://youtu.be/opj24KnzrWo + * Vimeo + * http://vimeo.com/40648169 + * http://vimeo.com/channels/staffpicks/38843628 + * http://vimeo.com/groups/surrealism/videos/36516384 + * http://player.vimeo.com/video/45074303 + * Metacafe + * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/ + * http://www.metacafe.com/watch/7635964/ + * Dailymotion + * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people + * Twitvid + * http://twitvid.com/QY7MD + * Twitpic + * http://twitpic.com/7p93st + * Instagram + * http://instagr.am/p/IejkuUGxQn/ + * http://instagram.com/p/IejkuUGxQn/ + * Google maps + * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17 + * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 + * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56 + */ +(function ($) { + "use strict"; + + //Shortcut for fancyBox object + var F = $.fancybox, + format = function( url, rez, params ) { + params = params || ''; + + if ( $.type( params ) === "object" ) { + params = $.param(params, true); + } + + $.each(rez, function(key, value) { + url = url.replace( '$' + key, value || '' ); + }); + + if (params.length) { + url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params; + } + + return url; + }; + + //Add helper object + F.helpers.media = { + defaults : { + youtube : { + matcher : /(youtube\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i, + params : { + autoplay : 1, + autohide : 1, + fs : 1, + rel : 0, + hd : 1, + wmode : 'opaque', + enablejsapi : 1 + }, + type : 'iframe', + url : '//www.youtube.com/embed/$3' + }, + vimeo : { + matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/, + params : { + autoplay : 1, + hd : 1, + show_title : 1, + show_byline : 1, + show_portrait : 0, + fullscreen : 1 + }, + type : 'iframe', + url : '//player.vimeo.com/video/$1' + }, + metacafe : { + matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/, + params : { + autoPlay : 'yes' + }, + type : 'swf', + url : function( rez, params, obj ) { + obj.swf.flashVars = 'playerVars=' + $.param( params, true ); + + return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf'; + } + }, + dailymotion : { + matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, + params : { + additionalInfos : 0, + autoStart : 1 + }, + type : 'swf', + url : '//www.dailymotion.com/swf/video/$1' + }, + twitvid : { + matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i, + params : { + autoplay : 0 + }, + type : 'iframe', + url : '//www.twitvid.com/embed.php?guid=$1' + }, + twitpic : { + matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i, + type : 'image', + url : '//twitpic.com/show/full/$1/' + }, + instagram : { + matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, + type : 'image', + url : '//$1/p/$2/media/' + }, + google_maps : { + matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i, + type : 'iframe', + url : function( rez ) { + return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed'); + } + } + }, + + beforeLoad : function(opts, obj) { + var url = obj.href || '', + type = false, + what, + item, + rez, + params; + + for (what in opts) { + item = opts[ what ]; + rez = url.match( item.matcher ); + + if (rez) { + type = item.type; + params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null)); + + url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params ); + + break; + } + } + + if (type) { + obj.href = url; + obj.type = type; + + obj.autoHeight = false; + } + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/js/fancybox/helpers/jquery.fancybox-thumbs.css b/js/fancybox/helpers/jquery.fancybox-thumbs.css new file mode 100644 index 0000000..e40ae82 --- /dev/null +++ b/js/fancybox/helpers/jquery.fancybox-thumbs.css @@ -0,0 +1,54 @@ +#fancybox-thumbs { + position: fixed; + left: 0; + width: 100%; + overflow: hidden; + z-index: 8050; +} + +#fancybox-thumbs.bottom { + bottom: 2px; +} + +#fancybox-thumbs.top { + top: 2px; +} + +#fancybox-thumbs ul { + position: relative; + list-style: none; + margin: 0; + padding: 0; +} + +#fancybox-thumbs ul li { + float: left; + padding: 1px; + opacity: 0.5; +} + +#fancybox-thumbs ul li.active { + opacity: 0.75; + padding: 0; + border: 1px solid #fff; +} + +#fancybox-thumbs ul li:hover { + opacity: 1; +} + +#fancybox-thumbs ul li a { + display: block; + position: relative; + overflow: hidden; + border: 1px solid #222; + background: #111; + outline: none; +} + +#fancybox-thumbs ul li img { + display: block; + position: relative; + border: 0; + padding: 0; +} \ No newline at end of file diff --git a/js/fancybox/helpers/jquery.fancybox-thumbs.js b/js/fancybox/helpers/jquery.fancybox-thumbs.js new file mode 100644 index 0000000..5db3d4a --- /dev/null +++ b/js/fancybox/helpers/jquery.fancybox-thumbs.js @@ -0,0 +1,162 @@ + /*! + * Thumbnail helper for fancyBox + * version: 1.0.7 (Mon, 01 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * thumbs: { + * width : 50, + * height : 50 + * } + * } + * }); + * + */ +(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.thumbs = { + defaults : { + width : 50, // thumbnail width + height : 50, // thumbnail height + position : 'bottom', // 'top' or 'bottom' + source : function ( item ) { // function to obtain the URL of the thumbnail image + var href; + + if (item.element) { + href = $(item.element).find('img').attr('src'); + } + + if (!href && item.type === 'image' && item.href) { + href = item.href; + } + + return href; + } + }, + + wrap : null, + list : null, + width : 0, + + init: function (opts, obj) { + var that = this, + list, + thumbWidth = opts.width, + thumbHeight = opts.height, + thumbSource = opts.source; + + //Build list structure + list = ''; + + for (var n = 0; n < obj.group.length; n++) { + list += '
    • '; + } + + this.wrap = $('
      ').addClass(opts.position).appendTo('body'); + this.list = $('
        ' + list + '
      ').appendTo(this.wrap); + + //Load each thumbnail + $.each(obj.group, function (i) { + var href = thumbSource( obj.group[ i ] ); + + if (!href) { + return; + } + + $("").load(function () { + var width = this.width, + height = this.height, + widthRatio, heightRatio, parent; + + if (!that.list || !width || !height) { + return; + } + + //Calculate thumbnail width/height and center it + widthRatio = width / thumbWidth; + heightRatio = height / thumbHeight; + + parent = that.list.children().eq(i).find('a'); + + if (widthRatio >= 1 && heightRatio >= 1) { + if (widthRatio > heightRatio) { + width = Math.floor(width / heightRatio); + height = thumbHeight; + + } else { + width = thumbWidth; + height = Math.floor(height / widthRatio); + } + } + + $(this).css({ + width : width, + height : height, + top : Math.floor(thumbHeight / 2 - height / 2), + left : Math.floor(thumbWidth / 2 - width / 2) + }); + + parent.width(thumbWidth).height(thumbHeight); + + $(this).hide().appendTo(parent).fadeIn(300); + + }).attr('src', href); + }); + + //Set initial width + this.width = this.list.children().eq(0).outerWidth(true); + + this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))); + }, + + beforeLoad: function (opts, obj) { + //Remove self if gallery do not have at least two items + if (obj.group.length < 2) { + obj.helpers.thumbs = false; + + return; + } + + //Increase bottom margin to give space for thumbs + obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15); + }, + + afterShow: function (opts, obj) { + //Check if exists and create or update list + if (this.list) { + this.onUpdate(opts, obj); + + } else { + this.init(opts, obj); + } + + //Set active element + this.list.children().removeClass('active').eq(obj.index).addClass('active'); + }, + + //Center list + onUpdate: function (opts, obj) { + if (this.list) { + this.list.stop(true).animate({ + 'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)) + }, 150); + } + }, + + beforeClose: function () { + if (this.wrap) { + this.wrap.remove(); + } + + this.wrap = null; + this.list = null; + this.width = 0; + } + } + +}(jQuery)); \ No newline at end of file diff --git a/js/fancybox/jquery.fancybox-1.3.4.css b/js/fancybox/jquery.fancybox-1.3.4.css deleted file mode 100644 index 8fe0fbd..0000000 --- a/js/fancybox/jquery.fancybox-1.3.4.css +++ /dev/null @@ -1,359 +0,0 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. - * - * Version: 1.3.4 (11/11/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -#fancybox-loading { - position: fixed; - top: 50%; - left: 50%; - width: 40px; - height: 40px; - margin-top: -20px; - margin-left: -20px; - cursor: pointer; - overflow: hidden; - z-index: 1104; - display: none; -} - -#fancybox-loading div { - position: absolute; - top: 0; - left: 0; - width: 40px; - height: 480px; - background-image: url('fancybox.png'); -} - -#fancybox-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - z-index: 1100; - display: none; -} - -#fancybox-tmp { - padding: 0; - margin: 0; - border: 0; - overflow: auto; - display: none; -} - -#fancybox-wrap { - position: absolute; - top: 0; - left: 0; - padding: 20px; - z-index: 1101; - outline: none; - display: none; -} - -#fancybox-outer { - position: relative; - width: 100%; - height: 100%; - background: #fff; -} - -#fancybox-content { - width: 0; - height: 0; - padding: 0; - outline: none; - position: relative; - overflow: hidden; - z-index: 1102; - border: 0px solid #fff; -} - -#fancybox-hide-sel-frame { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: transparent; - z-index: 1101; -} - -#fancybox-close { - position: absolute; - top: -15px; - right: -15px; - width: 30px; - height: 30px; - background: transparent url('fancybox.png') -40px 0px; - cursor: pointer; - z-index: 1103; - display: none; -} - -#fancybox-error { - color: #444; - font: normal 12px/20px Arial; - padding: 14px; - margin: 0; -} - -#fancybox-img { - width: 100%; - height: 100%; - padding: 0; - margin: 0; - border: none; - outline: none; - line-height: 0; - vertical-align: top; -} - -#fancybox-frame { - width: 100%; - height: 100%; - border: none; - display: block; -} - -#fancybox-left, #fancybox-right { - position: absolute; - bottom: 0px; - height: 100%; - width: 35%; - cursor: pointer; - outline: none; - background: transparent url('blank.gif'); - z-index: 1102; - display: none; -} - -#fancybox-left { - left: 0px; -} - -#fancybox-right { - right: 0px; -} - -#fancybox-left-ico, #fancybox-right-ico { - position: absolute; - top: 50%; - left: -9999px; - width: 30px; - height: 30px; - margin-top: -15px; - cursor: pointer; - z-index: 1102; - display: block; -} - -#fancybox-left-ico { - background-image: url('fancybox.png'); - background-position: -40px -30px; -} - -#fancybox-right-ico { - background-image: url('fancybox.png'); - background-position: -40px -60px; -} - -#fancybox-left:hover, #fancybox-right:hover { - visibility: visible; /* IE6 */ -} - -#fancybox-left:hover span { - left: 20px; -} - -#fancybox-right:hover span { - left: auto; - right: 20px; -} - -.fancybox-bg { - position: absolute; - padding: 0; - margin: 0; - border: 0; - width: 20px; - height: 20px; - z-index: 1001; -} - -#fancybox-bg-n { - top: -20px; - left: 0; - width: 100%; - background-image: url('fancybox-x.png'); -} - -#fancybox-bg-ne { - top: -20px; - right: -20px; - background-image: url('fancybox.png'); - background-position: -40px -162px; -} - -#fancybox-bg-e { - top: 0; - right: -20px; - height: 100%; - background-image: url('fancybox-y.png'); - background-position: -20px 0px; -} - -#fancybox-bg-se { - bottom: -20px; - right: -20px; - background-image: url('fancybox.png'); - background-position: -40px -182px; -} - -#fancybox-bg-s { - bottom: -20px; - left: 0; - width: 100%; - background-image: url('fancybox-x.png'); - background-position: 0px -20px; -} - -#fancybox-bg-sw { - bottom: -20px; - left: -20px; - background-image: url('fancybox.png'); - background-position: -40px -142px; -} - -#fancybox-bg-w { - top: 0; - left: -20px; - height: 100%; - background-image: url('fancybox-y.png'); -} - -#fancybox-bg-nw { - top: -20px; - left: -20px; - background-image: url('fancybox.png'); - background-position: -40px -122px; -} - -#fancybox-title { - font-family: Helvetica; - font-size: 12px; - z-index: 1102; -} - -.fancybox-title-inside { - padding-bottom: 10px; - text-align: center; - color: #333; - background: #fff; - position: relative; -} - -.fancybox-title-outside { - padding-top: 10px; - color: #fff; -} - -.fancybox-title-over { - position: absolute; - bottom: 0; - left: 0; - color: #FFF; - text-align: left; -} - -#fancybox-title-over { - padding: 10px; - background-image: url('fancy_title_over.png'); - display: block; -} - -.fancybox-title-float { - position: absolute; - left: 0; - bottom: -20px; - height: 32px; -} - -#fancybox-title-float-wrap { - border: none; - border-collapse: collapse; - width: auto; -} - -#fancybox-title-float-wrap td { - border: none; - white-space: nowrap; -} - -#fancybox-title-float-left { - padding: 0 0 0 15px; - background: url('fancybox.png') -40px -90px no-repeat; -} - -#fancybox-title-float-main { - color: #FFF; - line-height: 29px; - font-weight: bold; - padding: 0 0 3px 0; - background: url('fancybox-x.png') 0px -40px; -} - -#fancybox-title-float-right { - padding: 0 0 0 15px; - background: url('fancybox.png') -55px -90px no-repeat; -} - -/* IE6 */ - -.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; } -.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame { - height: expression(this.parentNode.clientHeight + "px"); -} - -#fancybox-loading.fancybox-ie6 { - position: absolute; margin-top: 0; - top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'); -} - -#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale'); } - -/* IE6, IE7, IE8 */ - -.fancybox-ie .fancybox-bg { background: transparent !important; } - -.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_w.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); } \ No newline at end of file diff --git a/js/fancybox/jquery.fancybox-1.3.4.js b/js/fancybox/jquery.fancybox-1.3.4.js deleted file mode 100644 index a852005..0000000 --- a/js/fancybox/jquery.fancybox-1.3.4.js +++ /dev/null @@ -1,1156 +0,0 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. - * - * Version: 1.3.4 (11/11/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -;(function($) { - var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right, - - selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], - - ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, - - loadingTimer, loadingFrame = 1, - - titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('
      ')[0], { prop: 0 }), - - isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest, - - /* - * Private methods - */ - - _abort = function() { - loading.hide(); - - imgPreloader.onerror = imgPreloader.onload = null; - - if (ajaxLoader) { - ajaxLoader.abort(); - } - - tmp.empty(); - }, - - _error = function() { - if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) { - loading.hide(); - busy = false; - return; - } - - selectedOpts.titleShow = false; - - selectedOpts.width = 'auto'; - selectedOpts.height = 'auto'; - - tmp.html( '

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

      ' ); - - _process_inline(); - }, - - _start = function() { - var obj = selectedArray[ selectedIndex ], - href, - type, - title, - str, - emb, - ret; - - _abort(); - - selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); - - ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts); - - if (ret === false) { - busy = false; - return; - } else if (typeof ret == 'object') { - selectedOpts = $.extend(selectedOpts, ret); - } - - title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || ''; - - if (obj.nodeName && !selectedOpts.orig) { - selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); - } - - if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) { - title = selectedOpts.orig.attr('alt'); - } - - href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null; - - if ((/^(?:javascript)/i).test(href) || href == '#') { - href = null; - } - - if (selectedOpts.type) { - type = selectedOpts.type; - - if (!href) { - href = selectedOpts.content; - } - - } else if (selectedOpts.content) { - type = 'html'; - - } else if (href) { - if (href.match(imgRegExp)) { - type = 'image'; - - } else if (href.match(swfRegExp)) { - type = 'swf'; - - } else if ($(obj).hasClass("iframe")) { - type = 'iframe'; - - } else if (href.indexOf("#") === 0) { - type = 'inline'; - - } else { - type = 'ajax'; - } - } - - if (!type) { - _error(); - return; - } - - if (type == 'inline') { - obj = href.substr(href.indexOf("#")); - type = $(obj).length > 0 ? 'inline' : 'ajax'; - } - - selectedOpts.type = type; - selectedOpts.href = href; - selectedOpts.title = title; - - if (selectedOpts.autoDimensions) { - if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') { - selectedOpts.width = 'auto'; - selectedOpts.height = 'auto'; - } else { - selectedOpts.autoDimensions = false; - } - } - - if (selectedOpts.modal) { - selectedOpts.overlayShow = true; - selectedOpts.hideOnOverlayClick = false; - selectedOpts.hideOnContentClick = false; - selectedOpts.enableEscapeButton = false; - selectedOpts.showCloseButton = false; - } - - selectedOpts.padding = parseInt(selectedOpts.padding, 10); - selectedOpts.margin = parseInt(selectedOpts.margin, 10); - - tmp.css('padding', (selectedOpts.padding + selectedOpts.margin)); - - $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { - $(this).replaceWith(content.children()); - }); - - switch (type) { - case 'html' : - tmp.html( selectedOpts.content ); - _process_inline(); - break; - - case 'inline' : - if ( $(obj).parent().is('#fancybox-content') === true) { - busy = false; - return; - } - - $('
      ') - .hide() - .insertBefore( $(obj) ) - .bind('fancybox-cleanup', function() { - $(this).replaceWith(content.children()); - }).bind('fancybox-cancel', function() { - $(this).replaceWith(tmp.children()); - }); - - $(obj).appendTo(tmp); - - _process_inline(); - break; - - case 'image': - busy = false; - - $.fancybox.showActivity(); - - imgPreloader = new Image(); - - imgPreloader.onerror = function() { - _error(); - }; - - imgPreloader.onload = function() { - busy = true; - - imgPreloader.onerror = imgPreloader.onload = null; - - _process_image(); - }; - - imgPreloader.src = href; - break; - - case 'swf': - selectedOpts.scrolling = 'no'; - - str = ''; - emb = ''; - - $.each(selectedOpts.swf, function(name, val) { - str += ''; - emb += ' ' + name + '="' + val + '"'; - }); - - str += ''; - - tmp.html(str); - - _process_inline(); - break; - - case 'ajax': - busy = false; - - $.fancybox.showActivity(); - - selectedOpts.ajax.win = selectedOpts.ajax.success; - - ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, { - url : href, - data : selectedOpts.ajax.data || {}, - error : function(XMLHttpRequest, textStatus, errorThrown) { - if ( XMLHttpRequest.status > 0 ) { - _error(); - } - }, - success : function(data, textStatus, XMLHttpRequest) { - var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader; - if (o.status == 200) { - if ( typeof selectedOpts.ajax.win == 'function' ) { - ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest); - - if (ret === false) { - loading.hide(); - return; - } else if (typeof ret == 'string' || typeof ret == 'object') { - data = ret; - } - } - - tmp.html( data ); - _process_inline(); - } - } - })); - - break; - - case 'iframe': - _show(); - break; - } - }, - - _process_inline = function() { - var - w = selectedOpts.width, - h = selectedOpts.height; - - if (w.toString().indexOf('%') > -1) { - w = parseInt( ($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px'; - - } else { - w = w == 'auto' ? 'auto' : w + 'px'; - } - - if (h.toString().indexOf('%') > -1) { - h = parseInt( ($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px'; - - } else { - h = h == 'auto' ? 'auto' : h + 'px'; - } - - tmp.wrapInner('
      '); - - selectedOpts.width = tmp.width(); - selectedOpts.height = tmp.height(); - - _show(); - }, - - _process_image = function() { - selectedOpts.width = imgPreloader.width; - selectedOpts.height = imgPreloader.height; - - $("").attr({ - 'id' : 'fancybox-img', - 'src' : imgPreloader.src, - 'alt' : selectedOpts.title - }).appendTo( tmp ); - - _show(); - }, - - _show = function() { - var pos, equal; - - loading.hide(); - - if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { - $.event.trigger('fancybox-cancel'); - - busy = false; - return; - } - - busy = true; - - $(content.add( overlay )).unbind(); - - $(window).unbind("resize.fb scroll.fb"); - $(document).unbind('keydown.fb'); - - if (wrap.is(":visible") && currentOpts.titlePosition !== 'outside') { - wrap.css('height', wrap.height()); - } - - currentArray = selectedArray; - currentIndex = selectedIndex; - currentOpts = selectedOpts; - - if (currentOpts.overlayShow) { - overlay.css({ - 'background-color' : currentOpts.overlayColor, - 'opacity' : currentOpts.overlayOpacity, - 'cursor' : currentOpts.hideOnOverlayClick ? 'pointer' : 'auto', - 'height' : $(document).height() - }); - - if (!overlay.is(':visible')) { - if (isIE6) { - $('select:not(#fancybox-tmp select)').filter(function() { - return this.style.visibility !== 'hidden'; - }).css({'visibility' : 'hidden'}).one('fancybox-cleanup', function() { - this.style.visibility = 'inherit'; - }); - } - - overlay.show(); - } - } else { - overlay.hide(); - } - - final_pos = _get_zoom_to(); - - _process_title(); - - if (wrap.is(":visible")) { - $( close.add( nav_left ).add( nav_right ) ).hide(); - - pos = wrap.position(), - - start_pos = { - top : pos.top, - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); - - content.fadeTo(currentOpts.changeFade, 0.3, function() { - var finish_resizing = function() { - content.html( tmp.contents() ).fadeTo(currentOpts.changeFade, 1, _finish); - }; - - $.event.trigger('fancybox-change'); - - content - .empty() - .removeAttr('filter') - .css({ - 'border-width' : currentOpts.padding, - 'width' : final_pos.width - currentOpts.padding * 2, - 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 - }); - - if (equal) { - finish_resizing(); - - } else { - fx.prop = 0; - - $(fx).animate({prop: 1}, { - duration : currentOpts.changeSpeed, - easing : currentOpts.easingChange, - step : _draw, - complete : finish_resizing - }); - } - }); - - return; - } - - wrap.removeAttr("style"); - - content.css('border-width', currentOpts.padding); - - if (currentOpts.transitionIn == 'elastic') { - start_pos = _get_zoom_from(); - - content.html( tmp.contents() ); - - wrap.show(); - - if (currentOpts.opacity) { - final_pos.opacity = 0; - } - - fx.prop = 0; - - $(fx).animate({prop: 1}, { - duration : currentOpts.speedIn, - easing : currentOpts.easingIn, - step : _draw, - complete : _finish - }); - - return; - } - - if (currentOpts.titlePosition == 'inside' && titleHeight > 0) { - title.show(); - } - - content - .css({ - 'width' : final_pos.width - currentOpts.padding * 2, - 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 - }) - .html( tmp.contents() ); - - wrap - .css(final_pos) - .fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); - }, - - _format_title = function(title) { - if (title && title.length) { - if (currentOpts.titlePosition == 'float') { - return '
      ' + title + '
      '; - } - - return '
      ' + title + '
      '; - } - - return false; - }, - - _process_title = function() { - titleStr = currentOpts.title || ''; - titleHeight = 0; - - title - .empty() - .removeAttr('style') - .removeClass(); - - if (currentOpts.titleShow === false) { - title.hide(); - return; - } - - titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr); - - if (!titleStr || titleStr === '') { - title.hide(); - return; - } - - title - .addClass('fancybox-title-' + currentOpts.titlePosition) - .html( titleStr ) - .appendTo( 'body' ) - .show(); - - switch (currentOpts.titlePosition) { - case 'inside': - title - .css({ - 'width' : final_pos.width - (currentOpts.padding * 2), - 'marginLeft' : currentOpts.padding, - 'marginRight' : currentOpts.padding - }); - - titleHeight = title.outerHeight(true); - - title.appendTo( outer ); - - final_pos.height += titleHeight; - break; - - case 'over': - title - .css({ - 'marginLeft' : currentOpts.padding, - 'width' : final_pos.width - (currentOpts.padding * 2), - 'bottom' : currentOpts.padding - }) - .appendTo( outer ); - break; - - case 'float': - title - .css('left', parseInt((title.width() - final_pos.width - 40)/ 2, 10) * -1) - .appendTo( wrap ); - break; - - default: - title - .css({ - 'width' : final_pos.width - (currentOpts.padding * 2), - 'paddingLeft' : currentOpts.padding, - 'paddingRight' : currentOpts.padding - }) - .appendTo( wrap ); - break; - } - - title.hide(); - }, - - _set_navigation = function() { - if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) { - $(document).bind('keydown.fb', function(e) { - if (e.keyCode == 27 && currentOpts.enableEscapeButton) { - e.preventDefault(); - $.fancybox.close(); - - } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') { - e.preventDefault(); - $.fancybox[ e.keyCode == 37 ? 'prev' : 'next'](); - } - }); - } - - if (!currentOpts.showNavArrows) { - nav_left.hide(); - nav_right.hide(); - return; - } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { - nav_left.show(); - } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { - nav_right.show(); - } - }, - - _finish = function () { - if (!$.support.opacity) { - content.get(0).style.removeAttribute('filter'); - wrap.get(0).style.removeAttribute('filter'); - } - - if (selectedOpts.autoDimensions) { - content.css('height', 'auto'); - } - - wrap.css('height', 'auto'); - - if (titleStr && titleStr.length) { - title.show(); - } - - if (currentOpts.showCloseButton) { - close.show(); - } - - _set_navigation(); - - if (currentOpts.hideOnContentClick) { - content.bind('click', $.fancybox.close); - } - - if (currentOpts.hideOnOverlayClick) { - overlay.bind('click', $.fancybox.close); - } - - $(window).bind("resize.fb", $.fancybox.resize); - - if (currentOpts.centerOnScroll) { - $(window).bind("scroll.fb", $.fancybox.center); - } - - if (currentOpts.type == 'iframe') { - $('').appendTo(content); - } - - wrap.show(); - - busy = false; - - $.fancybox.center(); - - currentOpts.onComplete(currentArray, currentIndex, currentOpts); - - _preload_images(); - }, - - _preload_images = function() { - var href, - objNext; - - if ((currentArray.length -1) > currentIndex) { - href = currentArray[ currentIndex + 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - - if (currentIndex > 0) { - href = currentArray[ currentIndex - 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - }, - - _draw = function(pos) { - var dim = { - width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10), - height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10), - - top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10), - left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10) - }; - - if (typeof final_pos.opacity !== 'undefined') { - dim.opacity = pos < 0.5 ? 0.5 : pos; - } - - wrap.css(dim); - - content.css({ - 'width' : dim.width - currentOpts.padding * 2, - 'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2 - }); - }, - - _get_viewport = function() { - return [ - $(window).width() - (currentOpts.margin * 2), - $(window).height() - (currentOpts.margin * 2), - $(document).scrollLeft() + currentOpts.margin, - $(document).scrollTop() + currentOpts.margin - ]; - }, - - _get_zoom_to = function () { - var view = _get_viewport(), - to = {}, - resize = currentOpts.autoScale, - double_padding = currentOpts.padding * 2, - ratio; - - if (currentOpts.width.toString().indexOf('%') > -1) { - to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10); - } else { - to.width = currentOpts.width + double_padding; - } - - if (currentOpts.height.toString().indexOf('%') > -1) { - to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10); - } else { - to.height = currentOpts.height + double_padding; - } - - if (resize && (to.width > view[0] || to.height > view[1])) { - if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { - ratio = (currentOpts.width ) / (currentOpts.height ); - - if ((to.width ) > view[0]) { - to.width = view[0]; - to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10); - } - - if ((to.height) > view[1]) { - to.height = view[1]; - to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10); - } - - } else { - to.width = Math.min(to.width, view[0]); - to.height = Math.min(to.height, view[1]); - } - } - - to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10); - to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10); - - return to; - }, - - _get_obj_pos = function(obj) { - var pos = obj.offset(); - - pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0; - pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0; - - pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0; - pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0; - - pos.width = obj.width(); - pos.height = obj.height(); - - return pos; - }, - - _get_zoom_from = function() { - var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, - from = {}, - pos, - view; - - if (orig && orig.length) { - pos = _get_obj_pos(orig); - - from = { - width : pos.width + (currentOpts.padding * 2), - height : pos.height + (currentOpts.padding * 2), - top : pos.top - currentOpts.padding - 20, - left : pos.left - currentOpts.padding - 20 - }; - - } else { - view = _get_viewport(); - - from = { - width : currentOpts.padding * 2, - height : currentOpts.padding * 2, - top : parseInt(view[3] + view[1] * 0.5, 10), - left : parseInt(view[2] + view[0] * 0.5, 10) - }; - } - - return from; - }, - - _animate_loading = function() { - if (!loading.is(':visible')){ - clearInterval(loadingTimer); - return; - } - - $('div', loading).css('top', (loadingFrame * -40) + 'px'); - - loadingFrame = (loadingFrame + 1) % 12; - }; - - /* - * Public methods - */ - - $.fn.fancybox = function(options) { - if (!$(this).length) { - return this; - } - - $(this) - .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) - .unbind('click.fb') - .bind('click.fb', function(e) { - e.preventDefault(); - - if (busy) { - return; - } - - busy = true; - - $(this).blur(); - - selectedArray = []; - selectedIndex = 0; - - var rel = $(this).attr('rel') || ''; - - if (!rel || rel == '' || rel === 'nofollow') { - selectedArray.push(this); - - } else { - selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); - selectedIndex = selectedArray.index( this ); - } - - _start(); - - return; - }); - - return this; - }; - - $.fancybox = function(obj) { - var opts; - - if (busy) { - return; - } - - busy = true; - opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; - - selectedArray = []; - selectedIndex = parseInt(opts.index, 10) || 0; - - if ($.isArray(obj)) { - for (var i = 0, j = obj.length; i < j; i++) { - if (typeof obj[i] == 'object') { - $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); - } else { - obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); - } - } - - selectedArray = jQuery.merge(selectedArray, obj); - - } else { - if (typeof obj == 'object') { - $(obj).data('fancybox', $.extend({}, opts, obj)); - } else { - obj = $({}).data('fancybox', $.extend({content : obj}, opts)); - } - - selectedArray.push(obj); - } - - if (selectedIndex > selectedArray.length || selectedIndex < 0) { - selectedIndex = 0; - } - - _start(); - }; - - $.fancybox.showActivity = function() { - clearInterval(loadingTimer); - - loading.show(); - loadingTimer = setInterval(_animate_loading, 66); - }; - - $.fancybox.hideActivity = function() { - loading.hide(); - }; - - $.fancybox.next = function() { - return $.fancybox.pos( currentIndex + 1); - }; - - $.fancybox.prev = function() { - return $.fancybox.pos( currentIndex - 1); - }; - - $.fancybox.pos = function(pos) { - if (busy) { - return; - } - - pos = parseInt(pos); - - selectedArray = currentArray; - - if (pos > -1 && pos < currentArray.length) { - selectedIndex = pos; - _start(); - - } else if (currentOpts.cyclic && currentArray.length > 1) { - selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1; - _start(); - } - - return; - }; - - $.fancybox.cancel = function() { - if (busy) { - return; - } - - busy = true; - - $.event.trigger('fancybox-cancel'); - - _abort(); - - selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); - - busy = false; - }; - - // Note: within an iframe use - parent.$.fancybox.close(); - $.fancybox.close = function() { - if (busy || wrap.is(':hidden')) { - return; - } - - busy = true; - - if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { - busy = false; - return; - } - - _abort(); - - $(close.add( nav_left ).add( nav_right )).hide(); - - $(content.add( overlay )).unbind(); - - $(window).unbind("resize.fb scroll.fb"); - $(document).unbind('keydown.fb'); - - content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank'); - - if (currentOpts.titlePosition !== 'inside') { - title.empty(); - } - - wrap.stop(); - - function _cleanup() { - overlay.fadeOut('fast'); - - title.empty().hide(); - wrap.hide(); - - $.event.trigger('fancybox-cleanup'); - - content.empty(); - - currentOpts.onClosed(currentArray, currentIndex, currentOpts); - - currentArray = selectedOpts = []; - currentIndex = selectedIndex = 0; - currentOpts = selectedOpts = {}; - - busy = false; - } - - if (currentOpts.transitionOut == 'elastic') { - start_pos = _get_zoom_from(); - - var pos = wrap.position(); - - final_pos = { - top : pos.top , - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - if (currentOpts.opacity) { - final_pos.opacity = 1; - } - - title.empty().hide(); - - fx.prop = 1; - - $(fx).animate({ prop: 0 }, { - duration : currentOpts.speedOut, - easing : currentOpts.easingOut, - step : _draw, - complete : _cleanup - }); - - } else { - wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); - } - }; - - $.fancybox.resize = function() { - if (overlay.is(':visible')) { - overlay.css('height', $(document).height()); - } - - $.fancybox.center(true); - }; - - $.fancybox.center = function() { - var view, align; - - if (busy) { - return; - } - - align = arguments[0] === true ? 1 : 0; - view = _get_viewport(); - - if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) { - return; - } - - wrap - .stop() - .animate({ - 'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)), - 'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding)) - }, typeof arguments[0] == 'number' ? arguments[0] : 200); - }; - - $.fancybox.init = function() { - if ($("#fancybox-wrap").length) { - return; - } - - $('body').append( - tmp = $('
      '), - loading = $('
      '), - overlay = $('
      '), - wrap = $('
      ') - ); - - outer = $('
      ') - .append('
      ') - .appendTo( wrap ); - - outer.append( - content = $('
      '), - close = $(''), - title = $('
      '), - - nav_left = $(''), - nav_right = $('') - ); - - close.click($.fancybox.close); - loading.click($.fancybox.cancel); - - nav_left.click(function(e) { - e.preventDefault(); - $.fancybox.prev(); - }); - - nav_right.click(function(e) { - e.preventDefault(); - $.fancybox.next(); - }); - - if ($.fn.mousewheel) { - wrap.bind('mousewheel.fb', function(e, delta) { - if (busy) { - e.preventDefault(); - - } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) { - e.preventDefault(); - $.fancybox[ delta > 0 ? 'prev' : 'next'](); - } - }); - } - - if (!$.support.opacity) { - wrap.addClass('fancybox-ie'); - } - - if (isIE6) { - loading.addClass('fancybox-ie6'); - wrap.addClass('fancybox-ie6'); - - $('').prependTo(outer); - } - }; - - $.fn.fancybox.defaults = { - padding : 10, - margin : 40, - opacity : false, - modal : false, - cyclic : false, - scrolling : 'auto', // 'auto', 'yes' or 'no' - - width : 560, - height : 340, - - autoScale : true, - autoDimensions : true, - centerOnScroll : false, - - ajax : {}, - swf : { wmode: 'transparent' }, - - hideOnOverlayClick : true, - hideOnContentClick : false, - - overlayShow : true, - overlayOpacity : 0.7, - overlayColor : '#777', - - titleShow : true, - titlePosition : 'float', // 'float', 'outside', 'inside' or 'over' - titleFormat : null, - titleFromAlt : false, - - transitionIn : 'fade', // 'elastic', 'fade' or 'none' - transitionOut : 'fade', // 'elastic', 'fade' or 'none' - - speedIn : 300, - speedOut : 300, - - changeSpeed : 300, - changeFade : 'fast', - - easingIn : 'swing', - easingOut : 'swing', - - showCloseButton : true, - showNavArrows : true, - enableEscapeButton : true, - enableKeyboardNav : true, - - onStart : function(){}, - onCancel : function(){}, - onComplete : function(){}, - onCleanup : function(){}, - onClosed : function(){}, - onError : function(){} - }; - - $(document).ready(function() { - $.fancybox.init(); - }); - -})(jQuery); \ No newline at end of file diff --git a/js/fancybox/jquery.fancybox-1.3.4.pack.js b/js/fancybox/jquery.fancybox-1.3.4.pack.js deleted file mode 100644 index 1373ed0..0000000 --- a/js/fancybox/jquery.fancybox-1.3.4.pack.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. - * - * Version: 1.3.4 (11/11/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -;(function(b){var m,t,u,f,D,j,E,n,z,A,q=0,e={},o=[],p=0,d={},l=[],G=null,v=new Image,J=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,W=/[^\.]\.(swf)\s*$/i,K,L=1,y=0,s="",r,i,h=false,B=b.extend(b("
      ")[0],{prop:0}),M=b.browser.msie&&b.browser.version<7&&!window.XMLHttpRequest,N=function(){t.hide();v.onerror=v.onload=null;G&&G.abort();m.empty()},O=function(){if(false===e.onError(o,q,e)){t.hide();h=false}else{e.titleShow=false;e.width="auto";e.height="auto";m.html('

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

      '); -F()}},I=function(){var a=o[q],c,g,k,C,P,w;N();e=b.extend({},b.fn.fancybox.defaults,typeof b(a).data("fancybox")=="undefined"?e:b(a).data("fancybox"));w=e.onStart(o,q,e);if(w===false)h=false;else{if(typeof w=="object")e=b.extend(e,w);k=e.title||(a.nodeName?b(a).attr("title"):a.title)||"";if(a.nodeName&&!e.orig)e.orig=b(a).children("img:first").length?b(a).children("img:first"):b(a);if(k===""&&e.orig&&e.titleFromAlt)k=e.orig.attr("alt");c=e.href||(a.nodeName?b(a).attr("href"):a.href)||null;if(/^(?:javascript)/i.test(c)|| -c=="#")c=null;if(e.type){g=e.type;if(!c)c=e.content}else if(e.content)g="html";else if(c)g=c.match(J)?"image":c.match(W)?"swf":b(a).hasClass("iframe")?"iframe":c.indexOf("#")===0?"inline":"ajax";if(g){if(g=="inline"){a=c.substr(c.indexOf("#"));g=b(a).length>0?"inline":"ajax"}e.type=g;e.href=c;e.title=k;if(e.autoDimensions)if(e.type=="html"||e.type=="inline"||e.type=="ajax"){e.width="auto";e.height="auto"}else e.autoDimensions=false;if(e.modal){e.overlayShow=true;e.hideOnOverlayClick=false;e.hideOnContentClick= -false;e.enableEscapeButton=false;e.showCloseButton=false}e.padding=parseInt(e.padding,10);e.margin=parseInt(e.margin,10);m.css("padding",e.padding+e.margin);b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){b(this).replaceWith(j.children())});switch(g){case "html":m.html(e.content);F();break;case "inline":if(b(a).parent().is("#fancybox-content")===true){h=false;break}b('
      ').hide().insertBefore(b(a)).bind("fancybox-cleanup",function(){b(this).replaceWith(j.children())}).bind("fancybox-cancel", -function(){b(this).replaceWith(m.children())});b(a).appendTo(m);F();break;case "image":h=false;b.fancybox.showActivity();v=new Image;v.onerror=function(){O()};v.onload=function(){h=true;v.onerror=v.onload=null;e.width=v.width;e.height=v.height;b("").attr({id:"fancybox-img",src:v.src,alt:e.title}).appendTo(m);Q()};v.src=c;break;case "swf":e.scrolling="no";C='';P="";b.each(e.swf,function(x,H){C+='';P+=" "+x+'="'+H+'"'});C+='";m.html(C);F();break;case "ajax":h=false;b.fancybox.showActivity();e.ajax.win=e.ajax.success;G=b.ajax(b.extend({},e.ajax,{url:c,data:e.ajax.data||{},error:function(x){x.status>0&&O()},success:function(x,H,R){if((typeof R=="object"?R:G).status==200){if(typeof e.ajax.win== -"function"){w=e.ajax.win(c,x,H,R);if(w===false){t.hide();return}else if(typeof w=="string"||typeof w=="object")x=w}m.html(x);F()}}}));break;case "iframe":Q()}}else O()}},F=function(){var a=e.width,c=e.height;a=a.toString().indexOf("%")>-1?parseInt((b(window).width()-e.margin*2)*parseFloat(a)/100,10)+"px":a=="auto"?"auto":a+"px";c=c.toString().indexOf("%")>-1?parseInt((b(window).height()-e.margin*2)*parseFloat(c)/100,10)+"px":c=="auto"?"auto":c+"px";m.wrapInner('
      ');e.width=m.width();e.height=m.height();Q()},Q=function(){var a,c;t.hide();if(f.is(":visible")&&false===d.onCleanup(l,p,d)){b.event.trigger("fancybox-cancel");h=false}else{h=true;b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");f.is(":visible")&&d.titlePosition!=="outside"&&f.css("height",f.height());l=o;p=q;d=e;if(d.overlayShow){u.css({"background-color":d.overlayColor, -opacity:d.overlayOpacity,cursor:d.hideOnOverlayClick?"pointer":"auto",height:b(document).height()});if(!u.is(":visible")){M&&b("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});u.show()}}else u.hide();i=X();s=d.title||"";y=0;n.empty().removeAttr("style").removeClass();if(d.titleShow!==false){if(b.isFunction(d.titleFormat))a=d.titleFormat(s,l,p,d);else a=s&&s.length? -d.titlePosition=="float"?'
      '+s+'
      ':'
      '+s+"
      ":false;s=a;if(!(!s||s==="")){n.addClass("fancybox-title-"+d.titlePosition).html(s).appendTo("body").show();switch(d.titlePosition){case "inside":n.css({width:i.width-d.padding*2,marginLeft:d.padding,marginRight:d.padding}); -y=n.outerHeight(true);n.appendTo(D);i.height+=y;break;case "over":n.css({marginLeft:d.padding,width:i.width-d.padding*2,bottom:d.padding}).appendTo(D);break;case "float":n.css("left",parseInt((n.width()-i.width-40)/2,10)*-1).appendTo(f);break;default:n.css({width:i.width-d.padding*2,paddingLeft:d.padding,paddingRight:d.padding}).appendTo(f)}}}n.hide();if(f.is(":visible")){b(E.add(z).add(A)).hide();a=f.position();r={top:a.top,left:a.left,width:f.width(),height:f.height()};c=r.width==i.width&&r.height== -i.height;j.fadeTo(d.changeFade,0.3,function(){var g=function(){j.html(m.contents()).fadeTo(d.changeFade,1,S)};b.event.trigger("fancybox-change");j.empty().removeAttr("filter").css({"border-width":d.padding,width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2});if(c)g();else{B.prop=0;b(B).animate({prop:1},{duration:d.changeSpeed,easing:d.easingChange,step:T,complete:g})}})}else{f.removeAttr("style");j.css("border-width",d.padding);if(d.transitionIn=="elastic"){r=V();j.html(m.contents()); -f.show();if(d.opacity)i.opacity=0;B.prop=0;b(B).animate({prop:1},{duration:d.speedIn,easing:d.easingIn,step:T,complete:S})}else{d.titlePosition=="inside"&&y>0&&n.show();j.css({width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2}).html(m.contents());f.css(i).fadeIn(d.transitionIn=="none"?0:d.speedIn,S)}}}},Y=function(){if(d.enableEscapeButton||d.enableKeyboardNav)b(document).bind("keydown.fb",function(a){if(a.keyCode==27&&d.enableEscapeButton){a.preventDefault();b.fancybox.close()}else if((a.keyCode== -37||a.keyCode==39)&&d.enableKeyboardNav&&a.target.tagName!=="INPUT"&&a.target.tagName!=="TEXTAREA"&&a.target.tagName!=="SELECT"){a.preventDefault();b.fancybox[a.keyCode==37?"prev":"next"]()}});if(d.showNavArrows){if(d.cyclic&&l.length>1||p!==0)z.show();if(d.cyclic&&l.length>1||p!=l.length-1)A.show()}else{z.hide();A.hide()}},S=function(){if(!b.support.opacity){j.get(0).style.removeAttribute("filter");f.get(0).style.removeAttribute("filter")}e.autoDimensions&&j.css("height","auto");f.css("height","auto"); -s&&s.length&&n.show();d.showCloseButton&&E.show();Y();d.hideOnContentClick&&j.bind("click",b.fancybox.close);d.hideOnOverlayClick&&u.bind("click",b.fancybox.close);b(window).bind("resize.fb",b.fancybox.resize);d.centerOnScroll&&b(window).bind("scroll.fb",b.fancybox.center);if(d.type=="iframe")b('').appendTo(j); -f.show();h=false;b.fancybox.center();d.onComplete(l,p,d);var a,c;if(l.length-1>p){a=l[p+1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}if(p>0){a=l[p-1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}},T=function(a){var c={width:parseInt(r.width+(i.width-r.width)*a,10),height:parseInt(r.height+(i.height-r.height)*a,10),top:parseInt(r.top+(i.top-r.top)*a,10),left:parseInt(r.left+(i.left-r.left)*a,10)};if(typeof i.opacity!=="undefined")c.opacity=a<0.5?0.5:a;f.css(c); -j.css({width:c.width-d.padding*2,height:c.height-y*a-d.padding*2})},U=function(){return[b(window).width()-d.margin*2,b(window).height()-d.margin*2,b(document).scrollLeft()+d.margin,b(document).scrollTop()+d.margin]},X=function(){var a=U(),c={},g=d.autoScale,k=d.padding*2;c.width=d.width.toString().indexOf("%")>-1?parseInt(a[0]*parseFloat(d.width)/100,10):d.width+k;c.height=d.height.toString().indexOf("%")>-1?parseInt(a[1]*parseFloat(d.height)/100,10):d.height+k;if(g&&(c.width>a[0]||c.height>a[1]))if(e.type== -"image"||e.type=="swf"){g=d.width/d.height;if(c.width>a[0]){c.width=a[0];c.height=parseInt((c.width-k)/g+k,10)}if(c.height>a[1]){c.height=a[1];c.width=parseInt((c.height-k)*g+k,10)}}else{c.width=Math.min(c.width,a[0]);c.height=Math.min(c.height,a[1])}c.top=parseInt(Math.max(a[3]-20,a[3]+(a[1]-c.height-40)*0.5),10);c.left=parseInt(Math.max(a[2]-20,a[2]+(a[0]-c.width-40)*0.5),10);return c},V=function(){var a=e.orig?b(e.orig):false,c={};if(a&&a.length){c=a.offset();c.top+=parseInt(a.css("paddingTop"), -10)||0;c.left+=parseInt(a.css("paddingLeft"),10)||0;c.top+=parseInt(a.css("border-top-width"),10)||0;c.left+=parseInt(a.css("border-left-width"),10)||0;c.width=a.width();c.height=a.height();c={width:c.width+d.padding*2,height:c.height+d.padding*2,top:c.top-d.padding-20,left:c.left-d.padding-20}}else{a=U();c={width:d.padding*2,height:d.padding*2,top:parseInt(a[3]+a[1]*0.5,10),left:parseInt(a[2]+a[0]*0.5,10)}}return c},Z=function(){if(t.is(":visible")){b("div",t).css("top",L*-40+"px");L=(L+1)%12}else clearInterval(K)}; -b.fn.fancybox=function(a){if(!b(this).length)return this;b(this).data("fancybox",b.extend({},a,b.metadata?b(this).metadata():{})).unbind("click.fb").bind("click.fb",function(c){c.preventDefault();if(!h){h=true;b(this).blur();o=[];q=0;c=b(this).attr("rel")||"";if(!c||c==""||c==="nofollow")o.push(this);else{o=b("a[rel="+c+"], area[rel="+c+"]");q=o.index(this)}I()}});return this};b.fancybox=function(a,c){var g;if(!h){h=true;g=typeof c!=="undefined"?c:{};o=[];q=parseInt(g.index,10)||0;if(b.isArray(a)){for(var k= -0,C=a.length;ko.length||q<0)q=0;I()}};b.fancybox.showActivity=function(){clearInterval(K);t.show();K=setInterval(Z,66)};b.fancybox.hideActivity=function(){t.hide()};b.fancybox.next=function(){return b.fancybox.pos(p+ -1)};b.fancybox.prev=function(){return b.fancybox.pos(p-1)};b.fancybox.pos=function(a){if(!h){a=parseInt(a);o=l;if(a>-1&&a1){q=a>=l.length?0:l.length-1;I()}}};b.fancybox.cancel=function(){if(!h){h=true;b.event.trigger("fancybox-cancel");N();e.onCancel(o,q,e);h=false}};b.fancybox.close=function(){function a(){u.fadeOut("fast");n.empty().hide();f.hide();b.event.trigger("fancybox-cleanup");j.empty();d.onClosed(l,p,d);l=e=[];p=q=0;d=e={};h=false}if(!(h||f.is(":hidden"))){h= -true;if(d&&false===d.onCleanup(l,p,d))h=false;else{N();b(E.add(z).add(A)).hide();b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");j.find("iframe").attr("src",M&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");d.titlePosition!=="inside"&&n.empty();f.stop();if(d.transitionOut=="elastic"){r=V();var c=f.position();i={top:c.top,left:c.left,width:f.width(),height:f.height()};if(d.opacity)i.opacity=1;n.empty().hide();B.prop=1; -b(B).animate({prop:0},{duration:d.speedOut,easing:d.easingOut,step:T,complete:a})}else f.fadeOut(d.transitionOut=="none"?0:d.speedOut,a)}}};b.fancybox.resize=function(){u.is(":visible")&&u.css("height",b(document).height());b.fancybox.center(true)};b.fancybox.center=function(a){var c,g;if(!h){g=a===true?1:0;c=U();!g&&(f.width()>c[0]||f.height()>c[1])||f.stop().animate({top:parseInt(Math.max(c[3]-20,c[3]+(c[1]-j.height()-40)*0.5-d.padding)),left:parseInt(Math.max(c[2]-20,c[2]+(c[0]-j.width()-40)*0.5- -d.padding))},typeof a=="number"?a:200)}};b.fancybox.init=function(){if(!b("#fancybox-wrap").length){b("body").append(m=b('
      '),t=b('
      '),u=b('
      '),f=b('
      '));D=b('
      ').append('
      ').appendTo(f); -D.append(j=b('
      '),E=b(''),n=b('
      '),z=b(''),A=b(''));E.click(b.fancybox.close);t.click(b.fancybox.cancel);z.click(function(a){a.preventDefault();b.fancybox.prev()});A.click(function(a){a.preventDefault();b.fancybox.next()}); -b.fn.mousewheel&&f.bind("mousewheel.fb",function(a,c){if(h)a.preventDefault();else if(b(a.target).get(0).clientHeight==0||b(a.target).get(0).scrollHeight===b(a.target).get(0).clientHeight){a.preventDefault();b.fancybox[c>0?"prev":"next"]()}});b.support.opacity||f.addClass("fancybox-ie");if(M){t.addClass("fancybox-ie6");f.addClass("fancybox-ie6");b('').prependTo(D)}}}; -b.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing", -easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};b(document).ready(function(){b.fancybox.init()})})(jQuery); \ No newline at end of file diff --git a/js/fancybox/jquery.fancybox.css b/js/fancybox/jquery.fancybox.css new file mode 100644 index 0000000..d6ff8a1 --- /dev/null +++ b/js/fancybox/jquery.fancybox.css @@ -0,0 +1,249 @@ +/*! fancyBox v2.1.3 fancyapps.com | fancyapps.com/fancybox/#license */ +.fancybox-wrap, +.fancybox-skin, +.fancybox-outer, +.fancybox-inner, +.fancybox-image, +.fancybox-wrap iframe, +.fancybox-wrap object, +.fancybox-nav, +.fancybox-nav span, +.fancybox-tmp +{ + padding: 0; + margin: 0; + border: 0; + outline: none; + vertical-align: top; +} + +.fancybox-wrap { + position: absolute; + top: 0; + left: 0; + z-index: 8020; +} + +.fancybox-skin { + position: relative; + background: #f9f9f9; + color: #444; + text-shadow: none; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.fancybox-opened { + z-index: 8030; +} + +.fancybox-opened .fancybox-skin { + -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); +} + +.fancybox-outer, .fancybox-inner { + position: relative; +} + +.fancybox-inner { + overflow: hidden; +} + +.fancybox-type-iframe .fancybox-inner { + -webkit-overflow-scrolling: touch; +} + +.fancybox-error { + color: #444; + font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; + margin: 0; + padding: 15px; + white-space: nowrap; +} + +.fancybox-image, .fancybox-iframe { + display: block; + width: 100%; + height: 100%; +} + +.fancybox-image { + max-width: 100%; + max-height: 100%; +} + +#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { + background-image: url('fancybox_sprite.png'); +} + +#fancybox-loading { + position: fixed; + top: 50%; + left: 50%; + margin-top: -22px; + margin-left: -22px; + background-position: 0 -108px; + opacity: 0.8; + cursor: pointer; + z-index: 8060; +} + +#fancybox-loading div { + width: 44px; + height: 44px; + background: url('fancybox_loading.gif') center center no-repeat; +} + +.fancybox-close { + position: absolute; + top: -18px; + right: -18px; + width: 36px; + height: 36px; + cursor: pointer; + z-index: 8040; +} + +.fancybox-nav { + position: absolute; + top: 0; + width: 40%; + height: 100%; + cursor: pointer; + text-decoration: none; + background: transparent url('blank.gif'); /* helps IE */ + -webkit-tap-highlight-color: rgba(0,0,0,0); + z-index: 8040; +} + +.fancybox-prev { + left: 0; +} + +.fancybox-next { + right: 0; +} + +.fancybox-nav span { + position: absolute; + top: 50%; + width: 36px; + height: 34px; + margin-top: -18px; + cursor: pointer; + z-index: 8040; + visibility: hidden; +} + +.fancybox-prev span { + left: 10px; + background-position: 0 -36px; +} + +.fancybox-next span { + right: 10px; + background-position: 0 -72px; +} + +.fancybox-nav:hover span { + visibility: visible; +} + +.fancybox-tmp { + position: absolute; + top: -99999px; + left: -99999px; + visibility: hidden; + max-width: 99999px; + max-height: 99999px; + overflow: visible !important; +} + +/* Overlay helper */ + +.fancybox-lock { + overflow: hidden; +} + +.fancybox-overlay { + position: absolute; + top: 0; + left: 0; + overflow: hidden; + display: none; + z-index: 8010; + background: url('fancybox_overlay.png'); +} + +.fancybox-overlay-fixed { + position: fixed; + bottom: 0; + right: 0; +} + +.fancybox-lock .fancybox-overlay { + overflow: auto; + overflow-y: scroll; +} + +/* Title helper */ + +.fancybox-title { + visibility: hidden; + font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; + position: relative; + text-shadow: none; + z-index: 8050; +} + +.fancybox-opened .fancybox-title { + visibility: visible; +} + +.fancybox-title-float-wrap { + position: absolute; + bottom: 0; + right: 50%; + margin-bottom: -35px; + z-index: 8050; + text-align: center; +} + +.fancybox-title-float-wrap .child { + display: inline-block; + margin-right: -100%; + padding: 2px 20px; + background: transparent; /* Fallback for web browsers that doesn't support RGBa */ + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + text-shadow: 0 1px 2px #222; + color: #FFF; + font-weight: bold; + line-height: 24px; + white-space: nowrap; +} + +.fancybox-title-outside-wrap { + position: relative; + margin-top: 10px; + color: #fff; +} + +.fancybox-title-inside-wrap { + padding-top: 10px; +} + +.fancybox-title-over-wrap { + position: absolute; + bottom: 0; + left: 0; + color: #fff; + padding: 10px; + background: #000; + background: rgba(0, 0, 0, .8); +} \ No newline at end of file diff --git a/js/fancybox/jquery.fancybox.js b/js/fancybox/jquery.fancybox.js new file mode 100644 index 0000000..ee88e35 --- /dev/null +++ b/js/fancybox/jquery.fancybox.js @@ -0,0 +1,1985 @@ +/*! + * fancyBox - jQuery Plugin + * version: 2.1.3 (Tue, 23 Oct 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 ); + }, + didUpdate = null, + isTouch = document.createTouch !== undefined, + + isQuery = function(obj) { + return obj && obj.hasOwnProperty && obj instanceof $; + }, + isString = function(str) { + return str && $.type(str) === "string"; + }, + isPercentage = function(str) { + return isString(str) && str.indexOf('%') > 0; + }, + isScrollable = function(el) { + return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight))); + }, + getScalar = function(orig, dim) { + var value = parseInt(orig, 10) || 0; + + if (dim && isPercentage(orig)) { + value = F.getViewport()[ dim ] / 100 * value; + } + + return Math.ceil(value); + }, + getValue = function(value, dim) { + return getScalar(value, dim) + 'px'; + }; + + $.extend(F, { + // The current version of fancyBox + version: '2.1.3', + + defaults: { + padding : 15, + margin : 20, + + width : 800, + height : 600, + minWidth : 100, + minHeight : 100, + maxWidth : 9999, + maxHeight : 9999, + + autoSize : true, + autoHeight : false, + autoWidth : false, + + autoResize : true, + autoCenter : !isTouch, + fitToView : true, + aspectRatio : false, + topRatio : 0.5, + leftRatio : 0.5, + + 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 } + }, + iframe : { + scrolling : 'auto', + preload : true + }, + swf : { + wmode: 'transparent', + allowfullscreen : 'true', + allowscriptaccess : 'always' + }, + + keys : { + next : { + 13 : 'left', // enter + 34 : 'up', // page down + 39 : 'left', // right arrow + 40 : 'up' // down arrow + }, + prev : { + 8 : 'right', // backspace + 33 : 'down', // page up + 37 : 'right', // left arrow + 38 : 'down' // up arrow + }, + close : [27], // escape key + play : [32], // space - start/stop slideshow + toggle : [70] // letter "f" - toggle fullscreen + }, + + direction : { + next : 'left', + prev : 'right' + }, + + scrollOutside : true, + + // Override some properties + index : 0, + type : null, + href : null, + content : null, + title : null, + + // HTML templates + tpl: { + wrap : '
      ', + image : '', + iframe : '', + error : '

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

      ', + closeBtn : '', + next : '', + prev : '' + }, + + // Properties for each animation type + // Opening fancyBox + openEffect : 'fade', // 'elastic', 'fade' or 'none' + openSpeed : 250, + openEasing : 'swing', + openOpacity : true, + openMethod : 'zoomIn', + + // Closing fancyBox + closeEffect : 'fade', // 'elastic', 'fade' or 'none' + closeSpeed : 250, + closeEasing : 'swing', + closeOpacity : true, + closeMethod : 'zoomOut', + + // Changing next gallery item + nextEffect : 'elastic', // 'elastic', 'fade' or 'none' + nextSpeed : 250, + nextEasing : 'swing', + nextMethod : 'changeIn', + + // Changing previous gallery item + prevEffect : 'elastic', // 'elastic', 'fade' or 'none' + prevSpeed : 250, + prevEasing : 'swing', + prevMethod : 'changeOut', + + // Enable default helpers + helpers : { + overlay : true, + title : true + }, + + // Callbacks + onCancel : $.noop, // If canceling + beforeLoad : $.noop, // Before loading + afterLoad : $.noop, // After loading + beforeShow : $.noop, // Before changing in current item + afterShow : $.noop, // After opening + beforeChange : $.noop, // Before changing gallery item + beforeClose : $.noop, // Before closing + afterClose : $.noop // After closing + }, + + //Current state + group : {}, // Selected group + opts : {}, // Group options + previous : null, // Previous element + coming : null, // Element being loaded + current : null, // Currently loaded element + isActive : false, // Is activated + 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) { + if (!group) { + return; + } + + if (!$.isPlainObject(opts)) { + opts = {}; + } + + // Close if already active + if (false === F.close(true)) { + return; + } + + // Normalize group + if (!$.isArray(group)) { + group = isQuery(group) ? $(group).get() : [group]; + } + + // Recheck if the type of each element is `object` and set content type (image, ajax, etc) + $.each(group, function(i, element) { + var obj = {}, + href, + title, + content, + type, + rez, + hrefParts, + selector; + + if ($.type(element) === "object") { + // Check if is DOM element + if (element.nodeType) { + element = $(element); + } + + if (isQuery(element)) { + obj = { + href : element.data('fancybox-href') || element.attr('href'), + title : element.data('fancybox-title') || element.attr('title'), + isDom : true, + element : element + }; + + if ($.metadata) { + $.extend(true, obj, element.metadata()); + } + + } else { + obj = element; + } + } + + href = opts.href || obj.href || (isString(element) ? element : null); + title = opts.title !== undefined ? opts.title : obj.title || ''; + + content = opts.content || obj.content; + type = content ? 'html' : (opts.type || obj.type); + + if (!type && obj.isDom) { + type = element.data('fancybox-type'); + + if (!type) { + rez = element.prop('class').match(/fancybox\.(\w+)/); + type = rez ? rez[1] : null; + } + } + + if (isString(href)) { + // Try to guess the content type + if (!type) { + if (F.isImage(href)) { + type = 'image'; + + } else if (F.isSWF(href)) { + type = 'swf'; + + } else if (href.charAt(0) === '#') { + type = 'inline'; + + } else if (isString(element)) { + type = 'html'; + content = element; + } + } + + // Split url into two pieces with source url and content selector, e.g, + // "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id" + if (type === 'ajax') { + hrefParts = href.split(/\s+/, 2); + href = hrefParts.shift(); + selector = hrefParts.shift(); + } + } + + if (!content) { + if (type === 'inline') { + if (href) { + content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7 + + } else if (obj.isDom) { + content = element; + } + + } else if (type === 'html') { + content = href; + + } else if (!type && !href && obj.isDom) { + type = 'inline'; + content = element; + } + } + + $.extend(obj, { + href : href, + type : type, + content : content, + title : title, + selector : selector + }); + + group[ i ] = obj; + }); + + // Extend the defaults + F.opts = $.extend(true, {}, F.defaults, opts); + + // All options are merged recursive except keys + if (opts.keys !== undefined) { + F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false; + } + + F.group = group; + + return F._start(F.opts.index); + }, + + // Cancel image loading or abort ajax request + cancel: function () { + var coming = F.coming; + + if (!coming || false === F.trigger('onCancel')) { + return; + } + + F.hideLoading(); + + if (F.ajaxLoad) { + F.ajaxLoad.abort(); + } + + F.ajaxLoad = null; + + if (F.imgPreload) { + F.imgPreload.onload = F.imgPreload.onerror = null; + } + + if (coming.wrap) { + coming.wrap.stop(true, true).trigger('onReset').remove(); + } + + F.coming = null; + + // If the first item has been canceled, then clear everything + if (!F.current) { + F._afterZoomOut( coming ); + } + }, + + // Start closing animation if is open; remove immediately if opening/closing + close: function (event) { + F.cancel(); + + if (false === F.trigger('beforeClose')) { + return; + } + + F.unbindEvents(); + + if (!F.isActive) { + return; + } + + if (!F.isOpen || event === true) { + $('.fancybox-wrap').stop(true).trigger('onReset').remove(); + + F._afterZoomOut(); + + } else { + F.isOpen = F.isOpened = false; + F.isClosing = true; + + $('.fancybox-item, .fancybox-nav').remove(); + + F.wrap.stop(true, true).removeClass('fancybox-opened'); + + F.transitions[ F.current.closeMethod ](); + } + }, + + // Manage slideshow: + // $.fancybox.play(); - toggle slideshow + // $.fancybox.play( true ); - start + // $.fancybox.play( false ); - stop + play: function ( action ) { + 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 (action === true || (!F.player.isActive && action !== false)) { + start(); + } else { + stop(); + } + }, + + // Navigate to next gallery item + next: function ( direction ) { + var current = F.current; + + if (current) { + if (!isString(direction)) { + direction = current.direction.next; + } + + F.jumpto(current.index + 1, direction, 'next'); + } + }, + + // Navigate to previous gallery item + prev: function ( direction ) { + var current = F.current; + + if (current) { + if (!isString(direction)) { + direction = current.direction.prev; + } + + F.jumpto(current.index - 1, direction, 'prev'); + } + }, + + // Navigate to gallery item by index + jumpto: function ( index, direction, router ) { + var current = F.current; + + if (!current) { + return; + } + + index = getScalar(index); + + F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ]; + F.router = router || 'jumpto'; + + if (current.loop) { + if (index < 0) { + index = current.group.length + (index % current.group.length); + } + + index = index % current.group.length; + } + + if (current.group[ index ] !== undefined) { + F.cancel(); + + F._start(index); + } + }, + + // Center inside viewport and toggle position type to fixed or absolute if needed + reposition: function (e, onlyAbsolute) { + var current = F.current, + wrap = current ? current.wrap : null, + pos; + + if (wrap) { + pos = F._getPosition(onlyAbsolute); + + if (e && e.type === 'scroll') { + delete pos.position; + + wrap.stop(true, true).animate(pos, 200); + + } else { + wrap.css(pos); + + current.pos = $.extend({}, current.dim, pos); + } + } + }, + + update: function (e) { + var type = (e && e.type), + anyway = !type || type === 'orientationchange'; + + if (anyway) { + clearTimeout(didUpdate); + + didUpdate = null; + } + + if (!F.isOpen || didUpdate) { + return; + } + + didUpdate = setTimeout(function() { + var current = F.current; + + if (!current || F.isClosing) { + return; + } + + F.wrap.removeClass('fancybox-tmp'); + + if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) { + F._setDimension(); + } + + if (!(type === 'scroll' && current.canShrink)) { + F.reposition(e); + } + + F.trigger('onUpdate'); + + didUpdate = null; + + }, (anyway && !isTouch ? 0 : 300)); + }, + + // Shrink content to fit inside viewport or restore if resized + toggle: function ( action ) { + if (F.isOpen) { + F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView; + + // Help browser to restore document dimensions + if (isTouch) { + F.wrap.removeAttr('style').addClass('fancybox-tmp'); + + F.trigger('onUpdate'); + } + + F.update(); + } + }, + + hideLoading: function () { + D.unbind('.loading'); + + $('#fancybox-loading').remove(); + }, + + showLoading: function () { + var el, viewport; + + F.hideLoading(); + + el = $('
      ').click(F.cancel).appendTo('body'); + + // If user will press the escape-button, the request will be canceled + D.bind('keydown.loading', function(e) { + if ((e.which || e.keyCode) === 27) { + e.preventDefault(); + + F.cancel(); + } + }); + + if (!F.defaults.fixed) { + viewport = F.getViewport(); + + el.css({ + position : 'absolute', + top : (viewport.h * 0.5) + viewport.y, + left : (viewport.w * 0.5) + viewport.x + }); + } + }, + + getViewport: function () { + var locked = (F.current && F.current.locked) || false, + rez = { + x: W.scrollLeft(), + y: W.scrollTop() + }; + + if (locked) { + rez.w = locked[0].clientWidth; + rez.h = locked[0].clientHeight; + + } else { + // See http://bugs.jquery.com/ticket/6724 + rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width(); + rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height(); + } + + return rez; + }, + + // Unbind the keyboard / clicking actions + unbindEvents: function () { + if (F.wrap && isQuery(F.wrap)) { + F.wrap.unbind('.fb'); + } + + D.unbind('.fb'); + W.unbind('.fb'); + }, + + bindEvents: function () { + var current = F.current, + keys; + + if (!current) { + return; + } + + // Changing document height on iOS devices triggers a 'resize' event, + // that can change document height... repeating infinitely + W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update); + + keys = current.keys; + + if (keys) { + D.bind('keydown.fb', function (e) { + var code = e.which || e.keyCode, + target = e.target || e.srcElement; + + // Skip esc key if loading, because showLoading will cancel preloading + if (code === 27 && F.coming) { + return false; + } + + // Ignore key combinations and key events within form elements + if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) { + $.each(keys, function(i, val) { + if (current.group.length > 1 && val[ code ] !== undefined) { + F[ i ]( val[ code ] ); + + e.preventDefault(); + return false; + } + + if ($.inArray(code, val) > -1) { + F[ i ] (); + + e.preventDefault(); + return false; + } + }); + } + }); + } + + if ($.fn.mousewheel && current.mouseWheel) { + F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) { + var target = e.target || null, + parent = $(target), + canScroll = false; + + while (parent.length) { + if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) { + break; + } + + canScroll = isScrollable( parent[0] ); + parent = $(parent).parent(); + } + + if (delta !== 0 && !canScroll) { + if (F.group.length > 1 && !current.canShrink) { + if (deltaY > 0 || deltaX > 0) { + F.prev( deltaY > 0 ? 'down' : 'left' ); + + } else if (deltaY < 0 || deltaX < 0) { + F.next( deltaY < 0 ? 'up' : 'right' ); + } + + e.preventDefault(); + } + } + }); + } + }, + + trigger: function (event, o) { + var ret, obj = o || F.coming || F.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 && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) { + opts = $.extend(true, {}, F.helpers[helper].defaults, opts); + + F.helpers[helper][event](opts, obj); + } + }); + } + + $.event.trigger(event + '.fb'); + }, + + isImage: function (str) { + return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp)((\?|#).*)?$)/i); + }, + + isSWF: function (str) { + return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i); + }, + + _start: function (index) { + var coming = {}, + obj, + href, + type, + margin, + padding; + + index = getScalar( index ); + obj = F.group[ index ] || null; + + if (!obj) { + return false; + } + + coming = $.extend(true, {}, F.opts, obj); + + // Convert margin and padding properties to array - top, right, bottom, left + margin = coming.margin; + padding = coming.padding; + + if ($.type(margin) === 'number') { + coming.margin = [margin, margin, margin, margin]; + } + + if ($.type(padding) === 'number') { + coming.padding = [padding, padding, padding, padding]; + } + + // '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 : { + closeClick : false + } + } + }); + } + + // 'autoSize' property is a shortcut, too + if (coming.autoSize) { + coming.autoWidth = coming.autoHeight = true; + } + + if (coming.width === 'auto') { + coming.autoWidth = true; + } + + if (coming.height === 'auto') { + coming.autoHeight = true; + } + + /* + * 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 : ''); + * } + */ + + coming.group = F.group; + coming.index = index; + + // 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; + + if (!type) { + F.coming = null; + + //If we can not determine content type then drop silently or display next/prev item if looping through gallery + if (F.current && F.router && F.router !== 'jumpto') { + F.current.index = index; + + return F[ F.router ]( F.direction ); + } + + return false; + } + + F.isActive = true; + + if (type === 'image' || type === 'swf') { + coming.autoHeight = coming.autoWidth = false; + coming.scrolling = 'visible'; + } + + if (type === 'image') { + coming.aspectRatio = true; + } + + if (type === 'iframe' && isTouch) { + coming.scrolling = 'scroll'; + } + + // Build the neccessary markup + coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' ); + + $.extend(coming, { + skin : $('.fancybox-skin', coming.wrap), + outer : $('.fancybox-outer', coming.wrap), + inner : $('.fancybox-inner', coming.wrap) + }); + + $.each(["Top", "Right", "Bottom", "Left"], function(i, v) { + coming.skin.css('padding' + v, getValue(coming.padding[ i ])); + }); + + F.trigger('onReady'); + + // Check before try to load; 'inline' and 'html' types need content, others - href + if (type === 'inline' || type === 'html') { + if (!coming.content || !coming.content.length) { + return F._error( 'content' ); + } + + } else if (!href) { + return F._error( 'href' ); + } + + if (type === 'image') { + F._loadImage(); + + } else if (type === 'ajax') { + F._loadAjax(); + + } else if (type === 'iframe') { + F._loadIframe(); + + } else { + F._afterLoad(); + } + }, + + _error: function ( type ) { + $.extend(F.coming, { + type : 'html', + autoWidth : true, + autoHeight : true, + minWidth : 0, + minHeight : 0, + scrolling : 'no', + 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 !== true) { + F.showLoading(); + } + }, + + _loadAjax: function () { + var coming = F.coming; + + F.showLoading(); + + F.ajaxLoad = $.ajax($.extend({}, coming.ajax, { + url: 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') { + coming.content = data; + + F._afterLoad(); + } + } + })); + }, + + _loadIframe: function() { + var coming = F.coming, + iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime())) + .attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling) + .attr('src', coming.href); + + // This helps IE + $(coming.wrap).bind('onReset', function () { + try { + $(this).find('iframe').hide().attr('src', '//about:blank').end().empty(); + } catch (e) {} + }); + + if (coming.iframe.preload) { + F.showLoading(); + + iframe.one('load', function() { + $(this).data('ready', 1); + + // iOS will lose scrolling if we resize + if (!isTouch) { + $(this).bind('load.fb', F.update); + } + + // Without this trick: + // - iframe won't scroll on iOS devices + // - IE7 sometimes displays empty iframe + $(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show(); + + F._afterLoad(); + }); + } + + coming.content = iframe.appendTo( coming.inner ); + + if (!coming.iframe.preload) { + F._afterLoad(); + } + }, + + _preloadImages: function() { + var group = F.group, + current = F.current, + len = group.length, + cnt = current.preload ? Math.min(current.preload, len - 1) : 0, + item, + i; + + for (i = 1; i <= cnt; i += 1) { + item = group[ (current.index + i ) % len ]; + + if (item.type === 'image' && item.href) { + new Image().src = item.href; + } + } + }, + + _afterLoad: function () { + var coming = F.coming, + previous = F.current, + placeholder = 'fancybox-placeholder', + current, + content, + type, + scrolling, + href, + embed; + + F.hideLoading(); + + if (!coming || F.isActive === false) { + return; + } + + if (false === F.trigger('afterLoad', coming, previous)) { + coming.wrap.stop(true).trigger('onReset').remove(); + + F.coming = null; + + return; + } + + if (previous) { + F.trigger('beforeChange', previous); + + previous.wrap.stop(true).removeClass('fancybox-opened') + .find('.fancybox-item, .fancybox-nav') + .remove(); + } + + F.unbindEvents(); + + current = coming; + content = coming.content; + type = coming.type; + scrolling = coming.scrolling; + + $.extend(F, { + wrap : current.wrap, + skin : current.skin, + outer : current.outer, + inner : current.inner, + current : current, + previous : previous + }); + + href = current.href; + + switch (type) { + case 'inline': + case 'ajax': + case 'html': + if (current.selector) { + content = $('
      ').html(content).find(current.selector); + + } else if (isQuery(content)) { + if (!content.data(placeholder)) { + content.data(placeholder, $('
      ').insertAfter( content ).hide() ); + } + + content = content.show().detach(); + + current.wrap.bind('onReset', function () { + if ($(this).find(content).length) { + content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false); + } + }); + } + break; + + case 'image': + content = current.tpl.image.replace('{href}', href); + break; + + case 'swf': + content = ''; + embed = ''; + + $.each(current.swf, function(name, val) { + content += ''; + embed += ' ' + name + '="' + val + '"'; + }); + + content += ''; + break; + } + + if (!(isQuery(content) && content.parent().is(current.inner))) { + current.inner.append( content ); + } + + // Give a chance for helpers or callbacks to update elements + F.trigger('beforeShow'); + + // Set scrolling before calculating dimensions + current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling)); + + // Set initial dimensions and start position + F._setDimension(); + + F.reposition(); + + F.isOpen = false; + F.coming = null; + + F.bindEvents(); + + if (!F.isOpened) { + $('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove(); + + } else if (previous.prevMethod) { + F.transitions[ previous.prevMethod ](); + } + + F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ](); + + F._preloadImages(); + }, + + _setDimension: function () { + var viewport = F.getViewport(), + steps = 0, + canShrink = false, + canExpand = false, + wrap = F.wrap, + skin = F.skin, + inner = F.inner, + current = F.current, + width = current.width, + height = current.height, + minWidth = current.minWidth, + minHeight = current.minHeight, + maxWidth = current.maxWidth, + maxHeight = current.maxHeight, + scrolling = current.scrolling, + scrollOut = current.scrollOutside ? current.scrollbarWidth : 0, + margin = current.margin, + wMargin = getScalar(margin[1] + margin[3]), + hMargin = getScalar(margin[0] + margin[2]), + wPadding, + hPadding, + wSpace, + hSpace, + origWidth, + origHeight, + origMaxWidth, + origMaxHeight, + ratio, + width_, + height_, + maxWidth_, + maxHeight_, + iframe, + body; + + // Reset dimensions so we could re-check actual size + wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp'); + + wPadding = getScalar(skin.outerWidth(true) - skin.width()); + hPadding = getScalar(skin.outerHeight(true) - skin.height()); + + // Any space between content and viewport (margin, padding, border, title) + wSpace = wMargin + wPadding; + hSpace = hMargin + hPadding; + + origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width; + origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height; + + if (current.type === 'iframe') { + iframe = current.content; + + if (current.autoHeight && iframe.data('ready') === 1) { + try { + if (iframe[0].contentWindow.document.location) { + inner.width( origWidth ).height(9999); + + body = iframe.contents().find('body'); + + if (scrollOut) { + body.css('overflow-x', 'hidden'); + } + + origHeight = body.height(); + } + + } catch (e) {} + } + + } else if (current.autoWidth || current.autoHeight) { + inner.addClass( 'fancybox-tmp' ); + + // Set width or height in case we need to calculate only one dimension + if (!current.autoWidth) { + inner.width( origWidth ); + } + + if (!current.autoHeight) { + inner.height( origHeight ); + } + + if (current.autoWidth) { + origWidth = inner.width(); + } + + if (current.autoHeight) { + origHeight = inner.height(); + } + + inner.removeClass( 'fancybox-tmp' ); + } + + width = getScalar( origWidth ); + height = getScalar( origHeight ); + + ratio = origWidth / origHeight; + + // Calculations for the content + minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth); + maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth); + + minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight); + maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight); + + // These will be used to determine if wrap can fit in the viewport + origMaxWidth = maxWidth; + origMaxHeight = maxHeight; + + if (current.fitToView) { + maxWidth = Math.min(viewport.w - wSpace, maxWidth); + maxHeight = Math.min(viewport.h - hSpace, maxHeight); + } + + maxWidth_ = viewport.w - wMargin; + maxHeight_ = viewport.h - hMargin; + + if (current.aspectRatio) { + if (width > maxWidth) { + width = maxWidth; + height = getScalar(width / ratio); + } + + if (height > maxHeight) { + height = maxHeight; + width = getScalar(height * ratio); + } + + if (width < minWidth) { + width = minWidth; + height = getScalar(width / ratio); + } + + if (height < minHeight) { + height = minHeight; + width = getScalar(height * ratio); + } + + } else { + width = Math.max(minWidth, Math.min(width, maxWidth)); + + if (current.autoHeight && current.type !== 'iframe') { + inner.width( width ); + + height = inner.height(); + } + + height = Math.max(minHeight, Math.min(height, maxHeight)); + } + + // Try to fit inside viewport (including the title) + if (current.fitToView) { + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + // Real wrap dimensions + width_ = wrap.width(); + height_ = wrap.height(); + + if (current.aspectRatio) { + while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) { + if (steps++ > 19) { + break; + } + + height = Math.max(minHeight, Math.min(maxHeight, height - 10)); + width = getScalar(height * ratio); + + if (width < minWidth) { + width = minWidth; + height = getScalar(width / ratio); + } + + if (width > maxWidth) { + width = maxWidth; + height = getScalar(width / ratio); + } + + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + width_ = wrap.width(); + height_ = wrap.height(); + } + + } else { + width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_))); + height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_))); + } + } + + if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) { + width += scrollOut; + } + + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + width_ = wrap.width(); + height_ = wrap.height(); + + canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight; + canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight)); + + $.extend(current, { + dim : { + width : getValue( width_ ), + height : getValue( height_ ) + }, + origWidth : origWidth, + origHeight : origHeight, + canShrink : canShrink, + canExpand : canExpand, + wPadding : wPadding, + hPadding : hPadding, + wrapSpace : height_ - skin.outerHeight(true), + skinSpace : skin.height() - height + }); + + if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) { + inner.height('auto'); + } + }, + + _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], + left : margin[3] + }; + + if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) { + rez.position = 'fixed'; + + } else if (!current.locked) { + rez.top += viewport.y; + rez.left += viewport.x; + } + + 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) * current.leftRatio))); + + return rez; + }, + + _afterZoomIn: function () { + var current = F.current; + + if (!current) { + return; + } + + F.isOpen = F.isOpened = true; + + F.wrap.css('overflow', 'visible').addClass('fancybox-opened'); + + F.update(); + + // Assign a click event + if ( current.closeClick || (current.nextClick && F.group.length > 1) ) { + F.inner.css('cursor', 'pointer').bind('click.fb', function(e) { + if (!$(e.target).is('a') && !$(e.target).parent().is('a')) { + e.preventDefault(); + + F[ current.closeClick ? 'close' : 'next' ](); + } + }); + } + + // Create a close button + if (current.closeBtn) { + $(current.tpl.closeBtn).appendTo(F.skin).bind( isTouch ? 'touchstart.fb' : 'click.fb', function(e) { + e.preventDefault(); + + 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); + } + } + + F.trigger('afterShow'); + + // Stop the slideshow if this is the last item + if (!current.loop && current.index === current.group.length - 1) { + F.play( false ); + + } else if (F.opts.autoPlay && !F.player.isActive) { + F.opts.autoPlay = false; + + F.play(); + } + }, + + _afterZoomOut: function ( obj ) { + obj = obj || F.current; + + $('.fancybox-wrap').trigger('onReset').remove(); + + $.extend(F, { + group : {}, + opts : {}, + router : false, + current : null, + isActive : false, + isOpened : false, + isOpen : false, + isClosing : false, + wrap : null, + skin : null, + outer : null, + inner : null + }); + + F.trigger('afterClose', obj); + } + }); + + /* + * Default transitions + */ + + F.transitions = { + getOrigPosition: function () { + var current = F.current, + element = current.element, + orig = current.orig, + pos = {}, + width = 50, + height = 50, + hPadding = current.hPadding, + wPadding = current.wPadding, + viewport = F.getViewport(); + + if (!orig && current.isDom && element.is(':visible')) { + orig = element.find('img:first'); + + if (!orig.length) { + orig = element; + } + } + + if (isQuery(orig)) { + pos = orig.offset(); + + if (orig.is('img')) { + width = orig.outerWidth(); + height = orig.outerHeight(); + } + + } else { + pos.top = viewport.y + (viewport.h - height) * current.topRatio; + pos.left = viewport.x + (viewport.w - width) * current.leftRatio; + } + + if (F.wrap.css('position') === 'fixed' || current.locked) { + pos.top -= viewport.y; + pos.left -= viewport.x; + } + + pos = { + top : getValue(pos.top - hPadding * current.topRatio), + left : getValue(pos.left - wPadding * current.leftRatio), + width : getValue(width + wPadding), + height : getValue(height + hPadding) + }; + + return pos; + }, + + step: function (now, fx) { + var ratio, + padding, + value, + prop = fx.prop, + current = F.current, + wrapSpace = current.wrapSpace, + skinSpace = current.skinSpace; + + if (prop === 'width' || prop === 'height') { + ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start); + + if (F.isClosing) { + ratio = 1 - ratio; + } + + padding = prop === 'width' ? current.wPadding : current.hPadding; + value = now - padding; + + F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) ); + F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) ); + } + }, + + zoomIn: function () { + var current = F.current, + startPos = current.pos, + effect = current.openEffect, + elastic = effect === '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.1; + } + + } else if (effect === 'fade') { + startPos.opacity = 0.1; + } + + F.wrap.css(startPos).animate(endPos, { + duration : effect === 'none' ? 0 : current.openSpeed, + easing : current.openEasing, + step : elastic ? this.step : null, + complete : F._afterZoomIn + }); + }, + + zoomOut: function () { + var current = F.current, + effect = current.closeEffect, + elastic = effect === 'elastic', + endPos = {opacity : 0.1}; + + if (elastic) { + endPos = this.getOrigPosition(); + + if (current.closeOpacity) { + endPos.opacity = 0.1; + } + } + + F.wrap.animate(endPos, { + duration : effect === 'none' ? 0 : current.closeSpeed, + easing : current.closeEasing, + step : elastic ? this.step : null, + complete : F._afterZoomOut + }); + }, + + changeIn: function () { + var current = F.current, + effect = current.nextEffect, + startPos = current.pos, + endPos = { opacity : 1 }, + direction = F.direction, + distance = 200, + field; + + startPos.opacity = 0.1; + + if (effect === 'elastic') { + field = direction === 'down' || direction === 'up' ? 'top' : 'left'; + + if (direction === 'down' || direction === 'right') { + startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance); + endPos[ field ] = '+=' + distance + 'px'; + + } else { + startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance); + endPos[ field ] = '-=' + distance + 'px'; + } + } + + // Workaround for http://bugs.jquery.com/ticket/12273 + if (effect === 'none') { + F._afterZoomIn(); + + } else { + F.wrap.css(startPos).animate(endPos, { + duration : current.nextSpeed, + easing : current.nextEasing, + complete : function() { + // This helps FireFox to properly render the box + setTimeout(F._afterZoomIn, 20); + } + }); + } + }, + + changeOut: function () { + var previous = F.previous, + effect = previous.prevEffect, + endPos = { opacity : 0.1 }, + direction = F.direction, + distance = 200; + + if (effect === 'elastic') { + endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px'; + } + + previous.wrap.animate(endPos, { + duration : effect === 'none' ? 0 : previous.prevSpeed, + easing : previous.prevEasing, + complete : function () { + $(this).trigger('onReset').remove(); + } + }); + } + }; + + /* + * Overlay helper + */ + + F.helpers.overlay = { + defaults : { + closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay + speedOut : 200, // duration of fadeOut animation + showEarly : true, // indicates if should be opened immediately or wait until the content is ready + css : {}, // custom CSS properties + locked : !isTouch, // if true, the content will be locked into overlay + fixed : true // if false, the overlay CSS position property will not be set to "fixed" + }, + + overlay : null, // current handle + fixed : false, // indicates if the overlay has position "fixed" + + // Public methods + create : function(opts) { + opts = $.extend({}, this.defaults, opts); + + if (this.overlay) { + this.close(); + } + + this.overlay = $('
      ').appendTo( 'body' ); + this.fixed = false; + + if (opts.fixed && F.defaults.fixed) { + this.overlay.addClass('fancybox-overlay-fixed'); + + this.fixed = true; + } + }, + + open : function(opts) { + var that = this; + + opts = $.extend({}, this.defaults, opts); + + if (this.overlay) { + this.overlay.unbind('.overlay').width('auto').height('auto'); + + } else { + this.create(opts); + } + + if (!this.fixed) { + W.bind('resize.overlay', $.proxy( this.update, this) ); + + this.update(); + } + + if (opts.closeClick) { + this.overlay.bind('click.overlay', function(e) { + if ($(e.target).hasClass('fancybox-overlay')) { + if (F.isActive) { + F.close(); + } else { + that.close(); + } + } + }); + } + + this.overlay.css( opts.css ).show(); + }, + + close : function() { + $('.fancybox-overlay').remove(); + + W.unbind('resize.overlay'); + + this.overlay = null; + + if (this.margin !== false) { + $('body').css('margin-right', this.margin); + + this.margin = false; + } + + if (this.el) { + this.el.removeClass('fancybox-lock'); + } + }, + + // Private, callbacks + + update : function () { + var width = '100%', offsetWidth; + + // Reset width/height so it will not mess + this.overlay.width(width).height('100%'); + + // jQuery does not return reliable result for IE + if ($.browser.msie) { + offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth); + + if (D.width() > offsetWidth) { + width = D.width(); + } + + } else if (D.width() > W.width()) { + width = D.width(); + } + + this.overlay.width(width).height(D.height()); + }, + + // This is where we can manipulate DOM, because later it would cause iframes to reload + onReady : function (opts, obj) { + $('.fancybox-overlay').stop(true, true); + + if (!this.overlay) { + this.margin = D.height() > W.height() || $('body').css('overflow-y') === 'scroll' ? $('body').css('margin-right') : false; + this.el = document.all && !document.querySelector ? $('html') : $('body'); + + this.create(opts); + } + + if (opts.locked && this.fixed) { + obj.locked = this.overlay.append( obj.wrap ); + obj.fixed = false; + } + + if (opts.showEarly === true) { + this.beforeShow.apply(this, arguments); + } + }, + + beforeShow : function(opts, obj) { + if (obj.locked) { + this.el.addClass('fancybox-lock'); + + if (this.margin !== false) { + $('body').css('margin-right', getScalar( this.margin ) + obj.scrollbarWidth); + } + } + + this.open(opts); + }, + + onUpdate : function() { + if (!this.fixed) { + this.update(); + } + }, + + afterClose: function (opts) { + // Remove overlay if exists and fancyBox is not opening + // (e.g., it is not being open using afterClose callback) + if (this.overlay && !F.isActive) { + this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this )); + } + } + }; + + /* + * Title helper + */ + + F.helpers.title = { + defaults : { + type : 'float', // 'float', 'inside', 'outside' or 'over', + position : 'bottom' // 'top' or 'bottom' + }, + + beforeShow: function (opts) { + var current = F.current, + text = current.title, + type = opts.type, + title, + target; + + if ($.isFunction(text)) { + text = text.call(current.element, current); + } + + if (!isString(text) || $.trim(text) === '') { + return; + } + + title = $('
      ' + text + '
      '); + + switch (type) { + case 'inside': + target = F.skin; + break; + + case 'outside': + target = F.wrap; + break; + + case 'over': + target = F.inner; + break; + + default: // 'float' + target = F.skin; + + title.appendTo('body'); + + if ($.browser.msie) { + title.width( title.width() ); + } + + title.wrapInner(''); + + //Increase bottom margin so this title will also fit into viewport + F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) ); + break; + } + + title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target); + } + }; + + // jQuery plugin initialization + $.fn.fancybox = function (options) { + var index, + that = $(this), + selector = this.selector || '', + run = function(e) { + var what = $(this).blur(), idx = index, relType, relVal; + + if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) { + relType = options.groupAttr || 'data-fancybox-group'; + relVal = what.attr(relType); + + if (!relVal) { + relType = 'rel'; + relVal = what.get(0)[ relType ]; + } + + if (relVal && relVal !== '' && relVal !== 'nofollow') { + what = selector.length ? $(selector) : that; + what = what.filter('[' + relType + '="' + relVal + '"]'); + idx = what.index(this); + } + + options.index = idx; + + // Stop an event from bubbling if everything is fine + if (F.open(what, options) !== false) { + e.preventDefault(); + } + } + }; + + options = options || {}; + index = options.index || 0; + + if (!selector || options.live === false) { + that.unbind('click.fb-start').bind('click.fb-start', run); + + } else { + D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run); + } + + this.filter('[data-fancybox-start=1]').trigger('click'); + + return this; + }; + + // Tests that need a body at doc ready + D.ready(function() { + if ( $.scrollbarWidth === undefined ) { + // http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth + $.scrollbarWidth = function() { + var parent = $('
      ').appendTo('body'), + child = parent.children(), + width = child.innerWidth() - child.height( 99 ).innerWidth(); + + parent.remove(); + + return width; + }; + } + + if ( $.support.fixedPosition === undefined ) { + $.support.fixedPosition = (function() { + var elem = $('
      ').appendTo('body'), + fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 ); + + elem.remove(); + + return fixed; + }()); + } + + $.extend(F.defaults, { + scrollbarWidth : $.scrollbarWidth(), + fixed : $.support.fixedPosition, + parent : $('body') + }); + }); + +}(window, document, jQuery)); \ No newline at end of file diff --git a/js/fancybox/jquery.fancybox.pack.js b/js/fancybox/jquery.fancybox.pack.js new file mode 100644 index 0000000..088b5c6 --- /dev/null +++ b/js/fancybox/jquery.fancybox.pack.js @@ -0,0 +1,45 @@ +/*! fancyBox v2.1.3 fancyapps.com | fancyapps.com/fancybox/#license */ +(function(B,x,f,q){var r=f(B),m=f(x),b=f.fancybox=function(){b.open.apply(this,arguments)},u=null,n=x.createTouch!==q,s=function(a){return a&&a.hasOwnProperty&&a instanceof f},p=function(a){return a&&"string"===f.type(a)},E=function(a){return p(a)&&0
      ',image:'',iframe:'",error:'

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

      ',closeBtn:'',next:'',prev:''},openEffect:"fade",openSpeed:250,openEasing:"swing", +openOpacity:!0,openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null, +isActive:!1,isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=s(a)?f(a).get():[a]),f.each(a,function(e,c){var j={},g,h,i,l,k;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),s(c)?(j={href:c.data("fancybox-href")||c.attr("href"),title:c.data("fancybox-title")||c.attr("title"),isDom:!0,element:c},f.metadata&&f.extend(!0, +j,c.metadata())):j=c);g=d.href||j.href||(p(c)?c:null);h=d.title!==q?d.title:j.title||"";l=(i=d.content||j.content)?"html":d.type||j.type;!l&&j.isDom&&(l=c.data("fancybox-type"),l||(l=(l=c.prop("class").match(/fancybox\.(\w+)/))?l[1]:null));p(g)&&(l||(b.isImage(g)?l="image":b.isSWF(g)?l="swf":"#"===g.charAt(0)?l="inline":p(c)&&(l="html",i=c)),"ajax"===l&&(k=g.split(/\s+/,2),g=k.shift(),k=k.shift()));i||("inline"===l?g?i=f(p(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):j.isDom&&(i=c):"html"===l?i=g:!l&&(!g&& +j.isDom)&&(l="inline",i=c));f.extend(j,{href:g,type:l,content:i,title:h,selector:k});a[e]=j}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==q&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1!==b.trigger("onCancel")&&(b.hideLoading(),b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),b.coming=null,b.current|| +b._afterZoomOut(a))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(!b.isOpen||!0===a?(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut()):(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&(b.player.timer= +setTimeout(b.next,b.current.playSpeed))},c=function(){d();f("body").unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};if(!0===a||!b.player.isActive&&!1!==a){if(b.current&&(b.current.loop||b.current.index=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==q&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,j;c&&(j=b._getPosition(d),a&&"scroll"===a.type?(delete j.position,c.stop(!0,!0).animate(j,200)):(c.css(j),e.pos=f.extend({}, +e.dim,j)))},update:function(a){var d=a&&a.type,e=!d||"orientationchange"===d;e&&(clearTimeout(u),u=null);b.isOpen&&!u&&(u=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),u=null)},e&&!n?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,n&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"), +b.trigger("onUpdate")),b.update())},hideLoading:function(){m.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('
      ').click(b.cancel).appendTo("body");m.bind("keydown.loading",function(a){if(27===(a.which||a.keyCode))a.preventDefault(),b.cancel()});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}))},getViewport:function(){var a=b.current&&b.current.locked|| +!1,d={x:r.scrollLeft(),y:r.scrollTop()};a?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=n&&B.innerWidth?B.innerWidth:r.width(),d.h=n&&B.innerHeight?B.innerHeight:r.height());return d},unbindEvents:function(){b.wrap&&s(b.wrap)&&b.wrap.unbind(".fb");m.unbind(".fb");r.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(r.bind("orientationchange.fb"+(n?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&m.bind("keydown.fb",function(e){var c=e.which||e.keyCode,j= +e.target||e.srcElement;if(27===c&&b.coming)return!1;!e.ctrlKey&&(!e.altKey&&!e.shiftKey&&!e.metaKey&&(!j||!j.type&&!f(j).is("[contenteditable]")))&&f.each(d,function(d,j){if(1h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();if(0!==c&&!i&&1g||0>j)b.next(0>g?"up":"right");d.preventDefault()}}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d, +e){e&&(b.helpers[d]&&f.isFunction(b.helpers[d][a]))&&(e=f.extend(!0,{},b.helpers[d].defaults,e),b.helpers[d][a](e,c))});f.event.trigger(a+".fb")}},isImage:function(a){return p(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp)((\?|#).*)?$)/i)},isSWF:function(a){return p(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c,a=k(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&& +(d.padding=[c,c,c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive= +!0;if("image"===c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=!0);"iframe"===c&&n&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(n?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,v(d.padding[a]))});b.trigger("onReady"); +if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width= +this.width;b.coming.height=this.height;b._afterLoad()};a.onerror=function(){this.onload=this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,d=f(a.tpl.iframe.replace(/\{rnd\}/g, +(new Date).getTime())).attr("scrolling",n?"auto":a.iframe.scrolling).attr("src",a.href);f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);n||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||b._afterLoad()},_preloadImages:function(){var a= +b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,j,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());b.unbindEvents(); +e=a.content;c=a.type;j=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("
      ").html(e).find(a.selector):s(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('
      ').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder", +!1)}));break;case "image":e=a.tpl.image.replace("{href}",g);break;case "swf":e='',h="",f.each(a.swf,function(a,b){e+='';h+=" "+a+'="'+b+'"'}),e+='"}(!s(e)||!e.parent().is(a.inner))&&a.inner.append(e);b.trigger("beforeShow"); +a.inner.css("overflow","yes"===j?"scroll":"no"===j?"hidden":j);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(b.isOpened){if(d.prevMethod)b.transitions[d.prevMethod]()}else f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,j=b.skin,g=b.inner,h=b.current,c=h.width,i=h.height,l=h.minWidth,t=h.minHeight,m=h.maxWidth, +n=h.maxHeight,r=h.scrolling,p=h.scrollOutside?h.scrollbarWidth:0,w=h.margin,y=k(w[1]+w[3]),q=k(w[0]+w[2]),x,z,s,C,A,F,B,D,u;e.add(j).add(g).width("auto").height("auto").removeClass("fancybox-tmp");w=k(j.outerWidth(!0)-j.width());x=k(j.outerHeight(!0)-j.height());z=y+w;s=q+x;C=E(c)?(a.w-z)*k(c)/100:c;A=E(i)?(a.h-s)*k(i)/100:i;if("iframe"===h.type){if(u=h.content,h.autoHeight&&1===u.data("ready"))try{u[0].contentWindow.document.location&&(g.width(C).height(9999),F=u.contents().find("body"),p&&F.css("overflow-x", +"hidden"),A=F.height())}catch(G){}}else if(h.autoWidth||h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(C),h.autoHeight||g.height(A),h.autoWidth&&(C=g.width()),h.autoHeight&&(A=g.height()),g.removeClass("fancybox-tmp");c=k(C);i=k(A);D=C/A;l=k(E(l)?k(l,"w")-z:l);m=k(E(m)?k(m,"w")-z:m);t=k(E(t)?k(t,"h")-s:t);n=k(E(n)?k(n,"h")-s:n);F=m;B=n;h.fitToView&&(m=Math.min(a.w-z,m),n=Math.min(a.h-s,n));z=a.w-y;q=a.h-q;h.aspectRatio?(c>m&&(c=m,i=k(c/D)),i>n&&(i=n,c=k(i*D)),cz||y>q)&&(c>l&&i>t)&&!(19m&&(c=m,i=k(c/D)),g.width(c).height(i),e.width(c+w),a=e.width(),y=e.height();else c=Math.max(l,Math.min(c,c-(a-z))),i=Math.max(t,Math.min(i,i-(y-q)));p&&("auto"===r&&iz||y>q)&&c>l&&i>t;c=h.aspectRatio?ct&&i
      ').appendTo("body");this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this,a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(r.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",function(a){f(a.target).hasClass("fancybox-overlay")&& +(b.isActive?b.close():d.close())});this.overlay.css(a.css).show()},close:function(){f(".fancybox-overlay").remove();r.unbind("resize.overlay");this.overlay=null;!1!==this.margin&&(f("body").css("margin-right",this.margin),this.margin=!1);this.el&&this.el.removeClass("fancybox-lock")},update:function(){var a="100%",b;this.overlay.width(a).height("100%");f.browser.msie?(b=Math.max(x.documentElement.offsetWidth,x.body.offsetWidth),m.width()>b&&(a=m.width())):m.width()>r.width()&&(a=m.width());this.overlay.width(a).height(m.height())}, +onReady:function(a,b){f(".fancybox-overlay").stop(!0,!0);this.overlay||(this.margin=m.height()>r.height()||"scroll"===f("body").css("overflow-y")?f("body").css("margin-right"):!1,this.el=x.all&&!x.querySelector?f("html"):f("body"),this.create(a));a.locked&&this.fixed&&(b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){b.locked&&(this.el.addClass("fancybox-lock"),!1!==this.margin&&f("body").css("margin-right",k(this.margin)+ +b.scrollbarWidth));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.isActive&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",position:"bottom"},beforeShow:function(a){var d=b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(p(e)&&""!==f.trim(e)){d=f('
      '+e+"
      ");switch(c){case "inside":c=b.skin;break;case "outside":c= +b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),f.browser.msie&&d.width(d.width()),d.wrapInner(''),b.current.margin[2]+=Math.abs(k(d.css("margin-bottom")))}d["top"===a.position?"prependTo":"appendTo"](c)}}};f.fn.fancybox=function(a){var d,e=f(this),c=this.selector||"",j=function(g){var h=f(this).blur(),i=d,j,k;!g.ctrlKey&&(!g.altKey&&!g.shiftKey&&!g.metaKey)&&!h.is(".fancybox-wrap")&&(j=a.groupAttr||"data-fancybox-group",k=h.attr(j),k||(j="rel", +k=h.get(0)[j]),k&&(""!==k&&"nofollow"!==k)&&(h=c.length?f(c):e,h=h.filter("["+j+'="'+k+'"]'),i=h.index(this)),a.index=i,!1!==b.open(h,a)&&g.preventDefault())},a=a||{};d=a.index||0;!c||!1===a.live?e.unbind("click.fb-start").bind("click.fb-start",j):m.undelegate(c,"click.fb-start").delegate(c+":not('.fancybox-item, .fancybox-nav')","click.fb-start",j);this.filter("[data-fancybox-start=1]").trigger("click");return this};m.ready(function(){f.scrollbarWidth===q&&(f.scrollbarWidth=function(){var a=f('
      ').appendTo("body"), +b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});if(f.support.fixedPosition===q){var a=f.support,d=f('
      ').appendTo("body"),e=20===d[0].offsetTop||15===d[0].offsetTop;d.remove();a.fixedPosition=e}f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")})})})(window,document,jQuery); \ No newline at end of file diff --git a/js/libs/api.js b/js/libs/api.js index 1755068..a6e949b 100755 --- a/js/libs/api.js +++ b/js/libs/api.js @@ -6,8 +6,8 @@ function ping() { timeout: 10000, success: function (data) { if (data["subsonic-response"].status == 'ok') { - version = data["subsonic-response"].version; - $('#SubsonicVersion').html(version); + apiVersion = data["subsonic-response"].version; + $('#SubsonicVersion').html(apiVersion); } else { if (typeof data["subsonic-response"].error != 'undefined') { alert(data["subsonic-response"].error.message); @@ -26,11 +26,11 @@ function loadArtists(id, refresh) { } var url; if (id == "all") { - url = baseURL + '/getIndexes.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json'; + url = baseURL + '/getIndexes.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json'; } else if (id) { - url = baseURL + '/getIndexes.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&musicFolderId=' + id; + url = baseURL + '/getIndexes.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&musicFolderId=' + id; } else { - url = baseURL + '/getIndexes.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json'; + url = baseURL + '/getIndexes.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json'; } if (debug) { console.log(url); } var content = $('#ArtistContainer').html(); @@ -102,6 +102,7 @@ function loadArtists(id, refresh) { $("#BottomIndex").empty(); $(indexlist).appendTo("#BottomIndex"); } + var indexes = []; if (data["subsonic-response"].indexes.child !== undefined) { var rowcolor; if (data["subsonic-response"].indexes.child.length > 0) { @@ -112,13 +113,10 @@ function loadArtists(id, refresh) { var appendto = '#AlbumContainer tbody'; $(appendto).empty(); $.each(indexes, function (i, child) { - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; + if (child.isVideo != true) { + var html = generateRowHTML(child, appendto); + $(html).appendTo(appendto); } - var html = generateRowHTML(child, appendto, rowcolor); - $(html).appendTo(appendto); }); header = generateSongHeaderHTML(); } @@ -141,7 +139,7 @@ function loadArtists(id, refresh) { } function getMusicFolders() { $.ajax({ - url: baseURL + '/getMusicFolders.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getMusicFolders.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, @@ -155,11 +153,11 @@ function getMusicFolders() { folders[0] = data["subsonic-response"].musicFolders.musicFolder; } - var savedMusicFolder = getCookie('MusicFolders'); + var savedMusicFolder = getCookie('MusicFolders') ? getCookie('MusicFolders') : null; var options = []; options.push(''); $.each(folders, function (i, folder) { - if (savedMusicFolder == folder.id) { + if (savedMusicFolder == folder.id && savedMusicFolder != null) { options.push(''); } else { options.push(''); @@ -203,7 +201,7 @@ function loadAutoPlaylists(refresh) { html += '
    • '; html += '' + genre + ''; html += '
      '; - html += '
      '; + html += '
      '; html += '
    • '; $(html).appendTo("#AutoPlaylistContainer"); }); @@ -211,7 +209,7 @@ function loadAutoPlaylists(refresh) { } function getAlbums(id, action, appendto) { $.ajax({ - url: baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + id, + url: baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + id, method: 'GET', dataType: 'json', timeout: 10000, @@ -239,13 +237,8 @@ function getAlbums(id, action, appendto) { var rowcolor; var header; $.each(children, function (i, child) { - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; - } if (child.isDir == true) { isDir = true; } - var html = generateRowHTML(child, appendto, rowcolor); + var html = generateRowHTML(child, appendto); $(html).appendTo(appendto).hide().fadeIn('fast'); }); toggleAlbumListNextPrev('#status_Library', false, '', ''); @@ -276,9 +269,9 @@ function getAlbumListBy(id, offset) { size = 15; } if (offset > 0) { - url = baseURL + '/getAlbumList.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=' + size + '&type=' + id + '&offset=' + offset + url = baseURL + '/getAlbumList.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=' + size + '&type=' + id + '&offset=' + offset } else { - url = baseURL + '/getAlbumList.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=' + size + '&type=' + id + url = baseURL + '/getAlbumList.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=' + size + '&type=' + id } $.ajax({ url: url, @@ -302,16 +295,11 @@ function getAlbumListBy(id, offset) { var rowcolor; var html; $.each(albums, function (i, album) { - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; - } // Only show albums, not songs (Rated songs will also be returned in API call, trying to display them will break Back button, disabled for now) var albumhtml, starred; if (album.starred !== undefined) { starred = true; } else { starred = false; } if (album.isDir === true) { - albumhtml = generateAlbumHTML(rowcolor, album.id, album.parent, album.coverArt, album.title, album.artist, album.userRating, starred); + albumhtml = generateAlbumHTML(album.id, album.parent, album.coverArt, album.title, album.artist, album.userRating, starred, album.created); } $(albumhtml).appendTo("#AlbumContainer tbody").hide().fadeIn('fast'); }); @@ -355,16 +343,16 @@ function getRandomSongList(action, appendto, genre, folder) { if (genre != '' && genre != 'Random') { gstring = '&genre=' + genre; } - if (typeof folder == 'number' && folder == 0) { + if (typeof folder == 'number' && folder == 0 && folder != 'all') { gstring = '&musicFolderId=' + folder; - } else if (folder != '') { + } else if (folder != '' && folder != 'all') { gstring = '&musicFolderId=' + folder; } if (genre == 'Starred') { getStarred(action, appendto, 'song'); } else { $.ajax({ - url: baseURL + '/getRandomSongs.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=' + size + gstring, + url: baseURL + '/getRandomSongs.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=' + size + gstring, method: 'GET', dataType: 'json', timeout: 10000, @@ -390,16 +378,11 @@ function getRandomSongList(action, appendto, genre, folder) { var rowcolor; var html; $.each(items, function (i, item) { - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; - } var track, starred, duration; if (item.starred !== undefined) { starred = true; } else { starred = false; } if (item.track === undefined) { track = " "; } else { track = item.track; } if (item.duration !== undefined) { duration = item.duration; } else { duration = ''; } - html = generateSongHTML(rowcolor, item.id, item.parent, track, item.title, '', item.artist, item.album, item.coverArt, item.userRating, starred, duration); + html = generateSongHTML(item.id, item.parent, track, item.title, '', item.artist, item.album, item.coverArt, item.userRating, starred, duration); $(html).appendTo(appendto); }); if (appendto === '#TrackContainer tbody') { @@ -427,7 +410,7 @@ function getStarred(action, appendto, type) { size = 25; } $.ajax({ - url: baseURL + '/getStarred.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=' + size, + url: baseURL + '/getStarred.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=' + size, method: 'GET', dataType: 'json', timeout: 10000, @@ -479,11 +462,6 @@ function getStarred(action, appendto, type) { var rowcolor; var html; $.each(items, function (i, item) { - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; - } var track, starred; if (item.starred !== undefined) { starred = true; } else { starred = false; } if (item.track === undefined) { track = " "; } else { track = item.track; } @@ -492,10 +470,10 @@ function getStarred(action, appendto, type) { case 'artist': break; case 'album': - html = generateRowHTML(item, appendto, rowcolor); + html = generateRowHTML(item, appendto); break; case 'song': - html = generateRowHTML(item, appendto, rowcolor); + html = generateRowHTML(item, appendto); break; default: break; @@ -523,7 +501,7 @@ function updateNowPlaying(showPopup) { updaterNowPlaying = $.periodic({ period: 4000, decay: 1.5, max_period: 30000 }, function () { $.ajax({ periodic: this, - url: baseURL + '/getNowPlaying.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getNowPlaying.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, @@ -560,12 +538,12 @@ function updateNowPlaying(showPopup) { if (msg.coverArt === undefined) { coverartSrc = 'images/albumdefault_50.jpg'; } else { - coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=50&id=' + msg.coverArt; + coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=50&id=' + msg.coverArt; } if (getCookie('Notification_NowPlaying')) { var sid = msg.username + '-' + msg.id; if (jQuery.inArray(sid, updaterNowPlayingIdList) === -1 && username != msg.username) { - showNotification(coverartSrc, toHTML.un(msg.username + ':' + msg.playerName), toHTML.un(msg.artist + ' - ' + msg.title), 'text'); + showNotification(coverartSrc, toHTML.un(msg.username + ':' + msg.playerName), toHTML.un(msg.artist + ' - ' + msg.title), 'text', ''); updaterNowPlayingIdList.push(sid); } } @@ -581,7 +559,7 @@ function stopUpdateNowPlaying() { function search(type, query) { $.ajax({ - url: baseURL + '/search2.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&query=' + query, + url: baseURL + '/search2.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&query=' + query, method: 'GET', dataType: 'json', timeout: 10000, @@ -613,22 +591,17 @@ function search(type, query) { } } $.each(children, function (i, child) { - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; - } var starred; if (child.starred !== undefined) { starred = true; } else { starred = false; } isDir = child.isDir; if (isDir === true) { - albumhtml = generateAlbumHTML(rowcolor, child.id, child.parent, child.coverArt, child.title, child.artist, child.userRating, starred); + albumhtml = generateAlbumHTML(child.id, child.parent, child.coverArt, child.title, child.artist, child.userRating, starred, child.created); } else { var track, starred, duration; if (child.starred !== undefined) { starred = true; } else { starred = false; } if (child.track === undefined) { track = " "; } else { track = child.track; } if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; } - albumhtml = generateSongHTML(rowcolor, child.id, child.parent, track, child.title, '', child.artist, child.album, child.coverArt, child.userRating, starred, duration); + albumhtml = generateSongHTML(child.id, child.parent, track, child.title, '', child.artist, child.album, child.coverArt, child.userRating, starred, duration); } $(albumhtml).appendTo("#AlbumContainer tbody"); }); @@ -646,7 +619,7 @@ function loadFolders(refresh) { if (content === "") { // Load Folders $.ajax({ - url: baseURL + '/getMusicFolders.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getMusicFolders.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, @@ -662,7 +635,7 @@ function loadFolders(refresh) { html += '
    • '; html += '' + musicFolder.name + ''; html += '
      '; - html += '
      '; + html += '
      '; html += '
    • '; $(html).appendTo("#FolderContainer"); }); @@ -679,7 +652,7 @@ function loadPlaylists(refresh) { if (content === "") { // Load Playlists $.ajax({ - url: baseURL + '/getPlaylists.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getPlaylists.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, @@ -696,7 +669,7 @@ function loadPlaylists(refresh) { html += '
    • '; html += '
      '; html += '
      '; - html += '
      '; + html += '
      '; html += '
      ' + playlist.name + '
      '; html += '
    • '; $(html).appendTo("#PlaylistContainer"); @@ -720,7 +693,7 @@ function savePlaylist(playlistid) { url: baseURL + '/createPlaylist.view?u=' + username + '&p=' + password, dataType: 'json', timeout: 10000, - data: { v: version, c: applicationName, f: "json", playlistId: playlistid, songId: songs }, + data: { v: apiVersion, c: applicationName, f: "json", playlistId: playlistid, songId: songs }, success: function () { getPlaylist(playlistid); updateMessage('Playlist Updated!'); @@ -731,7 +704,7 @@ function savePlaylist(playlistid) { } function getPlaylist(id, action, appendto) { $.ajax({ - url: baseURL + '/getPlaylist.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + id, + url: baseURL + '/getPlaylist.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + id, method: 'GET', dataType: 'json', timeout: 10000, @@ -758,16 +731,11 @@ function getPlaylist(id, action, appendto) { var html; var count = children.length; $.each(children, function (i, child) { - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; - } var track, starred, duration; if (child.starred !== undefined) { starred = true; } else { starred = false; } if (child.track === undefined) { track = " "; } else { track = child.track; } if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; } - html = generateSongHTML(rowcolor, child.id, child.parent, track, child.title, '', child.artist, child.album, child.coverArt, child.userRating, starred, duration); + html = generateSongHTML(child.id, child.parent, track, child.title, '', child.artist, child.album, child.coverArt, child.userRating, starred, duration); $(html).appendTo(appendto); }); if (appendto === '#TrackContainer tbody') { @@ -790,7 +758,7 @@ function getPlaylist(id, action, appendto) { function loadPlaylistsForMenu(menu) { $('#' + menu).empty(); $.ajax({ - url: baseURL + '/getPlaylists.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getPlaylists.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, @@ -812,9 +780,9 @@ function loadPlaylistsForMenu(menu) { } function newPlaylist() { var reply = prompt("Choose a name for your new playlist.", ""); - if (reply != null || reply != "") { + if (reply != 'null' && reply != null && reply != '') { $.ajax({ - url: baseURL + '/createPlaylist.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&name=' + reply, + url: baseURL + '/createPlaylist.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&name=' + reply, method: 'GET', dataType: 'json', timeout: 10000, @@ -826,7 +794,7 @@ function newPlaylist() { } function deletePlaylist(id) { $.ajax({ - url: baseURL + '/deletePlaylist.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + id, + url: baseURL + '/deletePlaylist.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + id, method: 'GET', dataType: 'json', timeout: 10000, @@ -852,7 +820,7 @@ function addToPlaylist(playlistid, from) { // Get songs from playlist var currentsongs = []; $.ajax({ - url: baseURL + '/getPlaylist.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + playlistid, + url: baseURL + '/getPlaylist.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + playlistid, method: 'GET', dataType: 'json', timeout: 10000, @@ -878,15 +846,15 @@ function addToPlaylist(playlistid, from) { } }); if (count > 0) { - var runningVersion = parseVersionString(version); + var runningVersion = parseVersionString(apiVersion); var minimumVersion = parseVersionString('1.8.0'); - if (checkVersion(runningVersion, minimumVersion)) { - $.ajax({ + if (checkVersion(runningVersion, minimumVersion)) { // is 1.8.0 or newer + $.ajax({ type: 'GET', url: baseURL + '/updatePlaylist.view?u=' + username + '&p=' + password, dataType: 'json', timeout: 10000, - data: { v: version, c: applicationName, f: "json", playlistId: playlistid, songIdToAdd: selected }, + data: { v: apiVersion, c: applicationName, f: "json", playlistId: playlistid, songIdToAdd: selected }, success: function () { $('table.songlist tr.song').each(function () { $(this).removeClass('selected'); @@ -896,12 +864,12 @@ function addToPlaylist(playlistid, from) { traditional: true // Fixes POST with an array in JQuery 1.4 }); } else { - $.ajax({ + $.ajax({ // Depreciated: 11/5/2012 type: 'GET', url: baseURL + '/createPlaylist.view?u=' + username + '&p=' + password, dataType: 'json', timeout: 10000, - data: { v: version, c: applicationName, f: "json", playlistId: playlistid, songId: currentsongs }, + data: { v: apiVersion, c: applicationName, f: "json", playlistId: playlistid, songId: currentsongs }, success: function () { $('table.songlist tr.song').each(function () { $(this).removeClass('selected'); @@ -922,7 +890,7 @@ function addToPlaylist(playlistid, from) { url: baseURL + '/createPlaylist.view?u=' + username + '&p=' + password, dataType: 'json', timeout: 10000, - data: { v: version, c: applicationName, f: "json", name: "" + reply + "", songId: selected }, + data: { v: apiVersion, c: applicationName, f: "json", name: "" + reply + "", songId: selected }, success: function () { $('table.songlist tr.song').each(function () { $(this).removeClass('selected'); @@ -979,7 +947,7 @@ function saveCurrentPlaylist() { if (current != '' && current != html) { try { localStorage.setItem('CurrentPlaylist', current); - if (debug) { console.log('Saving Current Playlist: ' + current.length + ' characters'); } + if (debug) { console.log('Saving Play Queue: ' + current.length + ' characters'); } } catch (e) { if (e == QUOTA_EXCEEDED_ERR) { alert('Quota exceeded!'); @@ -994,7 +962,7 @@ function deleteCurrentPlaylist() { if (browserStorageCheck) { localStorage.removeItem('CurrentPlaylist'); setCookie('CurrentSong', null); - if (debug) { console.log('Removing Current Playlist'); } + if (debug) { console.log('Removing Play Queue'); } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } } @@ -1004,7 +972,7 @@ function loadCurrentPlaylist() { var html = localStorage.getItem('CurrentPlaylist'); if (html != '' && html !== undefined && html !== null) { $('#CurrentPlaylistContainer tbody').html(html); - if (debug) { console.log('Load Current Playlist From localStorage: ' + html.length + ' characters'); } + if (debug) { console.log('Load Play Queue From localStorage: ' + html.length + ' characters'); } } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } @@ -1037,7 +1005,7 @@ function downloadItem(id, type) { reqDownload = 'playlistUtf8Hex=' + id; } if (reqDownload) { - url = baseURL + '/download.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&' + reqDownload; + url = baseURL + '/download.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&' + reqDownload; window.location = url; } } @@ -1052,7 +1020,7 @@ function loadPodcasts(refresh) { if (content === "") { // Load Podcasts $.ajax({ - url: baseURL + '/getPodcasts.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getPodcasts.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, @@ -1071,7 +1039,7 @@ function loadPodcasts(refresh) { html += '
    • '; html += '
      '; html += '
      '; - html += '
      '; + html += '
      '; html += '
      ' + podcast.title + '
      '; html += '
    • '; $(html).appendTo("#ChannelsContainer"); @@ -1086,7 +1054,7 @@ function loadPodcasts(refresh) { } function getPodcast(id, action, appendto) { $.ajax({ - url: baseURL + '/getPodcasts.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getPodcasts.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, @@ -1121,11 +1089,6 @@ function getPodcast(id, action, appendto) { var count = 0; $.each(children, function (i, child) { if (child.status == "skipped") return; // Skip podcasts that are not yet downloaded - if (i % 2 === 0) { - rowcolor = 'even'; - } else { - rowcolor = 'odd'; - } var date = parseDate(child.publishDate); var description = 'Published: ' + date + '\n\n'; description += child.description; @@ -1134,8 +1097,7 @@ function getPodcast(id, action, appendto) { if (child.starred !== undefined) { starred = true; } else { starred = false; } if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; } if (child.publishDate !== undefined) { publishdate = child.publishDate.substring(0, child.publishDate.indexOf(" ")); } else { publishdate = ''; } - var time = secondsToTime(child.duration); - html = generateSongHTML(rowcolor, child.streamId, child.parent, publishdate, child.title, description, child.artist, child.album, child.coverArt, child.userRating, starred, duration); + html = generateSongHTML(child.streamId, child.parent, publishdate, child.title, description, child.artist, child.album, child.coverArt, child.userRating, starred, duration); $(html).appendTo(appendto); count++; }); @@ -1157,23 +1119,23 @@ function getPodcast(id, action, appendto) { }); } function loadVideos(refresh) { - if (debug) { console.log("LOAD PODCASTS"); } + if (debug) { console.log("LOAD VIDEOS"); } if (refresh) { - $('#VideoContainer').empty(); + $('#VideosContainer').empty(); } - var content = $('#VideoContainer').html(); + var content = $('#VideosContainer').html(); if (content == "") { // Load Videos $.ajax({ - url: baseURL + '/getVideos.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json', + url: baseURL + '/getVideos.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json', method: 'GET', dataType: 'json', timeout: 10000, success: function (data) { if (data["subsonic-response"].videos != '') { var videos = []; - if (data["subsonic-response"].videos.length > 0) { - videos = data["subsonic-response"].videos; + if (data["subsonic-response"].videos.video.length > 0) { + videos = data["subsonic-response"].videos.video; } else { videos[0] = data["subsonic-response"].videos.video; } @@ -1185,11 +1147,13 @@ function loadVideos(refresh) { } else { rowcolor = 'odd'; } - html = ''; - html += ''; - html += ''; - html += ''; - html += ''; + var videoURL = baseURL + '/stream.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + video.id; + html = ''; + html += ''; + //html += ''; + //html += ''; + html += ''; + //html += ''; html += ''; html += ''; html += '' + video.title + ''; @@ -1198,13 +1162,13 @@ function loadVideos(refresh) { if (video.coverArt === undefined) { coverartSrc = 'images/albumdefault_25.jpg'; } else { - coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=25&id=' + video.coverArt; + coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=25&id=' + video.coverArt; } var time = secondsToTime(video.duration); html += '' + video.album + ''; html += '' + time + ''; html += ''; - $(html).appendTo("#VideoContainer"); + $(html).appendTo("#VideosContainer"); }); } } diff --git a/js/libs/chat.js b/js/libs/chat.js index 5350027..5172c55 100644 --- a/js/libs/chat.js +++ b/js/libs/chat.js @@ -4,7 +4,7 @@ function updateChatMessages() { updater = $.periodic({ period: 1000, decay: 1.5, max_period: 1800000 }, function () { $.ajax({ periodic: this, - url: baseURL + '/getChatMessages.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&since=' + starttime, + url: baseURL + '/getChatMessages.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&since=' + starttime, method: 'GET', dataType: 'json', timeout: 10000, @@ -52,7 +52,7 @@ function addChatMessage(msg) { url: baseURL + '/addChatMessage.view?u=' + username + '&p=' + password, dataType: 'json', timeout: 10000, - data: { v: version, c: applicationName, f: "json", message: msg }, + data: { v: apiVersion, c: applicationName, f: "json", message: msg }, success: function () { updater.reset(); }, diff --git a/js/libs/generators.js b/js/libs/generators.js index 7d1e1dd..3f7262f 100755 --- a/js/libs/generators.js +++ b/js/libs/generators.js @@ -1,27 +1,27 @@ -function generateRowHTML(child, appendto, rowcolor) { +function generateRowHTML(child, appendto) { var html, isDir, starred, duration, artist, i; isDir = child.isDir; if (child.starred !== undefined) { starred = true; } else { starred = false; } if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; } if (child.artist !== undefined) { artist = child.artist; } else { artist = ''; } if (isDir === true) { - html = generateAlbumHTML(rowcolor, child.id, child.parent, child.coverArt, child.title, artist, child.userRating, starred); + html = generateAlbumHTML(child.id, child.parent, child.coverArt, child.title, artist, child.userRating, starred, child.created); } else { var track; if (child.track === undefined) { track = " "; } else { track = child.track; } - html = generateSongHTML(rowcolor, child.id, child.parent, track, child.title, '', artist, child.album, child.coverArt, child.userRating, starred, duration); + html = generateSongHTML(child.id, child.parent, track, child.title, '', artist, child.album, child.coverArt, child.userRating, starred, duration); } return html; } function generateAlbumHeaderHTML() { var html; - html = 'AlbumArtist'; + html = 'AlbumArtistCreated'; return html; } -function generateAlbumHTML(rowcolor, childid, parentid, coverart, title, artist, rating, starred) { +function generateAlbumHTML(childid, parentid, coverart, title, artist, rating, starred, created) { var html; - html = ''; - html += ''; + html = ''; + html += ''; html += ''; html += ''; if (starred) { @@ -33,10 +33,11 @@ function generateAlbumHTML(rowcolor, childid, parentid, coverart, title, artist, if (coverart == undefined) { html += ''; } else { - html += ''; + html += ''; } html += '' + title + ''; html += '' + artist + ''; + html += '' + $.format.date(new Date(created), "yyyy-MM-dd h:mm a") + ''; html += ''; return html; } @@ -45,7 +46,7 @@ function generateSongHeaderHTML() { html = 'TrackTitleArtistAlbumTime'; return html; } -function generateSongHTML(rowcolor, childid, parentid, track, title, description, artist, album, coverart, rating, starred, duration) { +function generateSongHTML(childid, parentid, track, title, description, artist, album, coverart, rating, starred, duration) { var time; if (duration == '') { time = '00:00' @@ -53,8 +54,8 @@ function generateSongHTML(rowcolor, childid, parentid, track, title, description time = secondsToTime(duration); } var html; - html = ''; - html += ''; + html = ''; + html += ''; html += ''; html += ''; html += ''; @@ -75,7 +76,7 @@ function generateSongHTML(rowcolor, childid, parentid, track, title, description if (coverart == undefined) { coverartSrc = 'images/albumdefault_25.jpg'; } else { - coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=25&id=' + coverart; + coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=25&id=' + coverart; } html += '' + album + ''; html += '' + time + ''; diff --git a/js/libs/player.js b/js/libs/player.js index d6bb928..679d3a7 100644 --- a/js/libs/player.js +++ b/js/libs/player.js @@ -1,7 +1,15 @@ -var scrobbled = false; +var scrobbled = false; var timerid = 0; -function playSong(el, songid, albumid, position, loadonly) { - ajaxUrl = baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + albumid; +function getSongData(el, songid, albumid, position, loadonly) { + var runningVersion = parseVersionString(apiVersion); + var minimumVersion = parseVersionString('1.8.0'); + if (checkVersion(runningVersion, minimumVersion)) { + if (debug) { console.log('apiVersion at or above 1.8.0 using getSong.view'); } + ajaxUrl = baseURL + '/getSong.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + songid; + } else { + if (debug) { console.log('apiVersion below 1.8.0 using getMusicDirectory.view'); } + ajaxUrl = baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + albumid; // Deprecated: apiVersion 1.8.0 + } if (debug) { console.log(ajaxUrl) } $.ajax({ url: ajaxUrl, @@ -11,29 +19,56 @@ function playSong(el, songid, albumid, position, loadonly) { success: function (data) { var title, artist, album, rating, starred, contenttype, suffix; var specs = ''; - if (data["subsonic-response"].directory.child !== undefined) { - // There is a bug in the API that doesn't return a JSON array for one artist - var children = []; - if (data["subsonic-response"].directory.child.length > 0) { - children = data["subsonic-response"].directory.child; - } else { - children[0] = data["subsonic-response"].directory.child; - } - $.each(children, function (i, child) { - if (child.id == songid) { - title = child.title.toString(); - if (child.artist !== undefined) { artist = child.artist.toString(); } else { artist = ''; } - album = child.album; - coverart = child.coverArt; - rating = child.userRating; - if (child.contentType == 'audio/ogg') { contenttype = child.contentType; } else { contenttype = 'audio/mp3'; } - if (child.starred !== undefined) { starred = true; } else { starred = false; } - if (child.bitRate !== undefined) { specs += child.bitRate + ' Kbps'; } - if (child.transcodedSuffix !== undefined) { specs += ', transcoding:' + child.suffix + ' > ' + child.transcodedSuffix; } else { specs += ', ' + child.suffix; } - if (child.transcodedSuffix !== undefined) { suffix = child.transcodedSuffix; } else { suffix = child.suffix; } - if (suffix == 'ogg') { suffix = 'oga'; } + + if (typeof data["subsonic-response"].song != "undefined") { + var song = data["subsonic-response"].song; + title = song.title.toString(); + if (song.artist !== undefined) { artist = song.artist.toString(); } else { artist = ''; } + album = song.album; + coverart = song.coverArt; + rating = song.userRating; + if (song.contentType == 'audio/ogg') { contenttype = song.contentType; } else { contenttype = 'audio/mp3'; } + if (song.starred !== undefined) { starred = true; } else { starred = false; } + if (song.bitRate !== undefined) { specs += song.bitRate + ' Kbps'; } + if (song.transcodedSuffix !== undefined) { specs += ', transcoding:' + song.suffix + ' > ' + song.transcodedSuffix; } else { specs += ', ' + song.suffix; } + if (song.transcodedSuffix !== undefined) { suffix = song.transcodedSuffix; } else { suffix = song.suffix; } + if (suffix == 'ogg') { suffix = 'oga'; } + } + if (typeof data["subsonic-response"].directory != 'undefined') { // Deprecated: apiVersion 1.8.0 + if (typeof data["subsonic-response"].directory.child != 'undefined') { + // There is a bug in the API that doesn't return a JSON array for one artist + var children = []; + if (data["subsonic-response"].directory.child.length > 0) { + children = data["subsonic-response"].directory.child; + } else { + children[0] = data["subsonic-response"].directory.child; } - }); + $.each(children, function (i, child) { + if (child.id == songid) { + title = child.title.toString(); + if (child.artist !== undefined) { artist = child.artist.toString(); } else { artist = ''; } + album = child.album; + coverart = child.coverArt; + rating = child.userRating; + if (child.contentType == 'audio/ogg') { contenttype = child.contentType; } else { contenttype = 'audio/mp3'; } + if (child.starred !== undefined) { starred = true; } else { starred = false; } + if (child.bitRate !== undefined) { specs += child.bitRate + ' Kbps'; } + if (child.transcodedSuffix !== undefined) { specs += ', transcoding:' + child.suffix + ' > ' + child.transcodedSuffix; } else { specs += ', ' + child.suffix; } + if (child.transcodedSuffix !== undefined) { suffix = child.transcodedSuffix; } else { suffix = child.suffix; } + if (suffix == 'ogg') { suffix = 'oga'; } + } + }); + } + } + + playSong(el, songid, albumid, title, artist, album, coverart, rating, starred, contenttype, suffix, specs, loadonly); + } + }); +} +function playSong(el, songid, albumid, title, artist, album, coverart, rating, starred, contenttype, suffix, specs, loadonly) { + var volume = 1; + if (getCookie('Volume')) { + volume = parseFloat(getCookie('Volume')); } if (starred) { $('#songdetails_rate').attr('class', 'favorite'); @@ -49,122 +84,155 @@ function playSong(el, songid, albumid, position, loadonly) { $('#songdetails_specs').html(specs); var coverartSrc, coverartFullSrc; if (coverart == undefined) { - coverartSrc = 'images/albumdefault_56.jpg'; + coverartSrc = 'images/albumdefault_60.jpg'; coverartFullSrc = ''; } else { - coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=56&id=' + coverart; - coverartFullSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + coverart; + coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&size=60&id=' + coverart; + coverartFullSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + coverart; } $('#coverartimage').attr('href', coverartFullSrc); $('#coverartimage img').attr('src', coverartSrc); $('#playermiddle').css('visibility', 'visible'); $('#songdetails').css('visibility', 'visible'); - var salt = Math.floor(Math.random() * 100000); - // jPlayer Setup - var audioSolution = "html,flash"; - if (getCookie('ForceFlash')) { - audioSolution = "flash,html"; - } - $("#playdeck").jPlayer("destroy"); - $("#playdeck").jPlayer({ - swfPath: "js/jplayer", - wmode: "window", - solution: audioSolution, - supplied: suffix, - errorAlerts: debug, - warningAlerts: false, - volume: parseInt(volume)/100, - cssSelectorAncestor: "#player", - cssSelector: { - play: "#PlayTrack", - pause: "#PauseTrack", - seekBar: "#audiocontainer .scrubber", - playBar: "#audiocontainer .progress", - //mute: "#mute", - //unmute: "#unmute", - currentTime: "#played", - duration: "#duration" - }, - ready: function () { - if (suffix == 'oga') { - $(this).jPlayer("setMedia", { - oga: baseURL + '/stream.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt, - }); - } else if (suffix == 'mp3') { - $(this).jPlayer("setMedia", { - mp3: baseURL + '/stream.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt, - }); - } - if (!loadonly) { - $(this).jPlayer("play") - } else { - $(this).jPlayer("pause", position) - } - }, - ended: function() { // The $.jPlayer.event.ended event - var next = $('#CurrentPlaylistContainer tr.playing').next(); - if (!changeTrack(next)) { - if (getCookie('AutoPilot')) { - getRandomSongList('autoplayappend', '#CurrentPlaylistContainer tbody', '', ''); - } + var salt = Math.floor(Math.random() * 100000); + // jPlayer Setup + var audioSolution = "html,flash"; + if (getCookie('ForceFlash')) { + audioSolution = "flash,html"; + } + $("#playdeck").jPlayer("destroy"); + $("#playdeck").jPlayer({ + swfPath: "js/jplayer", + wmode: "window", + solution: audioSolution, + supplied: suffix, + volume: volume, + errorAlerts: debug, + warningAlerts: false, + cssSelectorAncestor: "#player", + cssSelector: { + play: "#PlayTrack", + pause: "#PauseTrack", + seekBar: "#audiocontainer .scrubber", + playBar: "#audiocontainer .progress", + mute: "#action_Mute", + unmute: "#action_UnMute", + volumeMax: "#action_VolumeMax", + currentTime: "#played", + duration: "#duration" + }, + ready: function () { + if (suffix == 'oga') { + $(this).jPlayer("setMedia", { + oga: baseURL + '/stream.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt, + }); + } else if (suffix == 'mp3') { + $(this).jPlayer("setMedia", { + mp3: baseURL + '/stream.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt, + }); + } + if (!loadonly) { + $(this).jPlayer("play"); + } else { + $(this).jPlayer("pause", position); + } + }, + volumechange: function(event) { // The $.jPlayer.event.ended event + setCookie('Volume', event.jPlayer.options.volume); + }, + ended: function() { // The $.jPlayer.event.ended event + var next = $('#CurrentPlaylistContainer tr.playing').next(); + if (!changeTrack(next)) { + if (getCookie('AutoPilot')) { + getRandomSongList('autoplayappend', '#CurrentPlaylistContainer tbody', '', ''); } } - }); - if (getCookie('SaveTrackPosition')) { - if (timerid != 0) { - clearInterval(timerid); - } - timerid = window.setInterval(function () { - if (getCookie('SaveTrackPosition')) { - var audio = typeof $("#playdeck").data("jPlayer") != 'undefined' ? true : false; - if (audio) { - saveTrackPosition(); - } + } + }); + if (getCookie('SaveTrackPosition')) { + if (timerid != 0) { + clearInterval(timerid); + } + timerid = window.setInterval(function () { + if (getCookie('SaveTrackPosition')) { + var audio = typeof $("#playdeck").data("jPlayer") != 'undefined' ? true : false; + if (audio) { + saveTrackPosition(); } - }, 5000); - } - var submenu = $('div#submenu_CurrentPlaylist'); - if (submenu.is(":visible")) { - submenu.fadeOut(); - } - var spechtml = ''; - var data = $('#playdeck').data().jPlayer; - for (i = 0; i < data.solutions.length; i++) { - var solution = data.solutions[i]; - if (data[solution].used) { - spechtml += "" + solution + " is"; - spechtml += " being used with"; - for (format in data[solution].support) { - if (data[solution].support[format]) { - spechtml += " " + format; - } - } - spechtml += " support"; } + }, 5000); + } + var submenu = $('div#submenu_CurrentPlaylist'); + if (submenu.is(":visible")) { + submenu.fadeOut(); + } + var spechtml = ''; + var data = $('#playdeck').data().jPlayer; + for (i = 0; i < data.solutions.length; i++) { + var solution = data.solutions[i]; + if (data[solution].used) { + spechtml += "" + solution + " is"; + spechtml += " being used with"; + for (format in data[solution].support) { + if (data[solution].support[format]) { + spechtml += " " + format; + } + } + spechtml += " support"; } - $('#SMStats').html(spechtml); - $('table.songlist tr.song').removeClass('playing'); - if (el != null) { - $(el).addClass('playing'); - } - scrobbleSong(false); - scrobbled = false; + } + $('#SMStats').html(spechtml); + $('table.songlist tr.song').removeClass('playing'); + if (el != null) { + $(el).addClass('playing'); + } + scrobbleSong(false); + scrobbled = false; - if (getCookie('Notification_Song')) { - showNotification(coverartSrc, toHTML.un(title), toHTML.un(artist + ' - ' + album), 'text'); - } - if (getCookie('ScrollTitle')) { - scrollTitle(toHTML.un(artist) + ' - ' + toHTML.un(title)); - } else { - setTitle(toHTML.un(artist) + ' - ' + toHTML.un(title)); - } - } - }); + if (getCookie('Notification_Song')) { + showNotification(coverartSrc, toHTML.un(title), toHTML.un(artist + ' - ' + album), 'text', '#NextTrack'); + } + if (getCookie('ScrollTitle')) { + scrollTitle(toHTML.un(artist) + ' - ' + toHTML.un(title)); + } else { + setTitle(toHTML.un(artist) + ' - ' + toHTML.un(title)); + } +} +function playVideo(id, bitrate) { + var w, h; + bitrate = parseInt(bitrate); + if (bitrate <= 600) { + w = 320; h = 240; + } else if (bitrate <= 1000) { + w = 480; h = 360; + } else { + w = 640; h = 480; + } + //$("#jPlayerSelector").jPlayer("option", "fullScreen", true); + $("#videodeck").jPlayer({ + ready: function () { + /* + $.fancybox({ + autoSize: false, + width: w + 10, + height: h + 10, + content: $('#videodeck') + }); + */ + $(this).jPlayer("setMedia", { + m4v: 'https://&id=' + id + '&salt=83132' + }).jPlayer("play"); + $('#videooverlay').show(); + }, + swfPath: "js/jplayer", + solution: "html, flash", + supplied: "m4v" + }); } function scrobbleSong(submission) { var songid = $('#songdetails_song').attr('childid'); $.ajax({ - url: baseURL + '/scrobble.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + songid + "&submission=" + submission, + url: baseURL + '/scrobble.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + songid + "&submission=" + submission, method: 'GET', dataType: 'json', timeout: 10000, @@ -177,7 +245,7 @@ function scrobbleSong(submission) { } function rateSong(songid, rating) { $.ajax({ - url: baseURL + '/setRating.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + songid + "&rating=" + rating, + url: baseURL + '/setRating.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + songid + "&rating=" + rating, method: 'GET', dataType: 'json', timeout: 10000, @@ -190,9 +258,9 @@ function starItem(itemid, starred) { var url; if (itemid !== undefined) { if (starred) { - url = baseURL + '/star.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + itemid; + url = baseURL + '/star.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + itemid; } else { - url = baseURL + '/unstar.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + itemid; + url = baseURL + '/unstar.view?u=' + username + '&p=' + password + '&v=' + apiVersion + '&c=' + applicationName + '&f=json&id=' + itemid; } $.ajax({ url: url, @@ -218,7 +286,7 @@ function changeTrack(next) { var songid = $(next).attr('childid'); if (songid !== undefined) { var albumid = $(next).attr('parentid'); - playSong(next, songid, albumid, 0, false); + getSongData(next, songid, albumid, 0, false); $('#CurrentPlaylist').scrollTo($('#' + songid), 400); //Scroll to object if (debug) { console.log('Changing Track: songid:' + songid + ', albumid:' + albumid); } return true; @@ -236,13 +304,13 @@ function autoPlay(loadonly) { song = $('#CurrentPlaylistContainer tr.song:first'); var songid = $(song).attr('childid'); var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, true); + getSongData(song, songid, albumid, 0, true); } else { // No songs currently playing, so get first and play song = $('#CurrentPlaylistContainer tr.song:first'); var songid = $(song).attr('childid'); var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, false); + getSongData(song, songid, albumid, 0, false); } } else { if (nextSong.length == 1) { @@ -250,13 +318,13 @@ function autoPlay(loadonly) { song = $('#CurrentPlaylistContainer tr.playing').next(); var songid = $(song).attr('childid'); var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, false); + getSongData(song, songid, albumid, 0, false); } else { // Otherwise get song = $('#CurrentPlaylistContainer tr.playing'); var songid = $(song).attr('childid'); var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, false); + getSongData(song, songid, albumid, 0, false); } } } \ No newline at end of file diff --git a/js/libs/player_sm.js b/js/libs/player_sm.js deleted file mode 100644 index 197118f..0000000 --- a/js/libs/player_sm.js +++ /dev/null @@ -1,344 +0,0 @@ -var scrobbled = false; -var timerid = 0; -function playSong(el, songid, albumid, position, loadonly) { - ajaxUrl = baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + albumid; - if (debug) { console.log(ajaxUrl) } - $.ajax({ - url: ajaxUrl, - method: 'GET', - dataType: 'json', - timeout: 10000, - success: function (data) { - var title, artist, album, rating, starred, contenttype; - var specs = ''; - if (data["subsonic-response"].directory.child !== undefined) { - // There is a bug in the API that doesn't return a JSON array for one artist - var children = []; - if (data["subsonic-response"].directory.child.length > 0) { - children = data["subsonic-response"].directory.child; - } else { - children[0] = data["subsonic-response"].directory.child; - } - $.each(children, function (i, child) { - if (child.id == songid) { - title = child.title.toString(); - if (child.artist !== undefined) { artist = child.artist.toString(); } else { artist = ''; } - album = child.album; - coverart = child.coverArt; - rating = child.userRating; - if (child.contentType == 'audio/ogg') { contenttype = child.contentType; } else { contenttype = 'audio/mp3'; } - if (child.starred !== undefined) { starred = true; } else { starred = false; } - if (child.bitRate !== undefined) { specs += child.bitRate + ' Kbps'; } - if (child.transcodedSuffix !== undefined) { specs += ', transcoding:' + child.suffix + ' > ' + child.transcodedSuffix; } else { specs += ', ' + child.suffix; } - } - }); - } - if (starred) { - $('#songdetails_rate').attr('class', 'favorite'); - } else { - $('#songdetails_rate').attr('class', 'rate'); - } - $('#songdetails_song').html(title); - $('#songdetails_song').attr('title', title); - $('#songdetails_song').attr('parentid', albumid); - $('#songdetails_song').attr('childid', songid); - $('#songdetails_artist').html(artist + ' - ' + album); - $('#songdetails_artist').attr('title', toHTML.un(artist + ' - ' + album)); - $('#songdetails_specs').html(specs); - var coverartSrc, coverartFullSrc; - if (coverart == undefined) { - coverartSrc = 'images/albumdefault_56.jpg'; - coverartFullSrc = ''; - } else { - coverartSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&size=56&id=' + coverart; - coverartFullSrc = baseURL + '/getCoverArt.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + coverart; - } - $('#coverartimage').attr('href', coverartFullSrc); - $('#coverartimage img').attr('src', coverartSrc); - $('#playermiddle').css('visibility', 'visible'); - $('#songdetails').css('visibility', 'visible'); - if (!loadonly) { // Sometimes we only want to load the track and not play - // SoundManager Initialize - var salt = Math.floor(Math.random() * 100000); - soundManager.onready(function () { - if (debug) { - console.log("SM HTML5 STATUS"); - $.each(soundManager.html5, function (key, value) { - console.log(key + ': ' + value); - }); - } - var sm = soundManager.getSoundById('audio'); - if (typeof sm !== undefined) { - soundManager.destroySound('audio'); - } - soundManager.createSound({ - id: 'audio', - url: baseURL + '/stream.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt, - stream: true, - type: contenttype, - multiShot: false, - whileloading: function () { - //if (debug) { console.log('loaded:' + this.bytesLoaded + ' total:' + this.bytesTotal); } - var percent = this.bytesLoaded / this.bytesTotal; - var scrubber = $('#audio_wrapper0').find(".scrubber"); - var loaded = $('#audio_wrapper0').find(".loaded"); - loaded.css('width', (scrubber.get(0).offsetWidth * percent) + 'px'); - loaded.attr('title', Math.round(percent * 100) + '% loaded'); - }, - whileplaying: function () { - //if (debug) { console.log('position:' + this.position + ' duration:' + this.duration); } - var percent = this.position / this.duration; - var scrubber = $('#audio_wrapper0').find(".scrubber"); - var progress = $('#audio_wrapper0').find(".progress"); - progress.css('width', (scrubber.get(0).offsetWidth * percent) + 'px'); - - var played = $('#audio_wrapper0').find(".played"); - var p = (this.duration / 1000) * percent, - m = Math.floor(p / 60), - s = Math.floor(p % 60); - played.html((m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s); - - // Scrobble song once percentage is reached - if (!scrobbled && p > 30 && (percent > 0.5 || p > 480)) { - if (debug) { console.log("LAST.FM SCROBBLE"); } - scrobbleSong(true); - } - }, - onload: function () { - var duration = $('#audio_wrapper0').find(".duration"); - var dp = this.duration / 1000, - dm = Math.floor(dp / 60), - ds = Math.floor(dp % 60); - duration.html((dm < 10 ? '0' : '') + dm + ':' + (ds < 10 ? '0' : '') + ds); - var scrubber = $('#audio_wrapper0').find(".scrubber"); - scrubber.unbind("click"); - scrubber.click(function (e) { - var x = (e.pageX - this.offsetLeft) / scrubber.width(); - var position = Math.round(dp * 1000 * x); - var s = soundManager.getSoundById('audio'); - s.setPosition(position); - }); - scrubber.mouseover(function (e) { - $('.audiojs .scrubber').stop().animate({ height: '8px' }); - }); - scrubber.mouseout(function (e) { - $('.audiojs .scrubber').stop().animate({ height: '4px' }); - }); - }, - onpause: function () { - if (debug) { console.log('Pause Event: ' + ' playState:' + this.playState + ', readyState:' + this.readyState + ', position:' + this.position + ', duration:' + this.duration + ', durationEstimate:' + this.durationEstimate + ', isBuffering:' + this.isBuffering); } - }, - onresume: function () { - if (debug) { console.log('Resume Event: ' + ' playState:' + this.playState + ', readyState:' + this.readyState + ', position:' + this.position + ', duration:' + this.duration + ', durationEstimate:' + this.durationEstimate + ', isBuffering:' + this.isBuffering); } - }, - onsuspend: function () { - if (debug) { console.log('Suspend Event: ' + ' playState:' + this.playState + ', readyState:' + this.readyState + ', position:' + this.position + ', duration:' + this.duration + ', durationEstimate:' + this.durationEstimate + ', isBuffering:' + this.isBuffering); } - }, - onfinish: function () { - var next = $('#CurrentPlaylistContainer tr.playing').next(); - if (!changeTrack(next)) { - if (getCookie('AutoPilot')) { - getRandomSongList('autoplayappend', '#CurrentPlaylistContainer tbody', '', ''); - } - } - }, - ontimeout: function (status) { - if (debug) { console.log('The status is ' + status.success + ', the error type is ' + status.error.type); } - } - }); - if (position == 0) { - soundManager.play('audio'); - soundManager.setVolume('audio', volume); - } else { - var p = position; - seekAndPlay('audio', p); - soundManager.setVolume('audio', volume); - } - if (getCookie('SaveTrackPosition')) { - if (timerid != 0) { - clearInterval(timerid); - } - timerid = window.setInterval(function () { - if (getCookie('SaveTrackPosition')) { - var sm = soundManager.getSoundById('audio'); - if (sm !== undefined) { - saveTrackPosition(); - } - } - }, 5000); - } - var submenu = $('div#submenu_CurrentPlaylist'); - if (submenu.is(":visible")) { - submenu.fadeOut(); - } - }); - - $('table.songlist tr.song').removeClass('playing'); - if (el != null) { - $(el).addClass('playing'); - } - $('#PlayTrack').find('img').attr('src', 'images/pause_24x32.png'); - $('#PlayTrack').addClass('playing'); - scrobbleSong(false); - scrobbled = false; - - if (getCookie('Notification_Song')) { - showNotification(coverartSrc, toHTML.un(title), toHTML.un(artist + ' - ' + album), 'text'); - } - if (getCookie('ScrollTitle')) { - scrollTitle(toHTML.un(artist) + ' - ' + toHTML.un(title)); - } else { - setTitle(toHTML.un(artist) + ' - ' + toHTML.un(title)); - } - } - } - }); -} -function seekAndPlay(soundID, soundPosition) { - var s = soundManager.getSoundById(soundID); - if (s) { - s.unload(); - if (s.readyState === 0) { // hasn't started loading yet... - // load the whole sound, and play when it's done - s.load({ - onload: function () { - this.play({ - position: soundPosition - }); - } - }); - } else if (s.readyState === 3) { - // sound has already loaded, ready to go - s.play({ - position: soundPosition - }); - } - } -} -function scrobbleSong(submission) { - var songid = $('#songdetails_song').attr('childid'); - $.ajax({ - url: baseURL + '/scrobble.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + songid + "&submission=" + submission, - method: 'GET', - dataType: 'json', - timeout: 10000, - success: function () { - if (submission) { - scrobbled = true; - } - } - }); -} -function rateSong(songid, rating) { - $.ajax({ - url: baseURL + '/setRating.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + songid + "&rating=" + rating, - method: 'GET', - dataType: 'json', - timeout: 10000, - success: function () { - updateMessage('Rating Updated!'); - } - }); -} -function starItem(itemid, starred) { - var url; - if (itemid !== undefined) { - if (starred) { - url = baseURL + '/star.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + itemid; - } else { - url = baseURL + '/unstar.view?u=' + username + '&p=' + password + '&v=' + version + '&c=' + applicationName + '&f=json&id=' + itemid; - } - $.ajax({ - url: url, - method: 'GET', - dataType: 'json', - timeout: 10000, - success: function () { - updateMessage('Favorite Updated!'); - } - }); - } -} -function playPauseSong() { - var el = '#PlayTrack'; - if ($(el).hasClass('playing')) { - $(el).find('img').attr('src', 'images/play_24x32.png'); - $(el).removeClass('playing'); - $(el).addClass('paused'); - soundManager.pause('audio'); - } else if ($(el).hasClass('paused')) { - $(el).find('img').attr('src', 'images/pause_24x32.png'); - $(el).removeClass('paused'); - $(el).addClass('playing'); - soundManager.resume('audio'); - } else { - var el = $('#songdetails_song'); - var songid = el.attr('childid'); - if (songid != '') { - if (getCookie("CurrentSong")) { - var currentSong = JSON.parse(getCookie("CurrentSong")); - playSong($('#' + songid), currentSong.songid, currentSong.albumid, currentSong.position, false); - var playing = $('#' + songid); - if (playing != undefined) { - $('#CurrentPlaylist').scrollTo(playing, 400); - } - } - } else { - // Start playing song - var play = $('#CurrentPlaylistContainer tr.selected').first(); - if (changeTrack(play)) { - $(el).find('img').attr('src', 'images/pause_24x32.png'); - $(el).addClass('playing'); - } else { - var first = $('#CurrentPlaylistContainer tr').first(); - changeTrack(first); - } - } - } -} -function changeTrack(next) { - var songid = $(next).attr('childid'); - if (songid !== undefined) { - var albumid = $(next).attr('parentid'); - playSong(next, songid, albumid, 0, false); - $('#CurrentPlaylist').scrollTo($('#' + songid), 400); //Scroll to object - if (debug) { console.log('Changing Track: songid:' + songid + ', albumid:' + albumid); } - return true; - } else { - return false; - } -} -function autoPlay(loadonly) { - if (debug) { console.log('Next Play'); } - var song = $('#CurrentPlaylistContainer tr.playing'); - var nextSong = $('#CurrentPlaylistContainer tr.playing').next(); - if (song.length == 0) { - if (loadonly) { - // No songs currently playing, so get first and do not play - song = $('#CurrentPlaylistContainer tr.song:first'); - var songid = $(song).attr('childid'); - var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, true); - } else { - // No songs currently playing, so get first and play - song = $('#CurrentPlaylistContainer tr.song:first'); - var songid = $(song).attr('childid'); - var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, false); - } - } else { - if (nextSong.length == 1) { - // Get next song after currently playing - song = $('#CurrentPlaylistContainer tr.playing').next(); - var songid = $(song).attr('childid'); - var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, false); - } else { - // Otherwise get - song = $('#CurrentPlaylistContainer tr.playing'); - var songid = $(song).attr('childid'); - var albumid = $(song).attr('parentid'); - playSong(song, songid, albumid, 0, false); - } - } -} \ No newline at end of file diff --git a/js/libs/utils.js b/js/libs/utils.js index d33bb6c..c8ad3a5 100644 --- a/js/libs/utils.js +++ b/js/libs/utils.js @@ -1,4 +1,23 @@ /* Reusable Functions */ +function clickButton(el) { + var el = $(el); + if (el) { + var classes = $(el).attr('class').split(" "); + for (var i = 0, l = classes.length; i < l; ++i) { + var types = ['shuffle', 'mute']; + if (jQuery.inArray(classes[i], types) >= 0) { + var up = classes[i] + '_up'; + if (el.hasClass(up)) { + el.removeClass(up); + return false; + } else { + el.addClass(up); + return true; + } + } + } + } +} function confirmDelete() { var question = confirm('Are you sure you want to delete the selected item(s)?'); if (question) { @@ -217,7 +236,7 @@ function hasNotificationPermission() { return !!(window.webkitNotifications) && (window.webkitNotifications.checkPermission() == 0); } var notifications = new Array(); -function showNotification(pic, title, text, type) { +function showNotification(pic, title, text, type, bind) { if (hasNotificationPermission()) { //closeAllNotifications() var popup; @@ -225,10 +244,15 @@ function showNotification(pic, title, text, type) { popup = window.webkitNotifications.createNotification(pic, title, text); } else if (type == 'html') { popup = window.webkitNotifications.createHTMLNotification(text); - } + } + if (bind = '#NextTrack') { + popup.addEventListener('click', function () { + $(bind).click(); + }) + } notifications.push(popup); setTimeout(function (notWin) { - notWin.cancel(); + notWin.cancel(); }, 10000, popup); popup.show(); } else { diff --git a/js/plugins/jquery.dateFormat-1.0.js b/js/plugins/jquery.dateFormat-1.0.js index 0b7a4fe..985d313 100644 --- a/js/plugins/jquery.dateFormat-1.0.js +++ b/js/plugins/jquery.dateFormat-1.0.js @@ -1,8 +1,8 @@ -(function ($) { - +(function (jQuery) { + var daysInWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; var shortMonthsInYear = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - var longMonthsInYear = ["January", "February", "March", "April", "May", "June", + var longMonthsInYear = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var shortMonthsToNumber = []; shortMonthsToNumber["Jan"] = "01"; @@ -17,8 +17,8 @@ shortMonthsToNumber["Oct"] = "10"; shortMonthsToNumber["Nov"] = "11"; shortMonthsToNumber["Dec"] = "12"; - - $.format = (function () { + + jQuery.format = (function () { function strDay(value) { return daysInWeek[parseInt(value, 10)] || value; } @@ -30,7 +30,7 @@ function strLongMonth(value) { var monthArrayIndex = parseInt(value, 10) - 1; - return longMonthsInYear[monthArrayIndex] || value; + return longMonthsInYear[monthArrayIndex] || value; } var parseMonth = function (value) { @@ -73,9 +73,9 @@ return { date: function (value, format) { - /* + /* value = new java.util.Date() - 2009-12-18 10:54:50.546 + 2009-12-18 10:54:50.546 */ try { var date = null; @@ -84,13 +84,16 @@ var dayOfMonth = null; var dayOfWeek = null; var time = null; - if (typeof value.getFullYear === "function") { + if (typeof value == "number"){ + return this.date(new Date(value), format); + } else if (typeof value.getFullYear == "function") { year = value.getFullYear(); month = value.getMonth() + 1; dayOfMonth = value.getDate(); dayOfWeek = value.getDay(); time = parseTime(value.toTimeString()); - } else if (value.search(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d{0,3}[-+]?\d{2}:\d{2}/) != -1) { /* 2009-04-19T16:11:05+02:00 */ + } else if (value.search(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d{0,3}[Z\-+]?(\d{2}:?\d{2})?/) != -1) { + /* 2009-04-19T16:11:05+02:00 || 2009-04-19T16:11:05Z */ var values = value.split(/[T\+-]/); year = values[0]; month = values[1]; @@ -133,6 +136,16 @@ date = new Date(year, month - 1, dayOfMonth); dayOfWeek = date.getDay(); break; + case 1: + /* added by Jonny, for 2012-02-07CET00:00:00 (Doctrine Entity -> Json Serializer) */ + var values2 = values[0].split(""); + year=values2[0]+values2[1]+values2[2]+values2[3]; + month= values2[5]+values2[6]; + dayOfMonth = values2[8]+values2[9]; + time = parseTime(values2[13]+values2[14]+values2[15]+values2[16]+values2[17]+values2[18]+values2[19]+values2[20]) + date = new Date(year, month - 1, dayOfMonth); + dayOfWeek = date.getDay(); + break; default: return value; } @@ -140,13 +153,15 @@ var pattern = ""; var retValue = ""; + var unparsedRest = ""; /* - Issue 1 - variable scope issue in format.date + Issue 1 - variable scope issue in format.date Thanks jakemonO */ for (var i = 0; i < format.length; i++) { var currentPattern = format.charAt(i); pattern += currentPattern; + unparsedRest = ""; switch (pattern) { case "ddd": retValue += strDay(dayOfWeek); @@ -162,6 +177,13 @@ retValue += dayOfMonth; pattern = ""; break; + case "d": + if (format.charAt(i + 1) == "d") { + break; + } + retValue += parseInt(dayOfMonth, 10); + pattern = ""; + break; case "MMMM": retValue += strLongMonth(month); pattern = ""; @@ -183,19 +205,46 @@ retValue += month; pattern = ""; break; + case "M": + if (format.charAt(i + 1) == "M") { + break; + } + retValue += parseInt(month, 10); + pattern = ""; + break; case "yyyy": retValue += year; pattern = ""; break; + case "yy": + if (format.charAt(i + 1) == "y" && + format.charAt(i + 2) == "y") { + break; + } + retValue += String(year).slice(-2); + pattern = ""; + break; case "HH": retValue += time.hour; pattern = ""; break; case "hh": /* time.hour is "00" as string == is used instead of === */ - retValue += (time.hour == 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12); + var hour = (time.hour == 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12); + hour = String(hour).length == 1 ? '0' + hour : hour; + retValue += hour; pattern = ""; break; + case "h": + if (format.charAt(i + 1) == "h") { + break; + } + var hour = (time.hour == 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12); + retValue += parseInt(hour, 10); + // Fixing issue https://github.com/phstc/jquery-dateFormat/issues/21 + // retValue = parseInt(retValue, 10); + pattern = ""; + break; case "mm": retValue += time.minute; pattern = ""; @@ -231,9 +280,12 @@ pattern = pattern.substring(1, 2); } else if ((pattern.length === 3 && pattern.indexOf("yyy") === -1)) { pattern = ""; + } else { + unparsedRest = pattern; } } } + retValue += unparsedRest; return retValue; } catch (e) { console.log(e); @@ -244,20 +296,22 @@ }()); }(jQuery)); +jQuery.format.date.defaultShortDateFormat = "dd/MM/yyyy"; +jQuery.format.date.defaultLongDateFormat = "dd/MM/yyyy hh:mm:ss"; -$(document).ready(function () { - $(".shortDateFormat").each(function (idx, elem) { - if ($(elem).is(":input")) { - $(elem).val($.format.date($(elem).val(), "dd/MM/yyyy")); +jQuery(document).ready(function () { + jQuery(".shortDateFormat").each(function (idx, elem) { + if (jQuery(elem).is(":input")) { + jQuery(elem).val(jQuery.format.date(jQuery(elem).val(), jQuery.format.date.defaultShortDateFormat)); } else { - $(elem).text($.format.date($(elem).text(), "dd/MM/yyyy")); + jQuery(elem).text(jQuery.format.date(jQuery(elem).text(), jQuery.format.date.defaultShortDateFormat)); } }); - $(".longDateFormat").each(function (idx, elem) { - if ($(elem).is(":input")) { - $(elem).val($.format.date($(elem).val(), "dd/MM/yyyy hh:mm:ss")); + jQuery(".longDateFormat").each(function (idx, elem) { + if (jQuery(elem).is(":input")) { + jQuery(elem).val(jQuery.format.date(jQuery(elem).val(), jQuery.format.date.defaultLongDateFormat)); } else { - $(elem).text($.format.date($(elem).text(), "dd/MM/yyyy hh:mm:ss")); + jQuery(elem).text(jQuery.format.date(jQuery(elem).text(), jQuery.format.date.defaultLongDateFormat)); } }); -}); +}); \ No newline at end of file diff --git a/js/ui-load.js b/js/ui-load.js index 6e09b65..fd90260 100755 --- a/js/ui-load.js +++ b/js/ui-load.js @@ -19,7 +19,7 @@ }); if (getCookie('CurrentSong')) { var currentSong = JSON.parse(getCookie("CurrentSong")); - playSong(null, currentSong.songid, currentSong.albumid, currentSong.position, true); + getSongData(null, currentSong.songid, currentSong.albumid, currentSong.position, true); loadCurrentPlaylist(); } resizeContent(); @@ -43,17 +43,20 @@ function resizeContent() { $('.tabcontent').css({ 'width': tabwidth + 'px' }); } var sbheight = $(window).height() - 152; - $('#SideBar').css({ 'height': (sbheight + 107) + 'px' }); + var sbwidth = $('#SideBar').width(); + $('#SideBar').css({ 'height': (sbheight + 104) + 'px' }); $('#ChatMsgs').css({ 'height': (sbheight - 166) + 'px' }); + $('.status').css({ 'right': (sbwidth + 10) + 'px' }); } else { var tabwidth = $(window).width() - 58; if (tabwidth >= 300) { $('.tabcontent').css({ 'width': tabwidth + 'px' }); + $('.status').css({ 'right': 4 + 'px' }); } } var tabwidth = $('.tabcontent').width(); - $('#AlbumContainer, #TrackContainer, #PodcastContainer, #CurrentPlaylistContainer').css({ 'width': (tabwidth - smwidth - 45) + 'px' }); - $('#CurrentPlaylistContainer').css({ 'width': (tabwidth - 30) + 'px' }); + $('#AlbumContainer, #TrackContainer, #PodcastContainer').css({ 'width': (tabwidth - smwidth - 45) + 'px' }); + $('#CurrentPlaylistContainer, #VideosContainer').css({ 'width': (tabwidth - 30) + 'px' }); $('#player').css({ 'width': tabwidth + 'px' }); } function resizeSMSection(x) { diff --git a/js/ui-ready.js b/js/ui-ready.js index 0402923..d48ff51 100755 --- a/js/ui-ready.js +++ b/js/ui-ready.js @@ -76,27 +76,13 @@ // Tabs $('.tabcontent').hide(); //Hide all content - if (!getCookie('username') && !getCookie('passwordenc') && !getCookie('Server')) { - $('ul.tabs li a').each(function () { - if ($(this).attr("href") == '#tabPreferences') { - $(this).addClass("active"); //Add "active" class to selected tab - } - }); - $('#tabPreferences').show(); //Show first tab content + if (!getCookie('username') && !getCookie('passwordenc') && !getCookie('Server')) { // Show Preferences loadTabContent('#tabPreferences'); } else { if (window.location.hash) { var hash = window.location.hash; - $('ul.tabs li a').each(function () { - if ($(this).attr("href") == hash) { - $(this).addClass("active"); //Add "active" class to selected tab - } - }); - $(hash).show(); //Fade in the active ID content loadTabContent(hash); } else { - $("ul.tabs li:first a").addClass("active").show(); //Activate first tab - $(".tabcontent:first").show(); //Show first tab content var firstTab = $("ul.tabs li:first a").attr("href"); loadTabContent(firstTab); } @@ -113,12 +99,11 @@ var currentTab = window.location.hash; var activeTab = $(this).attr("href"); //Find the href attribute value to identify the active tab + content if (currentTab != activeTab) { - $("ul.tabs li a").removeClass("active"); //Remove any "active" class - $(this).addClass("active"); //Add "active" class to selected tab - $(".tabcontent").hide(); //Hide all tab content - $(activeTab).fadeIn('fast'); //Fade in the active ID content + if (getCookie('username') && getCookie('passwordenc') && getCookie('Server')) { + loadTabContent(activeTab); + } } - loadTabContent(activeTab); + return false; }); // Ajax Loading Screen @@ -157,25 +142,10 @@ // spacebar } else if (unicode == 32 || unicode == 179 || unicode == 0179) { playPauseSong(); + return false; } else if (unicode == 36 && $('#tabLibrary').is(':visible')) { $('#Artists').stop().scrollTo('#auto', 400); } - if (unicode == 189) { // dash - if (volume <= 100 && volume > 0 && source == '') { - volume += -10; - $("#playdesk").jPlayer("volume", volume/100); - setCookie('Volume', volume); - updateMessage('Volume: ' + volume + '%'); - } - } - if (unicode == 187) { // equals - if (volume < 100 && volume >= 0 && source == '') { - volume += 10; - $("#playdesk").jPlayer("volume", volume / 100); - setCookie('Volume', volume); - updateMessage('Volume: ' + volume + '%'); - } - } } }); @@ -183,8 +153,12 @@ // Albums Click Event $('#MusicFolders').live('change', function () { var folder = $(this).val(); + if (folder != 'all') { + setCookie('MusicFolders', folder); + } else { + setCookie('MusicFolders', null); + } loadArtists(folder, true); - setCookie('MusicFolders', folder); }); $('#ArtistContainer li.item').live('click', function () { $('#AutoAlbumContainer li').removeClass('selected'); @@ -285,12 +259,12 @@ //$(this).addClass('playing').siblings().removeClass('playing'); var songid = $(this).attr('childid'); var albumid = $(this).attr('parentid'); - playSong(this, songid, albumid, 0, false); + getSongData(this, songid, albumid, 0, false); }); $('table.songlist tr.song a.play').live('click', function (event) { var songid = $(this).parent().parent().attr('childid'); var albumid = $(this).parent().parent().attr('parentid'); - if (!$('#tabCurrent').is(':visible')) { + if (!$('#tabQueue').is(':visible')) { $('#CurrentPlaylistContainer tbody').empty(); var track = $(this).parent().parent(); $(track).clone().appendTo('#CurrentPlaylistContainer'); @@ -306,9 +280,9 @@ var firstsong = $('#CurrentPlaylistContainer tr.song:first'); songid = $(firstsong).attr('childid'); albumid = $(firstsong).attr('parentid'); - playSong(firstsong, songid, albumid, 0, false); + getSongData(firstsong, songid, albumid, 0, false); } else { - playSong($(this).parent().parent(), songid, albumid, 0, false); + getSongData($(this).parent().parent(), songid, albumid, 0, false); } return false; }); @@ -393,15 +367,13 @@ $('div.submenu').hide(); //setTimeout(function () { if (submenu_active == false) $('div.submenu').stop().fadeOut(); }, 400); }); - $('a#action_AddToCurrent').click(function () { + $('a#action_AddToQueue').click(function () { if (!$(this).hasClass('disabled')) { - addToCurrent(false); - } - return false; - }); - $('a#action_AddAllToCurrent').click(function () { - if (!$(this).hasClass('disabled')) { - addToCurrent(true); + if ($('#AlbumContainer tr.selected').size() > 0) { + addToCurrent(false); + } else { + addToCurrent(true); + } } return false; }); @@ -497,7 +469,7 @@ return false; }); - // Current Playlist Click Events + // Play Queue Click Events $('#action_Shuffle').live('click', function () { $('#CurrentPlaylistContainer tbody tr.song:not(#CurrentPlaylistContainer tbody tr.playing)').shuffle(); /* Sets currently playing song first in list after sort @@ -544,8 +516,8 @@ $('#songdetails').click(function (e) { var source = e.target.nodeName; var hash = window.location.hash; - if (source != 'IMG' && hash != '#tabCurrent') { - $('#action_tabCurrent').click(); + if (source != 'A' && hash != '#tabQueue') { + loadTabContent('#tabQueue'); } }); $('#songdetails').mouseover(function () { @@ -634,12 +606,16 @@ $('#action_AutoPilot').addClass('selected'); msg = 'Autopilot On'; var audio = typeof $("#playdeck").data("jPlayer") != 'undefined' ? true : false; + var folder = ''; + if (getCookie('MusicFolders')) { + folder = getCookie('MusicFolders') + } if ($('#CurrentPlaylistContainer tbody').html() == '' && !audio) { $('#CurrentPlaylistContainer tbody').empty(); - getRandomSongList('autoplay', '#CurrentPlaylistContainer tbody', '', ''); + getRandomSongList('autoplay', '#CurrentPlaylistContainer tbody', '', folder); $('#currentActions a.button').removeClass('disabled'); } else { - getRandomSongList('', '#CurrentPlaylistContainer tbody', '', ''); + getRandomSongList('', '#CurrentPlaylistContainer tbody', '', folder); $('#currentActions a.button').removeClass('disabled'); } } @@ -649,28 +625,47 @@ }); // Playlist Click Events - $('#AutoPlaylistContainer li.item, #FolderContainer li.item').live('click', function () { + $('#AutoPlaylistContainer li.item').live('click', function () { $('#AutoPlaylistContainer li, #FolderContainer li, #PlaylistContainer li').removeClass('selected'); $(this).addClass('selected'); var genre = $(this).data('genre') !== undefined ? $(this).data('genre') : ''; - var folder = $(this).data('folder') !== undefined ? $(this).data('folder') : ''; + var folder = getCookie('MusicFolders') ? getCookie('MusicFolders') : ''; + $('#playlistActions a.button').addClass('disabled'); getRandomSongList('', '#TrackContainer tbody', genre, folder); }); - $('#AutoPlaylistContainer li.item a.play, #FolderContainer li.item a.play').live('click', function () { + $('#AutoPlaylistContainer li.item a.play').live('click', function () { var genre = $(this).data('genre') !== undefined ? $(this).data('genre') : ''; - var folder = $(this).data('folder') !== undefined ? $(this).data('folder') : ''; + var folder = getCookie('MusicFolders') ? getCookie('MusicFolders') : ''; getRandomSongList('autoplay', '#CurrentPlaylistContainer tbody', genre, folder); return false; }); - $('#AutoPlaylistContainer li.item a.add, #FolderContainer li.item a.add').live('click', function () { + $('#AutoPlaylistContainer li.item a.add').live('click', function () { var genre = $(this).data('genre') !== undefined ? $(this).data('genre') : ''; - var folder = $(this).data('folder') !== undefined ? $(this).data('folder') : ''; + var folder = getCookie('MusicFolders') ? getCookie('MusicFolders') : ''; getRandomSongList('', '#CurrentPlaylistContainer tbody', genre, folder); return false; }); + $('#FolderContainer li.item').live('click', function () { + $('#AutoPlaylistContainer li, #FolderContainer li, #PlaylistContainer li').removeClass('selected'); + $(this).addClass('selected'); + var folder = $(this).data('folder') !== undefined ? $(this).data('folder') : ''; + $('#playlistActions a.button').addClass('disabled'); + getRandomSongList('', '#TrackContainer tbody', '', folder); + }); + $('#FolderContainer li.item a.play').live('click', function () { + var folder = $(this).data('folder') !== undefined ? $(this).data('folder') : ''; + getRandomSongList('autoplay', '#CurrentPlaylistContainer tbody', '', folder); + return false; + }); + $('#FolderContainer li.item a.add').live('click', function () { + var folder = $(this).data('folder') !== undefined ? $(this).data('folder') : ''; + getRandomSongList('', '#CurrentPlaylistContainer tbody', '', folder); + return false; + }); $('#PlaylistContainer li.item').live('click', function () { $('#AutoPlaylistContainer li, #FolderContainer li, #PlaylistContainer li').removeClass('selected'); $(this).addClass('selected'); + $('#playlistActions a.button').removeClass('disabled'); getPlaylist($(this).attr("id"), '', '#TrackContainer tbody'); }); $('#PlaylistContainer li.item a.play').live('click', function () { @@ -691,35 +686,47 @@ loadFolders(true); return false; }); + $('#action_NewPlaylist').click(function () { + newPlaylist(); + return false; + }); $('#action_DeletePlaylist').click(function () { - if ($('#PlaylistContainer li.selected').length > 0) { - if (confirmDelete()) { - $('#PlaylistContainer li.selected').each(function () { - deletePlaylist($(this).attr("id")); - }); + if (!$(this).hasClass('disabled')) { + if ($('#PlaylistContainer li.selected').length > 0) { + if (confirmDelete()) { + $('#PlaylistContainer li.selected').each(function () { + deletePlaylist($(this).attr("id")); + }); + } } } return false; }); $('#action_SavePlaylist').click(function () { - if ($('#PlaylistContainer li.selected').length > 0) { - $('#PlaylistContainer li.selected').each(function () { - savePlaylist($(this).attr("id")); - }); + if (!$(this).hasClass('disabled')) { + if ($('#PlaylistContainer li.selected').length > 0) { + $('#PlaylistContainer li.selected').each(function () { + savePlaylist($(this).attr("id")); + }); + } } return false; }); $('#action_RemoveSongs').click(function () { - if ($('#TrackContainer tr.selected').length > 0) { - $('#TrackContainer tr.selected').each(function () { - $(this).remove(); - }); + if (!$(this).hasClass('disabled')) { + if ($('#TrackContainer tr.selected').length > 0) { + $('#TrackContainer tr.selected').each(function () { + $(this).remove(); + }); + } } return false; }); $('#action_ShufflePlaylist').live('click', function () { - $('#TrackContainer thead').find('th').removeClass('sorted ascending descending'); - $('#TrackContainer tbody tr.song').shuffle(); + if (!$(this).hasClass('disabled')) { + $('#TrackContainer thead').find('th').removeClass('sorted ascending descending'); + $('#TrackContainer tbody tr.song').shuffle(); + } return false; }); @@ -748,6 +755,19 @@ return false; }); + // Video Click Events + $('#VideosContainer tr.video').live('dblclick', function (e) { + e.preventDefault(); + var id = $(this).attr('childid'); + $(this).find('a.play').click(); + //var bitrate = $(this).attr('bitrate'); + //playVideo(id, bitrate); + }); + $('#action_RefreshVideos').click(function () { + loadVideos(true); + return false; + }); + // Player Click Events $('#NextTrack').live('click', function () { var next; @@ -792,6 +812,20 @@ $('#audiocontainer .scrubber').mouseout(function (e) { $('.audiojs .scrubber').stop().animate({ height: '4px' }); }); + $('#action_ShuffleMode').live('click', function () { + clickButton(this); + return false; + }); + /* + $('#action_Mute').live('click', function () { + if (clickButton(this)) { + $("#playdeck").jPlayer("mute"); + } else { + $("#playdeck").jPlayer("unmute"); + } + return false; + }); + */ // Side Bar Click Events $('#action_ToggleSideBar').live('click', function () { @@ -967,5 +1001,5 @@ $("#TrackContainer tbody").sortable({ helper: fixHelper }).disableSelection(); -}); // End document.ready +}); // End document.ready diff --git a/manifest.json b/manifest.json index 920d1cf..b07a02a 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "MiniSub", "description": "MiniSub - HTML5 Mini Player for Subsonic", - "version": "2.2.7", + "version": "2.3.1", "app": { "launch": { "local_path": "index.html" diff --git a/style/Dark.css b/style/Dark.css index 0fa90bf..e288468 100644 --- a/style/Dark.css +++ b/style/Dark.css @@ -14,6 +14,10 @@ a:hover h3.title { color: #f2f2f2; } +span.apiversion +{ + color: #ffffff; +} #content { @@ -112,12 +116,12 @@ h3.title { background: #2E2E2E; border: 1px solid #1D1D1D; } -#coverart -{ - border: 1px solid #232323; -} .vertshade { - background-image: -webkit-gradient( linear, left top, right top, from(rgba(46, 46, 46, 0)), to(rgba(46, 46, 46, 1))); + background: -webkit-gradient(linear, left top, right top, from(rgba(46, 46, 46, 0)), to(rgba(46, 46, 46, 1))); +} +.horizshade +{ + background: -webkit-gradient(linear, center top, center bottom, from(rgba(46, 46, 46, 0)), to(rgba(46, 46, 46, 1))); } #songdetails { @@ -126,10 +130,19 @@ h3.title { #songdetails.hover { border: solid 1px #212121; + background: -webkit-gradient(linear, center top, center bottom, from(rgba(46, 46, 46, 0)), to(rgba(34, 34, 34, .4))); } #songdetails ul { color: #F2F2F2; } +#songdetails a.rate +{ + background-color: #2e2e2e; +} +#songdetails a.rate:hover +{ + background-color: #2e2e2e; +} /* Button Style */ a.button { color: #6e6e6e; @@ -203,7 +216,8 @@ ul.simplelist li.selected #BottomContainer { border-top: 1px solid #F2F2F2; - background: #2a2a2a; + /*background: #2a2a2a;*/ + background: rgba(42, 42, 42, .8); } #BottomContainer #BottomIndex li a { @@ -229,22 +243,22 @@ table.songlist tr.album td.albumart img { border: 1px solid #232323; } -table.songlist tr.song { +table.songlist tr.row { border-bottom: 1px solid #232323; } -table.songlist tr.song:hover +table.songlist tr.row:hover { background: #1d1d1d; } -table.songlist tr.song td.album img +table.songlist tr.row td.album img { border: 1px solid #232323; } -table.songlist tr.song td.album a +table.songlist tr.row td.album a { color: #f2f2f2; } -table.songlist tr.song td.album a:hover +table.songlist tr.row td.album a:hover { color: #d6d469; text-decoration: underline; diff --git a/style/Style.css b/style/Style.css index efbf463..b81cc2e 100755 --- a/style/Style.css +++ b/style/Style.css @@ -20,6 +20,18 @@ h3.title padding: 0; margin: 5px 0; } +span.alert +{ + color: #6BA2D6; + font-size: 12px; + margin: 0 0 0 10px; +} +span.apiversion +{ + color: #000000; + font-weight: bold; + font-size: 14px; +} .border { border: 2px solid #d9d9d9; } .floatleft { float: left; } @@ -404,7 +416,7 @@ table.songlist th { font-size: 14px; font-variant: small-caps; - padding: 5px 5px 5px 12px; + padding: 5px; cursor: pointer; border-bottom: 1px solid #ffffff; background: #fff; @@ -520,17 +532,17 @@ table.songlist tr.album a.favorite background: url('../images/star_yo_12x12.png') 2px center no-repeat; } -table.songlist tr.song +table.songlist tr.row { cursor: pointer; border-bottom: 1px solid #f0f0f0; } -table.songlist tr.song td +table.songlist tr.row td { font-size: 13px; padding: 9px 10px; } -table.songlist tr.song td.itemactions +table.songlist tr.row td.itemactions { width: 85px; padding-left: 26px; @@ -538,20 +550,20 @@ table.songlist tr.song td.itemactions margin: auto 0; height: 18px; } -table.songlist tr.song td.track +table.songlist tr.row td.track { width: 80px; text-align: right; } -table.songlist tr.song td.title +table.songlist tr.row td.title { } -table.songlist tr.song td.album +table.songlist tr.row td.album { padding: 0; line-height: 31px; } -table.songlist tr.song td.album a +table.songlist tr.row td.album a { color: #829FC0; text-decoration: none; @@ -560,11 +572,11 @@ table.songlist tr.song td.album a white-space: nowrap; font-size: 12px; } -table.songlist tr.song td.album a:hover +table.songlist tr.row td.album a:hover { text-decoration: underline; } -table.songlist tr.song td.album img +table.songlist tr.row td.album img { border: 1px solid #DEDEDE; display: block; @@ -573,14 +585,14 @@ table.songlist tr.song td.album img padding: 2px; height: 25px; } -table.songlist tr.song td.artist +table.songlist tr.row td.artist { } -table.songlist tr.song td.time +table.songlist tr.row td.time { text-align: right; } -table.songlist tr.song a.play +table.songlist tr.row a.play { float: left; width: 20px; @@ -589,11 +601,11 @@ table.songlist tr.song a.play margin: 0; background: url('../images/play_gl_6x8.png') no-repeat 7px center; } -table.songlist tr.song a.play:hover +table.songlist tr.row a.play:hover { background: url('../images/play_6x8.png') no-repeat 7px center #DEECFB; } -table.songlist tr.song a.download +table.songlist tr.row a.download { float: left; width: 20px; @@ -601,11 +613,11 @@ table.songlist tr.song a.download display: block; background: url('../images/download_gl_9x12.png') no-repeat 5px center; } -table.songlist tr.song a.download:hover +table.songlist tr.row a.download:hover { background: url('../images/download_gd_9x12.png') no-repeat 5px center #DEECFB; } -table.songlist tr.song a.add +table.songlist tr.row a.add { float: left; width: 20px; @@ -614,11 +626,11 @@ table.songlist tr.song a.add margin: 0; background: url('../images/plus_gl_8x8.png') no-repeat 6px center; } -table.songlist tr.song a.add:hover +table.songlist tr.row a.add:hover { background: url('../images/plus_8x8.png') no-repeat 6px center #DEECFB; } -table.songlist tr.song a.rate +table.songlist tr.row a.rate { float: left; height: 20px; @@ -627,11 +639,11 @@ table.songlist tr.song a.rate display: block; background: url('../images/star_wo_12x12.png') center 3px no-repeat; } -table.songlist tr.song a.rate:hover +table.songlist tr.row a.rate:hover { background: url('../images/star_lgo_12x12.png') center 3px no-repeat; } -table.songlist tr.song a.favorite +table.songlist tr.row a.favorite { float: left; height: 20px; @@ -671,7 +683,7 @@ table.songlist tr.selected td.album a #BottomContainer { border-top: 1px solid #F2F2F2; - background: #fff; + background: rgba(255, 255, 255, .8); position: fixed; height: 43px; width: 178px; @@ -873,7 +885,7 @@ table.songlist tr.selected td.album a .audiojs .scrubber { height: 4px; - margin: 36px 5px 0px 5px; + margin: 35px 5px 0px 5px; float: none; width: auto; position: relative; @@ -925,63 +937,80 @@ table.songlist tr.selected td.album a } .playeractions { - margin: 16px 12px 0 20px; + margin: 16px 12px 7px 20px; width: 160px; } .playeractionssmall { - margin: 25px 8px 0 14px; + margin: 24px 8px 0 14px; width: 50px; float: right; } #playermiddle { width: 100%; - /*visibility: hidden;*/ + visibility: hidden; } #coverart { - width: 56px; - height: 56px; + width: 60px; + height: 60px; overflow: hidden; - margin: 2px 8px 0 0; + margin: 1px 8px 0 1px; float: left; padding: 2px; - border: 1px solid #DEDEDE; +} +#songdetails +{ + width: 322px; + margin: 2px 6px; + float: left; + cursor: pointer; + padding: 0; + border: 1px solid #fff; + visibility: hidden; } #songdetails.hover { border: solid 1px gainsboro; + background: -webkit-gradient(linear, center top, center bottom, from(rgba(255, 255, 255, 0)), to(rgba(244, 244, 244, .2))); } -#songdetails -{ - width: 288px; - margin: 2px 6px; +#songdetails .jp-volume-bar { + overflow: hidden; + background: #cccccc; + width: 46px; + height: 4px; + cursor: pointer; float: left; - cursor: pointer; - padding: 3px; - border: 1px solid #fff; + margin: 7px 4px 0 0; +} +#songdetails .jp-volume-bar-value { + background-color: #5A5A5A; + width: 0px; + height: 4px; } #songdetails ul { list-style-type: none; - margin: 6px 0; + margin: 4px 0 2px 0; padding: 0; - height: 52px; - width: 185px; + height: 58px; + width: 215px; overflow: hidden; white-space: nowrap; float: left; } -#songdetails li +#songdetails ul li { + display: block; + height: 14px; } #songdetails li.song { font-size: 12px; font-weight: bold; line-height: 14px; - margin: 6px 0 2px 0; + margin: 0 0 2px 0; } #songdetails li.album { @@ -992,7 +1021,7 @@ table.songlist tr.selected td.album a { opacity: .6; font-size: 10px; - line-height: 15px; + line-height: 14px; } #songdetails li span.label { @@ -1005,14 +1034,16 @@ table.songlist tr.selected td.album a #songdetails a.rate { float: left; - height: 64px; - width: 30px; + height: 66px; + width: 32px; display: block; background: url('../images/star_wo_12x12.png') 10px center no-repeat; + background-color: #ffffff; } #songdetails a.rate:hover { background: url('../images/star_lgo_12x12.png') 10px center no-repeat; + background-color: #ffffff; } #songdetails a.favorite { @@ -1022,14 +1053,82 @@ table.songlist tr.selected td.album a display: block; background: url('../images/star_yo_12x12.png') 10px center no-repeat; } +#songdetails a.mute +{ + float: left; + margin: 2px; + height: 12px; + width: 16px; + display: block; + background: url('../images/volume_mute_gd_12x9.png') 0 center no-repeat; +} +#songdetails a.unmute +{ + float: left; + margin: 2px; + height: 12px; + width: 16px; + display: block; + background: url('../images/volume_mute_gl_12x9.png') 0 center no-repeat; +} +#songdetails a.volume +{ + float: left; + margin: 2px; + height: 12px; + width: 16px; + display: block; + background: url('../images/volume_gd_12x9.png') 0 center no-repeat; +} +#songdetails a.shuffle +{ + float: left; + margin: 2px; + height: 12px; + width: 16px; + display: block; + background: url('../images/loop_alt4_gd_16x12.png') 0 center no-repeat; +} +#songdetails a.shuffle:hover, #songdetails a.shuffle_up +{ + background: url('../images/loop_alt4_gl_16x12.png') 0 center no-repeat; +} +#songdetails a.first +{ + margin: 2px 2px 2px 0; +} .vertshade { position: relative; top: 0; - left: 229px; - width: 28px; - height: 62px; + left: 259px; + width: 32px; + height: 66px; background-image: -webkit-gradient( linear, left top, right top, from(rgba(255, 255, 255, 0)), to(rgba(255, 255, 255, 1))); } + + +/* Video */ +#videodeck +{ + position: relative; + margin: 0 auto; + z-index:1002; +} +.darkoverlay +{ + display: none; + position: absolute; + top: 0%; + left: 0%; + width: 100%; + height: 100%; + background-color: black; + z-index:1001; + -moz-opacity: 0.8; + opacity:.80; + filter: alpha(opacity=80); +} +/* Settings */ ul.preferences { list-style-type: none; @@ -1149,15 +1248,16 @@ a.button img.pad { margin: 1px 0 -1px 0; } /* Scrollbar Style */ ::-webkit-scrollbar { width: 12px; + height: 12px; } ::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2); - -webkit-border-radius: 12px; - border-radius: 12px; + -webkit-border-radius: 10px; + border-radius: 10px; } ::-webkit-scrollbar-thumb { - -webkit-border-radius: 12px; - border-radius: 12px; + -webkit-border-radius: 10px; + border-radius: 10px; background: rgba(237, 237, 237, 0.4); -webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2); }