1- /*
2- * Javascript to create the necessary HTML, CSS and JS for our widgets
3- */
1+ document . addEventListener ( 'DOMContentLoaded' , function ( ) {
2+ // Function to find the script source
3+ function findScriptSource ( ) {
4+ const widgetScript = document . getElementById ( 'dataverse-widget-js' ) ;
5+ if ( widgetScript && widgetScript . src ) {
6+ return widgetScript . src ;
7+ }
8+
9+ const scripts = document . getElementsByTagName ( 'script' ) ;
10+ for ( const script of scripts ) {
11+ if ( script . src && script . src . includes ( 'widgets.js' ) ) {
12+ return script . src ;
13+ }
14+ }
15+
16+ console . error ( 'Could not find the widgets.js script source' ) ;
17+ return null ;
18+ }
419
5- var scriptSource = ( function ( ) {
6- var scripts = document . getElementsByTagName ( 'script' ) ;
7- return scripts [ scripts . length - 1 ] . src ;
8- } ( ) ) ;
20+ // Function to parse query string
21+ function parseQueryString ( queryString ) {
22+ const params = { } ;
23+ if ( queryString ) {
24+ const keyValues = queryString . split ( '&' ) ;
25+ for ( const keyValue of keyValues ) {
26+ const [ key , value ] = keyValue . split ( '=' ) ;
27+ params [ key ] = decodeURIComponent ( value . replace ( / \+ / g, " " ) ) ;
28+ }
29+ }
30+ return params ;
31+ }
932
10- var params = parseQueryString ( scriptSource . split ( '?' ) [ 1 ] ) ;
33+ // Function to create and append elements
34+ function appendElement ( tag , attributes = { } , textContent = '' ) {
35+ const element = document . createElement ( tag ) ;
36+ Object . assign ( element , attributes ) ;
37+ if ( textContent ) element . textContent = textContent ;
38+ scriptTag . parentNode . insertBefore ( element , scriptTag . nextSibling ) ;
39+ return element ;
40+ }
1141
12- params . widget ; // Widget type
13- params . alias ; // Dataverse Alias
14- params . persistentId ; // persistentId
15- params . dvUrl ; // Dataverse Installation URL
16- params . heightPx ; // iframe height in pixels
17- params . text ; // search input placeholder text
42+ // Find the script source
43+ const scriptSource = findScriptSource ( ) ;
44+ if ( ! scriptSource ) return ;
1845
19- // Utility function to convert "a=b&c=d" into { a:'b', c:'d' }
20- function parseQueryString ( queryString ) {
21- var params = { } ;
22- var pl = / \+ / g;
23- if ( queryString ) {
24- var keyValues = queryString . split ( '&' ) ;
25- for ( var i = 0 ; i < keyValues . length ; i ++ ) {
26- var pair = keyValues [ i ] . split ( '=' ) ;
27- params [ pair [ 0 ] ] = pair [ 1 ] . replace ( pl , " " ) ;
28- // OpenScholar is encoding ":" as "%3A". See https://github.com/IQSS/dataverse/issues/6381
29- params [ pair [ 0 ] ] = pair [ 1 ] . replace ( "%3A" , ":" ) ;
30- }
46+ // Find the script tag in the document
47+ const scriptTag = Array . from ( document . getElementsByTagName ( 'script' ) )
48+ . find ( script => script . src === scriptSource ) ;
49+ if ( ! scriptTag ) {
50+ console . error ( 'Could not find the widgets.js script tag in the document' ) ;
51+ return ;
3152 }
32- return params ;
33- } ;
3453
35- if ( ! window . jQuery ) {
36- // Path to jquery.js file, eg. Google hosted version
37- document . write ( '<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>' ) ;
38- }
54+ // Parse parameters
55+ const params = parseQueryString ( scriptSource . split ( '?' ) [ 1 ] ) ;
3956
40- if ( params . widget === 'search' ) {
41- /*
42- * Dataverse Search Box
43- */
44- document . write ( '<input type="text" placeholder="' + params . text + '..." onkeydown="if (event.keyCode == 13) document.getElementById(\'btnDataverseSearch\').click()" style="background:#fff; border:1px solid #ccc; border-radius:3px; box-shadow:0 1px 1px rgba(0, 0, 0, 0.075) inset; padding:4px; min-width:180px;"/> <input id="btnDataverseSearch" value="Find" type="button" onclick="window.open('' + params . dvUrl + '/dataverse.xhtml?alias=' + params . alias + '&q=' + this.previousSibling.previousSibling.value + '', '_blank');" style="-moz-border-bottom-colors:none; -moz-border-left-colors:none; -moz-border-right-colors:none; -moz-border-top-colors:none; background-color:#f5f5f5; background-image:-moz-linear-gradient(center top , #ffffff, #e6e6e6); background-repeat:repeat-x; border:1px solid #ccc; border-color:#e6e6e6 #e6e6e6 #b3b3b3; border-image:none; border-radius:4px; box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05); color:#333; cursor:pointer; text-shadow:0 1px 1px rgba(255, 255, 255, 0.75); padding:0.3em 1em; line-height:1.4;" />' ) ;
45- }
57+ // Load jQuery if not present
58+ if ( ! window . jQuery ) {
59+ const jqueryScript = appendElement ( 'script' , {
60+ src : "https://code.jquery.com/jquery-3.6.0.min.js" ,
61+ integrity : "sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" ,
62+ crossOrigin : "anonymous"
63+ } ) ;
64+ jqueryScript . onload = initializeWidget ;
65+ } else {
66+ initializeWidget ( ) ;
67+ }
68+
69+ function initializeWidget ( ) {
70+ if ( params . widget === 'search' ) {
71+ const input = appendElement ( 'input' , {
72+ type : "text" ,
73+ placeholder : params . text + "..." ,
74+ style : "background:#fff; border:1px solid #ccc; border-radius:3px; box-shadow:0 1px 1px rgba(0, 0, 0, 0.075) inset; padding:4px; min-width:180px;"
75+ } ) ;
76+ input . addEventListener ( 'keydown' , function ( event ) {
77+ if ( event . keyCode === 13 ) {
78+ document . getElementById ( 'btnDataverseSearch' ) . click ( ) ;
79+ }
80+ } ) ;
81+
82+ appendElement ( 'span' , { } , ' ' ) ;
4683
47- if ( params . widget === 'iframe' && params . alias ) {
48- /*
49- * Dataverse Listing iFrame
50- */
51- document . write ( '<iframe id="dataverse-widget" src="' + params . dvUrl + '/dataverse/' + params . alias + '?widget=dataverse@' + params . alias + '" width="100%" height="' + params . heightPx + '" style="border:0; background:url(' + params . dvUrl + '/resources/images/ajax-loading.gif) no-repeat 50% 50%;"></iframe><script>var widgetScope = "' + params . alias + '"; var dvUrl = "' + params . dvUrl + '";</script><script src="' + params . dvUrl + '/resources/js/widgets-host.js"></script>' ) ;
52- }
84+ const button = appendElement ( 'input' , {
85+ id : "btnDataverseSearch" ,
86+ type : "button" ,
87+ value : "Find" ,
88+ style : "-moz-border-bottom-colors:none; -moz-border-left-colors:none; -moz-border-right-colors:none; -moz-border-top-colors:none; background-color:#f5f5f5; background-image:-moz-linear-gradient(center top , #ffffff, #e6e6e6); background-repeat:repeat-x; border:1px solid #ccc; border-color:#e6e6e6 #e6e6e6 #b3b3b3; border-image:none; border-radius:4px; box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05); color:#333333; cursor:pointer; display:inline-block; font-size:14px; line-height:20px; margin-bottom:0; padding:4px 12px; text-align:center; text-shadow:0 1px 1px rgba(255, 255, 255, 0.75); vertical-align:middle;"
89+ } ) ;
90+ button . addEventListener ( 'click' , function ( ) {
91+ window . open ( params . dvUrl + '/dataverse.xhtml?alias=' + params . alias + '&q=' + input . value , '_blank' ) ;
92+ } ) ;
93+ } else if ( params . widget === 'iframe' ) {
94+ const iframeUrl = params . persistentId
95+ ? params . dvUrl + '/dataset.xhtml?persistentId=' + params . persistentId + '&widget=dataset@' + params . persistentId
96+ : params . dvUrl + '/dataverse/' + params . alias + '?widget=dataverse@' + params . alias ;
5397
54- if ( params . widget === 'iframe' && params . persistentId ) {
55- /*
56- * Dataset 'Full' iFrame
57- */
58- document . write ( '<iframe id="dataset-widget" src="' + params . dvUrl + '/dataset.xhtml?persistentId=' + params . persistentId + '&widget=dataset@' + params . persistentId + '" width="100%" height="' + params . heightPx + '" style="border:0; background:url(' + params . dvUrl + '/resources/images/ajax-loading.gif) no-repeat 50% 50%;"></iframe><script>var widgetScope = "' + params . alias + '"; var dvUrl = "' + params . dvUrl + '";</script><script src="' + params . dvUrl + '/resources/js/widgets-host.js"></script>' ) ;
59- }
98+ appendElement ( 'iframe' , {
99+ id : params . persistentId ? "dataset-widget" : "dataverse-widget" ,
100+ src : iframeUrl ,
101+ width : "100%" ,
102+ height : params . heightPx ,
103+ style : "border:0; background:url(" + params . dvUrl + "/resources/images/ajax-loading.gif) no-repeat 50% 50%;"
104+ } ) ;
60105
61- if ( params . widget === 'citation' ) {
62- /*
63- * Dataset Citation iFrame
64- */
65- document . write ( '<iframe id="citation-widget" src="' + params . dvUrl + '/iframe.xhtml?persistentId=' + params . persistentId + '" width="100%" height="' + params . heightPx + '" style="border:0; background:url(' + params . dvUrl + '/resources/images/ajax-loading.gif) no-repeat 50% 50%;"></iframe><script>var widgetScope = "' + params . persistentId + '"; var dvUrl = "' + params . dvUrl + '";</script><script src="' + params . dvUrl + '/resources/js/widgets-host.js"></script>' ) ;
66- }
106+ appendElement ( 'script' , { } , 'var widgetScope = "' + ( params . persistentId || params . alias ) + '"; var dvUrl = "' + params . dvUrl + '";' ) ;
107+ appendElement ( 'script' , { src : params . dvUrl + '/resources/js/widgets-host.js' } ) ;
108+ } else if ( params . widget === 'citation' ) {
109+ appendElement ( 'iframe' , {
110+ id : "citation-widget" ,
111+ src : params . dvUrl + '/iframe.xhtml?persistentId=' + params . persistentId ,
112+ width : "100%" ,
113+ height : params . heightPx ,
114+ style : "border:0; background:url(" + params . dvUrl + "/resources/images/ajax-loading.gif) no-repeat 50% 50%;"
115+ } ) ;
116+
117+ appendElement ( 'script' , { } , 'var widgetScope = "' + params . persistentId + '"; var dvUrl = "' + params . dvUrl + '";' ) ;
118+ appendElement ( 'script' , { src : params . dvUrl + '/resources/js/widgets-host.js' } ) ;
119+ }
120+ }
121+ } ) ;
0 commit comments