PageSourceSearch

https://www.knoll.com/js/jquery/searchPaginatedResultsMod.js

js knoll.com collected 2026-10-01 09:12:31 UTC 20,177 bytes, 592 lines download raw bytes

1var slidInfo;
2var searchPaginatedResultsMod = (function(){
3	var pageBaseUrl = '/cs/Satellite?pagename=KnollUtilities/Library/Page', // +{id}
4		assetBaseUrl = '/cs/Satellite?pagename=KnollUtilities/Library/Asset', // +{id}
5		currentPage = 0,
6		cache = {},
7		curOffset,
8		pagesTotalCount = 1,
9		isWindowLoaded = false,
10		pageSizeCount,
11		resultsTotalCount,
12		loadingMessage,
13		isUsingRoutes = false,
14		hasData = false,
15		paginationStyle = 'scrolling',
16		imagePopupWidth = 0,
17		imagePopupLeft = 0,
18		downloadModalContentSectionWidth = 0,
19		downloadModalBannerWidth = 0,
20		
21		setup = function(options){
22           if (options){
23				pageBaseUrl = options.url;
24           }
25	      	
26			// This probably doesn't belong here - basically, unbind the style selects stuff from the window event
27			$(window).unbind('load',Custom.init)
28			// Get the load more button ready
29			updateGetPageButton()
30	
31			if(isUsingRoutes){
32				$.routes.add('{id:int}', function() {})
33				$.routes.load(location.hash)
34			}
35		
36			// Load the custom init with default settings
37			Custom.init();
38			bindEvents();
39		},
40
41		bindEvents = function(){
42			
43			$('#loadNextPage').click(function(e){
44				
45				var pageid = $(this).attr('href').replace('#','');
46				if (pageid > pagesTotalCount){
47					e.preventDefault();
48					return	
49				}
50				
51				if (!isUsingRoutes){
52					e.preventDefault();
53				}
54				
55				getPageData(pageid);
56				
57			})
58			// no longer in use, just sets a flag that the window is loaded
59			$(window).load(function() {
60				isWindowLoaded = true;
61			});
62			
63			$(window).scroll(function () {
64				if($(window).scrollTop() >= $(document).height() - $(window).height() - 5000){
65					$('#loadNextPage').click();
66				}
67			});
68			
69			//Get asset id off of the jsagentdata attribute.  data-attr should be renamed
70			// so should the jsAgent - data-jsAgent=fetchAsset, data-assetid
71			$('#results').on('click','[data-jsAgent="modalOpener"]', function(e){
72				$('.lg-download-button .lg-download').addClass('downld');
73				e.preventDefault();
74				
75				$('#mediaid').val($(this).data('mediaid'));
76				var assestDataa = $(this).data('jsagentdata');
77				console.log(assestDataa);
78				getAssetData($(this).data('jsagentdata'));
79					
80			})
81			
82			// add to the form on the page for the hi-rez image 
83
84			// Do keywordSearch
85			/*$('.downloadModalContentSection .keywords-tag a').on('click','[data-jsAgent="keywordSearch"]', function(){
86				keywordSearch($(this).data('jsagentkeyword'));
87			})*/
88
89			// Do downloadFile function
90			$('.fileDownloadModal').on('click', '[data-jsAgent="downloadFile"]', function(e){})
91
92			// All bound up - call click if there is no data
93			if(!hasData){
94				$('#loadNextPage').click().show();
95				hasData = true;
96			}
97
98		},
99		cleanHash = function(hash){
100			return id;
101		},
102		getDataParameters = function(selected){
103			var defaultUrlObj = {},
104				defaultObjectKey = "pList"
105				parentSeparator = "|;",
106				childSeparator = ";",
107				defaultObjectValue = '';
108			
109			defaultUrlObj[defaultObjectKey] = '';
110
111			$('#defaultParameters > li').each(function(i,el){
112				var $this = $(this);
113				if(selected){
114			
115					if($this.children('input').is(':checked')){			
116						defaultObjectValue += $this.children('input:checked').val();
117						defaultObjectValue += parentSeparator;
118					} else {
119	
120						return
121					}
122				} else {
123		
124					defaultObjectValue += $this.children('input').eq(0).val();
125					defaultObjectValue += parentSeparator;
126				}
127				
128				
129				if ($this.children('.subFilter')){
130					$this.children('.subFilter').children('li').each(function(i, el){
131						var idx = i;
132						var subfilterstring = '';
133					
134						var $this = $(this);
135						if(selected){
136							if($this.children('input').is(':checked')){
137								
138								subfilterstring = $this.children('input:checked').val() + childSeparator;
139			
140							} else {
141								return
142							}
143							
144						} else {
145						
146							defaultObjectValue += $this.children('input').eq(0).val();
147							defaultObjectValue += childSeparator;
148						}
149						
150						defaultObjectValue+=subfilterstring;
151					})
152				}
153			})
154
155			defaultUrlObj[defaultObjectKey] = defaultObjectValue;
156			// needs to return an object
157			return defaultUrlObj;
158		},
159		createPageAjaxUrl = function(){
160			
161			var url,
162				// creates an object of query string parameters from url
163				originalUrlParams = $.deparam.querystring(),
164				// creates a page object
165				currentHash = {page:currentPage};	
166			if($.isEmptyObject(originalUrlParams )){
167				url = getDataParameters();
168			} else {
169				url = getDataParameters("selected");
170			};
171			if(url.pList.length==0 && $.isEmptyObject(url.pList )){
172				url = getDataParameters();
173				}
174			// extend object to include the page object
175			url = $.extend(originalUrlParams,url,currentHash);
176			url = $.param(url);
177			return url;
178		}
179
180		updateGetPageButton = function(){
181
182			currentPage++;
183			$('#loadNextPage').attr('href', '#'+currentPage);
184			return;
185		},
186		
187		// id == next page id.  
188		getPageData = function(id){
189			
190			// not sure what the difference would be if we were using routes.  The id would be passed in through
191			// the hashchange function, which would just click the link directly, but would still need to build the url
192			if(!isUsingRoutes){
193				var url = pageBaseUrl+'&'+createPageAjaxUrl(id);
194			}
195			// we check against the cache so that we don't call the same url twice before data has come back
196			if(!cache[id]){
197				cache[id] = url
198			}else{
199				return;
200			}
201			
202			$.ajax({
203  				type: "GET",
204  				url: url,
205				dataType: 'json',
206				success: function(data) {
207					displayPageData(data)
208					//initializeLightGallery();
209                }
210			});
211			
212		},
213
214		displayPageData = function(data){
215		
216			var template = $('#libraryThumbnailTemplate').html();
217			var results = Mustache.to_html(template, data);
218			
219			var pageEl = $( "<div/>", {id: "page"+currentPage,"class":"clearfix"});
220			
221			pageEl.html(results).appendTo("#results");
222			if(currentPage != data.data.totalpages){
223				pageEl.css({'min-height':'2480px'});
224			}
225			//$("#results :nth-child(5n)").addClass("last");
226		   
227			pagesTotalCount = data.data.totalpages;
228			pageSizeCount = data.data.pagesize;
229			resultsTotalCount = data.data.totalitems;
230			
231			// the lazy load the images in the data set
232			Custom.init(pageEl.attr('id'));
233			updateGetPageButton();
234			//initializeLightGallery();
235		  
236		},
237
238		getAssetData = function(id,slid_info){
239			slidInfo = slid_info
240			var url = assetBaseUrl+'&assetId='+id
241			
242			$.ajax({
243  				type: "GET",
244  				url: url,
245				dataType: 'json',
246				success: function(data) {
247					//On Successfull service call
248					displayAssetData(data) 
249                }
250			});
251		},
252		
253		displayAssetData = function(data){
254			var slideType = slid_info;
255			$(document).off('click', '.lg-download-button .lg-download');
256			var template = $('#libraryModalTemplate').html();
257		    var results = Mustache.to_html(template, data);
258
259			var downloadTemplate = $('#libraryDownloadModalTemplate').html();
260		    var downloadResults = Mustache.to_html(downloadTemplate, data);
261
262			var downloadVideoTemplate = $('#libraryVideoDownloadModalTemplate').html();
263		    var downloadvideoResults = Mustache.to_html(downloadVideoTemplate, data);
264			addDownloadVideo();
265			console.log("videoUrl",videoUrl)
266			/*$('.downloadResolution .active').click(function() {
267				$('.downloadResolution.active').hide();
268				});*/
269				
270			 //slideType = $('#lg-outer-1').data('lg-slide-type');
271			$('.lg-download-button .lg-download').html(downloadvideoResults);
272			addDownloadVideo();
273			$('.lg-download-button .lg-download').addClass('downld');
274		    $('.fileDownloadModal').removeClass('videoModal');
275		    $('.lg-infoicon-button .lg-infoicon').click(function() {
276				$('.downloadModalContentSection').remove();
277				$('.fileDownloadModal').remove();/* KCD-397 changes */
278				$('.downloadResolution').hide();
279				$('.lg-img-wrap').addClass('infoPopup');
280				$('.lg-close-button').addClass('infoOverlay');
281     			$('.lg-img-wrap.infoPopup').append(results);
282				addClikEventToTags();
283    		});
284		//KCD-395: starts
285		//changed for high resolution form and made form to not close until close or submitt button is clicked.	
286		$('.lg-download-button .lg-download').off('click');
287		$('.lg-download-button .lg-download').on('click', function(e) {
288			$('.lg-infoicon-button .lg-infoicon').removeClass('infoPopup');
289			$('.lg-img-wrap.infoPopup').removeClass('infoPopup');
290			$('.lg-close-button').removeClass('infoOverlay');
291    		if (slideType === 'image') {
292    	    	$('.lg-download-button .lg-download').removeAttr("href");
293	        	$('.downloadModalContentSection').hide();
294				$('.fileDownloadModal').remove(); /* KCD-397 changes */
295    	    	$(this).addClass('downloadPopup');
296				$('.lg-download-button').addClass('active');//KCD-399:Media Bank Pop Up - Download button position
297				$('.lg-download-button .download').remove();
298        		$('.lg-download.downloadPopup').addClass('active');
299				
300        		$('.lg-download-button').append(downloadResults);
301        		$('.downloadResolution').addClass('active');
302        		addClickEventTo_High_res();
303    		} 
304			//KCD-395: ends	
305			else if (slideType === 'video') {
306        		var browserInfo = getBrowserInfo();
307        		if (browserInfo.name == 'Chrome') {
308            		e.preventDefault();
309            		 var videoUrl = videoSource;
310        			 var fileName = videoUrl.substring(videoUrl.lastIndexOf('/') + 1);
311					 fetch(videoUrl)
312        			 .then(response => response.blob())
313        			 .then(blob => {
314            			var link = document.createElement('a');
315            			link.href = window.URL.createObjectURL(blob);
316            			link.download = fileName;
317            			document.body.appendChild(link);
318            			link.click();
319            			setTimeout(function() {
320                			document.body.removeChild(link);
321            		    }, 100);
322       		 		});
323        		}
324    		}
325    		addDownloadVideo();
326		});
327
328		
329		    
330		   // Reset imagePopup and child widths 
331		    if ( imagePopupWidth > 0 ) {
332			    $('.fileDownloadModal .currentPopup .downloadModalBanner').width( downloadModalBannerWidth );
333			    $('.fileDownloadModal .currentPopup .downloadModalContentSection').width( downloadModalContentSectionWidth );
334			    $('.fileDownloadModal .currentPopup').parent().width( imagePopupWidth );
335			    $('.fileDownloadModal .currentPopup').parent().css( 'left', imagePopupLeft );
336			}
337		    
338		    // *** hide medium and low res if not available. 
339		    $('.fileDownloadModal .currentPopup .resolution li').each(function() {
340			  if(($(this).children('a').attr('href')=="/media/") || ($(this).children('a').attr('href')=="") ||($(this).children('a').attr('href') =="undefined") || ($(this).children('a').attr('href') == null)){ 	// CN check actual result 
341			  	$(this).hide(); // or remove
342			  }
343			// *** hide medium and low res if not available.
344			 
345			});
346			//*** video embed 
347
348			$('input[name="p"]','#requestHiresForm').val(data.data.items.assetID);
349	
350		};
351
352		return {
353		    init: setup
354		};
355
356})();
357
358function downloadImage(event) {
359    event.preventDefault();
360    const url = event.currentTarget.href;
361    
362    // Extract the filename from the URL
363    const urlParts = url.split('/');
364    const filenameWithParams = urlParts[urlParts.length - 1];
365    const filename = filenameWithParams.split('?')[0]; // Remove any query parameters
366
367    fetch(url)
368        .then(response => response.blob())
369        .then(blob => {
370            const downloadUrl = window.URL.createObjectURL(blob);
371            const a = document.createElement('a');
372            a.style.display = 'none';
373            a.href = downloadUrl;
374            a.download = filename; // Use the extracted filename
375            document.body.appendChild(a);
376            a.click();
377            window.URL.revokeObjectURL(downloadUrl);
378        })
379        .catch(() => alert('Failed to download image.'));
380}
381addClikEventToTags = function() {
382    $('.keywords-tag a[data-jsAgent="keywordSearch"]').click(function() {
383        keywordSearch($(this).data('jsagentkeyword'));
384    });
385	$('.info_Close').click(function() {
386		event.stopPropagation();
387		$('.downloadModalContentSection').hide();
388		$('.lg-infoicon-button .lg-infoicon').removeClass('infoPopup');
389		$('.lg-close-button').removeClass('infoOverlay');
390		//event.preventDefault();
391	});
392}
393
394function downloadImage(event) {
395    event.preventDefault();
396    const url = event.currentTarget.href;
397    
398    // Extract the filename from the URL
399    const urlParts = url.split('/');
400    const filenameWithParams = urlParts[urlParts.length - 1];
401    const filename = filenameWithParams.split('?')[0]; // Remove any query parameters
402
403    fetch(url)
404        .then(response => response.blob())
405        .then(blob => {
406            const downloadUrl = window.URL.createObjectURL(blob);
407            const a = document.createElement('a');
408            a.style.display = 'none';
409            a.href = downloadUrl;
410            a.download = filename; // Use the extracted filename
411            document.body.appendChild(a);
412            a.click();
413            window.URL.revokeObjectURL(downloadUrl);
414        })
415        .catch(() => alert('Failed to download image.'));
416}
417
418addClickEventTo_High_res = function() {
419	$('.low-res').click(function(event) {
420		downloadImage(event);
421		$('.downloadResolution.active').hide();
422		
423		event.stopPropagation();
424	});
425	$('.med-res').click(function(event) {
426		downloadImage(event);
427		$('.downloadResolution.active').hide();
428		event.stopPropagation();
429	});
430	$('.high-res').click(function() {
431		$('.downloadResolution.active').hide();
432		$('.fileDownloadModal').remove();/* KCD-397 changes */
433		$('.lg-content').append(fileDownloadModal_template); /* KCD-397 changes */
434		$('.fileDownloadModal').addClass('active');
435		$('.fileDownloadModal .imagePopup').addClass('active');
436	    /*changes for KCD-416-starts  */
437		$('.lg-show-in #closePopup1').addClass('close_high_res_form');
438        $('.lg-show-in .close_high_res_form').click(function() {
439			$('.fileDownloadModal.active').removeClass('active');
440			event.stopPropagation();	
441		});
442		/*changes for KCD-416-ends  */
443		$('.downloadResolution.active').hide();
444		//$('.fileDownloadModal.active .imagePopup').css('display', 'block');
445		//$('.downloadPopup ul.downloadResolution').css('display', 'none');
446		event.stopPropagation();
447		
448	
449	});
450	
451}
452 var videoUrl; 
453 var fileName;
454addDownloadVideo = function(){
455	var videoLink = $('.lg-download-button .lg-download a.downloadVideo').hasClass('downloadVideo');
456	if (videoLink) {
457        videoUrl = $('.lg-download-button .lg-download a.downloadVideo').data('videourl');
458        fileName = videoUrl.substring(videoUrl.lastIndexOf('/') + 1);
459		//var downloadUrl = videoUrl + '?content-type=video/mp4&Content-Disposition=attachment;filename=' + encodeURIComponent(fileName) + '&MDT-Type=abinary; charset=UTF-8';
460		$('.lg-download-button .lg-download').attr('href', videoUrl);
461		//$('.lg-download-button .lg-download').attr('download', fileName);
462		//$('.lg-download-button .lg-download').attr('type','video/mp4');
463		//$('.lg-download-button .lg-download').attr('target',"_blank");
464		//$('.lg-download-button .lg-download').attr('data-jsAgent',"downloadFile");
465		$('.lg-download-button .lg-download').attr('data-videourl',videoUrl);
466		$('.lg-download-button .lg-download').removeAttr("target");
467		$('.lg-download-button .lg-download').removeAttr("rel");
468		$('.lg-download-button .lg-download .download_video .downloadVideo').remove();
469 	}
470}
471
472//KCD-471 changes starts
473		gridAssetInfoData = function(response){
474			$(document).off('click', '.lg-download-button .lg-download');
475			$('.lg-download-button .lg-download').addClass('downld');
476		    $('.fileDownloadModal').removeClass('videoModal');
477			$('.downloadModalContentSection').remove();
478			$('.fileDownloadModal').remove();
479			$('.downloadResolution').hide();
480			$('.lg-current .lg-img-wrap').addClass('infoPopup');
481			$('.lg-close-button').addClass('infoOverlay');
482     		$('.lg-show-in .lg-current .lg-img-wrap.infoPopup').append(response);
483			addClikEventToTags();
484    		
485			}
486		
487			gridAssetDownloadData = function(response){
488				var slideType = slid_info;
489				$('.lg-infoicon-button .lg-infoicon').removeClass('infoPopup');
490				$('.lg-img-wrap.infoPopup').removeClass('infoPopup');
491				$('.lg-close-button').removeClass('infoOverlay');
492    			if (slideType === 'image') {
493    	    		$('.lg-download-button .lg-download').removeAttr("href");
494	        		$('.downloadModalContentSection').hide();
495					$('.fileDownloadModal').remove();
496    	    		$('.lg-download-button .lg-download').addClass('downloadPopup');
497					$('.lg-download-button').addClass('active');
498					$('.lg-download-button .download').remove();
499        			$('.lg-download.downloadPopup').addClass('active');
500					$('.lg-show-in .lg-download-button').append(response);
501        			$('.downloadResolution').addClass('active');
502        			addClickEventTo_High_res();
503    			}
504				else if (slideType === 'video') {
505        			var browserInfo = getBrowserInfo();
506        			if (browserInfo.name == 'Chrome') {
507            			e.preventDefault();
508            			var videoUrl = videoSource;
509        			 	var fileName = videoUrl.substring(videoUrl.lastIndexOf('/') + 1);
510						fetch(videoUrl)
511        			 	.then(response => response.blob())
512        			 	.then(blob => {
513            				var link = document.createElement('a');
514            				link.href = window.URL.createObjectURL(blob);
515            				link.download = fileName;
516            				document.body.appendChild(link);
517            				link.click();
518            				setTimeout(function() {
519                				document.body.removeChild(link);
520            		    	}, 100);
521       		 			});
522        			}
523    			}
524    			addDownloadVideo();
525			};
526//KCD-471 changes ends
527
528var fileDownloadModal_template;
529console.log("media_bank");
530$(window).on('load', function() {
531fileDownloadModal_template = document.querySelector('.fileDownloadModal');
532});
533
534// Start of KCD-374: New Pop Up for Media Bank Library Page - Lazy Load and Filter compatible.
535// using mutation observer to listen for changes in results,clearfix class elements for lazy loaded media items on media bank pages.
536var prev_ele;
537const mutationCallback = function(mutationsList) {
538    mutationsList.forEach(function(mutation) {
539        if (mutation.target.className === 'clearfix') {
540			if(mutation.type == 'childList'){
541				ele = mutation.addedNodes[0].id;
542				if(ele != prev_ele){
543					attachLightGallery(ele);
544					prev_ele = ele;
545				}
546			}
547        }
548    });
549};
550
551	const observer = new MutationObserver(mutationCallback);
552	const targetNode = document.getElementById('results');
553	if (targetNode) {
554    	observer.observe(targetNode, { subtree: true, childList: true });
555	} else {
556    console.error("Target node not found or is not a valid DOM element.");
557}
558
559function attachLightGallery(ele){
560		var mediaImage = document.getElementById(ele);
561		if (mediaImage) {
562			lgInst = lightGallery(mediaImage, {
563				licenseKey : 'BF6D4415-F44A-40B6-A338-FFDCEAAB2F2E',
564				plugins: [lgVideo],
565				'selector' : '.media_items',
566				'width' : '700px',
567				'height' : '470px',
568				'mode' : 'lg-fade',
569				'addClass' : 'fixed-size',
570				'controls' : true,
571				'closable' : true,
572				'showCloseIcon' : true,
573				'download': true,
574				'infoicon': true,
575				'previousSlide':'Previous slide',
576				'nextSlide':'Next slide',
577				'speed': 500,
578				'videoMaxWidth': '1000px',
579				'videojs': false,
580				'videoAutoplay': false,
581				'videojsOptions': {
582					'autoplay': false,
583					'controls': true,
584					'preload': 'auto',
585					'width': '600px',
586					'height': '460px'
587				}
588			});
589		}
590}
591
592//End of KCD-374

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.