source: main/trunk/greenstone3/web/interfaces/default/js/javascript-global-functions.js@ 29869

Last change on this file since 29869 was 29869, checked in by ak19, 9 years ago

First part of commit for ensuring the user is authenticated when running the scripts used by the online metadata editor. Running metaserver, BuildAndActivate and other GS2Construct.java commands should not be possible from a web browser.

File size: 16.9 KB
Line 
1var SUCCESS = 1;
2var ACCEPTED = 2;
3var ERROR = 3;
4var CONTINUING = 10;
5var COMPLETED = 11;
6var HALTED = 12;
7
8gs.functions = new Array();
9
10gs.jqGet = function(id)
11{
12 return $("#" + id.replace(/\./g, "\\.").replace(/:/g,"\\:"));
13}
14
15gs.functions.ajaxRequest = function()
16{
17 var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
18 if(window.ActiveXObject)
19 {
20 for (var i=0; i<activexmodes.length; i++)
21 {
22 try
23 {
24 return new ActiveXObject(activexmodes[i]);
25 }
26 catch(e){}
27 }
28 }
29 else if (window.XMLHttpRequest)
30 {
31 return new XMLHttpRequest();
32 }
33 else
34 {
35 return false
36 }
37}
38
39gs.functions.hasClass = function(elem, classVal)
40{
41 if(!elem || !elem.getAttribute("class"))
42 {
43 return false;
44 }
45
46 return (elem.getAttribute("class").search(classVal) != -1)
47}
48
49gs.functions.getElementsByClassName = function(cl)
50{
51 var nodes = new Array();
52 var classRegEx = new RegExp('\\b'+cl+'\\b');
53 var allElems = document.getElementsByTagName('*');
54
55 for (var i = 0; i < allElems.length; i++)
56 {
57 var classes = allElems[i].className;
58 if (classRegEx.test(classes))
59 {
60 nodes.push(allElems[i]);
61 }
62 }
63 return nodes;
64};
65
66gs.functions.makeToggle = function(buttons, divs)
67{
68 var buttonArray = (buttons.length) ? buttons : [buttons];
69 var divArray = (divs.length) ? divs : [divs];
70
71 for(var i = 0; i < buttonArray.length; i++)
72 {
73 buttonArray[i].onclick = function()
74 {
75 for(var j = 0; j < divArray.length; j++)
76 {
77 if(divArray[j].style.display == "none")
78 {
79 divArray[j].style.display = "block";
80 }
81 else
82 {
83 divArray[j].style.display = "none";
84 }
85 }
86
87 for(var j = 0; j < buttonArray.length; j++)
88 {
89 if(buttonArray[j].getAttribute("src") == gs.imageURLs.collapse)
90 {
91 buttonArray[j].setAttribute("src", gs.imageURLs.expand);
92 }
93 else if(buttonArray[j].getAttribute("src") == gs.imageURLs.expand)
94 {
95 buttonArray[j].setAttribute("src", gs.imageURLs.collapse);
96 }
97 }
98 };
99 }
100}
101
102gs.functions.checkForErrors = function(xml)
103{
104 var errorElems = xml.getElementsByTagName("error");
105
106 if(errorElems && errorElems.length > 0)
107 {
108 var errorString = gs.text.dse.error_saving_changes + ": ";
109 for(var i = 0; i < errorElems.length; i++)
110 {
111 errorString += " " + errorElems.item(i).firstChild.nodeValue;
112 }
113 alert(errorString);
114 return true;
115 }
116 return false; //No errors
117}
118
119gs.functions.validateXML = function(txt)
120{
121 // code for IE
122 if (window.ActiveXObject)
123 {
124 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
125 xmlDoc.async = "false";
126 xmlDoc.loadXML(document.all(txt).value);
127
128 if(xmlDoc.parseError.errorCode!=0)
129 {
130 txt = dse.error_code + ": " + xmlDoc.parseError.errorCode + "\n";
131 txt = txt + dse.error_reason + ": " + xmlDoc.parseError.reason;
132 txt = txt + dse.error_line + ": " + xmlDoc.parseError.line;
133 console.log(txt);
134 return null;
135 }
136
137 return xmlDoc;
138 }
139 // code for Mozilla, Firefox, Opera, etc.
140 else if (document.implementation.createDocument)
141 {
142 var parser = new DOMParser();
143 var xmlDoc = parser.parseFromString(txt,"text/xml");
144
145 if (xmlDoc.getElementsByTagName("parsererror").length > 0)
146 {
147 console.log(gs.text.dse.xml_error);
148 return null;
149 }
150
151 return xmlDoc;
152 }
153 else
154 {
155 console.log(gs.text.dse.browse_cannot_validate_xml);
156 }
157 return null;
158}
159
160gs.functions.buildCollections = function(collections, finalFunction)
161{
162 if(!collections || collections.length == 0)
163 {
164 console.log("List of collections to build is empty");
165 return;
166 }
167
168 var counter = 0;
169 var buildFunction = function()
170 {
171 var ajax = new gs.functions.ajaxRequest();
172 ajax.open("GET", gs.xsltParams.library_name + "?a=g&rt=r&ro=1&s=BuildCollection&s1.collection=" + collections[counter]);
173 ajax.onreadystatechange = function()
174 {
175 if(ajax.readyState == 4 && ajax.status == 200)
176 {
177 var text = ajax.responseText;
178 var xml = gs.functions.validateXML(text);
179
180 if(!xml || gs.functions.checkForErrors(xml))
181 {
182 console.log("Could not build collection -> " + collections[counter] + ", aborting");
183 return;
184 }
185
186 var status = xml.getElementsByTagName("status")[0];
187 var pid = status.getAttribute("pid");
188
189 gs.functions.startCheckLoop(pid, "BuildCollection", function()
190 {
191 var localAjax = new gs.functions.ajaxRequest();
192 localAjax.open("GET", gs.xsltParams.library_name + "?a=g&rt=r&ro=1&s=ActivateCollection&s1.collection=" + collections[counter], true);
193 localAjax.onreadystatechange = function()
194 {
195 if(localAjax.readyState == 4 && localAjax.status == 200)
196 {
197 var localText = localAjax.responseText;
198 var localXML = gs.functions.validateXML(localText);
199
200 if(!xml || gs.functions.checkForErrors(xml))
201 {
202 console.log("Could not activate collection -> " + collections[counter] + ", aborting");
203 return;
204 }
205
206 var localStatus = localXML.getElementsByTagName("status")[0];
207 if(localStatus)
208 {
209 var localPID = localStatus.getAttribute("pid");
210 gs.functions.startCheckLoop(localPID, "ActivateCollection", function()
211 {
212 if (++counter == collections.length)
213 {
214 //Run this function once we are done building all the collections
215 if(finalFunction){finalFunction();}
216 }
217 else
218 {
219 buildFunction();
220 }
221 });
222 }
223 }
224 }
225 localAjax.send();
226 });
227 }
228 }
229 ajax.send();
230 }
231 buildFunction();
232}
233
234gs.functions.startCheckLoop = function(pid, serverFunction, callbackFunction)
235{
236 var ajaxFunction = function()
237 {
238 var ajax = new gs.functions.ajaxRequest();
239 ajax.open("GET", gs.xsltParams.library_name + "?a=g&rt=s&ro=1&s=" + serverFunction + "&s1.pid=" + pid, true);
240 ajax.onreadystatechange = function()
241 {
242 if(ajax.readyState == 4 && ajax.status == 200)
243 {
244 var text = ajax.responseText;
245 var xml = gs.functions.validateXML(text);
246
247 if(!xml || gs.functions.checkForErrors(xml))
248 {
249 console.log("Could not check status of " + serverFunction + ", there was an error in the XML, aborting");
250 return;
251 }
252
253 var status = xml.getElementsByTagName("status")[0];
254 var code = status.getAttribute("code");
255
256 if (code == COMPLETED || code == SUCCESS)
257 {
258 callbackFunction();
259 }
260 else if (code == HALTED || code == ERROR)
261 {
262 console.log("Could not check status of " + serverFunction + ", there was an error on the server, aborting");
263 }
264 else
265 {
266 setTimeout(ajaxFunction, 1000);
267 }
268 }
269 }
270 ajax.send();
271 }
272 ajaxFunction();
273}
274
275function inc(a, b)
276{
277 var carry = 0;
278 var num = 0;
279 var i = 0;
280
281 while((carry || (i < a.length) || (i < b.length)) && (i < 100))
282 {
283 num = carry;
284 if(i < a.length){num += a[i];}
285 if(i < b.length){num += b[i];}
286
287 if(num >= 256)
288 {
289 num -= 256;
290 carry = 1;
291 }
292 else
293 {
294 carry = 0;
295 }
296
297 a[i] = num;
298
299 i++;
300 }
301}
302
303function ifposDec(a, b)
304{
305 var carry = 0;
306 var num = 0;
307 var i = 0;
308
309 if(b.length > a.length){return a;}
310 if(b.length == a.length)
311 {
312 i = a.length - 1;
313 while(i >= 0)
314 {
315 if(a[i] > b[i]){break;}
316 if(a[i] < b[i]){return a;}
317 i--;
318 }
319 }
320
321 i = 0;
322 var len = 0;
323 var outString = "";
324 while((i < a.length) || (i < b.length))
325 {
326 num = -carry;
327 if(i < a.length){num += a[i];}
328 if(i < b.length){num -= b[i];}
329
330 if(num < 0)
331 {
332 num += 256;
333 carry = 1;
334 }
335 else
336 {
337 carry = 0;
338 }
339
340 a[i] = num;
341 outString += num + ","
342 i++
343
344 if(num != 0){len = i}
345 }
346
347 if(len < a.length)
348 {
349 a = a.slice(0, len);
350 }
351
352 return a;
353}
354
355function convertNum(a)
356{
357 var result = new Array();
358 var i;
359 var convert = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
360
361 if(a.length == 0)
362 {
363 result.push("0");
364 return result;
365 }
366
367 for(i = a.length - 1; i >= 0; i--)
368 {
369 result.push(convert[Math.floor(a[i]/16)]);
370 result.push(convert[Math.floor(a[i]%16)]);
371 }
372
373 var resultString = "";
374 for(var j = 0; j < result.length; j++)
375 {
376 resultString += result[j];
377 }
378
379 return resultString;
380}
381
382gs.functions.hashString = function(str)
383{
384 var remainder = new Array();
385 var primePow = new Array();
386 var pow =
387 [
388 255, 255, 255,
389 255, 255, 255,
390 255, 255, 255,
391 255, 255, 1
392 ];
393
394 for(var i = 0; i < 8; i++)
395 {
396 primePow.push(pow.slice()); //The javascript way to do an array copy (yuck!)
397 inc(pow, pow);
398 }
399
400 for(var i = 0; i < str.length; i++)
401 {
402 var c = str.charCodeAt(i);
403
404 if(remainder.length == 99)
405 {
406 return null;
407 }
408
409 for(var j = remainder.length; j > 0; j--)
410 {
411 remainder[j] = remainder[j-1];
412 }
413 remainder[0] = c;
414
415 for(var j = 7; j >= 0; j--)
416 {
417 remainder = ifposDec(remainder, primePow[j]);
418 }
419 }
420
421 return convertNum(remainder);
422}
423
424function callMetadataServer(callingFunction, url, responseFunction)
425{
426 // rewrite URLs to call GS2Construct's SetMetadata service instead
427 url = url.replace("&c=", "&collection="); // c is a special param name for GS2Construct
428 url = url.replace(/(&|\?)([^=]*=)/g, "$1"+"s1.$2"); // prefix param names with "s1."
429 url = url.replace("cgi-bin/metadata-server.pl?", gs.xsltParams.library_name + "?a=g&rt=r&ro=1&s=SetMetadata&");
430
431
432 $.ajax(url)
433 .success(function(response)
434 {
435 console.log("(" + callingFunction + ") Response received from server: " + response);
436
437 //var xml = $.parseXML(response);
438 //console.log(xml);
439
440 if(responseFunction != null)
441 {
442 responseFunction(response);
443 }
444 })
445 .error(function()
446 {
447 console.log("(" + callingFunction + ") Failed");
448 });
449}
450
451/*************************
452* SET METADATA FUNCTIONS *
453*************************/
454
455gs.functions.setImportMetadata = function(collection, site, documentID, metadataName, metadataValue, prevMetadataValue, metamode, responseFunction)
456{
457 callMetadataServer("setImportMetadata", "cgi-bin/metadata-server.pl?a=set-import-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue + "&prevmetavalue=" + prevMetadataValue + "&metamode=" + metamode, responseFunction);
458}
459
460gs.functions.setArchivesMetadata = function(collection, site, documentID, metadataName, metadataPosition, metadataValue, prevMetadataValue, metamode, responseFunction)
461{
462 if(metadataPosition != null)
463 {
464 callMetadataServer("setArchivesMetadata", "cgi-bin/metadata-server.pl?a=set-archives-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metapos=" + metadataPosition + "&metavalue=" + metadataValue + "&metamode=" + metamode, responseFunction);
465 }
466 else if(prevMetadataValue != null)
467 {
468 callMetadataServer("setArchivesMetadata", "cgi-bin/metadata-server.pl?a=set-archives-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue + "&prevmetavalue=" + prevMetadataValue + "&metamode=" + metamode, responseFunction);
469 }
470 else
471 {
472 callMetadataServer("setArchivesMetadata", "cgi-bin/metadata-server.pl?a=set-archives-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue + "&metamode=" + metamode, responseFunction);
473 }
474}
475
476gs.functions.setIndexMetadata = function(collection, site, documentID, metadataName, metadataPosition, metadataValue, prevMetadataValue, metamode, responseFunction)
477{
478 if(metadataPosition != null)
479 {
480 callMetadataServer("setIndexMetadata", "cgi-bin/metadata-server.pl?a=set-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metapos=" + metadataPosition + "&metavalue=" + metadataValue + "&metamode=" + metamode, responseFunction);
481 }
482 else if(prevMetadataValue != null)
483 {
484 callMetadataServer("setIndexMetadata", "cgi-bin/metadata-server.pl?a=set-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue + "&prevmetavalue=" + prevMetadataValue + "&metamode=" + metamode, responseFunction);
485 }
486}
487
488gs.functions.setMetadata = function(collection, site, documentID, metadataName, metadataValue, metamode, responseFunction)
489{
490 var nameArray = ["setImportMetadata", "setArchivesMetadata", "setIndexMetadata"];
491 var functionArray = ["set-import-metadata", "set-archives-metadata", "set-metadata"];
492
493 for(var i = 0; i < nameArray.length; i++)
494 {
495 callMetadataServer(nameArray[i], "cgi-bin/metadata-server.pl?a=" + functionArray[i] + "&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue + "&metamode=" + metamode, responseFunction);
496 }
497}
498
499/*************************
500* GET METADATA FUNCTIONS *
501*************************/
502
503gs.functions.getImportMetadata = function(collection, site, documentID, metadataName, responseFunction)
504{
505 var url = "cgi-bin/metadata-server.pl?a=get-import-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName;
506 callMetadataServer("getImportMetadata", url, function(responseText)
507 {
508 var metadata = new GSMetadata(collection, site, documentID, metadataName, null, responseText);
509 if(responseFunction != null)
510 {
511 responseFunction(metadata);
512 }
513 });
514}
515
516gs.functions.getArchivesMetadata = function(collection, site, documentID, metadataName, metadataPosition, responseFunction)
517{
518 var url = "cgi-bin/metadata-server.pl?a=get-archives-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName;
519 if(metadataPosition != null)
520 {
521 url += "&metapos=" + metadataPosition;
522 }
523
524 callMetadataServer("getArchivesMetadata", url, function(responseText)
525 {
526 var metadata = new GSMetadata(collection, site, documentID, metadataName, metadataPosition, responseText);
527 if(responseFunction != null)
528 {
529 responseFunction(metadata);
530 }
531 });
532}
533
534gs.functions.getIndexMetadata = function(collection, site, documentID, metadataName, metadataPosition, responseFunction)
535{
536 var url = "cgi-bin/metadata-server.pl?a=get-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName;
537 if(metadataPosition != null)
538 {
539 url += "&metapos=" + metadataPosition;
540 }
541
542 callMetadataServer("getIndexMetadata", url, function(responseText)
543 {
544 var metadata = new GSMetadata(collection, site, documentID, metadataName, metadataPosition, responseText);
545
546 if(responseFunction != null)
547 {
548 responseFunction(metadata);
549 }
550 });
551}
552
553/****************************
554* REMOVE METADATA FUNCTIONS *
555****************************/
556
557gs.functions.removeImportMetadata = function(collection, site, documentID, metadataName, metadataValue, responseFunction)
558{
559 callMetadataServer("removeImportMetadata", "cgi-bin/metadata-server.pl?a=remove-import-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue, responseFunction);
560}
561
562gs.functions.removeArchivesMetadata = function(collection, site, documentID, metadataName, metadataPosition, metadataValue, responseFunction)
563{
564 if(metadataPosition != null)
565 {
566 callMetadataServer("removeArchiveMetadata", "cgi-bin/metadata-server.pl?a=remove-archives-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metapos=" + metadataPosition, responseFunction);
567 }
568 else if(metadataValue != null)
569 {
570 callMetadataServer("removeArchiveMetadata", "cgi-bin/metadata-server.pl?a=remove-archives-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue, responseFunction);
571 }
572}
573
574gs.functions.removeIndexMetadata = function(collection, site, documentID, metadataName, metadataPosition, metadataValue, responseFunction)
575{
576 if(metadataPosition != null)
577 {
578 callMetadataServer("removeIndexMetadata", "cgi-bin/metadata-server.pl?a=remove-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metapos=" + metadataPosition, responseFunction);
579 }
580 else if(metadataValue != null)
581 {
582 callMetadataServer("removeIndexMetadata", "cgi-bin/metadata-server.pl?a=remove-metadata&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue, responseFunction);
583 }
584}
585
586gs.functions.removeMetadata = function(collection, site, documentID, metadataName, metadataValue, responseFunction)
587{
588 var nameArray = ["removeImportMetadata", "removeArchivesMetadata", "removeIndexMetadata"];
589 var functionArray = ["remove-import-metadata", "remove-archives-metadata", "remove-metadata"];
590
591 for(var i = 0; i < nameArray.length; i++)
592 {
593 callMetadataServer(nameArray[i], "cgi-bin/metadata-server.pl?a=" + functionArray[i] + "&c=" + collection + "&site=" + site + "&d=" + documentID + "&metaname=" + metadataName + "&metavalue=" + metadataValue, responseFunction);
594 }
595}
Note: See TracBrowser for help on using the repository browser.