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

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

Collection will be rebuilt when metadata is changed

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