PageSourceSearch

https://www.supsi.ch/o/supsi-v2-theme/js/custom/elements/list_selector.js?v=

js supsi.ch collected 2026-10-02 02:21:57 UTC 43,757 bytes, 1,191 lines download raw bytes

1/* Gestione configurazioni per selezione documenti, faq, ecc. */
2/* ---------------------------------------------------------- */
3
4//Funzioni comuni
5
6var listSelectorConfigurations = {
7	portletNamespace:"",
8	objSearchFilters:"",
9	objListId:"",
10	objListUlId:"",
11	manualShowInAnyLangId:"",
12	manualPreviewFiltersId:"",
13	manualSearchId:"",
14	filterSearchId:"",
15	objManualResultsId:"",
16	manualSearchFieldSelector:"",
17	autoSearchFieldSelector:"",
18	searchUrl:"",
19	fieldLanguageId:"",
20	listContentType:"",
21	selectContentType:"",
22	objIdAttributeName:"",
23	idAttributeName:"",
24	idAttributeString:false,
25	labelAttributeName:"",
26	researchResultsModalTitle:"",
27	previewModalTitle:"",
28	selectModalTitle:"",
29	modalListhasLink:false,
30	objListhasLink:false,
31	canEditTitle:false,
32	linkAttributeName:null,
33	objLinkClass:"",
34	listObjLinkClass:"",
35	objIdDataAttributeName:"",
36	languagesToShow:"",
37	isDocuwareList:false,
38	isFaqsList:false,
39	isProjectsList:false,
40	isPublicationsList:false,
41	useLangs:false,
42	noObjectsText:"Nessun elemento selezionato",
43	isManualSearch:false,
44	isSortable:false,
45	orderAutoSearchListByAttributeId:"",
46	objDataAttributes:[],
47	contentTypeAttributes:{}
48};
49function initListSelector(portletListSelectorConfigurations){
50	try{
51		Object.keys(portletListSelectorConfigurations).forEach(key => {
52			listSelectorConfigurations[key] = portletListSelectorConfigurations[key];
53		});
54		//listSelectorConfigurations = portletListSelectorConfigurations;
55		//console.log("listSelectorConfigurations:"); console.dir(listSelectorConfigurations);		
56		if(listSelectorConfigurations.isDocuwareList){
57			searchConfigurationLoad(
58				listSelectorConfigurations.portletNamespace, 
59				listSelectorConfigurations.objSearchFilters,
60				listSelectorConfigurations.autoSearchFieldSelector, 
61				listSelectorConfigurations.objIdAttributeName
62			);			
63		}
64		var listUpdated = false;
65		if(listSelectorConfigurations.useLangs){
66			let languages = listSelectorConfigurations.languagesToShow;
67			if(languages.length>0){
68				languages.forEach(function(lang){
69					updateList(lang);
70					listUpdated = true;
71				});
72			}
73		}
74		if(!listUpdated){ updateList(); }
75		if(listSelectorConfigurations.isDocuwareList){
76			addDowloadDocuwareDocumentEventListener();
77		}
78		if(listSelectorConfigurations.isFaqsList){
79			addUpdateCategoriesValuesEventListener();
80		}
81		if(listSelectorConfigurations.isSortable){
82			initObjectsSortLists();
83		}
84	}
85	catch(error){ logError(error); }
86}
87
88function changeSelectorType(val){
89	try{
90		var ManualSearch = document.getElementById(listSelectorConfigurations.manualSearchId);
91	    var ManualSearchResults = document.getElementById(listSelectorConfigurations.objManualResultsId);
92	    var FilterSearch = document.getElementById(listSelectorConfigurations.filterSearchId);
93	    if(val){
94	    	ManualSearch.classList.remove('d-none');
95	    	ManualSearchResults.classList.remove('d-none');
96	    	FilterSearch.classList.add('d-none');
97	    	listSelectorConfigurations.isManualSearch = true;
98	    }
99	    else{
100	    	ManualSearch.classList.add('d-none');
101	    	ManualSearchResults.classList.add('d-none');
102	    	FilterSearch.classList.remove('d-none');
103	    	listSelectorConfigurations.isManualSearch = false;
104	    }
105	}
106	catch(error){ logError(error); }    
107}
108
109function setListNoLegend(){
110	try{
111		setTimeout(function(){
112			var noLegends = document.querySelectorAll(".no-legend");
113			for(var i=0;i < noLegends.length; i++){
114				var noLegend = noLegends[i];
115				noLegend.classList.add("no-legend-item");
116			}
117		}, 500);
118	}
119	catch(error){ logError(error); }		
120}
121
122function getInputFieldType(fieldObject){
123	var inputFieldType = undefined;
124	try{
125		if(typeof fieldObject === "object" && fieldObject !== null){
126			var inputTagName = ""; var inputType = "";
127			inputTagName = fieldObject.tagName;
128			inputType = fieldObject.type;
129			if(inputTagName=="INPUT"){
130	  			if(inputType=="text"){ inputFieldType = "text"; }
131	  			else if(inputType=="checkbox"){ inputFieldType = "checkbox"; }
132	  		}
133	  		else if(inputTagName=="SELECT"){
134	  			inputFieldType = "select";
135	  		}
136			
137		}
138	}
139	catch(error){ logError(error); }		
140	return inputFieldType;
141}
142
143function listSelectorConfigurationSubmit(){
144	try{
145		showLoading(document);
146		var thisForm = document.getElementById(listSelectorConfigurations.portletNamespace+"fm");
147		if(thisForm!=null){
148			if(listSelectorConfigurations.isDocuwareList){
149				updatefilterFieldsInput(listSelectorConfigurations.portletNamespace, listSelectorConfigurations.autoSearchFieldSelector, listSelectorConfigurations.listContentType, listSelectorConfigurations.objSearchFilters, listSelectorConfigurations.objIdAttributeName);
150			}
151		  	thisForm.submit();
152	  	}
153	}
154	catch(error){ logError(error); }		
155}
156
157function addUpdateCategoriesValuesEventListener(){
158	try{
159		// DOMNodeInserted/DOMNodeRemoved Deprecati: sostituitoi con MutationObserver
160		/*$('body').on('DOMNodeInserted', "input", function () {
161			updateSelectorCategoriesValues();	
162		});
163		$('body').on('DOMNodeRemoved', "input", function () {
164			setTimeout(function(){
165				updateSelectorCategoriesValues();
166			}, 1000);
167		});*/
168		
169		//MutationObserver
170		const observer = new MutationObserver((mutationList) => {
171		  mutationList
172		    .filter((m) => m.type === 'childList')
173		    .forEach((mutation) => {
174		      mutation.addedNodes.forEach((node) => DOMNodeInserted(node));
175		      mutation.removedNodes.forEach((node) => DOMNodeRemoved(node));
176		    });
177		});
178		
179		//Observe
180		let target = $('body')[0];
181		observer.observe(target, { childList: true, subtree: true });
182		
183		//Node inserted
184		function DOMNodeInserted(insertedNode){
185			if(insertedNode.localName=="input"){
186				console.log("insertedNode!"); console.dir(insertedNode);
187				updateSelectorCategoriesValues();	
188			}
189		}
190		//Node removed
191		function DOMNodeRemoved(removedNode){
192			if(removedNode.localName=="input"){
193				console.log("removedNode!"); console.dir(removedNode);
194				setTimeout(function(){
195					updateSelectorCategoriesValues();
196				}, 1000);
197			}
198		}
199	
200	}
201	catch(error){ logError(error); }		
202}
203
204
205function updateSelectorCategoriesValues(){
206	try{
207		var isManual = listSelectorConfigurations.isManualSearch;
208		var catFilterSelectorName = "filterAssetCategoryIds";
209		if(isManual){ catFilterSelectorName = "manualAssetCategoryIds"; }
210		var catFilterSelector = "input[name^='"+listSelectorConfigurations.portletNamespace+catFilterSelectorName+"']";
211		var confCatSel = document.querySelectorAll(catFilterSelector);
212		var filterSearchFieldsInput = document.getElementById(listSelectorConfigurations.objSearchFilters);
213		var manualSearchFieldsInput = document.getElementById(listSelectorConfigurations.manualPreviewFiltersId);
214		var searchFieldsInput = filterSearchFieldsInput;
215		if(isManual){ searchFieldsInput = manualSearchFieldsInput; }
216		if(confCatSel!=null && searchFieldsInput!=null){
217			var vals = "";
218			for (var i = 0; i < confCatSel.length; i++) {
219				var val = confCatSel[i].value;
220			  	if(val!="" && vals.indexOf(val)==-1){
221					if(vals!=""){ vals += ","; }
222			 		vals += val; 
223				}
224			}
225			searchFieldsInput.value = vals;
226		}	
227	}
228	catch(error){ logError(error); }		
229}
230
231
232function getFieldsValues(portletNamespace, fieldselector, addAllCharToTexts, contentType, objIdAttributeName, returnArray){
233	var jsonFilterValues = null;
234	var jsonFilterValuesObj = {};
235	var jsonFilterValuesArray = [];
236	try{
237		var filterSearchFields = document.querySelectorAll('.'+fieldselector);
238		if(filterSearchFields!=null){
239			filterSearchFields.forEach(input => {
240		  		var inputId = input.id.replace(portletNamespace, "");
241		  		var inputValue = input.value;
242		  		var inputDwFieldType = input.dataset.dwfieldtype;
243		  		var inputFieldType = "text";
244		  		inputFieldType = getInputFieldType(input);
245		  		var val = inputValue;
246		  		var addElement = true;
247		  		if(inputFieldType == "checkbox"){
248		  			var checked = input.checked;
249		  			if(!checked){ addElement = false; }
250		  		}
251		  		if(addAllCharToTexts && inputFieldType == "text"){
252		  			if(val!=null && val!=""){
253		  				if(!val.startsWith("*")){ val = "*" + val; }
254		  				if(!val.endsWith("*")){ val = val + "*"; }
255		  			}
256		  		}
257		  		if(addElement){
258		  			var jsonValue = {};
259		  			switch(contentType){
260		  			case "dw-list":
261		  				jsonValue = {'dwfieldtype':inputDwFieldType, 'fieldtype':inputFieldType};
262		  				jsonValue[objIdAttributeName] = val;
263		  				break;
264		  			case "dw-select":
265		  				jsonValue = {'dwfieldtype':inputDwFieldType, 'fieldtype':inputFieldType};
266		  				jsonValue[objIdAttributeName] = val;
267			  			if(inputFieldType == "checkbox"){
268			  				var title = input.dataset.title;
269			  				var fileExtension = input.dataset.fileextension;
270			  				var fileSize = input.dataset.filesize;
271			  				var storeDate = input.dataset.storedate;
272			  				var modDate = input.dataset.moddate;
273			  				var pageCount = input.dataset.pagecount;
274			  				jsonValue.title = title;
275			  				jsonValue.fileExtension = fileExtension;
276			  				jsonValue.fileSize = fileSize;
277			  				jsonValue.storeDate = storeDate;
278			  				jsonValue.modDate = modDate;
279			  				jsonValue.pageCount = pageCount;
280			  			}
281		  				break;
282		  			case "faq-select":
283			  			jsonValue = {'fieldtype':inputFieldType};
284			  			jsonValue[objIdAttributeName] = val;
285			  			if(inputFieldType == "checkbox"){
286			  				var title = input.dataset.title;
287			  				jsonValue.title = title;
288			  			}
289			  			break;		
290		  			}
291		  			jsonFilterValuesArray.push(jsonValue);
292		  			jsonFilterValuesObj[inputId] = jsonValue;
293		  		}
294			});
295		}
296		if(returnArray){ jsonFilterValues = jsonFilterValuesArray; }
297		else{ jsonFilterValues = jsonFilterValuesObj;}
298	}
299	catch(error){ logError(error); }
300	return jsonFilterValues;
301}
302
303function doSearch(portletNamespace, searchFieldSelector, searchUrl, lang, fieldLanguageId, filtersContentType, contentType, filterSearchFieldsInputId,  objIdAttributeName, callbackFunction){
304	var bodyDiv = document.getElementById("p_p_id"+portletNamespace);
305	try{
306		let filtersVal = null;
307		let addLang = true;
308		if(isStringValid(listSelectorConfigurations.manualShowInAnyLangId)){
309			let manualShowInAnyLang = document.getElementById(listSelectorConfigurations.manualShowInAnyLangId);
310			if(manualShowInAnyLang!=null){
311				if(manualShowInAnyLang.checked){
312					addLang = false;
313				}
314			}
315		}
316		if(listSelectorConfigurations.isDocuwareList){
317			filtersVal = getFieldsValues(portletNamespace, searchFieldSelector, true, filtersContentType, objIdAttributeName, false);
318			if(isStringValid(lang) && isStringValid(fieldLanguageId) && addLang){
319				let fVal = {"value":"*"+lang+"*","fieldtype":"text"};
320				switch(contentType){
321	  			case "dw-select":
322	  				fVal = {"value":"*"+convertLanguageForDocuware(lang)+"*","dwfieldtype":"0","fieldtype":"text"};
323	  				break;
324				}
325				filtersVal[fieldLanguageId] = fVal;
326			}
327			filtersVal = "filters="+JSON.stringify(filtersVal);
328		}
329		else if(listSelectorConfigurations.isFaqsList){
330			filtersVal = "";
331			let cAttrs = listSelectorConfigurations.contentTypeAttributes;
332			if(cAttrs!=null){
333				Object.keys(cAttrs).forEach(key => {
334					filtersVal += key+"="+cAttrs[key]+"&";
335				});
336				
337			}
338			var filterSearchFieldsInput = document.getElementById(filterSearchFieldsInputId);
339			if(filterSearchFieldsInput!=null){
340				var anyCategoryIds = filterSearchFieldsInput.value;
341				filtersVal += "anyCategoryIds="+anyCategoryIds;	
342			}
343		}
344		else if(listSelectorConfigurations.isProjectsList){
345			if(listSelectorConfigurations.isManualSearch){
346				filtersVal = addSearchAttributes(
347					filtersVal, 
348					[
349						{'inputId':'manualPersonId', 'filterAttrName':'personId'},
350						{'inputId':'manualUnitId', 'filterAttrName':'unitId'},
351						{'inputId':'manualShowSubUnits', 'filterAttrName':'showSubUnits'},
352						{'inputId':'manualResultType', 'filterAttrName':'resultType'},
353						{'inputId':'manualShowAllProjects', 'filterAttrName':'showAllProjects'},
354						{'inputId':'manualSubjectKeywords', 'filterAttrName':'subjectKeywords'},
355						{'inputId':'manualOrderBy', 'filterAttrName':'orderBy'},
356						{'inputId':'manualOrderAsc', 'filterAttrName':'orderAsc'},
357						{'inputId':'manualProudFirst', 'filterAttrName':'proudFirst'}/*,
358						{'inputId':'manualResultsNum', 'filterAttrName':'resultsNum'}*/
359					], 
360					portletNamespace
361				);
362			}
363			else{
364				filtersVal = addSearchAttributes(
365						filtersVal, 
366						[
367							{'inputId':'myConfigurationPersonId', 'filterAttrName':'personId'},
368							{'inputId':'myConfigurationUnitId', 'filterAttrName':'unitId'},
369							{'inputId':'myConfigurationShowSubUnits', 'filterAttrName':'showSubUnits'},
370							{'inputId':'myConfigurationResultType', 'filterAttrName':'resultType'},
371							{'inputId':'myConfigurationSubjectKeywords', 'filterAttrName':'subjectKeywords'},
372							{'inputId':'myConfigurationShowAllProjects', 'filterAttrName':'showAllProjects'},
373							{'inputId':'myConfigurationOrderBy', 'filterAttrName':'orderBy'},
374							{'inputId':'myConfigurationOrderAsc', 'filterAttrName':'orderAsc'},
375							{'inputId':'myConfigurationProudFirst', 'filterAttrName':'proudFirst'},
376							{'inputId':'myConfigurationResultsNum', 'filterAttrName':'resultsNum'},
377							{'inputId':'myConfigurationStaticProjectslist', 'filterAttrName':'staticProjectslist'}
378						], 
379						portletNamespace
380					);
381			}
382			let cAttrs = listSelectorConfigurations.contentTypeAttributes;
383			if(cAttrs!=null){
384				Object.keys(cAttrs).forEach(key => {
385					if(filtersVal!=""){ filtersVal += "&"; }
386					filtersVal += key+"="+cAttrs[key];
387				});
388			}	
389		}
390		else if(listSelectorConfigurations.isPublicationsList){
391			if(listSelectorConfigurations.isManualSearch){
392				filtersVal = addSearchAttributes(
393					filtersVal, 
394					[
395						{'inputId':'manualPersonId', 'filterAttrName':'personId'},
396						{'inputId':'manualUnitId', 'filterAttrName':'unitId'},
397						{'inputId':'manualShowSubUnits', 'filterAttrName':'showSubUnits'},
398						{'inputId':'manualSubjectKeywords', 'filterAttrName':'subjectKeywords'},
399						{'inputId':'manualShowAllPublications', 'filterAttrName':'showAllPublications'},
400						{'inputId':'manualOrderBy', 'filterAttrName':'orderBy'},
401						{'inputId':'manualOrderAsc', 'filterAttrName':'orderAsc'},
402						{'inputId':'manualProudFirst', 'filterAttrName':'proudFirst'}/*,
403						{'inputId':'manualResultsNum', 'filterAttrName':'resultsNum'}*/
404					], 
405					portletNamespace
406				);
407			}
408			else{
409				filtersVal = addSearchAttributes(
410						filtersVal, 
411						[
412							{'inputId':'myConfigurationPersonId', 'filterAttrName':'personId'},
413							{'inputId':'myConfigurationUnitId', 'filterAttrName':'unitId'},
414							{'inputId':'myConfigurationShowSubUnits', 'filterAttrName':'showSubUnits'},
415							{'inputId':'myConfigurationSubjectKeywords', 'filterAttrName':'subjectKeywords'},
416							{'inputId':'myConfigurationShowAllPublications', 'filterAttrName':'showAllPublications'},
417							{'inputId':'myConfigurationOrderBy', 'filterAttrName':'orderBy'},
418							{'inputId':'myConfigurationOrderAsc', 'filterAttrName':'orderAsc'},
419							{'inputId':'myConfigurationProudFirst', 'filterAttrName':'proudFirst'},
420							{'inputId':'myConfigurationResultsNum', 'filterAttrName':'resultsNum'},
421							{'inputId':'myConfigurationStaticPublicationslist', 'filterAttrName':'staticPublicationslist'}
422						], 
423						portletNamespace
424					);
425			}
426			let cAttrs = listSelectorConfigurations.contentTypeAttributes;
427			if(cAttrs!=null){
428				Object.keys(cAttrs).forEach(key => {
429					if(filtersVal!=""){ filtersVal += "&"; }
430					filtersVal += key+"="+cAttrs[key];
431				});
432			}	
433		}
434		filtersVal = filtersVal.replaceAll('{', "%7B").replaceAll('}', "%7D");
435		//console.log(filtersVal);
436		if(isStringValid(filtersVal)){
437			showLoading(bodyDiv);
438			var url = searchUrl+"?"+filtersVal;
439			//console.log("url:"+url);
440			executeStrutsWithReturnData(url, function(data){
441				callbackFunction(data);
442				hideLoading(bodyDiv);
443			});
444		}
445	}
446	catch(error){ 
447		hideLoading(bodyDiv);
448		logError(error); 
449	} 	
450}
451
452function addSearchAttributes(filtersVal, attributes, portletNamespace){
453	try{
454		if(filtersVal==null){ filtersVal = ""; }
455		if(attributes!=null){
456			for (var i in attributes) {
457				let attribute = attributes[i];
458				var inputId = attribute.inputId;
459				var filterAttrName = attribute.filterAttrName;
460				var attributeField = document.getElementById(portletNamespace+inputId);
461				if(attributeField!=null && attributeField!=undefined){
462					var inputValue = attributeField.value;
463			  		var inputFieldType = getInputFieldType(attributeField);
464			  		switch(inputFieldType){
465			  		case "text": inputValue = attributeField.value; break;
466			  		case "checkbox": inputValue = attributeField.checked; break;
467			  		case "select": 
468			  			if(attributeField.multiple){
469			  				var result = [];
470			  				var options = attributeField && attributeField.options;
471							var opt;
472							for (var i=0, iLen=options.length; i<iLen; i++) {
473								opt = options[i];
474							    if (opt.selected) { result.push(opt.value); }
475							}
476							inputValue = result.toString();
477			  			}
478			  			else{
479			  				inputValue = attributeField.options[attributeField.selectedIndex].value; 
480			  			}
481			  			break;
482			  		}
483			  		inputValue = encodeURIComponent(inputValue);
484			  		if(filtersVal!=""){ filtersVal+= "&"; }
485			  		filtersVal += filterAttrName+"="+inputValue;
486				}
487			}
488		}
489	}
490	catch(error){ logError(error); }
491	return filtersVal;
492}
493
494
495//Funzioni per la selezione manuale
496
497function manualSelectSearch(lang){
498	let thisobjListId = listSelectorConfigurations.objListId;
499	if(isStringValid(lang)){ thisobjListId += "_"+lang; }
500	doSearch(
501		listSelectorConfigurations.portletNamespace,  
502		listSelectorConfigurations.manualSearchFieldSelector,
503		listSelectorConfigurations.searchUrl,
504		lang,
505		listSelectorConfigurations.fieldLanguageId,
506		listSelectorConfigurations.listContentType,
507		listSelectorConfigurations.selectContentType,
508		listSelectorConfigurations.manualPreviewFiltersId,
509		listSelectorConfigurations.objIdAttributeName,
510		function(data){
511			let dataAttributes = listSelectorConfigurations.objDataAttributes;
512			let output = generateInteractiveObjectsListHTML(
513				data, 
514				thisobjListId,
515				listSelectorConfigurations.objIdAttributeName,
516				listSelectorConfigurations.idAttributeName,
517				listSelectorConfigurations.labelAttributeName, 
518				listSelectorConfigurations.researchResultsModalTitle, 
519				listSelectorConfigurations.modalListhasLink, 
520				listSelectorConfigurations.linkAttributeName, 
521				listSelectorConfigurations.objLinkClass,
522				listSelectorConfigurations.objIdDataAttributeName,
523				dataAttributes
524			);
525			var modalID = listSelectorConfigurations.portletNamespace+"manualSelectModal";
526			createModal(modalID, listSelectorConfigurations.selectModalTitle, output);
527			$('#'+modalID).modal('show');
528			if(listSelectorConfigurations.isDocuwareList){
529				addDowloadDocuwareDocumentEventListener();
530			}
531			addInsertObjectEventListener(function(element){
532				insertObjectToList(element, thisobjListId, listSelectorConfigurations.selectContentType, listSelectorConfigurations.objIdAttributeName);
533				updateList(lang);
534				if(listSelectorConfigurations.isSortable){
535					initObjectsSortLists();
536				}
537			});
538		}
539	);
540}
541
542
543
544
545function getObjectsIdsList(objectsListInputId, idAttributeName){
546	var objIdsList = [];
547	try{
548		var objectsListInput = document.getElementById(objectsListInputId);
549		if(objectsListInput!=null){
550			var objectsListInputValues = objectsListInput.value;
551			if(isStringValid(objectsListInputValues)){
552				var jsonObjValues = JSON.parse(objectsListInputValues);
553				for (var objElID in jsonObjValues) {
554					var obj = jsonObjValues[objElID];
555					var id = "";
556					if(obj.hasOwnProperty(idAttributeName)){ 
557						id = obj[idAttributeName];
558						objIdsList.push(id);
559					}
560				}
561			}
562		}
563	}
564	catch(error){ logError(error); }		
565	return objIdsList;
566}
567
568
569function generateInteractiveObjectsListHTML(data, objectsListInputId, objectsListIdAttributeName, idAttributeName, labelAttributeName, headerTitle, hasLink, linkAttributeName, objectLinkClass, objectIdDataAttributeName, dataAttributes){
570	let output = '';
571	try{
572		let objectsIdsList = getObjectsIdsList(objectsListInputId, objectsListIdAttributeName);
573		if(isStringValid(data)){
574			var jsonData = JSON.parse(data);
575			var resultsCount = 0; var results = [];
576			if (jsonData.hasOwnProperty('resultsCount')) { resultsCount = jsonData.resultsCount; }
577			if (jsonData.hasOwnProperty('results')) { results = jsonData.results; }
578			output += "<strong>"+headerTitle+": "+resultsCount+"</strong>";
579			output += "<ul class='object-selector-list'>";
580			if (typeof results === 'string' || results instanceof String){
581				try{ results = JSON.parse(results); }
582				catch (e) {}
583			}
584			var rNum = 0;
585			results.forEach(result => {
586				var id = ""; var label = "";
587				if (result.hasOwnProperty(idAttributeName)) { id = result[idAttributeName]; }
588				if (result.hasOwnProperty(labelAttributeName)) { label = result[labelAttributeName]; }
589				var link = "#";
590				if (result.hasOwnProperty(linkAttributeName)) { link = result[linkAttributeName]; }
591				var checked = ""; var checkedClass = "item-not-selected";
592				if(objectsIdsList.includes(id)){ checked = "checked"; checkedClass = "item-selected"; }
593				if(isStringValid(id) && isStringValid(label)){
594					var escTitle = escapeHtml(label);
595					output += "<li class='object-selector-item'>";
596					output += "<div class='object-selector-element "+checkedClass+"'>";
597					output += "<input type='checkbox' name='obj-"+id+"' id='obj-"+id+"' data-title='"+escTitle+"' data-rnum='"+rNum+"'";
598					if(dataAttributes!=null){
599						dataAttributes.forEach(dataAttribute => {
600							let dataName = dataAttribute.dataName;
601							let attributeId = dataAttribute.attributeId;
602							let attributeValue = "";
603							if (result.hasOwnProperty(attributeId)) { attributeValue = result[attributeId]; }
604							output += " data-"+dataName+"='"+attributeValue+"'";
605						});
606					}
607					var valueContent = id;
608					if(listSelectorConfigurations.isProjectsList || listSelectorConfigurations.isPublicationsList){
609						valueContent = JSON.stringify(result);
610						valueContent = valueContent.replace(/[']+/g, "&#039;");
611					}
612					output += " class='object-select-field' value='"+valueContent+"' "+checked+" />&nbsp;";
613					if(hasLink){
614						output += "<a href='"+link+"' data-"+objectIdDataAttributeName+"='"+id+"' class='"+objectLinkClass+"'>"+label+" ["+id+"]</a>";
615					}
616					else{
617						output += label+" ["+id+"]";
618					}
619					output += "</div>";
620					output += "</li>";	
621				}
622				rNum++;
623			});
624			output += "</ul>";
625		}
626	}
627	catch(error){ logError(error); }
628	return output;
629}
630
631function selectObjects(portletNamespace, objectsListFieldsInputId, contentType, objIdAttributeName){
632	try{
633		var objectSelectVal = getFieldsValues(portletNamespace, 'object-select-field', false, contentType, objIdAttributeName, true);
634		var objectsListFieldsInput = document.getElementById(objectsListFieldsInputId);
635		if(objectsListFieldsInput!=null){
636			objectSelectVal = JSON.stringify(objectSelectVal);
637			objectsListFieldsInput.value = objectSelectVal;
638		}
639	}
640	catch(error){ logError(error); }
641}
642
643function updateList(lang){
644	try{
645		let thisobjListUlId = listSelectorConfigurations.objListUlId;
646		let thisobjListId = listSelectorConfigurations.objListId;
647		if(isStringValid(lang)){
648			thisobjListUlId += "_"+lang;
649			thisobjListId += "_"+lang;
650		}
651		updateObjectsList(
652			thisobjListUlId,
653			thisobjListId,
654			listSelectorConfigurations.objIdAttributeName,
655			listSelectorConfigurations.labelAttributeName,
656			listSelectorConfigurations.objListhasLink,
657			listSelectorConfigurations.linkAttributeName,
658			listSelectorConfigurations.listObjLinkClass,
659			listSelectorConfigurations.objIdDataAttributeName,
660			listSelectorConfigurations.canEditTitle,
661			function(element, title){
662				if(confirm("L'elemento '"+title+"' verrà cancellato.") == true){
663					deleteObjectFromList(element, thisobjListId, listSelectorConfigurations.objIdAttributeName);
664					updateList(lang);
665					if(listSelectorConfigurations.isSortable){
666						initObjectsSortLists();
667					}
668				}
669			},
670			function(element, title){
671				let newTitle = prompt("Inserisci il nuovo titolo", title);
672				if (newTitle != null) {
673				  	updateObjectTitle(element, newTitle, thisobjListId, listSelectorConfigurations.objIdAttributeName, listSelectorConfigurations.labelAttributeName);
674				  	updateList(lang);
675					if(listSelectorConfigurations.isSortable){
676						initObjectsSortLists();
677					}
678				}
679			}
680		);
681	}
682	catch(error){ logError(error); }		
683}
684
685function updateObjectsList(objectsListUlId, objectsListFieldsInputId, idAttributeName, labelAttributeName, hasLink, linkAttributeName, objectLinkClass, objectIdDataAttributeName, canEditTitle, deleteCallbackFunction, editTitlebackFunction){
686	try{
687		let objectsListUl = document.getElementById(objectsListUlId);
688		let objectsListFieldsInput = document.getElementById(objectsListFieldsInputId);
689		if(objectsListUl!=null && objectsListFieldsInput!=null){
690			var objectsListFieldsInputValues = objectsListFieldsInput.value;
691			if(isStringValid(objectsListFieldsInputValues)){
692				var jsonObjValues = JSON.parse(objectsListFieldsInputValues);
693				if(!Array.isArray(jsonObjValues)){ jsonObjValues = convertObjectToArray(jsonObjValues); }
694				jsonObjValues = sortArrayByObjectProperty(jsonObjValues, "order");
695				var output = '';
696				jsonObjValues.forEach(function(obj){
697					var id = ""; var label = "";
698					if (obj.hasOwnProperty(idAttributeName)) { id = obj[idAttributeName]; }
699					if (obj.hasOwnProperty(labelAttributeName)) { label = obj[labelAttributeName]; }
700					var escTitle = escapeHtml(label);
701					var link = "#";
702					if (obj.hasOwnProperty(linkAttributeName)) { link = obj[linkAttributeName]; }
703					output += '<li id="obj-'+id+'" class="removable" data-title="'+escTitle+'">';
704					if(hasLink){
705						output += '<a href="'+link+'" data-'+objectIdDataAttributeName+'"="'+id+'" class="'+objectLinkClass+'">'+label+'</a>';
706					}
707					else{
708						output += label;
709					}
710					if(canEditTitle){
711						output += '<span class="supsi-icon-tag--edit title-edit-icon" id="tit-'+id+'"></span>';
712					}
713					output += '<span class="supsi-icon-close--filled item-delete-icon" id="del-'+id+'"></span>';
714					output += '</li>';
715				});
716				if(!isStringValid(output)){
717					output = listSelectorConfigurations.noObjectsText;
718				}
719				objectsListUl.innerHTML = output;
720				addDeleteObjectEventListener(objectsListUl, function(element, title){
721					deleteCallbackFunction(element, title);
722				});
723				if(canEditTitle){
724					addEditTitleObjectEventListener(objectsListUl, function(element, title){
725						editTitlebackFunction(element, title);
726					});
727				}
728			}
729		}
730	}
731	catch(error){ logError(error); }
732}
733
734function initObjectsSortLists(){
735	try{
736		var manualSearchFieldset = document.getElementById(listSelectorConfigurations.objManualResultsId);
737		if(manualSearchFieldset!=null){
738			var sortLists = manualSearchFieldset.querySelectorAll('.sort-list-sortable');
739			if(sortLists!=null){
740				sortLists.forEach(sortList => {
741					let thisobjListUlId = listSelectorConfigurations.objListUlId;
742					let thisobjListId = listSelectorConfigurations.objListId
743					if(listSelectorConfigurations.useLangs){
744						let lang = "";
745						if(isStringValid(sortList.id)){
746							lang = sortList.id.slice(-2);
747						}
748						thisobjListUlId += "_"+lang;
749						thisobjListId += "_"+lang;
750					}
751					slist(sortList, function(el){
752						orderObjectsList(thisobjListUlId, thisobjListId, listSelectorConfigurations.objIdAttributeName);
753					});
754				});
755			}
756		}
757	}
758	catch(error){ logError(error); }
759}
760
761
762function orderObjectsList(objectsListUlId, objectsListFieldsInputId, valueAttributeName){
763	try{
764		const objectsListUl = document.getElementById(objectsListUlId);
765		const objectsListFieldsInput = document.getElementById(objectsListFieldsInputId);
766		if(objectsListUl!=null && objectsListFieldsInput!=null){
767			var objectsListFieldsInputValues = objectsListFieldsInput.value;
768			if(isStringValid(objectsListFieldsInputValues)){
769				let jsonObjValues = JSON.parse(objectsListFieldsInputValues);
770				if(!Array.isArray(jsonObjValues)){ jsonObjValues = convertObjectToArray(jsonObjValues); }
771				let newJsonObjValues = [];
772				const objectsListUlLis = objectsListUl.querySelectorAll("li");
773				if(objectsListUlLis!=null){
774					for(let i=0;i<objectsListUlLis.length;i++){
775						var objectsListUlLi = objectsListUlLis[i];
776						var objId = objectsListUlLi.id.replace("obj-","");
777						var jsonObjValResults = jsonObjValues.filter(obj => { return parseInt(obj[valueAttributeName]) === parseInt(objId); });
778						if(listSelectorConfigurations.idAttributeString){
779							jsonObjValResults = jsonObjValues.filter(obj => { return String(obj[valueAttributeName]) === String(objId); });
780						}
781						if(jsonObjValResults!=null){
782							if(jsonObjValResults.length>0){
783								let jsonObjVal = jsonObjValResults[0];
784								jsonObjVal.order = i;
785								newJsonObjValues.push(jsonObjVal);
786							}
787						}
788					}
789				}
790				newJsonObjValues = sortArrayByObjectProperty(newJsonObjValues, 'order');
791				objectsListFieldsInput.value = JSON.stringify(newJsonObjValues);
792			}
793		}
794	}
795	catch(error){ logError(error); }
796}
797
798
799function addInsertObjectEventListener(callbackFunction){
800	try{
801		let objectList = document.querySelector('.object-selector-list');
802		if(objectList!=null){
803			let listElements = objectList.querySelectorAll(".object-selector-element.item-not-selected");
804			if(listElements!=null){
805				listElements.forEach(function(listElement){
806					listElement.addEventListener("click", function(){
807						callbackFunction(listElement);
808					});
809				});
810			}
811		}
812	}
813	catch(error){ logError(error); }	
814}
815
816function addEditTitleObjectEventListener(objectsListUl, callbackFunction){
817	try{
818		let listElements = objectsListUl.querySelectorAll("li");
819		if(listElements!=null){
820			listElements.forEach(function(listElement){
821				let title = listElement.dataset.title;
822				let editIcon = listElement.querySelector(".title-edit-icon");
823				if(editIcon!=null){
824					editIcon.addEventListener("click", function(){
825						callbackFunction(listElement, title);
826					});
827				}
828			});
829		}
830	}
831	catch(error){ logError(error); }	
832}
833
834function addDeleteObjectEventListener(objectsListUl, callbackFunction){
835	try{
836		let listElements = objectsListUl.querySelectorAll("li");
837		if(listElements!=null){
838			listElements.forEach(function(listElement){
839				let title = listElement.dataset.title;
840				let deleteIcon = listElement.querySelector(".item-delete-icon");
841				if(deleteIcon!=null){
842					deleteIcon.addEventListener("click", function(){
843						callbackFunction(listElement, title);
844					});
845				}
846			});
847		}
848	}
849	catch(error){ logError(error); }	
850}
851
852
853
854
855function insertObjectToList(element, objectsListInputId, contentType, objIdAttributeName){
856	try{
857		var objectsListInput = document.getElementById(objectsListInputId);
858		var input = element.querySelector("input");
859		if(objectsListInput!=null && input!=null){
860			var objectsListInputValue = objectsListInput.value;
861			let currentValues = [];
862			if(isStringValid(objectsListInputValue)){
863				currentValues = JSON.parse(objectsListInputValue);
864				if(!Array.isArray(currentValues)){ currentValues = convertObjectToArray(currentValues); }
865			}
866			var inputValue = input.value;
867			let objectId = input.id.replace("obj-","");
868	  		inputFieldType = getInputFieldType(input);
869	  		let jsonValue = {};
870	  		switch(contentType){
871	  		case "dw-select":
872		  		jsonValue = {'dwfieldtype':'', 'fieldtype':inputFieldType};
873		  		jsonValue[objIdAttributeName] = objectId;
874				if(inputFieldType == "checkbox"){
875					var title = input.dataset.title;
876					var fileExtension = input.dataset.fileextension;
877					var fileSize = input.dataset.filesize;
878					var storeDate = input.dataset.storedate;
879					var modDate = input.dataset.moddate;
880					var pageCount = input.dataset.pagecount;
881					jsonValue.title = title;
882					jsonValue.fileExtension = fileExtension;
883					jsonValue.fileSize = fileSize;
884					jsonValue.storeDate = storeDate;
885					jsonValue.modDate = modDate;
886					jsonValue.pageCount = pageCount;
887				}
888				break;
889	  		case "faq-select":
890	  			jsonValue = {'fieldtype':inputFieldType};
891	  			jsonValue[objIdAttributeName] = objectId;
892	  			if(inputFieldType == "checkbox"){
893	  				var title = input.dataset.title;
894	  				jsonValue.title = title;
895	  			}
896	  			break;
897	  		case "project-select":
898	  			jsonValue = JSON.parse(inputValue);
899	  			break;
900	  		case "publication-select":
901	  			jsonValue = JSON.parse(inputValue);
902	  			break;	  			
903	  		default:
904	  			jsonValue = {'fieldtype':inputFieldType};
905	  			jsonValue[objIdAttributeName] = objectId;
906	  			if(inputFieldType == "checkbox"){
907	  				var title = input.dataset.title;
908	  				jsonValue.title = title;
909	  			}
910	  			break;
911	  		}
912			var maxOrder = 0;
913			currentValues.forEach(function(currentValue){
914			   if(currentValue.order>maxOrder){ maxOrder = currentValue.order; }
915			});
916			jsonValue.order = maxOrder+1;
917			currentValues.push(jsonValue);
918			currentValues = sortArrayByObjectProperty(currentValues, 'order');
919			let newValue = JSON.stringify(currentValues);
920			objectsListInput.value = newValue;
921			element.classList.remove('item-not-selected');
922			element.classList.add('item-selected')
923			if(inputFieldType == "checkbox"){ input.checked = true; }
924		}
925	}
926	catch(error){ logError(error); }		
927}
928
929function updateObjectTitle(element, newtitle, objectsListInputId, idAttributeName, titleAttributeName){
930	try{
931		let objectsListInput = document.getElementById(objectsListInputId);
932		if(objectsListInput!=null){
933			let objectsListInputValue = objectsListInput.value;
934			let currentValues = [];
935			if(isStringValid(objectsListInputValue)){
936				currentValues = JSON.parse(objectsListInputValue);
937				if(!Array.isArray(currentValues)){ currentValues = convertObjectToArray(currentValues); }
938			}
939			let objectId = element.id.replace("obj-","");
940			let newValues = [];
941			currentValues.forEach(function(currentValue, index){
942				if(listSelectorConfigurations.idAttributeString){
943					if(String(currentValue[idAttributeName]) === String(objectId)){
944						currentValue[titleAttributeName] = newtitle;
945					}	
946				}
947				else{
948					if(parseInt(currentValue[idAttributeName]) === parseInt(objectId)){
949						currentValue[titleAttributeName] = newtitle;
950					}	
951				}
952				newValues.push(currentValue);
953			});
954			newValues = sortArrayByObjectProperty(newValues, 'order');
955			let newValue = JSON.stringify(newValues);
956			objectsListInput.value = newValue;
957		}
958	}
959	catch(error){ logError(error); }	
960}
961
962function deleteObjectFromList(element, objectsListInputId, valueAttributeName){
963	try{
964		let objectsListInput = document.getElementById(objectsListInputId);
965		let objectElementLi = element.closest("li");
966		if(objectsListInput!=null && objectElementLi!=null){
967			let objectId = objectElementLi.id.replace("obj-","");
968			let objectsListInputValue = objectsListInput.value;
969			let currentValues = [];
970			if(isStringValid(objectsListInputValue)){
971				currentValues = JSON.parse(objectsListInputValue);
972				if(!Array.isArray(currentValues)){ currentValues = convertObjectToArray(currentValues); }
973			}
974			let newValues = currentValues.filter(object => { return parseInt(object[valueAttributeName]) !== parseInt(objectId); });
975			if(listSelectorConfigurations.idAttributeString){
976				newValues = currentValues.filter(object => { return String(object[valueAttributeName]) !== String(objectId); });
977			}
978			let newValue = JSON.stringify(newValues);
979			objectsListInput.value = newValue;	
980		}
981	}
982	catch(error){ logError(error); }
983}
984
985
986//Funzioni per la selezione automatica
987
988function searchConfigurationLoad(portletNamespace, searchFieldsInputSelector, searchFieldSelector, valueAttributeName){
989	try{
990		var filterSearchFieldsInput = document.getElementById(searchFieldsInputSelector);
991		var filterSearchFields = document.querySelectorAll("."+searchFieldSelector);
992		if(filterSearchFieldsInput!=null && filterSearchFields!=null){
993			var filtersVal = filterSearchFieldsInput.value;
994			if(isStringValid(filtersVal)){
995				var jsonFilterValues = JSON.parse(filtersVal);
996				filterSearchFields.forEach(input => {
997					var inputId = input.id.replace(portletNamespace, "");
998					var inputType = input.type;
999			  		var inputTagName = input.tagName;
1000			  		var jsonElement = jsonFilterValues[inputId];
1001			  		if(jsonElement!=undefined && jsonElement!=null){
1002			  			if(jsonElement.hasOwnProperty(valueAttributeName)){
1003			  				var elementValue = jsonElement[valueAttributeName];
1004			  				if(elementValue!=null && elementValue!=""){
1005				  				if(elementValue.startsWith("*")){ elementValue = elementValue.slice(1); }
1006				  				if(elementValue.endsWith("*")){ elementValue = elementValue.slice(0, -1); }
1007				  			}
1008			  				input.value = elementValue;
1009			  			}
1010			  		}
1011				});
1012			}	
1013		}
1014		$('select').selectpicker('destroy');
1015		$('select').selectpicker();
1016	}
1017	catch(error){ logError(error); }
1018}
1019
1020function selectSearchListPreview(lang){
1021	doSearch(
1022		listSelectorConfigurations.portletNamespace, 
1023		listSelectorConfigurations.autoSearchFieldSelector, 
1024		listSelectorConfigurations.searchUrl,
1025		lang,
1026		listSelectorConfigurations.fieldLanguageId,
1027		listSelectorConfigurations.selectContentType, 
1028		listSelectorConfigurations.selectContentType,
1029		listSelectorConfigurations.objSearchFilters,
1030		listSelectorConfigurations.objIdAttributeName,
1031		function(data){
1032			let output = generateObjectsListHTML(
1033				data, 
1034				listSelectorConfigurations.idAttributeName,
1035				listSelectorConfigurations.labelAttributeName, 
1036				listSelectorConfigurations.researchResultsModalTitle, 
1037				listSelectorConfigurations.modalListhasLink, 
1038				listSelectorConfigurations.linkAttributeName, 
1039				listSelectorConfigurations.objLinkClass,
1040				listSelectorConfigurations.objIdDataAttributeName
1041			);
1042			var modalID = listSelectorConfigurations.portletNamespace+"previewModal";
1043			createModal(modalID, listSelectorConfigurations.previewModalTitle, output);
1044			$('#'+modalID).modal('show');
1045			if(listSelectorConfigurations.isDocuwareList){
1046				addDowloadDocuwareDocumentEventListener();
1047			}
1048		}
1049	);
1050}
1051
1052function generateObjectsListHTML(data, idAttributeName, labelAttributeName, headerTitle, hasLink, linkAttributeName, objectLinkClass, objectIdDataAttributeName){
1053	let output = '';
1054	try{
1055		if(isStringValid(data)){
1056			var jsonData = JSON.parse(data);
1057			var resultsCount = 0; var results = [];
1058			if (jsonData.hasOwnProperty('resultsCount')) { resultsCount = jsonData.resultsCount; }
1059			if (jsonData.hasOwnProperty('results')) { results = jsonData.results; }
1060			output += "<strong>"+headerTitle+": "+resultsCount+"</strong>";
1061			output += "<ul style='position: relative;'>";
1062			if (typeof results === 'string' || results instanceof String){
1063				try{ results = JSON.parse(results); }
1064				catch (e) {}
1065			}
1066			if(!listSelectorConfigurations.isManualSearch && listSelectorConfigurations.orderAutoSearchListByAttributeId!=""){
1067				results = sortArrayByObjectProperty(results, listSelectorConfigurations.orderAutoSearchListByAttributeId);
1068			}
1069			results.forEach(result => {
1070				var id = ""; var label = "";
1071				if (result.hasOwnProperty(idAttributeName)) { id = result[idAttributeName]; }
1072				if (result.hasOwnProperty(labelAttributeName)) { label = result[labelAttributeName]; }
1073				var link = "#";
1074				if (result.hasOwnProperty(linkAttributeName)) { link = result[linkAttributeName]; }
1075				if(isStringValid(id) && isStringValid(label)){
1076					var escTitle = escapeHtml(label);
1077					output += "<li id='obj-"+id+"'>";
1078					if(hasLink){
1079						output += "<a href='"+link+"' data-"+objectIdDataAttributeName+"='"+id+"' class='"+objectLinkClass+"'>"+label+" ["+id+"]</a>";
1080					}
1081					else{
1082						output += label;
1083					}
1084					output += "</li>";	
1085				}	
1086			});
1087			output += "</ul>";
1088		}	
1089	}
1090	catch(error){ logError(error); }
1091	return output;
1092}
1093
1094function updatefilterFieldsInput(portletNamespace, fieldselector, contentType, filterFieldsInputSelector, objIdAttributeName){
1095	try{
1096		var filterFieldsInput = document.getElementById(filterFieldsInputSelector);
1097		if(filterFieldsInput!=null){
1098			var jsonFilterValues = getFieldsValues(portletNamespace, fieldselector, true, contentType, objIdAttributeName, false);
1099			var filtersVal = JSON.stringify(jsonFilterValues);
1100			filterFieldsInput.value = filtersVal;
1101		}
1102	}
1103	catch(error){ logError(error); }
1104}
1105
1106
1107
1108function convertLanguageForDocuware(lang){
1109	let language = "Italiano";
1110	try{
1111		switch(lang){
1112		case "it": language = "Italiano"; break;
1113		case "en": language = "Inglese"; break;
1114		case "de": language = "Tedesco"; break;
1115		case "fr": language = "Francese"; break;
1116		}
1117	}
1118	catch(error){ logError(error); }
1119	return language;
1120}
1121
1122
1123/* ---------------------------------------------------------- */
1124
1125
1126
1127
1128/* Inizialize sort lists (with class 'sort-list-init') */
1129/* ---------------------------------------------------------- */
1130function initSortLists(){
1131	try{
1132		let slSelector = ".sort-list-init"
1133		var sortLists = document.querySelectorAll(slSelector);
1134		if(sortLists!=null){
1135			sortLists.forEach(sortList => {
1136				slist(sortList);
1137			});
1138		}
1139	}
1140	catch(error){ logError(error); }	
1141}
1142
1143function slist (target, callBackFunction) {
1144	try{
1145		//target.classList.add("slist");
1146		let items = target.getElementsByTagName("li"), current = null;
1147		for (let i of items) {
1148			i.draggable = true;
1149			//ondragstart
1150			i.ondragstart = e => {
1151				current = i;
1152				for (let it of items) {
1153					if (it != current) { it.classList.add("hint"); }
1154				}
1155			};
1156			//ondragenter
1157		    i.ondragenter = e => {
1158		    	if (i != current) { i.classList.add("active"); }
1159		    };
1160		    //ondragleave
1161		    i.ondragleave = () => i.classList.remove("active");
1162		    //ondragend
1163		    i.ondragend = () => { for (let it of items) {
1164		      it.classList.remove("hint");
1165		      it.classList.remove("active");
1166		    }};
1167		    // ondragover
1168		    i.ondragover = e => e.preventDefault();
1169		    //ondrop - DO SOMETHING
1170		    i.ondrop = e => {
1171			      e.preventDefault();
1172			      if (i != current) {
1173				        let currentpos = 0, droppedpos = 0;
1174				        for (let it=0; it<items.length; it++) {
1175					          if (current == items[it]) { currentpos = it; }
1176					          if (i == items[it]) { droppedpos = it; }
1177				        }
1178				        if (currentpos < droppedpos) {
1179				        	i.parentNode.insertBefore(current, i.nextSibling);
1180				        } else {
1181				        	i.parentNode.insertBefore(current, i);
1182				        }
1183				        if(callBackFunction!=null){
1184				        	callBackFunction(i);
1185				        }
1186			      }
1187		    };
1188		}
1189	}
1190	catch(error){ logError(error); }		
1191}

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.