Blame view

js/fancyBox/source/helpers/jquery.fancybox-thumbs.js 3.75 KB
bf807468   Alex Savenko   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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 += '<li><a style="width:' + thumbWidth + 'px;height:' + thumbHeight + 'px;" href="javascript:jQuery.fancybox.jumpto(' + n + ');"></a></li>';
  			}
  
  			this.wrap = $('<div id="fancybox-thumbs"></div>').addClass(opts.position).appendTo('body');
  			this.list = $('<ul>' + list + '</ul>').appendTo(this.wrap);
  
  			//Load each thumbnail
  			$.each(obj.group, function (i) {
  				var href = thumbSource( obj.group[ i ] );
  
  				if (!href) {
  					return;
  				}
  
  				$("<img />").load(function () {
  					var width  = this.width,
  						height = this.height,
  						widthRatio, heightRatio, parent;
  
  					if (!that.list || !width || !height) {
  						return;
  					}
  
  					//Calculate thumbnail width/height and center it
  					widthRatio  = width / thumbWidth;
  					heightRatio = height / thumbHeight;
  
  					parent = that.list.children().eq(i).find('a');
  
  					if (widthRatio >= 1 && heightRatio >= 1) {
  						if (widthRatio > heightRatio) {
  							width  = Math.floor(width / heightRatio);
  							height = thumbHeight;
  
  						} else {
  							width  = thumbWidth;
  							height = Math.floor(height / widthRatio);
  						}
  					}
  
  					$(this).css({
  						width  : width,
  						height : height,
  						top    : Math.floor(thumbHeight / 2 - height / 2),
  						left   : Math.floor(thumbWidth / 2 - width / 2)
  					});
  
  					parent.width(thumbWidth).height(thumbHeight);
  
  					$(this).hide().appendTo(parent).fadeIn(300);
  
  				}).attr('src', href);
  			});
  
  			//Set initial width
  			this.width = this.list.children().eq(0).outerWidth(true);
  
  			this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)));
  		},
  
  		beforeLoad: function (opts, obj) {
  			//Remove self if gallery do not have at least two items
  			if (obj.group.length < 2) {
  				obj.helpers.thumbs = false;
  
  				return;
  			}
  
  			//Increase bottom margin to give space for thumbs
  			obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15);
  		},
  
  		afterShow: function (opts, obj) {
  			//Check if exists and create or update list
  			if (this.list) {
  				this.onUpdate(opts, obj);
  
  			} else {
  				this.init(opts, obj);
  			}
  
  			//Set active element
  			this.list.children().removeClass('active').eq(obj.index).addClass('active');
  		},
  
  		//Center list
  		onUpdate: function (opts, obj) {
  			if (this.list) {
  				this.list.stop(true).animate({
  					'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))
  				}, 150);
  			}
  		},
  
  		beforeClose: function () {
  			if (this.wrap) {
  				this.wrap.remove();
  			}
  
  			this.wrap  = null;
  			this.list  = null;
  			this.width = 0;
  		}
  	}
  
  }(jQuery));