// ********************************************************************** // // Visual XML Editor // // This class represents an editor that allows you to modify XML visually // // ********************************************************************** // function visualXMLEditor(xmlString) { var _globalID = 0; var _xml; var _mainDiv = $("
", {"id":"veMainDiv"}); var _toolboxDiv = $("
", {"id":"veToolboxDiv"}); var _editorContainer = $("
", {"id":"veEditorContainer"}); var _editorDiv = $("
", {"id":"veEditorDiv"}); var _infoDiv = $("
", {"id":"veInfoDiv"}); var _rootElement; var _selectedElement; var _validDropSpot = false; var _validDropType; var _validDropElem; var _origDDParent; var _origDDPosition; var _overList = new Array(); _overList.freeSpaces = new Array(); var _transactions = new Array(); var _childRestrictions = { gsf: { "choose-metadata":["gsf:metadata", "gsf:default"], "metadata":[] } }; this.getXML = function() { return _xml; } this.undo = function() { if(_transactions.length > 0) { var t = _transactions.pop(); //Undo an added element if(t.type == "addElem") { $(t.vElem.data("parentVEElement").getXMLNode()).remove(); t.vElem.remove(); resizeAll(); } //Undo a removed or moved element else if(t.type == "remMvElem") { var parent = t.vElemParent; var pos = t.vElemPos; var elem = t.vElem; elem.detach(); if(pos == 0) { parent.prepend(elem); $(parent.parent().data("parentVEElement").getXMLNode()).prepend(elem.data("parentVEElement").getXMLNode()); } else if(pos == parent.children(".veElement").length) { $(parent.children(".veElement").eq(pos - 1).data("parentVEElement").getXMLNode()).after(elem.data("parentVEElement").getXMLNode()); parent.children(".veElement").eq(pos - 1).after(elem); } else { $(parent.children(".veElement").eq(pos).data("parentVEElement").getXMLNode()).before(elem.data("parentVEElement").getXMLNode()); parent.children(".veElement").eq(pos).before(elem); } resizeAll(); } //Undo an added attribute else if(t.type == "addAttr") { if(t.row) { t.row.remove(); } } //Undo a removed or edited attribute else if(t.type == "editAttr") { t.elem.removeAttribute(t.newName); t.elem.setAttribute(t.name, t.value); if(t.row) { t.row.children("td").eq(0).text(t.name); t.row.children("td").eq(1).text(t.value); } } //Undo a removed or edited attribute else if(t.type == "remAttr") { t.elem.setAttribute(t.name, t.value); if(t.rowParent) { t.rowParent.append(t.row); } } //Undo edited text else if(t.type == "editText") { t.elem.nodeValue = t.value; if(t.vElem) { t.vElem.text(t.value); } } } } var checkRestricted = function(child, parent) { var pFullNodename = parent.tagName; var cFullNodename = child.tagName; var pNamespace; var pNodeName; if(pFullNodename.indexOf(":") == -1) { pNamespace = "no namespace"; pNodeName = pFullNodename; } else { pNamespace = pFullNodename.substring(0, pFullNodename.indexOf(":")); pNodeName = pFullNodename.substring(pFullNodename.indexOf(":") + 1); } var namespaceList = _childRestrictions[pNamespace]; if(namespaceList) { var childList = namespaceList[pNodeName]; if(childList) { for(var i = 0; i < childList.length; i++) { if(childList[i] == cFullNodename) { return true; } } return false; } } return true; } var populateToolbar = function() { var elemList = { html:["a", "br", "div", "li", "link", "script", "span", "table", "td", "tr", "ul"], xsl: [ "apply-imports", "apply-templates", "attribute", "attribute-set", "call-template", "choose", "copy", "copy-of", "decimal-format", "element", "fallback", "for-each", "if", "import", "include", "key", "message", "namespace-alias", "number", "otherwise", "output", "param", "preserve-space", "processing-instruction", "sort", "strip-space", "stylesheet", "template", "text", "transform", "value-of", "variable", "when", "with-param" ], gsf: [ "cgi-param", "choose-metadata", "collectionText", "displayItem", "displayText", "equivlinkgs3", "foreach-metadata", "icon", "if-metadata-exists", "image", "interfaceText", "link", "meta-value", "metadata", "script", "style", "switch", "template", "text", "variable" ] }; var tabHolder = $("