orange-flickr 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +27 -0
  5. data/Rakefile +46 -0
  6. data/lib/orange-flickr.rb +4 -0
  7. data/lib/orange-flickr/assets/js/yoxview/data/flickr.js +270 -0
  8. data/lib/orange-flickr/assets/js/yoxview/data/flickr.min.js +19 -0
  9. data/lib/orange-flickr/assets/js/yoxview/images/empty.gif +0 -0
  10. data/lib/orange-flickr/assets/js/yoxview/images/help_panel.png +0 -0
  11. data/lib/orange-flickr/assets/js/yoxview/images/left.png +0 -0
  12. data/lib/orange-flickr/assets/js/yoxview/images/left_eng.png +0 -0
  13. data/lib/orange-flickr/assets/js/yoxview/images/left_prev.png +0 -0
  14. data/lib/orange-flickr/assets/js/yoxview/images/popup_ajax_loader.gif +0 -0
  15. data/lib/orange-flickr/assets/js/yoxview/images/right.png +0 -0
  16. data/lib/orange-flickr/assets/js/yoxview/images/right_eng.png +0 -0
  17. data/lib/orange-flickr/assets/js/yoxview/images/sprites.png +0 -0
  18. data/lib/orange-flickr/assets/js/yoxview/install.htm +116 -0
  19. data/lib/orange-flickr/assets/js/yoxview/jquery.jsonp-1.0.4.min.js +12 -0
  20. data/lib/orange-flickr/assets/js/yoxview/jquery.timers-1.2.min.js +11 -0
  21. data/lib/orange-flickr/assets/js/yoxview/jquery.yoxthumbs.js +207 -0
  22. data/lib/orange-flickr/assets/js/yoxview/jquery.yoxthumbs.min.js +11 -0
  23. data/lib/orange-flickr/assets/js/yoxview/jquery.yoxview-1.98.js +1673 -0
  24. data/lib/orange-flickr/assets/js/yoxview/jquery.yoxview-1.98.min.js +38 -0
  25. data/lib/orange-flickr/assets/js/yoxview/lang/ar.js +21 -0
  26. data/lib/orange-flickr/assets/js/yoxview/lang/bg.js +21 -0
  27. data/lib/orange-flickr/assets/js/yoxview/lang/ca.js +21 -0
  28. data/lib/orange-flickr/assets/js/yoxview/lang/cs.js +21 -0
  29. data/lib/orange-flickr/assets/js/yoxview/lang/de.js +21 -0
  30. data/lib/orange-flickr/assets/js/yoxview/lang/en.js +21 -0
  31. data/lib/orange-flickr/assets/js/yoxview/lang/es.js +21 -0
  32. data/lib/orange-flickr/assets/js/yoxview/lang/fr.js +21 -0
  33. data/lib/orange-flickr/assets/js/yoxview/lang/gr.js +21 -0
  34. data/lib/orange-flickr/assets/js/yoxview/lang/he.js +21 -0
  35. data/lib/orange-flickr/assets/js/yoxview/lang/ie.js +21 -0
  36. data/lib/orange-flickr/assets/js/yoxview/lang/ir.js +21 -0
  37. data/lib/orange-flickr/assets/js/yoxview/lang/it.js +21 -0
  38. data/lib/orange-flickr/assets/js/yoxview/lang/ja.js +21 -0
  39. data/lib/orange-flickr/assets/js/yoxview/lang/mk.js +20 -0
  40. data/lib/orange-flickr/assets/js/yoxview/lang/nl.js +3 -0
  41. data/lib/orange-flickr/assets/js/yoxview/lang/pl.js +21 -0
  42. data/lib/orange-flickr/assets/js/yoxview/lang/pt-br.js +21 -0
  43. data/lib/orange-flickr/assets/js/yoxview/lang/pt.js +21 -0
  44. data/lib/orange-flickr/assets/js/yoxview/lang/ro.js +21 -0
  45. data/lib/orange-flickr/assets/js/yoxview/lang/ru.js +21 -0
  46. data/lib/orange-flickr/assets/js/yoxview/lang/sk.js +21 -0
  47. data/lib/orange-flickr/assets/js/yoxview/lang/sl.js +21 -0
  48. data/lib/orange-flickr/assets/js/yoxview/lang/sv.js +21 -0
  49. data/lib/orange-flickr/assets/js/yoxview/lang/tr.js +22 -0
  50. data/lib/orange-flickr/assets/js/yoxview/lang/ua.js +21 -0
  51. data/lib/orange-flickr/assets/js/yoxview/lang/zh-cn.js +21 -0
  52. data/lib/orange-flickr/assets/js/yoxview/lang/zh-tw.js +21 -0
  53. data/lib/orange-flickr/assets/js/yoxview/yox.js +179 -0
  54. data/lib/orange-flickr/assets/js/yoxview/yox.min.js +1 -0
  55. data/lib/orange-flickr/assets/js/yoxview/yoxview-init.js +47 -0
  56. data/lib/orange-flickr/assets/js/yoxview/yoxview-nojquery.js +5 -0
  57. data/lib/orange-flickr/assets/js/yoxview/yoxview.css +218 -0
  58. data/lib/orange-flickr/plugin.rb +14 -0
  59. data/lib/orange-flickr/resources/flickr_resource.rb +31 -0
  60. data/lib/orange-flickr/views/flickr/gallery.haml +4 -0
  61. data/lib/orange-flickr/views/flickr/photoset.haml +5 -0
  62. data/spec/orange-flickr_spec.rb +7 -0
  63. data/spec/spec.opts +1 -0
  64. data/spec/spec_helper.rb +9 -0
  65. metadata +164 -0
