orange-flickr 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }