source: main/trunk/greenstone3/web/interfaces/oran/js/documentmaker_scripts_util.js@ 25282

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

Added the ability to edit metadata on the document page

  • Property svn:executable set to *
File size: 25.4 KB
Line 
1//Some "constants" to match the server constants
2var SUCCESS = 1;
3var ACCEPTED = 2;
4var ERROR = 3;
5var CONTINUING = 10;
6var COMPLETED = 11;
7var HALTED = 12;
8
9function getElementsByClassName(cl, parent)
10{
11 var elemArray = [];
12 var classRegEx = new RegExp("\\b" + cl + "\\b");
13 var elems;
14 if(parent)
15 {
16 elems = parent.getElementsByTagName("*");
17 }
18 else
19 {
20 elems = document.getElementsByTagName("*");
21 }
22
23 for (var i = 0; i < elems.length; i++)
24 {
25 var classeName = elems[i].className;
26 if (classRegEx.test(classeName)) elemArray.push(elems[i]);
27 }
28
29 return elemArray;
30};
31
32function getNextSiblingOfType(elem, type)
33{
34 if(elem == null)
35 {
36 return null;
37 }
38
39 var current = elem.nextSibling;
40 while(current != null)
41 {
42 if(current.nodeName.toLowerCase() == type)
43 {
44 return current;
45 }
46
47 current = current.nextSibling;
48 }
49 return null;
50}
51
52function getPrevSiblingOfType(elem, type)
53{
54 if(elem == null)
55 {
56 return null;
57 }
58
59 var current = elem.previousSibling;
60 while(current != null)
61 {
62 if(current.nodeName.toLowerCase() == type)
63 {
64 return current;
65 }
66
67 current = current.previousSibling;
68 }
69 return null;
70}
71
72function saveTransaction(transaction)
73{
74 console.log(transaction);
75 _transactions.push(transaction);
76}
77
78function undo()
79{
80 if(_undoOperations.length == 0)
81 {
82 return;
83 }
84
85 var undoOp = _undoOperations.pop();
86
87 //Create/Duplicate undo
88 if(undoOp.op == "del")
89 {
90 if(undoOp.srcElem.childList)
91 {
92 removeFromParent(undoOp.srcElem.childList);
93 }
94 if(undoOp.srcElem.parentItem)
95 {
96 undoOp.srcElem.parentItem.menu.newSectionLink.style.display = "inline";
97 undoOp.srcElem.parentItem.childList = null;
98 }
99 removeFromParent(undoOp.srcElem);
100 }
101
102 if(undoOp.op == "delMeta")
103 {
104 if(undoOp.srcElem.childList)
105 {
106 removeFromParent(undoOp.srcElem.childList);
107 }
108 if(undoOp.srcElem.parentItem)
109 {
110 undoOp.srcElem.parentItem.menu.newSectionLink.style.display = "inline";
111 undoOp.srcElem.parentItem.childList = null;
112 }
113 de.doc.unregisterEditSection(undoOp.srcElem);
114 removeFromParent(undoOp.srcElem);
115 }
116
117 //Move undo (mva is move after, mvb is move before, mvi is move into)
118 else if(undoOp.op == "mva" || undoOp.op == "mvb" || undoOp.op == "mvi")
119 {
120 if(undoOp.op == "mvb")
121 {
122 undoOp.refElem.parentNode.insertBefore(undoOp.srcElem, undoOp.refElem);
123 }
124 else if(undoOp.op == "mva")
125 {
126 insertAfter(undoOp.srcElem, undoOp.refElem);
127 }
128 else
129 {
130 undoOp.refElem.removeChild(undoOp.refElem.firstChild);
131 undoOp.refElem.appendChild(undoOp.srcElem);
132 }
133
134 if(undoOp.srcElem.textDiv)
135 {
136 insertAfter(undoOp.srcElem.textDiv, undoOp.srcElem);
137 }
138 if(undoOp.srcElem.childList)
139 {
140 insertAfter(undoOp.srcElem.childList, undoOp.srcElem.textDiv);
141 }
142
143 if(undoOp.srcElem.onmouseout)
144 {
145 //Uncolour the section if it coloured
146 undoOp.srcElem.onmouseout();
147 }
148 updateFromTop();
149 }
150 else if(undoOp.op == "display")
151 {
152 undoOp.srcElem.style.display = undoOp.subOp;
153 }
154
155 if(undoOp.removeDeletedMetadata)
156 {
157 _deletedMetadata.pop();
158 }
159
160 if(undoOp.removeTransaction)
161 {
162 _transactions.pop();
163 }
164}
165
166function addCollectionToBuild(collection)
167{
168 for(var i = 0; i < _collectionsToBuild.length; i++)
169 {
170 if(collection == _collectionsToBuild[i])
171 {
172 return;
173 }
174 }
175 _collectionsToBuild.push(collection);
176}
177
178function save()
179{
180 var collection;
181 if(gs.cgiParams.c && gs.cgiParams.c != "")
182 {
183 collection = gs.cgiParams.c
184 }
185 else
186 {
187 collection = gs.cgiParams.p_c
188 }
189
190 for(var i = 0; i < _deletedMetadata.length; i++)
191 {
192 var currentRow = _deletedMetadata[i];
193
194 //Get document ID
195 var currentElem = currentRow;
196 while((currentElem = currentElem.parentNode).tagName != "TABLE");
197 var docID = currentElem.getAttribute("id").substring(4);
198
199 //Get metadata name
200 var cells = currentRow.getElementsByTagName("TD");
201 var nameCell = cells[0];
202 var name = nameCell.innerHTML;
203 var valueCell = cells[1];
204 var value = valueCell.innerHTML;
205
206 gs.functions.removeArchivesMetadata(collection /*bad*/, "localsite" /*bad*/, docID, name, null, value, function(){console.log("REMOVED ARCHIVES");});
207 addCollectionToBuild(collection); /*bad*/
208
209 removeFromParent(currentRow);
210 }
211
212 var changes = de.Changes.getChangedEditableSections();
213
214 for(var i = 0; i < changes.length; i++)
215 {
216 var changedElem = changes[i];
217
218 //Save metadata
219 if(hasClass(changedElem, "metaTableCell"))
220 {
221 //Get document ID
222 var currentElem = changedElem;
223 while((currentElem = currentElem.parentNode).tagName != "TABLE");
224 var docID = currentElem.getAttribute("id").substring(4);
225
226 //Get metadata name
227 var row = changedElem.parentNode;
228 var cells = row.getElementsByTagName("TD");
229 var nameCell = cells[0];
230 var name = nameCell.innerHTML;
231
232 if(changedElem.originalValue)
233 {
234 gs.functions.setArchivesMetadata(collection, "localsite" /*bad*/, docID, name, null, changedElem.innerHTML, changedElem.originalValue, "override", function(){console.log("SAVED ARCHIVES");});
235 }
236 else
237 {
238 gs.functions.setArchivesMetadata(collection, "localsite" /*bad*/, docID, name, null, changedElem.innerHTML, null, "accumulate", function(){console.log("SAVED ARCHIVES");});
239 }
240 changedElem.originalValue = changedElem.innerHTML;
241 addCollectionToBuild(collection);
242 }
243 //Save content
244 else if(hasClass(changedElem, "renderedText"))
245 {
246 var section = changedElem.parentDiv.parentItem;
247 saveTransaction('{"operation":"setText", "text":"' + changedElem.innerHTML.replace(/"/g, "\\\"").replace(/&/g, "%26") + '", "collection":"' + section.collection + '", "oid":"' + section.nodeID + '"}');
248 addCollectionToBuild(section.collection);
249 }
250 else if(hasClass(changedElem, "sectionText"))
251 {
252 var id = changedElem.getAttribute("id");
253 var sectionID = id.substring(4);
254 saveTransaction('{"operation":"setText", "text":"' + changedElem.innerHTML.replace(/"/g, "\\\"").replace(/&/g, "%26") + '", "collection":"' + gs.cgiParams.c + '", "oid":"' + sectionID + '"}');
255 addCollectionToBuild(gs.cgiParams.c);
256 }
257 }
258
259 var request = "[";
260 for(var i = 0; i < _transactions.length; i++)
261 {
262 request += _transactions[i];
263 if(i != _transactions.length - 1)
264 {
265 request += ",";
266 }
267 }
268 request += "]";
269
270 var statusID;
271 var ajax = new gs.functions.ajaxRequest();
272 ajax.open("POST", _baseURL, true);
273 ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
274 ajax.onreadystatechange = function()
275 {
276 if(ajax.readyState == 4 && ajax.status == 200)
277 {
278 var text = ajax.responseText;
279 var xml = validateXML(text);
280
281 var errorElems;
282 if(!xml || checkForErrors(xml))
283 {
284 alert("There was an error saving, aborting");
285
286 var saveButton = document.getElementById("saveButton");
287 saveButton.innerHTML = "Save changes";
288 saveButton.disabled = false;
289
290 _statusBar.removeStatus(statusID);
291 return;
292 }
293
294 _statusBar.removeStatus(statusID);
295 buildCollections(_collectionsToBuild);
296 }
297 }
298
299 if(_collectionsToBuild.length > 0)
300 {
301 var saveButton = document.getElementById("saveButton");
302 saveButton.innerHTML = "Saving...";
303 saveButton.disabled = true;
304
305 statusID = _statusBar.addStatus("Modifying archive files...");
306 ajax.send("a=g&rt=r&s=DocumentExecuteTransaction&s1.transactions=" + request);
307 }
308}
309
310function buildCollections(collections)
311{
312 var saveButton = document.getElementById("saveButton");
313 if(!collections || collections.length == 0)
314 {
315 console.log("List of collections to build is empty");
316 saveButton.innerHTML = "Save changes";
317 saveButton.disabled = false;
318 return;
319 }
320
321 var counter = 0;
322 var statusID = 0;
323 var buildFunction = function()
324 {
325 var ajax = new gs.functions.ajaxRequest();
326 ajax.open("GET", _baseURL + "?a=g&rt=r&ro=1&s=BuildCollection&s1.collection=" + collections[counter]);
327 ajax.onreadystatechange = function()
328 {
329 if(ajax.readyState == 4 && ajax.status == 200)
330 {
331 var text = ajax.responseText;
332 var xml = validateXML(text);
333
334 if(!xml || checkForErrors(xml))
335 {
336 alert("Could not build collection -> " + collections[counter] + ", aborting");
337
338 _statusBar.removeStatus(statusID);
339 saveButton.innerHTML = "Save changes";
340 saveButton.disabled = false;
341
342 return;
343 }
344
345 var status = xml.getElementsByTagName("status")[0];
346 var pid = status.getAttribute("pid");
347
348 startCheckLoop(pid, "BuildCollection", statusID, function()
349 {
350 var localAjax = new gs.functions.ajaxRequest();
351 localAjax.open("GET", _baseURL + "?a=g&rt=r&ro=1&s=ActivateCollection&s1.collection=" + collections[counter], true);
352 localAjax.onreadystatechange = function()
353 {
354 if(localAjax.readyState == 4 && localAjax.status == 200)
355 {
356 var localText = localAjax.responseText;
357 var localXML = validateXML(localText);
358
359 if(!xml || checkForErrors(xml))
360 {
361 alert("Could not activate collection -> " + collections[counter] + ", aborting");
362
363 _statusBar.removeStatus(statusID);
364 saveButton.innerHTML = "Save changes";
365 saveButton.disabled = false;
366
367 return;
368 }
369
370 var localStatus = localXML.getElementsByTagName("status")[0];
371 if(localStatus)
372 {
373 var localPID = localStatus.getAttribute("pid");
374 startCheckLoop(localPID, "ActivateCollection", statusID, function()
375 {
376 if(counter == collections.length - 1)
377 {
378 removeCollectionsFromBuildList(collections);
379 }
380 else
381 {
382 counter++;
383 buildFunction();
384 }
385
386 _transactions = new Array();
387
388 _statusBar.removeStatus(statusID);
389 saveButton.innerHTML = "Save changes";
390 saveButton.disabled = false;
391 });
392 }
393 }
394 }
395 _statusBar.changeStatus(statusID, "Activating collection " + collections[counter] + "...");
396 localAjax.send();
397 });
398 }
399 }
400 statusID = _statusBar.addStatus("Building collection " + collections[counter] + "...");
401 ajax.send();
402 }
403 buildFunction();
404}
405
406function startCheckLoop(pid, serverFunction, statusID, callbackFunction)
407{
408 var ajaxFunction = function()
409 {
410 var saveButton = document.getElementById("saveButton");
411
412 var ajax = new gs.functions.ajaxRequest();
413 ajax.open("GET", _baseURL + "?a=g&rt=s&ro=1&s=" + serverFunction + "&s1.pid=" + pid, true);
414 ajax.onreadystatechange = function()
415 {
416 if(ajax.readyState == 4 && ajax.status == 200)
417 {
418 var text = ajax.responseText;
419 var xml = validateXML(text);
420
421 if(!xml || checkForErrors(xml))
422 {
423 alert("Could not check status of " + serverFunction + ", there was an error in the XML, aborting");
424
425 _statusBar.removeStatus(statusID);
426 saveButton.innerHTML = "Save changes";
427 saveButton.disabled = false;
428
429 return;
430 }
431
432 var status = xml.getElementsByTagName("status")[0];
433 var code = status.getAttribute("code");
434
435 if (code == COMPLETED || code == SUCCESS)
436 {
437 callbackFunction();
438 }
439 else if (code == HALTED || code == ERROR)
440 {
441 alert("Could not check status of " + serverFunction + ", there was an error on the server, aborting");
442
443 _statusBar.removeStatus(statusID);
444 saveButton.innerHTML = "Save changes";
445 saveButton.disabled = false;
446 }
447 else
448 {
449 setTimeout(ajaxFunction, 1000);
450 }
451 }
452 }
453 ajax.send();
454 }
455 ajaxFunction();
456}
457
458function removeCollectionsFromBuildList(collections)
459{
460 var tempArray = new Array();
461 for(var i = 0; i < _collectionsToBuild.length; i++)
462 {
463 var found = false;
464 for(var j = 0; j < collections.length; j++)
465 {
466 if(collections[j] == _collectionsToBuild[i])
467 {
468 found = true;
469 break;
470 }
471 }
472
473 if(!found)
474 {
475 tempArray.push(_collectionsToBuild[i]);
476 }
477 }
478 _collectionsToBuild = tempArray;
479}
480
481function checkForErrors(xml)
482{
483 var errorElems = xml.getElementsByTagName("error");
484
485 if(errorElems && errorElems.length > 0)
486 {
487 var errorString = "There was an error saving your changes: ";
488 for(var i = 0; i < errorElems.length; i++)
489 {
490 errorString += " " + errorElems.item(i).firstChild.nodeValue;
491 }
492 alert(errorString);
493 return true;
494 }
495 return false; //No errors
496}
497
498function validateXML(txt)
499{
500 // code for IE
501 if (window.ActiveXObject)
502 {
503 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
504 xmlDoc.async = "false";
505 xmlDoc.loadXML(document.all(txt).value);
506
507 if(xmlDoc.parseError.errorCode!=0)
508 {
509 txt = "Error Code: " + xmlDoc.parseError.errorCode + "\n";
510 txt = txt + "Error Reason: " + xmlDoc.parseError.reason;
511 txt = txt + "Error Line: " + xmlDoc.parseError.line;
512 console.log(txt);
513 return null;
514 }
515
516 return xmlDoc;
517 }
518 // code for Mozilla, Firefox, Opera, etc.
519 else if (document.implementation.createDocument)
520 {
521 var parser = new DOMParser();
522 var xmlDoc = parser.parseFromString(txt,"text/xml");
523
524 if (xmlDoc.getElementsByTagName("parsererror").length > 0)
525 {
526 console.log("There was an error parsing the XML");
527 return null;
528 }
529
530 return xmlDoc;
531 }
532 else
533 {
534 console.log('Your browser cannot handle XML validation');
535 }
536 return null;
537}
538
539function onVisibleMetadataSetChange()
540{
541 var metadataList = document.getElementById("metadataSetList");
542 var index = metadataList.selectedIndex;
543 var options = metadataList.getElementsByTagName("OPTION");
544 var selectedOption = options[index];
545
546 var selectedSet = selectedOption.innerHTML;
547 changeVisibleMetadata(selectedSet);
548}
549
550function changeVisibleMetadata(metadataSetName)
551{
552 var tables = document.getElementsByTagName("TABLE");
553 for(var i = 0; i < tables.length; i++)
554 {
555 var id = tables[i].getAttribute("id");
556 if(id && id.search(/^meta/) != -1)
557 {
558 var rows = tables[i].getElementsByTagName("TR");
559 for(var j = 0; j < rows.length; j++)
560 {
561 if(metadataSetName == "All")
562 {
563 rows[j].style.display = "table-row";
564 }
565 else
566 {
567 var cells = rows[j].getElementsByTagName("TD");
568 var cellName = cells[0].innerHTML;
569
570 if(cellName.indexOf(".") == -1)
571 {
572 rows[j].style.display = "none";
573 }
574 else
575 {
576 var setName = cellName.substring(0, cellName.lastIndexOf("."));
577 if(setName == metadataSetName)
578 {
579 rows[j].style.display = "table-row";
580 }
581 else
582 {
583 rows[j].style.display = "none";
584 }
585 }
586 }
587 }
588 }
589 }
590}
591
592function asyncRegisterEditSection(cell)
593{
594 //This registering can cause a sizeable delay so we'll thread it (effectively) so the browser is not paused
595 cell.originalValue = cell.innerHTML;
596 setTimeout(function(){de.doc.registerEditSection(cell)}, 0);
597}
598
599function addFunctionalityToTable(table)
600{
601 var rows = table.getElementsByTagName("TR");
602 for(var i = 0; i < rows.length; i++)
603 {
604 var cells = rows[i].getElementsByTagName("TD");
605 var metadataName = cells[0].innerHTML;
606
607 if(metadataName.indexOf(".") != -1)
608 {
609 var metadataSetName = metadataName.substring(0, metadataName.lastIndexOf("."));
610
611 var found = false;
612 for(var j = 0; j < _metadataSetList.length; j++)
613 {
614 if(metadataSetName == _metadataSetList[j])
615 {
616 found = true;
617 break;
618 }
619 }
620
621 if(!found)
622 {
623 _metadataSetList.push(metadataSetName);
624
625 var metadataSetList = document.getElementById("metadataSetList");
626 var newOption = document.createElement("OPTION");
627 newOption.innerHTML = metadataSetName;
628 metadataSetList.appendChild(newOption);
629 }
630 }
631
632 asyncRegisterEditSection(cells[1]);
633
634 addRemoveLinkToRow(rows[i]);
635 }
636
637 var metaNameField = document.createElement("INPUT");
638 metaNameField.setAttribute("type", "text");
639 insertAfter(metaNameField, table);
640 table.metaNameField = metaNameField;
641
642 var addRowButton = document.createElement("BUTTON");
643 addRowButton.innerHTML = "Add new metadata";
644 addRowButton.onclick = function()
645 {
646 var name = metaNameField.value;
647 if(!name || name == "")
648 {
649 console.log("No value given for new metadata name");
650 return;
651 }
652
653 var newRow = document.createElement("TR");
654 var nameCell = document.createElement("TD");
655 var valueCell = document.createElement("TD");
656 nameCell.setAttribute("class", "metaTableCellName");
657 nameCell.innerHTML = name;
658 valueCell.setAttribute("class", "metaTableCell");
659
660 newRow.appendChild(nameCell);
661 newRow.appendChild(valueCell);
662 addRemoveLinkToRow(newRow);
663 table.appendChild(newRow);
664
665 var undo = new Array();
666 undo.op = "delMeta";
667 undo.srcElem = newRow;
668 undo.removeTransaction = false;
669 _undoOperations.push(undo);
670
671 //Threading this function here probably isn't necessary like the other times it is called
672 de.doc.registerEditSection(valueCell);
673 };
674 table.addRowButton = addRowButton;
675 insertAfter(addRowButton, metaNameField);
676}
677
678function addRemoveLinkToRow(row)
679{
680 var newCell = document.createElement("TD");
681 var removeLink = document.createElement("A");
682 removeLink.innerHTML = "remove";
683 removeLink.setAttribute("href", "javascript:;");
684 removeLink.onclick = function()
685 {
686 var undo = new Array();
687 undo.srcElem = row;
688 undo.op = "display";
689 undo.subOp = "table-row";
690 undo.removeDeletedMetadata = true;
691 _undoOperations.push(undo);
692 _deletedMetadata.push(row);
693 row.style.display = "none";
694 }
695 newCell.appendChild(removeLink);
696 newCell.setAttribute("class", "metaTableCell");
697 newCell.setAttribute("style", "font-size:0.6em; padding-left: 3px; padding-right: 3px;");
698 row.appendChild(newCell);
699}
700
701function createTopMenuBar()
702{
703 //Create the top menu bar
704 var headerTable = document.createElement("TABLE");
705 var tableBody = document.createElement("TBODY");
706 var row = document.createElement("TR");
707 var newDocCell = document.createElement("TD");
708 var newSecCell = document.createElement("TD");
709 var saveCell = document.createElement("TD");
710 var undoCell = document.createElement("TD");
711 var metadataListCell = document.createElement("TD");
712
713 var metadataListLabel = document.createElement("SPAN");
714 metadataListLabel.innerHTML = "Visible metadata: ";
715 var metadataList = document.createElement("SELECT");
716 metadataList.setAttribute("id", "metadataSetList");
717 metadataList.onchange = onVisibleMetadataSetChange;
718 var allMetadataOption = document.createElement("OPTION");
719 metadataList.appendChild(allMetadataOption);
720 allMetadataOption.innerHTML = "All";
721 metadataListCell.appendChild(metadataListLabel);
722 metadataListCell.appendChild(metadataList);
723
724 metadataListCell.setAttribute("class", "headerTableTD");
725 newDocCell.setAttribute("class", "headerTableTD");
726 newSecCell.setAttribute("class", "headerTableTD");
727 undoCell.setAttribute("class", "headerTableTD");
728 saveCell.setAttribute("class", "headerTableTD");
729
730 headerTable.appendChild(tableBody);
731 tableBody.appendChild(row);
732 row.appendChild(saveCell);
733 row.appendChild(undoCell);
734 row.appendChild(newDocCell);
735 row.appendChild(newSecCell);
736 row.appendChild(metadataListCell);
737
738 //The "Save changes" button
739 var saveButton = document.createElement("BUTTON");
740 saveButton.innerHTML = "Save changes";
741 saveButton.setAttribute("onclick", "save();");
742 saveButton.setAttribute("id", "saveButton");
743 saveCell.appendChild(saveButton);
744
745 //The "Undo" button
746 var undoButton = document.createElement("BUTTON");
747 undoButton.innerHTML = "Undo";
748 undoButton.setAttribute("onclick", "undo();");
749 undoCell.appendChild(undoButton);
750
751 //The "Create new document" button
752 var newDocButton = document.createElement("BUTTON");
753 newDocButton.innerHTML = "Create new document";
754 newDocButton.setAttribute("onclick", "createNewDocumentArea();");
755 newDocCell.appendChild(newDocButton);
756
757 //The "Insert new section" LI
758 var newSecLI = createDraggableNewSection(newSecCell);
759
760 return headerTable;
761}
762
763function getMetadataFromNode(node, name)
764{
765 var currentNode = node.firstChild;
766 while(currentNode != null)
767 {
768 if(currentNode.nodeName == "metadataList")
769 {
770 currentNode = currentNode.firstChild;
771 break;
772 }
773
774 currentNode = currentNode.nextSibling;
775 }
776
777 while(currentNode != null)
778 {
779 if(currentNode.nodeName == "metadata" && currentNode.getAttribute("name") == name)
780 {
781 return currentNode.firstChild.nodeValue;
782 }
783
784 currentNode = currentNode.nextSibling;
785 }
786 return "{UNTITLED}";
787}
788
789function storeMetadata(node, listItem)
790{
791 listItem.metadata = new Array();
792
793 var currentNode = node.firstChild;
794 while(currentNode != null)
795 {
796 if(currentNode.nodeName == "metadataList")
797 {
798 currentNode = currentNode.firstChild;
799 break;
800 }
801
802 currentNode = currentNode.nextSibling;
803 }
804
805 while(currentNode != null)
806 {
807 if(currentNode.nodeName == "metadata")
808 {
809 listItem.metadata[currentNode.getAttribute("name")] = currentNode.firstChild.nodeValue;
810 }
811
812 currentNode = currentNode.nextSibling;
813 }
814}
815
816function hasClass(elem, classVal)
817{
818 if(!elem || !elem.getAttribute("class"))
819 {
820 return false;
821 }
822
823 return (elem.getAttribute("class").search(classVal) != -1)
824}
825
826function getNodeContent(node)
827{
828 var currentNode = node.firstChild;
829 while(currentNode != null)
830 {
831 if(currentNode.nodeName == "nodeContent")
832 {
833 return currentNode.firstChild;
834 }
835
836 currentNode = currentNode.nextSibling;
837 }
838 return null;
839}
840
841function containsDocumentNode(node)
842{
843 var currentNode = node.firstChild;
844 while(currentNode != null)
845 {
846 if(currentNode.nodeName == "documentNode")
847 {
848 return true;
849 }
850
851 currentNode = currentNode.nextSibling;
852 }
853 return false;
854}
855
856function isExpanded(textDiv)
857{
858 if(!textDiv.style.display || textDiv.style.display == "block")
859 {
860 return true;
861 }
862 return false;
863}
864
865function toggleTextDiv(section)
866{
867 var textDiv = section.textDiv;
868 if(textDiv)
869 {
870 if(isExpanded(textDiv))
871 {
872 textDiv.style.display = "none";
873 section.menu.editTextLink.innerHTML = "edit";
874 }
875 else
876 {
877 textDiv.style.display = "block";
878 section.menu.editTextLink.innerHTML = "hide";
879 }
880 }
881}
882
883function updateFromTop()
884{
885 updateRecursive(document.getElementById("dbDiv"), null, null, 0);
886}
887
888function insertAfter(elem, refElem)
889{
890 if(refElem.nextSibling)
891 {
892 refElem.parentNode.insertBefore(elem, refElem.nextSibling);
893 }
894 else
895 {
896 refElem.parentNode.appendChild(elem);
897 }
898}
899
900function removeFromParent(elem)
901{
902 elem.parentNode.removeChild(elem);
903}
904
905function createSectionTitle(text)
906{
907 var textSpan = document.createElement("SPAN");
908 if(text)
909 {
910 textSpan.appendChild(document.createTextNode(" " + text + " "));
911 }
912 else
913 {
914 textSpan.appendChild(document.createTextNode(" [UNTITLED SECTION] "));
915 }
916 return textSpan;
917}
918
919function setMouseOverAndOutFunctions(section)
920{
921 //Colour the list item and display the menu on mouse over
922 section.onmouseover = function(e)
923 {
924 if(this.menu){this.menu.style.display = "inline";}
925 this.style.background = "rgb(255, 200, 0)";
926 };
927 //Uncolour the list item and hide the menu on mouse out
928 section.onmouseout = function(e)
929 {
930 if(this.menu){this.menu.style.display = "none";}
931 this.style.background = "none";
932 };
933}
934
935function createDraggableNewSection(parent)
936{
937 var newSecLI = document.createElement("LI");
938 var newSpan = document.createElement("SPAN");
939 newSpan.innerHTML = "Insert new section ";
940
941 newSecLI.sectionTitle = newSpan;
942 newSecLI.appendChild(newSpan);
943 newSecLI.setAttribute("class", "dragItem newSection");
944 newSecLI.newSection = true;
945 newSecLI.parent = parent;
946 newSecLI.index = -1;
947 new YAHOO.example.DDList(newSecLI);
948 parent.appendChild(newSecLI);
949}
950
951function closeAllOpenContents()
952{
953 for(var i = 0; i < _allContents.length; i++)
954 {
955 if(isExpanded(_allContents[i].textDiv))
956 {
957 toggleTextDiv(_allContents[i]);
958 }
959 }
960 DDM.refreshCache();
961}
962
963//Status Bar class (initialised with new StatusBar(elem);)
964function StatusBar(mainElem)
965{
966 var _statusMap = new Array();
967 var _statusIDCounter = 0;
968 var _mainElem = mainElem;
969 var _activeMessages = 0;
970
971 _mainElem.style.display = "none";
972
973 this.addStatus = function(newStatus)
974 {
975 _mainElem.style.display = "block";
976 var newStatusDiv = document.createElement("DIV");
977 var newStatusSpan = document.createElement("SPAN");
978
979 var workingImage = document.createElement("IMG");
980 workingImage.setAttribute("src", gs.imageURLs.loading);
981 workingImage.setAttribute("height", "16px");
982 workingImage.setAttribute("width", "16px");
983 newStatusDiv.appendChild(workingImage);
984
985 newStatusDiv.appendChild(newStatusSpan);
986 newStatusSpan.innerHTML = " " + newStatus;
987 newStatusDiv.setAttribute("class", "statusMessage");
988 newStatusDiv.span = newStatusSpan;
989
990 _mainElem.appendChild(newStatusDiv);
991 _statusMap["status" + _statusIDCounter] = newStatusDiv;
992 _activeMessages++;
993 return _statusIDCounter++;
994 }
995
996 this.changeStatus = function(id, newStatus)
997 {
998 if(_statusMap["status" + id])
999 {
1000 _statusMap["status" + id].span.innerHTML = " " + newStatus;
1001 }
1002 }
1003
1004 this.removeStatus = function(id)
1005 {
1006 if(_statusMap["status" + id])
1007 {
1008 removeFromParent(_statusMap["status" + id]);
1009
1010 if(--_activeMessages == 0)
1011 {
1012 _mainElem.style.display = "none";
1013 }
1014 }
1015 }
1016}
1017
1018/*
1019function toggleEdit(e)
1020{
1021 var mousePos = de.events.getXYInWindowFromEvent(e);
1022 var cDesc = de.cursor.getCursorDescAtXY(mousePos.x, mousePos.y, de.events.getEventTarget(e));
1023 de.cursor.setCursor(cDesc);
1024}
1025*/
Note: See TracBrowser for help on using the repository browser.