@@ -0,0 +1,12 @@
1
+ // jquery.jsonp 1.0.4 (c) 2009 Julian Aubourg | MIT License
2
+ // http://code.google.com/p/jquery-jsonp/
3
+ (function($){var x=function(o){return o!==undefined&&o!==null;},H=$("head"),Z={},K={callback:"C",url:location.href};$.jsonp=function(d){d=$.extend({},K,d);if(x(d.beforeSend)){var t=0;d.abort=function(){t=1;};if(d.beforeSend(d,d)===false||t)return d;}
4
+ var _="",y="success",n="error",u=x(d.url)?d.url:_,p=x(d.data)?d.data:_,s=(typeof p)=="string",k=function(f){setTimeout(f,1);},S,P,i,j,U;p=s?p:$.param(p);x(d.callbackParameter)&&(p+=(p==_?_:"&")+escape(d.callbackParameter)+"=?");!d.cache&&!d.pageCache&&(p+=[(p==_?_:"&"),"_xx",(new Date()).getTime(),"=",1].join(_));S=u.split("?");if(p!=_){P=p.split("?");j=S.length-1;j&&(S[j]+="&"+P.shift());S=S.concat(P);}
5
+ i=S.length-2;i&&(S[i]+=d.callback+S.pop());U=S.join("?");if(d.pageCache&&x(Z[U])){k(function(){if(x(Z[U].e)){x(d.error)&&d.error(d,n);x(d.complete)&&d.complete(d,n);}else{var v=Z[U].s;x(d.dataFilter)&&(v=d.dataFilter(v));x(d.success)&&d.success(v,y);x(d.complete)&&d.complete(d,y);}});return d;}
6
+ var f=$("<iframe />");H.append(f);var F=f[0],W=F.contentWindow||F.contentDocument,D=W.document;if(!x(D)){D=W;W=D.getParentNode();}
7
+ var w,e=function(_,m){d.pageCache&&!x(m)&&(Z[U]={e:1});w();m=x(m)?m:n;x(d.error)&&d.error(d,m);x(d.complete)&&d.complete(d,m);},t=0,C=d.callback,E=C=="E"?"X":"E";D.open();W[C]=function(v){t=1;d.pageCache&&(Z[U]={s:v});k(function(){w();x(d.dataFilter)&&(v=d.dataFilter(v));x(d.success)&&d.success(v,y);x(d.complete)&&d.complete(d,y);});};W[E]=function(s){(!s||s=="complete")&&!t++&&k(e);};w=function(){W[E]=undefined;W[C]=undefined;try{delete W[E];}catch(_){}
8
+ try{delete W[C];}catch(_){}
9
+ D.open()
10
+ D.write(_);D.close();f.remove();}
11
+ k(function(){D.write(['<html><head><script src="',U,'" onload="',E,'()" onreadystatechange="',E,'(this.readyState)"></script></head><body onload="',E,'()"></body></html>'].join(_));D.close();});d.timeout>0&&setTimeout(function(){!t&&e(_,"timeout");},d.timeout);d.abort=w;return d;}
12
+ $.jsonp.setup=function(o){$.extend(K,o);};})(jQuery);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * jQuery.timers - Timer abstractions for jQuery
3
+ * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
4
+ * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
5
+ * Date: 2009/10/16
6
+ *
7
+ * @author Blair Mitchelmore
8
+ * @version 1.2
9
+ *
10
+ **/
11
+ jQuery.fn.extend({everyTime:function(c,a,d,b){return this.each(function(){jQuery.timer.add(this,c,a,d,b)})},oneTime:function(c,a,d){return this.each(function(){jQuery.timer.add(this,c,a,d,1)})},stopTime:function(c,a){return this.each(function(){jQuery.timer.remove(this,c,a)})}}); jQuery.extend({timer:{global:[],guid:1,dataKey:"jQuery.timer",regex:/^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,powers:{ms:1,cs:10,ds:100,s:1E3,das:1E4,hs:1E5,ks:1E6},timeParse:function(c){if(c==undefined||c==null)return null;var a=this.regex.exec(jQuery.trim(c.toString()));return a[2]?parseFloat(a[1])*(this.powers[a[2]]||1):c},add:function(c,a,d,b,e){var g=0;if(jQuery.isFunction(d)){e||(e=b);b=d;d=a}a=jQuery.timer.timeParse(a);if(!(typeof a!="number"||isNaN(a)||a<0)){if(typeof e!="number"||isNaN(e)||e<0)e= 0;e=e||0;var f=jQuery.data(c,this.dataKey)||jQuery.data(c,this.dataKey,{});f[d]||(f[d]={});b.timerID=b.timerID||this.guid++;var h=function(){if(++g>e&&e!==0||b.call(c,g)===false)jQuery.timer.remove(c,d,b)};h.timerID=b.timerID;f[d][b.timerID]||(f[d][b.timerID]=window.setInterval(h,a));this.global.push(c)}},remove:function(c,a,d){var b=jQuery.data(c,this.dataKey),e;if(b){if(a){if(b[a]){if(d){if(d.timerID){window.clearInterval(b[a][d.timerID]);delete b[a][d.timerID]}}else for(d in b[a]){window.clearInterval(b[a][d]); delete b[a][d]}for(e in b[a])break;if(!e){e=null;delete b[a]}}}else for(a in b)this.remove(c,a,d);for(e in b)break;e||jQuery.removeData(c,this.dataKey)}}}});jQuery(window).bind("unload",function(){jQuery.each(jQuery.timer.global,function(c,a){jQuery.timer.remove(a)})});
@@ -0,0 +1,207 @@
1
+ /*!
2
+ * jquery.yoxthumbs v0.9
3
+ * jQuery thumbnails plugin
4
+ * http://yoxigen.com/
5
+ *
6
+ * Copyright (c) 2010 Yossi Kolesnicov
7
+ *
8
+ * Date: 13th July, 2010
9
+ * Version : 0.91
10
+ */
11
+ (function($){
12
+ $.fn.yoxthumbs = function(opt) {
13
+ if (this.length == 0)
14
+ return this;
15
+
16
+ if (typeof(opt) != 'string')
17
+ {
18
+ var defaults = {
19
+ target: null, // an yoxview instance
20
+ selectedThumbnailClassName : "selected",
21
+ thumbsOpacityFadeTime: 300,
22
+ thumbsOpacity : undefined,
23
+ prevBtn: undefined,
24
+ nextBtn: undefined,
25
+ onClick: undefined,
26
+ images: undefined,
27
+ enableOnlyMedia: false // If set to true, YoxThumbs is enabled only for links whose HREF is to an image or other supported media.
28
+ };
29
+
30
+ var options = $.extend(defaults, opt);
31
+ var $this = $(this);
32
+ $this.data("yoxthumbs", new YoxThumbs($this, options));
33
+ return this;
34
+ }
35
+ else
36
+ {
37
+ var instance = $(this).data("yoxthumbs");
38
+ if (instance)
39
+ {
40
+ if ($.isFunction(instance[opt]))
41
+ instance[opt].apply(instance, Array.prototype.slice.call(arguments, 1));
42
+ else
43
+ return instance[opt];
44
+ }
45
+ return this;
46
+ }
47
+ };
48
+ function YoxThumbs(container, options)
49
+ {
50
+ var self = this;
51
+ var prevBtn = options.prevBtn;
52
+ var nextBtn = options.nextBtn;
53
+ var viewIndex = container.data("yoxview") ? container.data("yoxview").viewIndex : undefined;
54
+ var $ = jQuery;
55
+ var containerIsAnchor = container[0].tagName == "A";
56
+
57
+ // If images data has been specified, create the thumbnails:
58
+ if (options.images)
59
+ {
60
+ jQuery.each(options.images, function(i, imageData){
61
+ container.append(createThumbnail(imageData));
62
+ });
63
+ }
64
+
65
+ this.thumbnails = [];
66
+ var foundThumbnails = containerIsAnchor ? container : container.find("a:has(img)");
67
+ var currentImageIndex = 0;
68
+
69
+ $.each(foundThumbnails, function(i, thumbnail)
70
+ {
71
+ var $thumbnail = $(thumbnail);
72
+ var addThumb = true;
73
+ if (options.enableOnlyMedia)
74
+ {
75
+ if (!thumbnail.href.match(Yox.imageRegex))
76
+ {
77
+ var isData = false;
78
+ for(dataProvider in Yox.dataRegex)
79
+ {
80
+ if (thumbnail.href.match(Yox.dataRegex[dataProvider]))
81
+ {
82
+ isData = true;
83
+ break;
84
+ }
85
+ }
86
+ if (!isData)
87
+ {
88
+ var isVideo = false;
89
+ for(videoProvider in Yox.videoRegex)
90
+ {
91
+ if (thumbnail.href.match(Yox.videoRegex[videoProvider]))
92
+ {
93
+ isVideo = true;
94
+ break;
95
+ }
96
+ }
97
+ if (!isVideo)
98
+ addThumb = false;
99
+ }
100
+ }
101
+ }
102
+
103
+ if (addThumb)
104
+ {
105
+ $thumbnail.data("yoxthumbs", $.extend({imageIndex: currentImageIndex++}, $thumbnail.data("yoxthumbs")));
106
+ self.thumbnails.push($thumbnail);
107
+ }
108
+ });
109
+
110
+ if (options.thumbsOpacity)
111
+ {
112
+ this.thumbnails.css("opacity", options.thumbsOpacity);
113
+ container.delegate("a:has(img)", "mouseenter.yoxthumbs", function(e){
114
+ if (self.currentSelectedIndex === undefined ||
115
+ $(e.currentTarget).data("yoxthumbs").imageIndex != self.currentSelectedIndex){
116
+ $(e.currentTarget).stop().animate({opacity: 1}, options.thumbsOpacityFadeTime);
117
+ }
118
+ })
119
+ .delegate("a:has(img)", "mouseout.yoxthumbs", function(e){
120
+ if (self.currentSelectedIndex === undefined ||
121
+ $(e.currentTarget).data("yoxthumbs").imageIndex != self.currentSelectedIndex)
122
+ $(e.currentTarget).stop().animate({opacity: options.thumbsOpacity}, options.thumbsOpacityFadeTime);
123
+ });
124
+ }
125
+ if (options.onClick)
126
+ {
127
+ if (containerIsAnchor)
128
+ container.bind("click.yoxthumbs", function(e){
129
+ options.onClick(e);
130
+ return false;
131
+ });
132
+ else
133
+ container.delegate("a:has(img)", "click.yoxthumbs", function(e){
134
+ if (!$(e.currentTarget).data("yoxthumbs"))
135
+ return true;
136
+
137
+ options.onClick(e);
138
+ return false;
139
+ });
140
+ }
141
+
142
+ function createThumbnail(imageData, viewIndex)
143
+ {
144
+ var thumbnail = jQuery("<a>", {
145
+ href: imageData.link
146
+ });
147
+
148
+ var thumbImage = jQuery("<img>", {
149
+ src : imageData.thumbnailSrc,
150
+ alt : imageData.media.alt,
151
+ title : imageData.media.title
152
+ });
153
+
154
+ if (imageData.data)
155
+ thumbnail.data("yoxthumbs", imageData.data);
156
+
157
+ if (imageData.thumbnailDimensions)
158
+ thumbImage.css({
159
+ "width": imageData.thumbnailDimensions.width,
160
+ "height" : imageData.thumbnailDimensions.height
161
+ });
162
+ thumbImage.appendTo(thumbnail);
163
+
164
+ return thumbnail;
165
+ }
166
+
167
+ // Selects a thumbnail
168
+ this.select = function(thumbIndex)
169
+ {
170
+ if (this.currentSelectedIndex === undefined || this.currentSelectedIndex != thumbIndex)
171
+ {
172
+ var currentThumbnail = this.thumbnails.eq(thumbIndex);
173
+ var yoxslider = container.data("yoxslide");
174
+ if (yoxslider)
175
+ yoxslider.show(currentThumbnail);
176
+
177
+ // Remove selection from previous thumbnail:
178
+ if (this.currentSelectedIndex !== undefined)
179
+ {
180
+ var previousSelectedThumbnail = this.thumbnails.eq(this.currentSelectedIndex);
181
+ previousSelectedThumbnail.removeClass(options.selectedThumbnailClassName);
182
+ if (options.thumbsOpacity)
183
+ previousSelectedThumbnail.animate({opacity: options.thumbsOpacity}, options.thumbsOpacityFadeTime);
184
+
185
+ }
186
+
187
+ currentThumbnail.addClass(options.selectedThumbnailClassName);
188
+ if (options.thumbsOpacity)
189
+ currentThumbnail.animate({opacity: 1}, options.thumbsOpacityFadeTime);
190
+
191
+ this.currentSelectedIndex = thumbIndex;
192
+ }
193
+ }
194
+ this.unload = function(dataKey)
195
+ {
196
+ $.each(this.thumbnails, function(i, thumbnail)
197
+ {
198
+ $(thumbnail).removeData("yoxthumbs");
199
+ if (dataKey)
200
+ $(thumbnail).removeData(dataKey);
201
+ });
202
+ container.undelegate("a:has(img)", "click.yoxthumbs");
203
+ if (containerIsAnchor)
204
+ container.unbind(".yoxthumbs");
205
+ }
206
+ }
207
+ })(jQuery);
@@ -0,0 +1,11 @@
1
+ /*!
2
+ * jquery.yoxthumbs v0.9
3
+ * jQuery thumbnails plugin
4
+ * http://yoxigen.com/
5
+ *
6
+ * Copyright (c) 2010 Yossi Kolesnicov
7
+ *
8
+ * Date: 13th July, 2010
9
+ * Version : 0.91
10
+ */
11
+ (function(g){function m(c,b){function j(a){var d=jQuery("<a>",{href:a.link}),e=jQuery("<img>",{src:a.thumbnailSrc,alt:a.media.alt,title:a.media.title});a.data&&d.data("yoxthumbs",a.data);a.thumbnailDimensions&&e.css({width:a.thumbnailDimensions.width,height:a.thumbnailDimensions.height});e.appendTo(d);return d}var h=this;c.data("yoxview")&&c.data("yoxview");var f=jQuery,k=c[0].tagName=="A";b.images&&jQuery.each(b.images,function(a,d){c.append(j(d))});this.thumbnails=[];var n=k?c:c.find("a:has(img)"), o=0;f.each(n,function(a,d){var e=f(d),l=true;if(b.enableOnlyMedia)if(!d.href.match(Yox.imageRegex)){var i=false;for(dataProvider in Yox.dataRegex)if(d.href.match(Yox.dataRegex[dataProvider])){i=true;break}if(!i){i=false;for(videoProvider in Yox.videoRegex)if(d.href.match(Yox.videoRegex[videoProvider])){i=true;break}i||(l=false)}}if(l){e.data("yoxthumbs",f.extend({imageIndex:o++},e.data("yoxthumbs")));h.thumbnails.push(e)}});if(b.thumbsOpacity){this.thumbnails.css("opacity",b.thumbsOpacity);c.delegate("a:has(img)", "mouseenter.yoxthumbs",function(a){if(h.currentSelectedIndex===undefined||f(a.currentTarget).data("yoxthumbs").imageIndex!=h.currentSelectedIndex)f(a.currentTarget).stop().animate({opacity:1},b.thumbsOpacityFadeTime)}).delegate("a:has(img)","mouseout.yoxthumbs",function(a){if(h.currentSelectedIndex===undefined||f(a.currentTarget).data("yoxthumbs").imageIndex!=h.currentSelectedIndex)f(a.currentTarget).stop().animate({opacity:b.thumbsOpacity},b.thumbsOpacityFadeTime)})}if(b.onClick)k?c.bind("click.yoxthumbs", function(a){b.onClick(a);return false}):c.delegate("a:has(img)","click.yoxthumbs",function(a){if(!f(a.currentTarget).data("yoxthumbs"))return true;b.onClick(a);return false});this.select=function(a){if(this.currentSelectedIndex===undefined||this.currentSelectedIndex!=a){var d=this.thumbnails.eq(a),e=c.data("yoxslide");e&&e.show(d);if(this.currentSelectedIndex!==undefined){e=this.thumbnails.eq(this.currentSelectedIndex);e.removeClass(b.selectedThumbnailClassName);b.thumbsOpacity&&e.animate({opacity:b.thumbsOpacity}, b.thumbsOpacityFadeTime)}d.addClass(b.selectedThumbnailClassName);b.thumbsOpacity&&d.animate({opacity:1},b.thumbsOpacityFadeTime);this.currentSelectedIndex=a}};this.unload=function(a){f.each(this.thumbnails,function(d,e){f(e).removeData("yoxthumbs");a&&f(e).removeData(a)});c.undelegate("a:has(img)","click.yoxthumbs");k&&c.unbind(".yoxthumbs")}}g.fn.yoxthumbs=function(c){if(this.length==0)return this;if(typeof c!="string"){var b=g.extend({target:null,selectedThumbnailClassName:"selected",thumbsOpacityFadeTime:300, thumbsOpacity:undefined,prevBtn:undefined,nextBtn:undefined,onClick:undefined,images:undefined,enableOnlyMedia:false},c),j=g(this);j.data("yoxthumbs",new m(j,b))}else if(b=g(this).data("yoxthumbs"))if(g.isFunction(b[c]))b[c].apply(b,Array.prototype.slice.call(arguments,1));else return b[c];return this}})(jQuery);
@@ -0,0 +1,1673 @@
1
+ /*!
2
+ * jquery.yoxview
3
+ * jQuery image gallery viewer
4
+ * http://yoxigen.com/yoxview
5
+ *
6
+ * Copyright (c) 2010 Yossi Kolesnicov
7
+ *
8
+ * Licensed under the MIT license.
9
+ * http://www.opensource.org/licenses/mit-license.php
10
+ *
11
+ * Date: 28th July, 2010
12
+ * Version : 1.98
13
+ */
14
+
15
+ var yoxviewApi;
16
+
17
+ (function($){
18
+ var yoxviewPath;
19
+
20
+ $.yoxviewUnload = function()
21
+ {
22
+ if (yoxviewApi)
23
+ {
24
+ yoxviewApi.unload();
25
+ yoxviewApi = null;
26
+ }
27
+ }
28
+ $(window).unload(function(){
29
+ $.yoxviewUnload();
30
+ });
31
+
32
+ $.fn.extend({
33
+ yoxview: function(opt)
34
+ {
35
+ if (this.length == 0)
36
+ return this;
37
+
38
+ if (!yoxviewPath)
39
+ yoxviewPath = typeof(_yoxviewPath) != "undefined" ? _yoxviewPath : Yox.getPath(/(.*)jquery.yoxview.*/i);
40
+
41
+ // Load the language file if not already loaded:
42
+ this.loadLanguage = function(lang, callBack)
43
+ {
44
+ var self = this;
45
+ if (!yoxviewLanguages[lang])
46
+ {
47
+ yoxviewLanguages[lang] = {};
48
+ $.ajax({
49
+ url : yoxviewPath + "lang/" + lang + ".js",
50
+ async : false,
51
+ dataType : "json",
52
+ success: function(data){
53
+ yoxviewLanguages[lang] = data;
54
+ Yox.loadDataSource(options, callBack, self);
55
+ }
56
+ });
57
+ }
58
+ else
59
+ Yox.loadDataSource(options, callBack, self);
60
+ }
61
+
62
+ var defaults = {
63
+ autoHideInfo: true, // If false, the info bar (with image count and title) is always displayed.
64
+ autoPlay: false, // If true, slideshow mode starts when the popup opens
65
+ backgroundColor: "#000",
66
+ backgroundOpacity: 0.8,
67
+ buttonsFadeTime: 300, // The time, in milliseconds, it takes the buttons to fade in/out when hovered on. Set to 0 to force the Prev/Next buttons to remain visible.
68
+ cacheBuffer: 5, // The number of images to cache after the current image (directional, depends on the current viewing direction)
69
+ cacheImagesInBackground: true, // If true, full-size images are cached even while the gallery hasn't been opened yet.
70
+ controlsInitialFadeTime: 1500, // The time, in milliseconds, it takes the menu and prev/next buttons to fade in and out when the popup is opened.
71
+ controlsInitialDisplayTime: 1000, // The time, in milliseconds, to display the menu and prev/next buttons when the popup is opened. Set to 0 to not display them by default
72
+ dataFolder: yoxviewPath + "data/",
73
+ imagesFolder: yoxviewPath + "images/",
74
+ infoBackColor: "Black",
75
+ infoBackOpacity: 0.5,
76
+ isRTL : false, // Switch direction. For RTL languages such as Hebrew or Arabic, for example.
77
+ lang: "en", // The language for texts. The relevant language file should exist in the lang folder.
78
+ langFolder: yoxviewPath + "lang/",
79
+ loopPlay: true, // If true, slideshow play starts over after the last image
80
+ playDelay: 3000, // Time in milliseconds to display each image
81
+ popupMargin: 20, // the minimum margin between the popup and the window
82
+ popupResizeTime: 600, // The time in milliseconds it takes to make the resize transition from one image to the next.
83
+ renderButtons: true, // Set to false if you want to implement your own Next/Prev buttons, using the API.
84
+ renderMenu: true, // Set to false if you want to implement you own menu (Play/Help/Close).
85
+ showBarsOnOpen: true, // If true, displays the top (help) bar and bottom (info) bar momentarily when the popup opens.
86
+ showButtonsOnOpen: true, // If true, displays the Prev/Next buttons momentarily when the popup opens.
87
+ titleAttribute: "title",
88
+ titleDisplayDuration: 2000 // The time in ms to display the image's title, after which it fades out.
89
+ };
90
+
91
+ var options = $.extend(defaults, opt);
92
+
93
+ if (!yoxviewApi)
94
+ {
95
+ this.loadLanguage(options.lang, function(views){
96
+ yoxviewApi = new YoxView(views, options);
97
+ });
98
+ }
99
+ else
100
+ {
101
+ this.loadLanguage(options.lang, function(views){
102
+ yoxviewApi.AddViews(views, options);
103
+ });
104
+ }
105
+
106
+ return this;
107
+ }
108
+ });
109
+ })(jQuery);
110
+
111
+ var yoxviewLanguages = new Array();
112
+
113
+ function YoxView(_views, _options)
114
+ {
115
+ var yoxviewApi = this;
116
+ var $ = jQuery; // Ensure the dollar sign stands for jQuery, in case other JS libraries are loaded, that use it.
117
+
118
+ var ajaxLoader;
119
+ var cacheBufferLastIndex;
120
+ var cacheComplete = false;
121
+ var cachedImagesCount = 0;
122
+ var cacheDirectionForward = true;
123
+ var cacheImg = new Image();
124
+ var countDisplay;
125
+ var ctlButtons; // next and prev buttons
126
+ var currentCacheImg = 0;
127
+ var currentItemIndex = 0;
128
+ var currentLanguage = {};
129
+ var currentViewIndex = 0;
130
+ var defaultOptions = _options;
131
+ var disableInfo = false;
132
+ var firstImage = true;
133
+ var helpPanel;
134
+ var hideInfoTimeout;
135
+ var hideMenuTimeout;
136
+ var image1;
137
+ var image2;
138
+ var images;
139
+ var imagesCount = 0;
140
+ var infoPanel;
141
+ var infoPanelContent;
142
+ var infoPanelLink;
143
+ var infoPanelMinHeight = 30;
144
+ var infoPanelWrap;
145
+ var infoPinLink;
146
+ var infoPinLinkImg;
147
+ var infoText;
148
+ this.isOpen = false;
149
+ var isPlaying = false;
150
+ var isResizing = false;
151
+ var itemVar;
152
+ var loading = false;
153
+ var mediaButtonsSize = {width: 100, height: 100};
154
+ var mediaLoader;
155
+ var mediaProviderUrls = {
156
+ vimeo: "http://vimeo.com/api/oembed.json",
157
+ myspace: "http://vids.myspace.com/index.cfm?fuseaction=oembed"
158
+ };
159
+ var menuHidePosition = -42;
160
+ var menuPanel;
161
+ var nextBtn;
162
+ var notifications = new Array();
163
+ var onOpenCallback;
164
+ var options = defaultOptions;
165
+ var panel1;
166
+ var panel2;
167
+ var playBtnText;
168
+ var popup;
169
+ var popupBackground;
170
+ var popupWrap;
171
+ var prevBtn;
172
+ var resumePlay = false;
173
+ var tempImg = new Image();
174
+ var thumbnail;
175
+ var thumbnailImg;
176
+ var thumbnailPos;
177
+ var thumbnailProperties;
178
+ var views = new Array();
179
+ var windowDimensions;
180
+
181
+ var keyCodes = {
182
+ 40: 'DOWN',
183
+ 35: 'END',
184
+ 13: 'ENTER',
185
+ 36: 'HOME',
186
+ 37: 'LEFT',
187
+ 39: 'RIGHT',
188
+ 32: 'SPACE',
189
+ 38: 'UP',
190
+ 72: 'h',
191
+ 27: 'ESCAPE'
192
+ };
193
+ var keyMappings = {
194
+ RIGHT: options.isRTL ? 'prev' : 'next',
195
+ DOWN: 'next',
196
+ UP: 'prev',
197
+ LEFT: options.isRTL ? 'next' : 'prev',
198
+ ENTER: 'play',
199
+ HOME: 'first',
200
+ END: 'last',
201
+ SPACE: 'next',
202
+ h: 'help',
203
+ ESCAPE: 'close'
204
+ };
205
+ var sprites = new Yox.Sprites({
206
+ notifications: {
207
+ width: 59,
208
+ height: 59,
209
+ sprites: [ 'empty', 'playRTL', 'play', 'pause', 'last', 'first' ]
210
+ },
211
+ icons: {
212
+ width: 18,
213
+ height: 18,
214
+ sprites: ['close', 'help', 'play', 'link', 'pin', 'unpin']
215
+ },
216
+ menu: {
217
+ height: 42,
218
+ sprites: ['back']
219
+ }
220
+ }, options.imagesFolder + "sprites.png", options.imagesFolder + "empty.gif");
221
+
222
+ this.AddViews = function(_views, options)
223
+ {
224
+ var popupIsCreated = this.firstViewWithImages != undefined;
225
+ jQuery.each(_views, function(){
226
+ setView(this, views.length, options);
227
+ views.push(this);
228
+ if (!yoxviewApi.firstViewWithImages)
229
+ {
230
+ var viewImages = $(this).data("yoxview").images;
231
+ if (viewImages && viewImages.length != 0)
232
+ yoxviewApi.firstViewWithImages = this;
233
+ }
234
+ });
235
+
236
+ if (!popupIsCreated && this.firstViewWithImages)
237
+ {
238
+ loadViewImages(this.firstViewWithImages);
239
+ createPopup();
240
+
241
+ if(options.cacheImagesInBackground && imagesCount != 0)
242
+ {
243
+ calculateCacheBuffer();
244
+ cacheImages(0);
245
+ }
246
+ popupIsCreated = true;
247
+ }
248
+ }
249
+ this.SetImages = function(images)
250
+ {
251
+ imagesCount = images.length;
252
+ }
253
+ function resetPopup()
254
+ {
255
+ if (popup)
256
+ {
257
+ popupWrap.remove();
258
+ popup = undefined;
259
+ prevBtn = undefined;
260
+ nextBtn = undefined;
261
+ image1 = undefined;
262
+ image2 = undefined;
263
+ panel1 = undefined;
264
+ panel2 = undefined;
265
+ currentItemIndex = 0;
266
+ currentCacheImg = 0;
267
+ yoxviewApi.infoButtons = undefined;
268
+ }
269
+ createPopup();
270
+ }
271
+ function loadViewImages(_view)
272
+ {
273
+ var viewData = $(_view).data("yoxview");
274
+ if (!images || currentViewIndex != viewData.viewIndex)
275
+ {
276
+ images = viewData.images;
277
+ imagesCount = images.length;
278
+ currentViewIndex = viewData.viewIndex;
279
+
280
+ var isResetPopup = false;
281
+
282
+ if (viewData.options && !Yox.compare(options, viewData.options))
283
+ {
284
+ options = viewData.options;
285
+ isResetPopup = true;
286
+ }
287
+ else if (!viewData.options && !Yox.compare(options, defaultOptions))
288
+ {
289
+ options = defaultOptions;
290
+ isResetPopup = true;
291
+ }
292
+ else if ((prevBtn && imagesCount == 1) || (popup && !prevBtn && imagesCount > 0))
293
+ isResetPopup = true;
294
+
295
+ if (isResetPopup)
296
+ resetPopup();
297
+ }
298
+ }
299
+
300
+ function getImageDataFromThumbnail(thumbnail)
301
+ {
302
+ var isVideo = false;
303
+ var imageData = {};
304
+ var thumbnailHref = thumbnail.attr("href");
305
+ var thumbImg = thumbnail.children("img:first");
306
+
307
+ if (thumbnailHref.match(Yox.imageRegex))
308
+ {
309
+ $.extend(imageData, {
310
+ media: {
311
+ src : thumbnail.attr("href"),
312
+ title : thumbImg.attr(options.titleAttribute),
313
+ alt : thumbImg.attr("alt")
314
+ }
315
+ });
316
+ }
317
+ else
318
+ {
319
+ for(videoProvider in Yox.videoRegex)
320
+ {
321
+ if (thumbnailHref.match(Yox.videoRegex[videoProvider]))
322
+ {
323
+ $.extend(imageData, {
324
+ media: {
325
+ type: "video",
326
+ provider: videoProvider,
327
+ url: thumbnailHref
328
+ }
329
+ });
330
+ isVideo = true;
331
+ break;
332
+ }
333
+ }
334
+ if (!isVideo)
335
+ return null;
336
+ }
337
+
338
+ $.extend(imageData, {
339
+ thumbnailImg : thumbImg,
340
+ thumbnailSrc : thumbImg.attr("src")
341
+ });
342
+ return imageData;
343
+ }
344
+
345
+ function setView(view, viewIndex, _options)
346
+ {
347
+ var view = $(view);
348
+ view.data("yoxview", {viewIndex : viewIndex});
349
+
350
+ if (!Yox.compare(options, _options))
351
+ view.data("yoxview").options = _options;
352
+
353
+ // First, get image data from thumbnails:
354
+ _options.isSingleLink = view[0].tagName == "A";
355
+ var thumbnails = _options.isSingleLink ? view : view.find("a:has(img)");
356
+ var viewImages = new Array();
357
+
358
+ thumbnails.each(function(i, thumbnail){
359
+ var imageData = getImageDataFromThumbnail($(thumbnail));
360
+ if (imageData != null)
361
+ viewImages.push(imageData);
362
+ });
363
+
364
+ if (_options.images)
365
+ viewImages = viewImages.concat(_options.images);
366
+
367
+ if (_options.dataSource)
368
+ {
369
+ Yox.dataSources[_options.dataSource].getImagesData(_options, function(data){
370
+ viewImages = viewImages.concat(data.images);
371
+ view.data("yoxview").images = viewImages;
372
+
373
+ var thumbnailsData = data.isGroup
374
+ ? [$.extend(data, {
375
+ media: {
376
+ title: data.title + " (" + data.images.length + " images)",
377
+ alt: data.title
378
+ }
379
+ })]
380
+ : data.images;
381
+
382
+ createThumbnails(view, _options.isSingleLink ? null : thumbnailsData, !data.createGroups ? null :
383
+ function(e){
384
+ var viewData = $(e.currentTarget).data("yoxview");
385
+ var thumbnail = $(e.currentTarget);
386
+ var thumbnailData = thumbnail.data("yoxthumbs");
387
+ if (!viewData.imagesAreSet)
388
+ {
389
+ thumbnail.css("cursor", "wait");
390
+ var newOptions = $.extend({}, options);
391
+ if (!newOptions.dataSourceOptions)
392
+ newOptions.dataSourceOptions = thumbnailData;
393
+ else
394
+ $.extend(newOptions.dataSourceOptions, thumbnailData);
395
+
396
+ Yox.dataSources[options.dataSource].getImagesData(newOptions, function(data){
397
+ viewData.images = data.images;
398
+ viewData.imagesAreSet = true;
399
+ thumbnail.css("cursor", "");
400
+ yoxviewApi.openGallery(viewData.viewIndex);
401
+ });
402
+ }
403
+ else
404
+ {
405
+ yoxviewApi.openGallery(viewData.viewIndex);
406
+ }
407
+ }
408
+ );
409
+ if (!_options.isSingleLink)
410
+ $.each(view.yoxthumbs("thumbnails"), function(i, thumbnail){
411
+ thumbnail.data("yoxview", {viewIndex: views.length});
412
+ views.push(thumbnail);
413
+ });
414
+ if (!yoxviewApi.firstViewWithImages && data.images.length > 0)
415
+ {
416
+ yoxviewApi.firstViewWithImages = view;
417
+
418
+ if (_options.cacheImagesInBackground)
419
+ yoxviewApi.startCache();
420
+ }
421
+ });
422
+ }
423
+ else
424
+ {
425
+ view.data("yoxview").images = viewImages;
426
+ createThumbnails(view);
427
+ }
428
+ }
429
+
430
+ function createThumbnails(view, additionalImages, onClick)
431
+ {
432
+ view.yoxthumbs({
433
+ images: additionalImages,
434
+ enableOnlyMedia: true,
435
+ onClick: onClick || function(e){
436
+ e.preventDefault();
437
+ if (options.thumbnailsOptions && options.thumbnailsOptions.onClick)
438
+ options.thumbnailsOptions.onClick(
439
+ $(e.currentTarget).data("yoxthumbs").imageIndex,
440
+ $(e.currentTarget),
441
+ $(e.liveFired).data("yoxview").viewIndex);
442
+ else
443
+ yoxviewApi.openGallery($(e.liveFired || e.currentTarget).data("yoxview").viewIndex,
444
+ $(e.currentTarget).data("yoxthumbs").imageIndex);
445
+
446
+ return false;
447
+ }
448
+ });
449
+ }
450
+ function setThumbnail(setToPopupImage)
451
+ {
452
+ var currentView = $(views[currentViewIndex]);
453
+ thumbnail = currentView[0].tagName == "A"
454
+ ? currentView
455
+ : currentView.yoxthumbs('thumbnails')[currentItemIndex];
456
+
457
+ if (!thumbnail || thumbnail.length == 0)
458
+ thumbnail = currentView.yoxthumbs('thumbnails')[0];
459
+
460
+ var thumbnailImg = thumbnail.children("img:first");
461
+ if (thumbnailImg)
462
+ {
463
+ if (setToPopupImage && image1)
464
+ image1.attr("src", thumbnailImg.attr("src"));
465
+
466
+ thumbnailPos = thumbnailImg.offset();
467
+ thumbnailProperties = {
468
+ width: thumbnailImg.width(),
469
+ height: thumbnailImg.height(),
470
+ top: thumbnailPos.top - $(window).scrollTop(),
471
+ left: thumbnailPos.left
472
+ };
473
+ }
474
+ }
475
+
476
+ // Opens the viewer popup.
477
+ // Arguments:
478
+ // viewIndex: The 0-based index of the view to open, in case there are multiple instances of YoxView on the same page. Default is 0.
479
+ // imageIndex: The 0-based index of the image to open, in the specified view. Default is 0.
480
+ // callBack: A function to call after the gallery has opened.
481
+ this.openGallery = function(viewIndex, initialItemIndex, callBack)
482
+ {
483
+ if (typeof(viewIndex) == 'function')
484
+ {
485
+ callBack = viewIndex;
486
+ viewIndex = initialItemIndex = 0;
487
+ }
488
+ else if (typeof(initialItemIndex) == 'function')
489
+ {
490
+ callBack = initialItemIndex;
491
+ initialItemIndex = 0;
492
+ }
493
+ viewIndex = viewIndex || 0;
494
+ initialItemIndex = initialItemIndex || 0;
495
+
496
+ loadViewImages(views[viewIndex]);
497
+
498
+ if (!popup && imagesCount != 0)
499
+ createPopup();
500
+
501
+ this.selectImage(initialItemIndex);
502
+ popupWrap.stop().css({ opacity: 1 }).fadeIn("slow", function(){ popupWrap.css("opacity", "") });
503
+
504
+ if(options.cacheImagesInBackground)
505
+ cacheImages(initialItemIndex);
506
+
507
+ if (callBack)
508
+ onOpenCallback = callBack;
509
+
510
+ return false;
511
+ }
512
+
513
+ this.selectImage = function(itemIndex)
514
+ {
515
+ yoxviewApi.currentImage = images[itemIndex];
516
+ currentItemIndex = itemIndex;
517
+
518
+ setThumbnail(true);
519
+ thumbnail.blur();
520
+
521
+ panel1.css({
522
+ "z-index" : "1",
523
+ "width" : thumbnailProperties.width,
524
+ "height" : thumbnailProperties.height
525
+ });
526
+ panel2.css({
527
+ "display" : "none",
528
+ "z-index" : "2"
529
+ });
530
+
531
+ firstImage = true;
532
+
533
+ popup.css({
534
+ "width" : thumbnailProperties.width,
535
+ "height" : thumbnailProperties.height,
536
+ "top" : thumbnailProperties.top,
537
+ "left" : thumbnailProperties.left
538
+ });
539
+ this.select(itemIndex);
540
+ }
541
+ this.refresh = function()
542
+ {
543
+ resumePlay = isPlaying;
544
+
545
+ if (isPlaying)
546
+ stopPlay();
547
+
548
+ setImage(currentItemIndex);
549
+
550
+ if (resumePlay)
551
+ startPlay();
552
+ }
553
+
554
+ // Displays the specified image and shows the specified button, if specified. Use when the viewer is open.
555
+ // Arguments:
556
+ // imageIndex: The 0-based index of the image to display.
557
+ // pressedBtn: a jQuery element of a button to display momentarily in the viewer.
558
+ // For example, if the image has been selected by pressing the Next button
559
+ // on the keyboard, specify the Next button. If no button should be display, leave blank.
560
+ this.select = function(itemIndex, pressedBtn, viewIndex)
561
+ {
562
+ if (typeof pressedBtn === "number")
563
+ {
564
+ viewIndex = pressedBtn;
565
+ pressedBtn = undefined;
566
+ }
567
+ viewIndex = viewIndex || 0;
568
+
569
+ if (!isResizing)
570
+ {
571
+ if (itemIndex < 0)
572
+ itemIndex = imagesCount - 1;
573
+ else if (itemIndex == imagesCount)
574
+ itemIndex = 0;
575
+
576
+ if (!isPlaying && pressedBtn)
577
+ flicker(pressedBtn);
578
+
579
+ yoxviewApi.currentImage = images[itemIndex];
580
+ currentItemIndex = itemIndex;
581
+ setImage(currentItemIndex);
582
+
583
+ // Set the cache buffer, if required:
584
+ calculateCacheBuffer();
585
+
586
+ // Handle event onSelect:
587
+ if (options.onSelect)
588
+ options.onSelect(itemIndex, images[itemIndex]);
589
+ }
590
+ }
591
+ this.prev = function()
592
+ {
593
+ cacheDirectionForward = false;
594
+ this.select(currentItemIndex - 1, prevBtn);
595
+ return false;
596
+ }
597
+ this.next = function()
598
+ {
599
+ cacheDirectionForward = true;
600
+ this.select(currentItemIndex + 1, nextBtn);
601
+ return false;
602
+ }
603
+ this.first = function()
604
+ {
605
+ longFlicker(notifications["first"]);
606
+ this.select(0);
607
+ return false;
608
+ }
609
+ this.last = function()
610
+ {
611
+ longFlicker(notifications["last"]);
612
+ this.select(imagesCount - 1);
613
+ return false;
614
+ }
615
+ this.play = function()
616
+ {
617
+ if (imagesCount == 1)
618
+ return;
619
+
620
+ cacheDirectionForward = true;
621
+
622
+ if (!isPlaying)
623
+ {
624
+ longFlicker(notifications["play"]);
625
+ startPlay();
626
+ playBtnText.text(currentLanguage.Pause);
627
+ }
628
+ else
629
+ {
630
+ longFlicker(notifications["pause"]);
631
+ stopPlay();
632
+ playBtnText.text(currentLanguage.Play);
633
+ }
634
+ }
635
+ function flicker(button)
636
+ {
637
+ if (button.css("opacity") == 0)
638
+ button.stop().animate({ opacity : 0 }, options.buttonsFadeTime, fadeOut(button));
639
+ }
640
+ function longFlicker(button)
641
+ {
642
+ button.stop().fadeIn(options.buttonsFadeTime, function(){
643
+ $(this).delay(500)
644
+ .fadeOut(options.buttonsFadeTime);
645
+ });
646
+ }
647
+ function fadeIn(button)
648
+ {
649
+ $(button).stop().animate({ opacity : 0 }, options.buttonsFadeTime);
650
+ }
651
+ function fadeOut(button)
652
+ {
653
+ $(button).stop().animate({ opacity : 0.5 }, options.buttonsFadeTime);
654
+ }
655
+
656
+ this.close = function()
657
+ {
658
+ this.closeHelp();
659
+ setThumbnail(false);
660
+ resizePopup(thumbnailProperties.width, thumbnailProperties.height, thumbnailProperties.top, thumbnailProperties.left, function(){
661
+ yoxviewApi.isOpen = false;
662
+ });
663
+ hideMenuPanel();
664
+
665
+ if (infoPanel)
666
+ hideInfoPanel(function(){
667
+ infoText.html("");
668
+ });
669
+
670
+ newPanel.animate({
671
+ width: thumbnailProperties.width,
672
+ height: thumbnailProperties.height
673
+ }, options.popupResizeTime, function(){
674
+ newPanel.css("opacity", 1);
675
+ popupBackground.css("opacity", options.backgroundOpacity);
676
+ });
677
+
678
+ popupWrap.stop().fadeOut(1000);
679
+
680
+ if (isPlaying)
681
+ stopPlay();
682
+
683
+ if (options.onClose)
684
+ options.onClose();
685
+
686
+ isResizing = false;
687
+ }
688
+ this.help = function()
689
+ {
690
+ if (this.isOpen)
691
+ {
692
+ if (helpPanel.css("display") == "none")
693
+ helpPanel.css("display", "block").stop().animate({ opacity : 0.8 }, options.buttonsFadeTime);
694
+ else
695
+ this.closeHelp();
696
+ }
697
+ }
698
+ this.closeHelp = function()
699
+ {
700
+ if (helpPanel.css("display") != "none")
701
+ helpPanel.stop().animate({ opacity: 0 }, options.buttonsFadeTime, function(){
702
+ helpPanel.css("display", "none");
703
+ });
704
+ }
705
+ this.clickBtn = function(fn, stopPlaying)
706
+ {
707
+ if (stopPlaying && isPlaying)
708
+ stopPlay();
709
+
710
+ fn.call(this);
711
+ return false;
712
+ }
713
+
714
+ function catchPress(e)
715
+ {
716
+ if (yoxviewApi && yoxviewApi.isOpen)
717
+ {
718
+ var pK = keyCodes[e.keyCode];
719
+ var calledFunction = yoxviewApi[keyMappings[pK]];
720
+ if (calledFunction)
721
+ {
722
+ e.preventDefault();
723
+ calledFunction.apply(yoxviewApi);
724
+ return false;
725
+ }
726
+ return true;
727
+ }
728
+ return true;
729
+ }
730
+
731
+ function createMenuButton(_title, btnFunction, stopPlay)
732
+ {
733
+ var btn = $("<a>", {
734
+ href : "#",
735
+ click : function(){
736
+ return yoxviewApi.clickBtn(yoxviewApi[btnFunction], stopPlay);
737
+ }
738
+ });
739
+ var btnSpan = $("<span>" + _title + "</span>");
740
+ btnSpan.css("opacity", "0")
741
+ .appendTo(btn);
742
+
743
+ btn.append(sprites.getSprite("icons", btnFunction));
744
+ return btn;
745
+ }
746
+
747
+ // Prev and next buttons:
748
+ function createNavButton(_function, _side)
749
+ {
750
+ var navBtnImg = new Image();
751
+ navBtnImg.src = options.imagesFolder + _side + ".png";
752
+ var navBtn = $("<a>", {
753
+ css : {
754
+ "background" : "url(" + navBtnImg.src + ") no-repeat " + _side + " center",
755
+ "opacity" : "0",
756
+ "outline" : "0"
757
+ },
758
+ className : "yoxview_ctlBtn",
759
+ href : "#",
760
+ click : function(){
761
+ this.blur();
762
+ return yoxviewApi.clickBtn(_function, true);
763
+ }
764
+ });
765
+ navBtn.css(_side, "0");
766
+ return navBtn;
767
+ }
768
+
769
+ // INIT:
770
+
771
+ this.AddViews(_views, options);
772
+
773
+ $(document).delegate('*', 'keydown', function(data){
774
+ catchPress(data);
775
+ });
776
+ $(window).bind("resize.yoxview", function()
777
+ {
778
+ windowDimensions = getWindowDimensions();
779
+ if (yoxviewApi.isOpen)
780
+ yoxviewApi.resize();
781
+ });
782
+
783
+ function createPopup()
784
+ {
785
+ currentLanguage = yoxviewLanguages[options.lang];
786
+
787
+ popupWrap = $("<div>", {
788
+ id : "yoxview_popupWrap",
789
+ css : {
790
+ "position" : "fixed",
791
+ "top" : "0",
792
+ "left" : "0",
793
+ "width" : "100%",
794
+ "height" : "100%",
795
+ "display" : "none",
796
+ "z-index" : "100"
797
+ }
798
+ });
799
+
800
+ popup = $("<div>", {
801
+ id : 'yoxview'
802
+ });
803
+ popupWrap.appendTo($(parent.document.body)).append(popup);
804
+
805
+ panel1 = $("<div>", {
806
+ className: "yoxview_imgPanel",
807
+ css: {
808
+ "z-index": "2"
809
+ }
810
+ });
811
+ panel2 = $("<div>", {
812
+ className: "yoxview_imgPanel",
813
+ css: {
814
+ "z-index": "1",
815
+ "display": "none"
816
+ }
817
+ });
818
+ // the first image:
819
+ image1 = $("<img />", {
820
+ className : "yoxview_fadeImg",
821
+ css : {
822
+ "display" : "block",
823
+ "width" : "100%",
824
+ "height" : "100%"
825
+ }
826
+ });
827
+
828
+ // the second image:
829
+ image2 = $("<img />", {
830
+ className : "yoxview_fadeImg",
831
+ css : {
832
+ "display" : "block",
833
+ "width" : "100%",
834
+ "height" : "100%"
835
+ }
836
+ });
837
+ panel1.data("yoxviewPanel", {image: image1})
838
+ .append(image1).appendTo(popup);
839
+ panel2.data("yoxviewPanel", {image: image2})
840
+ panel2.append(image2).appendTo(popup);
841
+ var singleImage = imagesCount == 1;
842
+ if (singleImage && !images[0].media[options.titleAttribute])
843
+ options.renderInfo = false;
844
+
845
+ // the menu:
846
+ if (options.renderMenu !== false)
847
+ {
848
+ var menuPanelWrap = $("<div>", {
849
+ className : "yoxview_popupBarPanel yoxview_top"
850
+ });
851
+
852
+ if (options.autoHideMenu !== false)
853
+ {
854
+ menuPanelWrap.mouseenter(function(){
855
+ if (yoxviewApi.isOpen)
856
+ showMenuPanel();
857
+ })
858
+ .mouseleave(function(){
859
+ if (yoxviewApi.isOpen)
860
+ hideMenuPanel();
861
+ });
862
+ }
863
+
864
+ menuPanel = $("<div>", {
865
+ id : "yoxview_menuPanel",
866
+ css: {
867
+ "opacity": "0.8",
868
+ "background-position": sprites.getBackgroundPosition("menu", "back")
869
+ }
870
+ });
871
+
872
+ var helpBtn = createMenuButton(currentLanguage.Help, "help", false);
873
+ var playBtn = createMenuButton(currentLanguage.Slideshow, "play", false);
874
+ playBtnText = playBtn.children("span");
875
+
876
+ menuPanel.append(
877
+ createMenuButton(currentLanguage.Close, "close", true),
878
+ helpBtn,
879
+ playBtn
880
+ );
881
+
882
+ if (singleImage)
883
+ {
884
+ playBtn.css("display", "none");
885
+ helpBtn.css("display", "none");
886
+ menuPanel.css({
887
+ width: 58
888
+ });
889
+ }
890
+
891
+ menuPanel.find("a:last-child").attr("class", "last");
892
+ menuPanelWrap.append(menuPanel).appendTo(popup);
893
+ menuPanel.delegate("a", "mouseenter", function(){
894
+ $(this).stop().animate({ top : "8px" }, "fast").find("span").stop().animate({opacity:1}, "fast");
895
+ })
896
+ .delegate("a", "mouseleave", function(){
897
+ $(this).stop().animate({ top : "0" }, "fast").find("span").stop().animate({opacity:0}, "fast");
898
+ });
899
+ }
900
+
901
+ if (options.renderButtons !== false && !singleImage)
902
+ {
903
+ // prev and next buttons:
904
+ prevBtn = createNavButton(yoxviewApi.prev, options.isRTL ? "right" : "left");
905
+ prevBtn.appendTo(popup);
906
+
907
+ nextBtn = createNavButton(yoxviewApi.next, options.isRTL ? "left" : "right");
908
+ nextBtn.appendTo(popup);
909
+ }
910
+
911
+ ctlButtons = popup.find(".yoxview_ctlBtn");
912
+
913
+ // add the ajax loader:
914
+ ajaxLoader = $("<div>", {
915
+ id: "yoxview_ajaxLoader",
916
+ className: "yoxview_notification",
917
+ css: {
918
+ "display": "none"
919
+ }
920
+ });
921
+ ajaxLoader.append($("<img>", {
922
+ src: options.imagesFolder + "popup_ajax_loader.gif",
923
+ alt: currentLanguage.Loading,
924
+ css: {
925
+ width: 32,
926
+ height: 32,
927
+ "background-image": "url(" + options.imagesFolder + "sprites.png)",
928
+ "background-position": sprites.getBackgroundPosition("notifications", "empty")
929
+ }
930
+ }))
931
+ .appendTo(popup);
932
+
933
+ // notification images:
934
+ var notificationsNames = ["play", "pause", "first", "last"];
935
+ jQuery.each(notificationsNames, function(i, notificationName){
936
+ var notification = sprites.getSprite("notifications", notificationName);
937
+
938
+ notification.attr("className", "yoxview_notification")
939
+ .css("display", "none")
940
+ .appendTo(popup);
941
+ notifications[notificationName] = notification;
942
+ });
943
+
944
+ // help:
945
+ helpPanel = $("<div>", {
946
+ id : "yoxview_helpPanel",
947
+ href : "#",
948
+ title : currentLanguage.CloseHelp,
949
+ css : {
950
+ "background" : "url(" + options.imagesFolder + "help_panel.png) no-repeat center top",
951
+ "direction" : currentLanguage.Direction,
952
+ "opacity" : "0"
953
+ },
954
+ click : function(){
955
+ return yoxviewApi.clickBtn(yoxviewApi.help, false);
956
+ }
957
+ });
958
+
959
+ var helpTitle = document.createElement("h1");
960
+ helpTitle.innerHTML = currentLanguage.Help.toUpperCase();
961
+
962
+ var helpText = document.createElement("p");
963
+ helpText.innerHTML = currentLanguage.HelpText;
964
+
965
+ var closeHelp = document.createElement("span");
966
+ closeHelp.id = "yoxview_closeHelp";
967
+ closeHelp.innerHTML = currentLanguage.CloseHelp;
968
+
969
+ helpPanel.append(helpTitle).append(helpText).append(closeHelp).appendTo(popup);
970
+
971
+ // popup info:
972
+ if (options.renderInfo !== false)
973
+ {
974
+ infoPanelWrap = $("<div>", {
975
+ className : "yoxview_popupBarPanel yoxview_bottom"
976
+ });
977
+
978
+ infoPanelWrap.mouseenter(function(){
979
+ if (yoxviewApi.isOpen && !disableInfo && options.autoHideInfo !== false)
980
+ setInfoPanelHeight();
981
+ })
982
+ .mouseleave(function(){
983
+ if (yoxviewApi.isOpen && !disableInfo && options.autoHideInfo !== false)
984
+ hideInfoPanel();
985
+ });
986
+
987
+ infoPanel = $("<div>", {
988
+ id: "yoxview_infoPanel"
989
+ });
990
+
991
+ infoPanel.append(
992
+ $("<div>", {
993
+ id : "yoxview_infoPanelBack",
994
+ css : {
995
+ "background" : options.infoBackColor,
996
+ "opacity" : options.infoBackOpacity
997
+ }
998
+ })
999
+ );
1000
+ infoPanelContent = $("<div>", {
1001
+ id: "yoxview_infoPanelContent"
1002
+ });
1003
+
1004
+ countDisplay = $("<span>", {
1005
+ id: "yoxview_count"
1006
+ });
1007
+
1008
+ infoText = $("<div>", {
1009
+ id: "yoxview_infoText"
1010
+ });
1011
+ if (singleImage)
1012
+ {
1013
+ infoText.css("margin-left", "10px");
1014
+ countDisplay.css("display", "none");
1015
+ }
1016
+ infoPanelContent.append(countDisplay);
1017
+
1018
+ if (options.renderInfoPin !== false)
1019
+ {
1020
+ infoPinLinkImg = sprites.getSprite("icons", options.autoHideInfo ? "pin" : "unpin");
1021
+ infoPinLink = $("<a>", {
1022
+ className: "yoxviewInfoLink",
1023
+ href: "#",
1024
+ title: options.autoHideInfo ? currentLanguage.PinInfo : currentLanguage.UnpinInfo,
1025
+ css: { display: 'inline' },
1026
+ click: function(e){
1027
+ e.preventDefault();
1028
+ options.autoHideInfo = !options.autoHideInfo;
1029
+ infoPinLinkImg.css("background-position", sprites.getBackgroundPosition("icons", options.autoHideInfo ? "pin" : "unpin"));
1030
+ this.title = options.autoHideInfo ? currentLanguage.PinInfo : currentLanguage.UnpinInfo;
1031
+ }
1032
+ });
1033
+ infoPinLink.append(infoPinLinkImg).appendTo(infoPanelContent);
1034
+
1035
+ }
1036
+ if (options.linkToOriginalContext !== false)
1037
+ {
1038
+ infoPanelLink = $("<a>", {
1039
+ className: "yoxviewInfoLink",
1040
+ target: "_blank",
1041
+ title: currentLanguage.OriginalContext
1042
+ });
1043
+ infoPanelLink.append(sprites.getSprite("icons", "link")).appendTo(infoPanelContent);
1044
+ }
1045
+
1046
+ if (options.infoButtons)
1047
+ {
1048
+ yoxviewApi.infoButtons = options.infoButtons;
1049
+ for (infoButton in options.infoButtons)
1050
+ {
1051
+ options.infoButtons[infoButton].attr("className", "yoxviewInfoLink").css("display", "inline").appendTo(infoPanelContent);
1052
+ }
1053
+ }
1054
+
1055
+ infoPanelContent.append(infoText);
1056
+
1057
+ infoPanel.append(infoPanelContent).appendTo(infoPanelWrap);
1058
+ popup.append(infoPanelWrap);
1059
+ }
1060
+ // set the background:
1061
+ popupBackground = $("<div>", {
1062
+ css : {
1063
+ "position" : "fixed",
1064
+ "height" : "100%",
1065
+ "width" : "100%",
1066
+ "top" : "0",
1067
+ "left" : "0",
1068
+ "background" : options.backgroundColor,
1069
+ "z-index" : "1",
1070
+ "opacity" : options.backgroundOpacity
1071
+ },
1072
+ click : function(){
1073
+ return yoxviewApi.clickBtn(yoxviewApi.close, true);
1074
+ }
1075
+ }).appendTo(popupWrap);
1076
+
1077
+ if (options.buttonsFadeTime != 0)
1078
+ {
1079
+ ctlButtons.hover(
1080
+ function(){
1081
+ if (yoxviewApi.isOpen)
1082
+ $(this).stop().animate({ opacity : 0.6 }, options.buttonsFadeTime);
1083
+ },
1084
+ function(){
1085
+ $(this).stop().animate({ opacity : 0 }, options.buttonsFadeTime);
1086
+ }
1087
+ );
1088
+ }
1089
+ }
1090
+
1091
+ $(cacheImg).load(function()
1092
+ {
1093
+ $.extend(images[currentCacheImg].media, {
1094
+ width: this.width,
1095
+ height: this.height,
1096
+ loaded: true
1097
+ });
1098
+ advanceCache();
1099
+ })
1100
+ .error(function(){
1101
+ advanceCache();
1102
+ });
1103
+
1104
+ function advanceCache()
1105
+ {
1106
+ cachedImagesCount++;
1107
+ if (cachedImagesCount == imagesCount)
1108
+ cacheComplete = true;
1109
+
1110
+ if (!cacheComplete)
1111
+ getCacheBuffer();
1112
+ }
1113
+ this.startCache = function()
1114
+ {
1115
+ loadViewImages(this.firstViewWithImages);
1116
+ calculateCacheBuffer();
1117
+ cacheImages(0);
1118
+ }
1119
+ function getCacheBuffer()
1120
+ {
1121
+ if (!options.cacheBuffer || currentCacheImg != cacheBufferLastIndex)
1122
+ cacheImages(currentCacheImg + (cacheDirectionForward ? 1 : -1));
1123
+ }
1124
+ function calculateCacheBuffer()
1125
+ {
1126
+ if (options.cacheBuffer)
1127
+ {
1128
+ cacheBufferLastIndex = cacheDirectionForward ? currentItemIndex + options.cacheBuffer : currentItemIndex - options.cacheBuffer;
1129
+ if (cacheBufferLastIndex < 0)
1130
+ cacheBufferLastIndex += imagesCount;
1131
+ else if (cacheBufferLastIndex >= imagesCount)
1132
+ cacheBufferLastIndex -= imagesCount;
1133
+ }
1134
+ }
1135
+ function cacheImages(imageIndexToCache)
1136
+ {
1137
+ if (cacheComplete)
1138
+ return;
1139
+
1140
+ if (imageIndexToCache == imagesCount)
1141
+ imageIndexToCache = 0;
1142
+
1143
+ else if (imageIndexToCache < 0)
1144
+ imageIndexToCache += imagesCount;
1145
+
1146
+ var image = images[imageIndexToCache].media;
1147
+ currentCacheImg = imageIndexToCache;
1148
+ if (image && !image.loaded)
1149
+ {
1150
+ if (!image.type || image.type === "image")
1151
+ cacheImg.src = image.src;
1152
+ else
1153
+ loadMedia(image, function(){
1154
+ advanceCache();
1155
+ });
1156
+ }
1157
+ else
1158
+ getCacheBuffer();
1159
+ }
1160
+
1161
+ function showLoaderIcon()
1162
+ {
1163
+ loading = true;
1164
+ ajaxLoader.stop().stopTime()
1165
+ .oneTime(options.buttonsFadeTime, function()
1166
+ {
1167
+ $(this).stop().css("opacity", "0.6").fadeIn(options.buttonsFadeTime);
1168
+ });
1169
+ }
1170
+
1171
+ function hideLoaderIcon()
1172
+ {
1173
+ loading = false;
1174
+ ajaxLoader.stop().stopTime().fadeOut(options.buttonsFadeTime);
1175
+ }
1176
+
1177
+ function setImage(itemIndex)
1178
+ {
1179
+ if (!isPlaying)
1180
+ {
1181
+ showLoaderIcon();
1182
+ }
1183
+ loadAndDisplayMedia(yoxviewApi.currentImage.media);
1184
+ }
1185
+
1186
+ function resizePopup(_width, _height, _top, _left, callBack)
1187
+ {
1188
+ popup.stop().animate({
1189
+ width: _width,
1190
+ height: _height,
1191
+ top: _top,
1192
+ left: _left
1193
+ }, options.popupResizeTime, callBack);
1194
+ }
1195
+ function startPlay()
1196
+ {
1197
+ if (imagesCount == 1)
1198
+ return;
1199
+
1200
+ isPlaying = true;
1201
+ if (currentItemIndex < imagesCount - 1)
1202
+ {
1203
+ popup.oneTime(options.playDelay, "play", function(){
1204
+ yoxviewApi.next();
1205
+ });
1206
+ }
1207
+ else
1208
+ {
1209
+ if (options.loopPlay)
1210
+ popup.oneTime(options.playDelay, "play", function(){
1211
+ yoxviewApi.select(0, null);
1212
+ });
1213
+ else
1214
+ stopPlay();
1215
+ }
1216
+ }
1217
+ function stopPlay()
1218
+ {
1219
+ popup.stopTime("play");
1220
+ isPlaying = false;
1221
+ }
1222
+
1223
+ function blink(_element)
1224
+ {
1225
+ _element.animate({ opacity : 0.8 }, 1000, function()
1226
+ {
1227
+ $(this).animate({opacity: 0.2}, 1000, blink($(this)));
1228
+ });
1229
+ }
1230
+
1231
+ var newPanel = panel1;
1232
+ var oldPanel = panel2;
1233
+
1234
+ function getWindowDimensions()
1235
+ {
1236
+ var widthVal = $(parent.window).width();
1237
+ var heightVal = $(parent.window).height();
1238
+ var returnValue = {
1239
+ height : heightVal,
1240
+ width : widthVal,
1241
+ usableHeight : heightVal - options.popupMargin * 2,
1242
+ usableWidth : widthVal - options.popupMargin * 2
1243
+ };
1244
+ return returnValue;
1245
+ }
1246
+ windowDimensions = getWindowDimensions();
1247
+
1248
+ this.resize = function()
1249
+ {
1250
+ if (isPlaying)
1251
+ {
1252
+ resumePlay = true;
1253
+ stopPlay();
1254
+ }
1255
+
1256
+ var imageMaxSize = newPanel.data("maxSize");
1257
+
1258
+ if (!imageMaxSize || !imageMaxSize)
1259
+ return;
1260
+
1261
+ var newImageDimensions = Yox.fitImageSize(
1262
+ imageMaxSize,
1263
+ { width: windowDimensions.usableWidth, height: windowDimensions.usableHeight});
1264
+
1265
+ newPanel.css({"width" : "100%", "height" : "100%"});
1266
+
1267
+ var marginTop = Math.round((windowDimensions.height - newImageDimensions.height) / 2);
1268
+ var marginLeft = Math.round((windowDimensions.width - newImageDimensions.width) / 2);
1269
+
1270
+ isResizing = true;
1271
+ if (newPanel.isMedia)
1272
+ ctlButtons.animate({top: newImageDimensions.height / 2 - mediaButtonsSize.height / 2}, options.popupResizeTime);
1273
+
1274
+ resizePopup(newImageDimensions.width,
1275
+ newImageDimensions.height,
1276
+ marginTop,
1277
+ marginLeft,
1278
+ function(){
1279
+ var newImageWidth = popup.width();
1280
+ var newImageHeight = popup.height();
1281
+
1282
+ newPanel.css({ "width" : newImageWidth + "px", "height" : newImageHeight + "px" });
1283
+ isResizing = false;
1284
+
1285
+ if (infoPanel)
1286
+ setInfoPanelHeight();
1287
+
1288
+ if (resumePlay)
1289
+ {
1290
+ startPlay();
1291
+ resumePlay = false;
1292
+ }
1293
+ }
1294
+ );
1295
+ }
1296
+
1297
+ function setInfoPanelHeight(callback)
1298
+ {
1299
+ clearTimeout(hideInfoTimeout);
1300
+ var titleHeight = infoText.outerHeight();
1301
+
1302
+ if (titleHeight < infoPanelMinHeight)
1303
+ titleHeight = infoPanelMinHeight;
1304
+
1305
+ infoPanel.stop().animate({height : titleHeight}, 500, function(){
1306
+ if (callback)
1307
+ callback();
1308
+ });
1309
+ }
1310
+ function hideInfoPanel(callback)
1311
+ {
1312
+ clearTimeout(hideInfoTimeout);
1313
+ infoPanel.stop().animate({ height: 0 }, 500, function(){
1314
+ if (callback)
1315
+ callback();
1316
+ });
1317
+ }
1318
+ function hideMenuPanel(callback)
1319
+ {
1320
+ clearTimeout(hideMenuTimeout);
1321
+ menuPanel.stop().animate({ top: menuHidePosition }, 500, function(){
1322
+ if (callback)
1323
+ callback();
1324
+ });
1325
+ }
1326
+ function showMenuPanel(callback)
1327
+ {
1328
+ clearTimeout(hideMenuTimeout);
1329
+ menuPanel.stop().animate({ top: 0 }, 500, function(){
1330
+ if (callback)
1331
+ callback();
1332
+ });
1333
+ }
1334
+
1335
+ function changeMedia(media)
1336
+ {
1337
+ var currentImageElement;
1338
+ var mediaIsImage = !media.type || media.type === "image";
1339
+
1340
+ if (mediaIsImage && disableInfo && infoPanel)
1341
+ infoPanelWrap.css("display", "block");
1342
+
1343
+ clearTimeout(hideInfoTimeout);
1344
+
1345
+ if (panel1.css('z-index') == 1)
1346
+ {
1347
+ newPanel = panel1;
1348
+ currentImageElement = image1;
1349
+ oldPanel = panel2;
1350
+ }
1351
+ else
1352
+ {
1353
+ newPanel = panel2;
1354
+ currentImageElement = image2;
1355
+ oldPanel = panel1;
1356
+ }
1357
+
1358
+ newPanel.data("maxSize", { width: media.width, height: media.height});
1359
+
1360
+ var newImageDimensions = Yox.fitImageSize(
1361
+ media,
1362
+ { width: windowDimensions.usableWidth, height: windowDimensions.usableHeight });
1363
+
1364
+ if (infoPanel)
1365
+ {
1366
+ var infoTextValue = media.title || "";
1367
+ if (media.description)
1368
+ infoTextValue += infoTextValue != ""
1369
+ ? "<div id='yoxview_infoTextDescription'>" + media.description + "</div>"
1370
+ : media.description;
1371
+
1372
+ infoText.html(infoTextValue);
1373
+
1374
+ if (imagesCount > 1)
1375
+ countDisplay.html(currentItemIndex + 1 + "/" + imagesCount);
1376
+
1377
+ if (infoPanelLink)
1378
+ {
1379
+ if (yoxviewApi.currentImage.link)
1380
+ infoPanelLink.attr("href", yoxviewApi.currentImage.link).css("display", "inline");
1381
+ else
1382
+ infoPanelLink.css("display", "none");
1383
+ }
1384
+ }
1385
+ var panelData = newPanel.data("yoxviewPanel");
1386
+ if (mediaIsImage)
1387
+ {
1388
+ currentImageElement.attr({
1389
+ src : media.src,
1390
+ title : media.title,
1391
+ alt: media.alt
1392
+ });
1393
+
1394
+ ctlButtons.css({"height": "100%", "width": "50%", "top": "0"});
1395
+ if(newPanel.isMedia)
1396
+ {
1397
+ panelData.media.remove();
1398
+ panelData.media = undefined;
1399
+ panelData.image.show();
1400
+ newPanel.isMedia = false;
1401
+ }
1402
+ disableInfo = false;
1403
+ }
1404
+ else
1405
+ {
1406
+ if (!panelData.media)
1407
+ {
1408
+ panelData.media = $("<div>", {
1409
+ className: "yoxview_mediaPanel"
1410
+ });
1411
+ panelData.image.hide();
1412
+ newPanel.append(panelData.media);
1413
+ }
1414
+ else
1415
+ panelData.media.show();
1416
+
1417
+ panelData.media.html(media.html);
1418
+ ctlButtons.css({
1419
+ "width": mediaButtonsSize.width,
1420
+ "height": mediaButtonsSize.height,
1421
+ "top": (newImageDimensions.height / 2) - (mediaButtonsSize.height / 2)
1422
+ });
1423
+ if (!newPanel.isMedia)
1424
+ {
1425
+ panelData.image.hide();
1426
+ newPanel.isMedia = true;
1427
+ }
1428
+ if (infoPanel)
1429
+ {
1430
+ if (options.autoHideInfo !== false)
1431
+ hideInfoPanel();
1432
+
1433
+ infoPanelWrap.css("display", "none");
1434
+ disableInfo = true;
1435
+ }
1436
+ }
1437
+ if (firstImage)
1438
+ newPanel.animate({
1439
+ width: newImageDimensions.width,
1440
+ height: newImageDimensions.height
1441
+ }, options.popupResizeTime);
1442
+ else
1443
+ newPanel.css({
1444
+ "width" : newImageDimensions.width + "px",
1445
+ "height" : newImageDimensions.height + "px"
1446
+ });
1447
+
1448
+ var marginTop = Math.round((windowDimensions.height - newImageDimensions.height) / 2);
1449
+ var marginLeft = Math.round((windowDimensions.width - newImageDimensions.width) / 2);
1450
+
1451
+ if (loading)
1452
+ hideLoaderIcon();
1453
+
1454
+ isResizing = true;
1455
+ resizePopup(newImageDimensions.width,
1456
+ newImageDimensions.height,
1457
+ marginTop,
1458
+ marginLeft,
1459
+ function()
1460
+ {
1461
+ if (firstImage)
1462
+ {
1463
+ yoxviewApi.isOpen = true;
1464
+
1465
+ if (options.controlsInitialDisplayTime > 0)
1466
+ {
1467
+ if (options.showButtonsOnOpen)
1468
+ ctlButtons.animate({opacity: 0.5}, options.controlsInitialFadeTime, function(){
1469
+ if(options.buttonsFadeTime != 0)
1470
+ $(this).delay(options.controlsInitialDisplayTime).animate({opacity : 0}, options.controlsInitialFadeTime);
1471
+ });
1472
+
1473
+ if (options.showBarsOnOpen)
1474
+ {
1475
+ showMenuPanel(function(){
1476
+ if (options.autoHideMenu !== false)
1477
+ hideMenuTimeout = setTimeout(function(){
1478
+ hideMenuPanel();
1479
+ },
1480
+ options.controlsInitialDisplayTime
1481
+ );
1482
+ });
1483
+ if (infoPanel)
1484
+ setInfoPanelHeight(function(){
1485
+ if (options.autoHideInfo !== false)
1486
+ hideInfoTimeout = setTimeout(function(){ hideInfoPanel(); }, options.controlsInitialDisplayTime);
1487
+ });
1488
+ }
1489
+ }
1490
+
1491
+ if (options.autoPlay)
1492
+ yoxviewApi.play();
1493
+
1494
+ if (options.onOpen)
1495
+ options.onOpen();
1496
+
1497
+ if (onOpenCallback)
1498
+ {
1499
+ onOpenCallback();
1500
+ onOpenCallback = undefined;
1501
+ }
1502
+
1503
+ firstImage = false;
1504
+ }
1505
+ isResizing = false;
1506
+ }
1507
+ );
1508
+
1509
+ newPanel.css({'z-index': '2', opacity: 1});
1510
+ oldPanel.css('z-index', '1');
1511
+
1512
+ newPanel.fadeIn(options.popupResizeTime, function(){
1513
+ oldPanel.css('display', 'none');
1514
+ if (infoPanel)
1515
+ setInfoPanelHeight(function(){
1516
+ if (options.autoHideInfo !== false)
1517
+ hideInfoTimeout = setTimeout(function(){ hideInfoPanel(); }, options.titleDisplayDuration);
1518
+ });
1519
+
1520
+ if (imagesCount > 1)
1521
+ {
1522
+ if (currentItemIndex < imagesCount - 1 && options.cacheImagesInBackground)
1523
+ cacheImages(currentItemIndex + 1);
1524
+
1525
+ if (isPlaying)
1526
+ startPlay();
1527
+ }
1528
+ });
1529
+ }
1530
+ $(tempImg).load(function()
1531
+ {
1532
+ if (this.width == 0)
1533
+ {
1534
+ displayError("Image error");
1535
+ return;
1536
+ }
1537
+ changeMedia($.extend({}, yoxviewApi.currentImage.media, {
1538
+ width: this.width,
1539
+ height: this.height
1540
+ }));
1541
+ })
1542
+ .error(function(){
1543
+ displayError("Image not found:<br /><span class='errorUrl'>" + this.src + "</span>");
1544
+ });
1545
+
1546
+ function loadMediaFromProvider(provider, url, availableSize, onLoad, onError)
1547
+ {
1548
+ jQuery.jsonp({
1549
+ url: (mediaProviderUrls[provider] || "http://oohembed.com/oohembed/"),
1550
+ data: jQuery.extend({
1551
+ "url" : url,
1552
+ "format": "json"
1553
+ }, availableSize),
1554
+ dataType: 'jsonp',
1555
+ callbackParameter: "callback",
1556
+ success: function(data)
1557
+ {
1558
+ var media = {
1559
+ title: data.title,
1560
+ width: data.width,
1561
+ height: data.height,
1562
+ type: data.type
1563
+ };
1564
+
1565
+ if (data.type === "video")
1566
+ {
1567
+ media.html = data.html
1568
+ .replace(/<embed /, "<embed wmode=\"transparent\" ")
1569
+ .replace(/<param/, "<param name=\"wmode\" value=\"transparent\"><param")
1570
+ .replace(/width=\"[\d]+\"/ig, "width=\"100%\"")
1571
+ .replace(/height=\"[\d]+\"/ig, "height=\"100%\"");
1572
+ }
1573
+ else if (data.type === "photo")
1574
+ {
1575
+ jQuery.extend(media, {
1576
+ src: data.url,
1577
+ alt: data.title,
1578
+ type: "image"
1579
+ });
1580
+ }
1581
+ onLoad(media);
1582
+ },
1583
+ error: function(errorSender, errorMsg){
1584
+ if (onError)
1585
+ onError(errorSender, errorMsg);
1586
+ }
1587
+ });
1588
+ };
1589
+
1590
+ function loadAndDisplayMedia(media)
1591
+ {
1592
+ try
1593
+ {
1594
+ if (!media)
1595
+ throw("Error: Media is unavailable.");
1596
+
1597
+ if (!media.type || media.type === "image")
1598
+ {
1599
+ // Resets the src attribute for the image - avoids a rendering problem in Chrome.
1600
+ // $.opacity is tested so this isn't applied in IE (up to IE8),
1601
+ // since it creates a problem with the image's fading:
1602
+ if ($.support.opacity)
1603
+ tempImg.src = "";
1604
+
1605
+ tempImg.src = media.src;
1606
+ }
1607
+ else
1608
+ {
1609
+ if (!media.loaded)
1610
+ {
1611
+ loadMedia(
1612
+ media,
1613
+ function(loadedMedia){
1614
+ changeMedia(loadedMedia);
1615
+ },
1616
+ function(errorSender)
1617
+ {
1618
+ displayError("Error getting data from:<br /><span class='errorUrl'>" + errorSender.data.url + "</span>");
1619
+ }
1620
+ );
1621
+ }
1622
+ else
1623
+ changeMedia(yoxviewApi.currentImage.media);
1624
+ }
1625
+ }
1626
+ catch(error)
1627
+ {
1628
+ displayError(error);
1629
+ }
1630
+ }
1631
+ function loadMedia(media, onLoad, onError)
1632
+ {
1633
+ if (!media.type || media.type !== "image")
1634
+ {
1635
+ loadMediaFromProvider(
1636
+ media.provider,
1637
+ media.url,
1638
+ options.videoSize,
1639
+ function(mediaData){
1640
+ $.extend(media, mediaData, {loaded: true});
1641
+ if (onLoad)
1642
+ onLoad(media);
1643
+ },
1644
+ onError
1645
+ );
1646
+ }
1647
+ }
1648
+ function displayError(errorMsg)
1649
+ {
1650
+ changeMedia({
1651
+ html: "<span class='yoxview_error'>" + errorMsg + "</span>",
1652
+ width: 500,
1653
+ height: 300,
1654
+ type: "error",
1655
+ title: ""
1656
+ });
1657
+ }
1658
+ this.unload = function(){
1659
+ jQuery.each(views, function(i, view){
1660
+ var $view = $(view);
1661
+ $view.undelegate("a", "click.yoxview")
1662
+ .removeData("yoxview")
1663
+ .yoxthumbs("unload", "yoxview");
1664
+ });
1665
+
1666
+ $(window).unbind(".yoxview");
1667
+
1668
+ if (popup){
1669
+ popupWrap.remove();
1670
+ popup = undefined;
1671
+ }
1672
+ };
1673
+ }