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

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

Added the ability to edit the document directly on the page

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