source: main/trunk/greenstone3/web/interfaces/oran/js/javascript-global-functions.js@ 25440

Last change on this file since 25440 was 25440, checked in by sjm84, 12 years ago

Adding a hashing function (replica of our cpp version)

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