6163 |
05 Mar 21 |
nicklas |
var Manager = function() |
6163 |
05 Mar 21 |
nicklas |
2 |
{ |
6163 |
05 Mar 21 |
nicklas |
var manager = {}; |
6163 |
05 Mar 21 |
nicklas |
4 |
|
6163 |
05 Mar 21 |
nicklas |
var debug = 0; |
6163 |
05 Mar 21 |
nicklas |
6 |
|
6163 |
05 Mar 21 |
nicklas |
manager.initPage = function() |
6163 |
05 Mar 21 |
nicklas |
8 |
{ |
6163 |
05 Mar 21 |
nicklas |
var url = '../Admin.servlet?ID=' + App.getSessionId(); |
6163 |
05 Mar 21 |
nicklas |
url += '&cmd=GetIndexInfo'; |
6163 |
05 Mar 21 |
nicklas |
Wizard.showLoadingAnimation('Loading index information...'); |
6163 |
05 Mar 21 |
nicklas |
Wizard.asyncJsonRequest(url, manager.indexInfoLoaded); |
6163 |
05 Mar 21 |
nicklas |
13 |
} |
6167 |
09 Mar 21 |
nicklas |
14 |
|
6167 |
09 Mar 21 |
nicklas |
manager.refreshPage = function() |
6167 |
09 Mar 21 |
nicklas |
16 |
{ |
6167 |
09 Mar 21 |
nicklas |
var url = '../Admin.servlet?ID=' + App.getSessionId(); |
6167 |
09 Mar 21 |
nicklas |
url += '&cmd=GetIndexInfo'; |
6167 |
09 Mar 21 |
nicklas |
Wizard.asyncJsonRequest(url, manager.indexInfoLoaded); |
6167 |
09 Mar 21 |
nicklas |
20 |
} |
6163 |
05 Mar 21 |
nicklas |
21 |
|
6163 |
05 Mar 21 |
nicklas |
manager.indexInfoLoaded = function(response) |
6163 |
05 Mar 21 |
nicklas |
23 |
{ |
6163 |
05 Mar 21 |
nicklas |
var html = ''; |
6163 |
05 Mar 21 |
nicklas |
var indexes = response.indexes; |
6163 |
05 Mar 21 |
nicklas |
26 |
|
6167 |
09 Mar 21 |
nicklas |
var autoRefresh = false; |
6167 |
09 Mar 21 |
nicklas |
28 |
|
6163 |
05 Mar 21 |
nicklas |
for (var idxNo = 0; idxNo < indexes.length; idxNo++) |
6163 |
05 Mar 21 |
nicklas |
30 |
{ |
6163 |
05 Mar 21 |
nicklas |
var idx = indexes[idxNo]; |
6556 |
28 Jan 22 |
nicklas |
var error = idx.error; |
6163 |
05 Mar 21 |
nicklas |
var queryCache = idx.queryCache; |
6163 |
05 Mar 21 |
nicklas |
var itemList = idx.itemList; |
6164 |
05 Mar 21 |
nicklas |
var progress = idx.progress; |
6558 |
31 Jan 22 |
nicklas |
36 |
|
6169 |
15 Mar 21 |
nicklas |
var allowActions = (idx.status == 'IDLE' || idx.status == 'DISABLED') && idx.nextAction == 'DEFAULT'; |
6167 |
09 Mar 21 |
nicklas |
if (!allowActions) autoRefresh = true; |
6163 |
05 Mar 21 |
nicklas |
39 |
|
6558 |
31 Jan 22 |
nicklas |
html += '<div class="index-div'+(idx.collapsed?' collapsed':'')+'">'; |
6558 |
31 Jan 22 |
nicklas |
html += '<div class="index-name bg-filled-100" data-index-id="'+idx.id+'">'+Strings.encodeTags(idx.name) + '</div>'; |
6169 |
15 Mar 21 |
nicklas |
html += '<div>Path</div><div>'+Strings.encodeTags(idx.path)+'</div>'; |
6169 |
15 Mar 21 |
nicklas |
html += '<div>'; |
6169 |
15 Mar 21 |
nicklas |
if (allowActions) |
6169 |
15 Mar 21 |
nicklas |
45 |
{ |
6169 |
15 Mar 21 |
nicklas |
html += '<span class="link index-action" data-cmd="auto-update" data-auto-update="DELETE" data-confirm="Are you sure? This will remove everything from the index!" data-index-id="'+idx.id+'" title="Delete this index and create a new empty index">Delete...</span>'; |
6169 |
15 Mar 21 |
nicklas |
47 |
} |
6169 |
15 Mar 21 |
nicklas |
else if (idx.status == 'IDLE' && idx.nextAction == 'DELETE') |
6169 |
15 Mar 21 |
nicklas |
49 |
{ |
6169 |
15 Mar 21 |
nicklas |
html += '<span class="next-action">Delete (waiting)</span>'; |
6169 |
15 Mar 21 |
nicklas |
51 |
} |
6169 |
15 Mar 21 |
nicklas |
html += '</div>'; |
6163 |
05 Mar 21 |
nicklas |
html += '<div>Size on disk</div><div>'+idx.sizeOnDiskFormatted+'</div><div></div>'; |
6163 |
05 Mar 21 |
nicklas |
html += '<div>Total variants</div><div>'+VarSearch.niceCount(idx.numVariants)+'</div><div></div>'; |
6544 |
19 Jan 22 |
nicklas |
if (idx.id=='oncoarray-500K') |
6544 |
19 Jan 22 |
nicklas |
56 |
{ |
6544 |
19 Jan 22 |
nicklas |
html += '<div>Indexed SNP:s</div><div>'+VarSearch.niceCount(idx.numSNPs)+'</div>'; |
6544 |
19 Jan 22 |
nicklas |
html += '<div>'; |
6544 |
19 Jan 22 |
nicklas |
if (allowActions) |
6544 |
19 Jan 22 |
nicklas |
60 |
{ |
6544 |
19 Jan 22 |
nicklas |
html += '<span class="link index-action" data-cmd="auto-update" data-auto-update="CUSTOM" data-custom-action="INDEX_SNP" data-index-id="'+idx.id+'">Build SNP index</span>' |
6544 |
19 Jan 22 |
nicklas |
62 |
} |
6544 |
19 Jan 22 |
nicklas |
else if (idx.status == 'IDLE' && idx.nextCustomAction == 'INDEX_SNP') |
6544 |
19 Jan 22 |
nicklas |
64 |
{ |
6544 |
19 Jan 22 |
nicklas |
html += '<span class="next-action">Build SNP index (waiting)</span>'; |
6544 |
19 Jan 22 |
nicklas |
66 |
} |
6544 |
19 Jan 22 |
nicklas |
html += '</div>'; |
6544 |
19 Jan 22 |
nicklas |
68 |
} |
6168 |
12 Mar 21 |
nicklas |
html += '<div>Indexed raw bioassays</div><div>'+VarSearch.niceCount(idx.numRawBioAssays)+'</div>'; |
6168 |
12 Mar 21 |
nicklas |
html += '<div>'; |
6168 |
12 Mar 21 |
nicklas |
if (allowActions && idx.numRawBioAssays > 0) |
6168 |
12 Mar 21 |
nicklas |
72 |
{ |
6168 |
12 Mar 21 |
nicklas |
html += '<span class="link index-action" data-cmd="auto-update" data-auto-update="FULL_REBUILD" data-index-id="'+idx.id+'" title="Re-index all rawbioassays">Rebuild index</span>'; |
6168 |
12 Mar 21 |
nicklas |
74 |
} |
6169 |
15 Mar 21 |
nicklas |
else if (idx.status == 'IDLE' && idx.nextAction == 'FULL_REBUILD') |
6169 |
15 Mar 21 |
nicklas |
76 |
{ |
6169 |
15 Mar 21 |
nicklas |
html += '<span class="next-action">Rebuild index (waiting)</span>'; |
6169 |
15 Mar 21 |
nicklas |
78 |
} |
6168 |
12 Mar 21 |
nicklas |
html += '</div>'; |
6165 |
08 Mar 21 |
nicklas |
80 |
|
6165 |
08 Mar 21 |
nicklas |
html += '<div>Deleted raw bioassays</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div>'+VarSearch.niceCount(idx.nonExistingRawBioAssays)+'</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div>'; |
6165 |
08 Mar 21 |
nicklas |
if (allowActions && idx.nonExistingRawBioAssays > 0) |
6165 |
08 Mar 21 |
nicklas |
85 |
{ |
6167 |
09 Mar 21 |
nicklas |
html += '<span class="link index-action" data-cmd="auto-update" data-auto-update="REMOVE_NON_EXISTING" data-index-id="'+idx.id+'" title="Remove all non-existing raw bioassays from the index">Remove from index</span>'; |
6165 |
08 Mar 21 |
nicklas |
87 |
} |
6169 |
15 Mar 21 |
nicklas |
else if (idx.status == 'IDLE' && idx.nextAction == 'REMOVE_NON_EXISTING') |
6169 |
15 Mar 21 |
nicklas |
89 |
{ |
6169 |
15 Mar 21 |
nicklas |
html += '<span class="next-action">Remove from index (waiting)</span>'; |
6169 |
15 Mar 21 |
nicklas |
91 |
} |
6165 |
08 Mar 21 |
nicklas |
html += '</div>'; |
6165 |
08 Mar 21 |
nicklas |
93 |
|
6164 |
05 Mar 21 |
nicklas |
if (queryCache) |
6164 |
05 Mar 21 |
nicklas |
95 |
{ |
6165 |
08 Mar 21 |
nicklas |
html += '<div>Cached query results</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div>'+VarSearch.niceCount(queryCache.size)+'</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div>'; |
6165 |
08 Mar 21 |
nicklas |
if (queryCache.size > 0) |
6165 |
08 Mar 21 |
nicklas |
100 |
{ |
6165 |
08 Mar 21 |
nicklas |
html += '<span class="link index-action" data-cmd="clean-cache" data-index-id="'+idx.id+'" title="Clean all results from the query cache">Clean cache</span>'; |
6165 |
08 Mar 21 |
nicklas |
102 |
} |
6165 |
08 Mar 21 |
nicklas |
html += '</div>'; |
6164 |
05 Mar 21 |
nicklas |
104 |
} |
6163 |
05 Mar 21 |
nicklas |
105 |
|
6163 |
05 Mar 21 |
nicklas |
if (itemList) |
6163 |
05 Mar 21 |
nicklas |
107 |
{ |
6165 |
08 Mar 21 |
nicklas |
// Item list |
6165 |
08 Mar 21 |
nicklas |
html += '<div>Item list</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div><span class="link linked-item" data-item-type="ITEMLIST" data-item-id="'+itemList.id+'">'+Strings.encodeTags(itemList.name)+'</span></div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div></div>'; |
6165 |
08 Mar 21 |
nicklas |
112 |
|
6165 |
08 Mar 21 |
nicklas |
// AutoProcessing |
6165 |
08 Mar 21 |
nicklas |
html += '<div>Auto-processing</div>'; |
6165 |
08 Mar 21 |
nicklas |
if (itemList.autoProcessing == 'Disable') |
6165 |
08 Mar 21 |
nicklas |
116 |
{ |
6408 |
20 Sep 21 |
nicklas |
html += '<div>Disabled</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div><span class="link index-action" data-cmd="change-ap" data-list-id="'+itemList.id+'" data-auto-processing="" title="Enable auto-processing">Enable</span></div>'; |
6165 |
08 Mar 21 |
nicklas |
119 |
} |
6165 |
08 Mar 21 |
nicklas |
else |
6165 |
08 Mar 21 |
nicklas |
121 |
{ |
6408 |
20 Sep 21 |
nicklas |
html += '<div>Enabled</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div><span class="link index-action" data-cmd="change-ap" data-list-id="'+itemList.id+'" data-auto-processing="Disable" title="Disable auto-processing">Disable</span></div>'; |
6165 |
08 Mar 21 |
nicklas |
124 |
} |
6165 |
08 Mar 21 |
nicklas |
125 |
|
6165 |
08 Mar 21 |
nicklas |
// Items in queue |
6165 |
08 Mar 21 |
nicklas |
html += '<div>Items in queue</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div>'+VarSearch.niceCount(itemList.size)+'</div>'; |
6165 |
08 Mar 21 |
nicklas |
html += '<div>'; |
6165 |
08 Mar 21 |
nicklas |
if (allowActions && itemList.size > 0) |
6165 |
08 Mar 21 |
nicklas |
131 |
{ |
6167 |
09 Mar 21 |
nicklas |
html += '<span class="link index-action" data-cmd="auto-update" data-auto-update="ADD_TO_INDEX" data-index-id="'+idx.id+'" title="Add all items to the index">Add to index</span>'; |
6165 |
08 Mar 21 |
nicklas |
133 |
} |
6169 |
15 Mar 21 |
nicklas |
else if (idx.status == 'IDLE' && idx.nextAction == 'ADD_TO_INDEX') |
6169 |
15 Mar 21 |
nicklas |
135 |
{ |
6169 |
15 Mar 21 |
nicklas |
html += '<span class="next-action">Add to index (waiting)</span>'; |
6169 |
15 Mar 21 |
nicklas |
137 |
} |
6165 |
08 Mar 21 |
nicklas |
html += '</div>'; |
6163 |
05 Mar 21 |
nicklas |
139 |
} |
6163 |
05 Mar 21 |
nicklas |
140 |
|
6558 |
31 Jan 22 |
nicklas |
html += '<div class="no-hide">Status</div>'; |
6558 |
31 Jan 22 |
nicklas |
html += '<div class="no-hide">'+Strings.encodeTags(idx.queryStatus)+' / '+Strings.encodeTags(idx.status); |
6167 |
09 Mar 21 |
nicklas |
if (idx.status == 'IDLE' && idx.nextAction != 'DEFAULT') |
6167 |
09 Mar 21 |
nicklas |
144 |
{ |
6167 |
09 Mar 21 |
nicklas |
autoRefresh = true; |
6544 |
19 Jan 22 |
nicklas |
html += '<span class="next-action">' + Strings.encodeTags(idx.nextCustomAction || idx.nextAction) + '</span>'; |
6167 |
09 Mar 21 |
nicklas |
147 |
} |
6558 |
31 Jan 22 |
nicklas |
html += '</div><div class="no-hide"></div>'; |
6164 |
05 Mar 21 |
nicklas |
149 |
|
6164 |
05 Mar 21 |
nicklas |
if (progress) |
6164 |
05 Mar 21 |
nicklas |
151 |
{ |
6167 |
09 Mar 21 |
nicklas |
autoRefresh = true; |
6558 |
31 Jan 22 |
nicklas |
html += '<div class="no-hide">'+Strings.encodeTags(progress.message)+'</div>'; |
6558 |
31 Jan 22 |
nicklas |
html += '<div class="no-hide"><div class="wizard-progress progress-bar" value="'+progress.percent+'%"><span class="progress-bar-done bg-filled-100 topborder bottomborder leftborder" style="width: '+progress.percent+'%;"></span><span class="progress-bar-remain topborder bottomborder rightborder"style="width: '+(100-progress.percent)+'%;"></span></div></div>'; |
6558 |
31 Jan 22 |
nicklas |
html += '<div class="no-hide"></div>'; |
6164 |
05 Mar 21 |
nicklas |
156 |
} |
6556 |
28 Jan 22 |
nicklas |
if (error) |
6556 |
28 Jan 22 |
nicklas |
158 |
{ |
6558 |
31 Jan 22 |
nicklas |
html += '<div style="grid-column: span 3;" class="no-hide messagecontainer error">'+Strings.encodeTags(error.msg)+'</div>'; |
6556 |
28 Jan 22 |
nicklas |
160 |
} |
6164 |
05 Mar 21 |
nicklas |
161 |
|
6163 |
05 Mar 21 |
nicklas |
html += '</div>' |
6163 |
05 Mar 21 |
nicklas |
163 |
} |
6163 |
05 Mar 21 |
nicklas |
164 |
|
6163 |
05 Mar 21 |
nicklas |
Doc.element('indexList').innerHTML = html; |
6163 |
05 Mar 21 |
nicklas |
166 |
|
6558 |
31 Jan 22 |
nicklas |
var indexSections = document.getElementsByClassName('index-name'); |
6558 |
31 Jan 22 |
nicklas |
for (var idxNo = 0; idxNo < indexSections.length; idxNo++) |
6558 |
31 Jan 22 |
nicklas |
169 |
{ |
6558 |
31 Jan 22 |
nicklas |
Events.addEventHandler(indexSections[idxNo], 'click', manager.toggleSection); |
6558 |
31 Jan 22 |
nicklas |
171 |
} |
6165 |
08 Mar 21 |
nicklas |
172 |
|
6165 |
08 Mar 21 |
nicklas |
var linkedItems = document.getElementsByClassName('linked-item'); |
6165 |
08 Mar 21 |
nicklas |
for (var itemNo = 0; itemNo < linkedItems.length; itemNo++) |
6165 |
08 Mar 21 |
nicklas |
175 |
{ |
6165 |
08 Mar 21 |
nicklas |
Events.addEventHandler(linkedItems[itemNo], 'click', Items.itemOnClick); |
6165 |
08 Mar 21 |
nicklas |
177 |
} |
6165 |
08 Mar 21 |
nicklas |
178 |
|
6165 |
08 Mar 21 |
nicklas |
var indexAction = document.getElementsByClassName('index-action'); |
6165 |
08 Mar 21 |
nicklas |
for (var itemNo = 0; itemNo < indexAction.length; itemNo++) |
6165 |
08 Mar 21 |
nicklas |
181 |
{ |
6165 |
08 Mar 21 |
nicklas |
var action = indexAction[itemNo]; |
6165 |
08 Mar 21 |
nicklas |
if (!Doc.isDisabled(action)) |
6165 |
08 Mar 21 |
nicklas |
184 |
{ |
6165 |
08 Mar 21 |
nicklas |
Events.addEventHandler(action, 'click', manager.indexAction); |
6165 |
08 Mar 21 |
nicklas |
186 |
} |
6165 |
08 Mar 21 |
nicklas |
187 |
} |
6167 |
09 Mar 21 |
nicklas |
188 |
|
6167 |
09 Mar 21 |
nicklas |
if (autoRefresh) setTimeout(manager.refreshPage, 1500); |
6163 |
05 Mar 21 |
nicklas |
190 |
} |
6163 |
05 Mar 21 |
nicklas |
191 |
|
6558 |
31 Jan 22 |
nicklas |
manager.toggleSection = function(event) |
6558 |
31 Jan 22 |
nicklas |
193 |
{ |
6558 |
31 Jan 22 |
nicklas |
Doc.addOrRemoveClass(event.currentTarget.parentNode, 'collapsed'); |
6558 |
31 Jan 22 |
nicklas |
var url = '../Admin.servlet?ID=' + App.getSessionId(); |
6558 |
31 Jan 22 |
nicklas |
url += '&cmd=SetSectionCollapsed'; |
6558 |
31 Jan 22 |
nicklas |
url += '&indexId='+Data.get(event.currentTarget, 'index-id'); |
6558 |
31 Jan 22 |
nicklas |
url += '&collapsed='+(Doc.element(event.currentTarget.parentNode).classList.contains('collapsed')?1:0); |
6558 |
31 Jan 22 |
nicklas |
Wizard.asyncJsonRequest(url, null, 'POST'); |
6558 |
31 Jan 22 |
nicklas |
200 |
} |
6558 |
31 Jan 22 |
nicklas |
201 |
|
6165 |
08 Mar 21 |
nicklas |
manager.indexAction = function(event) |
6165 |
08 Mar 21 |
nicklas |
203 |
{ |
6165 |
08 Mar 21 |
nicklas |
var cmd = Data.get(event.currentTarget, 'cmd'); |
6169 |
15 Mar 21 |
nicklas |
var msg = Data.get(event.currentTarget, 'confirm'); |
6169 |
15 Mar 21 |
nicklas |
if (msg && !confirm(msg)) return; |
6169 |
15 Mar 21 |
nicklas |
207 |
|
6165 |
08 Mar 21 |
nicklas |
if (cmd == 'change-ap') manager.changeAutoProcessing(event); |
6165 |
08 Mar 21 |
nicklas |
if (cmd == 'clean-cache') manager.cleanCache(event); |
6167 |
09 Mar 21 |
nicklas |
if (cmd == 'auto-update') manager.autoUpdate(event); |
6165 |
08 Mar 21 |
nicklas |
211 |
} |
6165 |
08 Mar 21 |
nicklas |
212 |
|
6165 |
08 Mar 21 |
nicklas |
manager.changeAutoProcessing = function(event) |
6165 |
08 Mar 21 |
nicklas |
214 |
{ |
6165 |
08 Mar 21 |
nicklas |
var element = event.currentTarget; |
6165 |
08 Mar 21 |
nicklas |
216 |
|
6165 |
08 Mar 21 |
nicklas |
var submitInfo = {}; |
6165 |
08 Mar 21 |
nicklas |
submitInfo.listId = Data.int(element, 'list-id'); |
6165 |
08 Mar 21 |
nicklas |
submitInfo.autoProcessing = Data.get(element, 'auto-processing'); |
6165 |
08 Mar 21 |
nicklas |
220 |
|
6165 |
08 Mar 21 |
nicklas |
var url = '../Admin.servlet?ID=' + App.getSessionId(); |
6165 |
08 Mar 21 |
nicklas |
url += '&cmd=ChangeAutoProcessing'; |
6165 |
08 Mar 21 |
nicklas |
Wizard.asyncJsonRequest(url, manager.initPage, 'POST', JSON.stringify(submitInfo)); |
6165 |
08 Mar 21 |
nicklas |
Doc.element('indexList').innerHTML = ''; |
6165 |
08 Mar 21 |
nicklas |
225 |
} |
6165 |
08 Mar 21 |
nicklas |
226 |
|
6167 |
09 Mar 21 |
nicklas |
manager.cleanCache = function(event) |
6165 |
08 Mar 21 |
nicklas |
228 |
{ |
6165 |
08 Mar 21 |
nicklas |
var element = event.currentTarget; |
6165 |
08 Mar 21 |
nicklas |
230 |
|
6165 |
08 Mar 21 |
nicklas |
var submitInfo = {}; |
6165 |
08 Mar 21 |
nicklas |
submitInfo.indexId = Data.get(element, 'index-id'); |
6165 |
08 Mar 21 |
nicklas |
233 |
|
6165 |
08 Mar 21 |
nicklas |
var url = '../Admin.servlet?ID=' + App.getSessionId(); |
6167 |
09 Mar 21 |
nicklas |
url += '&cmd=CleanCache'; |
6165 |
08 Mar 21 |
nicklas |
Wizard.asyncJsonRequest(url, manager.initPage, 'POST', JSON.stringify(submitInfo)); |
6165 |
08 Mar 21 |
nicklas |
Doc.element('indexList').innerHTML = ''; |
6165 |
08 Mar 21 |
nicklas |
238 |
} |
6165 |
08 Mar 21 |
nicklas |
239 |
|
6167 |
09 Mar 21 |
nicklas |
manager.autoUpdate = function(event) |
6165 |
08 Mar 21 |
nicklas |
241 |
{ |
6165 |
08 Mar 21 |
nicklas |
var element = event.currentTarget; |
6165 |
08 Mar 21 |
nicklas |
243 |
|
6165 |
08 Mar 21 |
nicklas |
var submitInfo = {}; |
6165 |
08 Mar 21 |
nicklas |
submitInfo.indexId = Data.get(element, 'index-id'); |
6167 |
09 Mar 21 |
nicklas |
submitInfo.autoUpdate = Data.get(element, 'auto-update'); |
6544 |
19 Jan 22 |
nicklas |
submitInfo.customAction = Data.get(element, 'custom-action'); |
6165 |
08 Mar 21 |
nicklas |
248 |
|
6165 |
08 Mar 21 |
nicklas |
var url = '../Admin.servlet?ID=' + App.getSessionId(); |
6167 |
09 Mar 21 |
nicklas |
url += '&cmd=SetNextAutoUpdate'; |
6165 |
08 Mar 21 |
nicklas |
Wizard.asyncJsonRequest(url, manager.initPage, 'POST', JSON.stringify(submitInfo)); |
6165 |
08 Mar 21 |
nicklas |
Doc.element('indexList').innerHTML = ''; |
6165 |
08 Mar 21 |
nicklas |
253 |
} |
6165 |
08 Mar 21 |
nicklas |
254 |
|
6163 |
05 Mar 21 |
nicklas |
return manager; |
6163 |
05 Mar 21 |
nicklas |
256 |
}(); |
6163 |
05 Mar 21 |
nicklas |
257 |
|
6163 |
05 Mar 21 |
nicklas |
Doc.onLoad(Manager.initPage); |