source: main/trunk/greenstone3/web/interfaces/default/js/collage_scripts.js--for-gs311@ 35811

Last change on this file since 35811 was 34720, checked in by davidb, 3 years ago

JS file to be used in next version of Greenstone3 to support collaging

File size: 8.2 KB
Line 
1window.onload=function(){ getImages() };
2
3var _allImagesURLS = new Array();
4var _allDocids = new Array();
5
6var _allImages = new Array();
7
8var _collageDelayMsec = 4000; // used to be 10000
9var _collageFadeTime = 25000;
10var _oversizedHeightFrac = 0.9;
11var _oversizedWidthFrac = 0.9;
12
13var clonedImageQueue = new Array();
14var anchoredClonedImageQueue = new Array();
15
16var cFrameNum;
17var timer;
18
19var COLLAGE_DEBUG = true;
20
21function removeClonedImage(clonedImage,anchoredClonedImage)
22{
23 clonedImagePos = clonedImageQueue.indexOf(clonedImage);
24 if (clonedImagePos>=0) {
25 clonedImageQueue.splice(clonedImagePos,1); // del element from array
26 }
27 else {
28 // This shouldn't happen, unless there has been an issue with incorrectly removing an image
29 // from the Queue
30 if (COLLAGE_DEBUG) {
31 console.log("**** Warning: in unpause::remove() failed to file cloned collage image: ");
32 console.log(clonedImage);
33 }
34 }
35
36 anchoredClonedImagePos = anchoredClonedImageQueue.indexOf(anchoredClonedImage);
37 if (anchoredClonedImagePos>=0) {
38 anchoredClonedImageQueue.splice(anchoredClonedImagePos,1); // del element from array
39 }
40 else {
41 // This shouldn't happen, unless there has been an issue with incorrectly removing an image
42 // from the Queue
43 if (COLLAGE_DEBUG) {
44 console.log("**** Warning: failed to file anchored cloned collage image: " + anchoredClonedImage);
45 }
46 }
47
48 anchoredClonedImage.remove();
49}
50
51
52function scaleOversizedImage(newImage,imageWidth,imageHeight,wrapperWidthThreshold,wrapperHeightThreshold)
53{
54 var xDifference = imageWidth - wrapperWidthThreshold;
55 var yDifference = imageHeight - wrapperHeightThreshold;
56
57 //console.log("xDifference = " + xDifference);
58 //console.log("yDifference = " + yDifference);
59
60 var xScaleDown = 1;
61 if (xDifference>0) {
62 // oversized by width
63 xScaleDown = Math.ceil(imageWidth / wrapperWidthThreshold);
64 }
65
66 var yScaleDown = 1;
67 if (yDifference>0) {
68 // oversized by height
69 yScaleDown = Math.ceil(imageHeight / wrapperHeightThreshold);
70 }
71
72 var maxScaleDown = Math.max(xScaleDown,yScaleDown);
73
74 // ****
75 //console.log("**** scaling down by: " + maxScaleDown);
76
77 newImage.height(imageHeight / maxScaleDown);
78 newImage.width(imageWidth / maxScaleDown);
79}
80
81function collageNextImage(collageFrameNum)
82{
83 collageFrameNum = collageFrameNum % _allImages.length; // keep counter cyclic
84 cFrameNum = collageFrameNum;
85
86 var wrapper = $("#collagewrapper");
87
88 var wrapperWidth = wrapper.width();
89 var wrapperHeight = wrapper.height();
90 //console.log("wrapperWidth = " + wrapperWidth);
91 //console.log("wrapperHeight = " + wrapperHeight);
92
93 var image_i_pos = collageFrameNum;
94 var clonedImage = _allImages[image_i_pos].clone();
95
96 var imageWidth = clonedImage[0].width;
97 var imageHeight = clonedImage[0].height;
98 //console.log("ImageWidth = " + imageWidth);
99 //console.log("ImageHeight = " + imageHeight);
100
101 if ((imageHeight == 0) || (imageWidth == 0)) {
102 // looks like the image hasn't had time to load in yet
103 console.log("For image-frame-number=" + image_i_pos + ", zero dimension encountered => skipping" );
104 }
105 else {
106
107 var wrapperWidthThreshold = wrapperWidth * _oversizedWidthFrac;
108 var wrapperHeightThreshold = wrapperHeight * _oversizedHeightFrac;
109
110 //console.log("wrapperWidthThreshold = " + wrapperWidthThreshold);
111 //console.log("wrapperHeightThreshold = " + wrapperHeightThreshold);
112
113 if (imageWidth > wrapperWidthThreshold || imageHeight > wrapperHeightThreshold)
114 {
115 scaleOversizedImage(clonedImage,imageWidth,imageHeight,wrapperWidthThreshold,wrapperHeightThreshold);
116 // Need to update width and height, as scaledOversizedImage changes this
117 imageWidth = clonedImage.width();
118 imageHeight = clonedImage.height();
119
120 // ****
121 //console.log("new ImageWidth = " + imageWidth);
122 //console.log("new ImageHeight = " + imageHeight);
123
124 }
125
126 var x = Math.random() * (wrapperWidth - imageWidth);
127 var y = Math.random() * (wrapperHeight - imageHeight);
128 //console.log("var x = " + x);
129 //console.log("var y = " + y);
130
131 clonedImage.css({position:"absolute", visibility:"visible", opacity:"1"});
132 clonedImage.offset({top:y, left:x});
133
134 var doc_href = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + _allDocids[image_i_pos];
135 var anchoredClonedImage = $('<a>', {'href': doc_href, 'target': '_blank'} );
136 anchoredClonedImage.append(clonedImage);
137
138 wrapper.append(anchoredClonedImage);
139
140 var queue_next_free_pos = clonedImageQueue.length;
141 clonedImageQueue.push(clonedImage);
142 anchoredClonedImageQueue.push(anchoredClonedImage);
143
144 clonedImage.fadeTo(_collageFadeTime, 0, function() {
145 removeClonedImage(clonedImage,anchoredClonedImage);
146 });
147 }
148
149 timer = setTimeout(function() {
150 collageNextImage(collageFrameNum + 1);
151 }, _collageDelayMsec);
152}
153
154
155function initCollage()
156{
157 var wrapper = $("#collagewrapper");
158 var wrapperHeight = wrapper.height();
159 var wrapperWidth = wrapper.width();
160
161 for (var i=0; i<_allImagesURLS.length; i++) {
162
163 var newImage = $("<img>", {src:_allImagesURLS[i]});
164 newImage.css({position:"absolute", top:"0px", left:"0px", visibility:"hidden"});
165
166 wrapper.append(newImage);
167
168 _allImages.push(newImage);
169 }
170}
171
172
173
174function pause()
175{
176 // console.log("**** pause()");
177
178 if (clonedImageQueue.length > 0) {
179 var queue_len = clonedImageQueue.length;
180 for (var i=0; i<queue_len; i++) {
181 var clonedImage = clonedImageQueue[i];
182 clonedImage.stop(true,false); // clearQueue=true, jumpToEnd=false
183 }
184 }
185 clearTimeout(timer);
186
187 var div = document.getElementById("collagewrapper");
188 div.onclick = function(){ unpause() };
189}
190
191
192function callbackClosure(clonedImageI, anchoredClonedImageI, callback) {
193 return function() {
194 return callback(clonedImageI, anchoredClonedImageI);
195 }
196}
197
198function unpause()
199{
200 //console.log("**** unpause()");
201
202 if (clonedImageQueue.length > 0) {
203 var queue_len = clonedImageQueue.length;
204 for (var i=0; i<queue_len; i++) {
205
206 var clonedImageI = clonedImageQueue[i];
207 var anchoredClonedImageI = anchoredClonedImageQueue[i];
208
209 var opacity = clonedImageI.css('opacity');
210 var fade_time = opacity * _collageFadeTime;
211/*
212 clonedImageI.fadeTo(fade_time, 0,
213 callbackClosure(clonedImageI, anchoredClonedImageI,
214 function(clonedImageJ, anchoredClonedImageJ) {
215 //console.log("***** unpause delayed remove with clonedImage:!");
216 //console.log(clonedImageJ);
217 removeClonedImage(clonedImageJ,anchoredClonedImageJ)
218 })
219 );
220*/
221 clonedImageI.fadeTo(fade_time, 0,
222 callbackClosure(clonedImageI, anchoredClonedImageI, removeClonedImage)
223 );
224 }
225 }
226
227 timer = setTimeout(function() {
228 collageNextImage(cFrameNum + 1);
229 }, _collageDelayMsec);
230
231
232 var div = document.getElementById("collagewrapper");
233 div.onclick = function(){ pause() };
234}
235
236
237function getImages()
238{
239 var extregex = ".*(jpg$|png$)";
240 extregex = extregex.replace(/\|/g, "%7C");
241
242 var url = gs.xsltParams.library_name + "?a=g&s=GetAllImagesInCollection&rt=r&s1.extregex="+extregex+"&s1.c=" + gs.cgiParams.c + "&o=xml";
243 var callback = {
244 success: function(data)
245 {
246 var xml = data.responseXML;
247
248 var imageList = xml.getElementsByTagName("image");
249
250
251 for(var i = 0; i < imageList.length; i++)
252 {
253
254 var imageElem = imageList[i];
255 var docid = imageElem.getAttribute("docid");
256 //console.log("****docid = " + docid);
257 var imageURL = imageElem.firstChild.nodeValue;
258
259 imageURL = imageURL.replace(/\\/gi, "/");
260 imageURL = imageURL.replace(/%5C/gi, "/");
261
262 imageURL = imageURL.substring(imageURL.indexOf("sites"));
263 // assoc file paths now need to start with the library name
264 _allImagesURLS.push("library/"+imageURL);
265 _allDocids.push(docid);
266 }
267
268 if(_allImagesURLS.length > 0)
269 {
270 initCollage();
271 var collagewrapper = document.getElementById("collagewrapper");
272 collagewrapper.onclick = function(){ pause() };
273
274 // start the collaging of the img tags
275 collageNextImage(0);
276
277
278 }
279 },
280 failed: function(data){alert("Failed to retrieve list of images to collage from Greenstone3 server");}
281 };
282
283 YAHOO.util.Connect.asyncRequest("GET", url , callback);
284}
Note: See TracBrowser for help on using the repository browser.