Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dojox.data.dom"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.data.dom"] = true;
dojo.provide("dojox.data.dom");

//DOM type to int value for reference.
//Ints make for more compact code than full constant names.
//ELEMENT_NODE                  = 1;
//ATTRIBUTE_NODE                = 2;
//TEXT_NODE                     = 3;
//CDATA_SECTION_NODE            = 4;
//ENTITY_REFERENCE_NODE         = 5;
//ENTITY_NODE                   = 6;
//PROCESSING_INSTRUCTION_NODE   = 7;
//COMMENT_NODE                  = 8;
//DOCUMENT_NODE                 = 9;
//DOCUMENT_TYPE_NODE            = 10;
//DOCUMENT_FRAGMENT_NODE        = 11;
//NOTATION_NODE                 = 12;

//FIXME:  Remove this file when possible.
//This file contains internal/helper APIs as holders until the true DOM apis of Dojo 0.9 are finalized.
//Therefore, these should not be generally used, they are present only for the use by XmlStore and the
//wires project until proper dojo replacements are available.  When such exist, XmlStore and the like
//will be ported off these and this file will be deleted.
dojo.experimental("dojox.data.dom");

dojox.data.dom.createDocument = function(/*string?*/ str, /*string?*/ mimetype){
        //      summary:
        //              cross-browser implementation of creating an XML document object.
        //
        //      str:
        //              Optional text to create the document from.  If not provided, an empty XML document will be created.
        //      mimetype:
        //              Optional mimetype of the text.  Typically, this is text/xml.  Will be defaulted to text/xml if not provided.
        var _document = dojo.doc;

        if(!mimetype){ mimetype = "text/xml"; }
        if(str && (typeof dojo.global["DOMParser"]) !== "undefined"){
                var parser = new DOMParser();
                return parser.parseFromString(str, mimetype);   //      DOMDocument
        }else if((typeof dojo.global["ActiveXObject"]) !== "undefined"){
                var prefixes = [ "MSXML2", "Microsoft", "MSXML", "MSXML3" ];
                for(var i = 0; i<prefixes.length; i++){
                        try{
                                var doc = new ActiveXObject(prefixes[i]+".XMLDOM");
                                if(str){
                                        if(doc){
                                                doc.async = false;
                                                doc.loadXML(str);
                                                return doc;     //      DOMDocument
                                        }else{
                                                console.log("loadXML didn't work?");
                                        }
                                }else{
                                        if(doc){ 
                                                return doc; //DOMDocument
                                        }
                                }
                        }catch(e){ /* squelch */ };
                }
        }else if((_document.implementation)&&
                (_document.implementation.createDocument)){
                if(str){
                        if(_document.createElement){
                                // FIXME: this may change all tags to uppercase!
                                var tmp = _document.createElement("xml");
                                tmp.innerHTML = str;
                                var xmlDoc = _document.implementation.createDocument("foo", "", null);
                                for(var i = 0; i < tmp.childNodes.length; i++) {
                                        xmlDoc.importNode(tmp.childNodes.item(i), true);
                                }
                                return xmlDoc;  //      DOMDocument
                        }
                }else{
                        return _document.implementation.createDocument("", "", null); // DOMDocument
                }
        }
        return null;    //      DOMDocument
}

dojox.data.dom.textContent = function(/*Node*/node, /*string?*/text){
        //      summary:
        //              Implementation of the DOM Level 3 attribute; scan node for text
        //      description:
        //              Implementation of the DOM Level 3 attribute; scan node for text
        //              This function can also update the text of a node by replacing all child 
        //              content of the node.
        //      node:
        //              The node to get the text off of or set the text on.
        //      text:
        //              Optional argument of the text to apply to the node.
        if(arguments.length>1){
                var _document = node.ownerDocument || dojo.doc;  //Preference is to get the node owning doc first or it may fail
                dojox.data.dom.replaceChildren(node, _document.createTextNode(text));
                return text;    //      string
        } else {
                if(node.textContent !== undefined){ //FF 1.5
                        return node.textContent;        //      string
                }
                var _result = "";
                if(node == null){
                        return _result; //empty string.
                }
                for(var i = 0; i < node.childNodes.length; i++){
                        switch(node.childNodes[i].nodeType){
                                case 1: // ELEMENT_NODE
                                case 5: // ENTITY_REFERENCE_NODE
                                        _result += dojox.data.dom.textContent(node.childNodes[i]);
                                        break;
                                case 3: // TEXT_NODE
                                case 2: // ATTRIBUTE_NODE
                                case 4: // CDATA_SECTION_NODE
                                        _result += node.childNodes[i].nodeValue;
                                        break;
                                default:
                                        break;
                        }
                }
                return _result; //      string
        }
}

dojox.data.dom.replaceChildren = function(/*Element*/node, /*Node || array*/ newChildren){
        //      summary:
        //              Removes all children of node and appends newChild. All the existing
        //              children will be destroyed.
        //      description:
        //              Removes all children of node and appends newChild. All the existing
        //              children will be destroyed.
        //      node:
        //              The node to modify the children on
        //      newChildren:
        //              The children to add to the node.  It can either be a single Node or an
        //              array of Nodes.
        var nodes = [];
        
        if(dojo.isIE){
                for(var i=0;i<node.childNodes.length;i++){
                        nodes.push(node.childNodes[i]);
                }
        }

        dojox.data.dom.removeChildren(node);
        for(var i=0;i<nodes.length;i++){
                dojo._destroyElement(nodes[i]);
        }

        if(!dojo.isArray(newChildren)){
                node.appendChild(newChildren);
        }else{
                for(var i=0;i<newChildren.length;i++){
                        node.appendChild(newChildren[i]);
                }
        }
}

dojox.data.dom.removeChildren = function(/*Element*/node){
        //      summary:
        //              removes all children from node and returns the count of children removed.
        //              The children nodes are not destroyed. Be sure to call dojo._destroyElement on them
        //              after they are not used anymore.
        //      node:
        //              The node to remove all the children from.
        var count = node.childNodes.length;
        while(node.hasChildNodes()){
                node.removeChild(node.firstChild);
        }
        return count; // int
}


dojox.data.dom.innerXML = function(/*Node*/node){
        //      summary:
        //              Implementation of MS's innerXML function.
        //      node:
        //              The node from which to generate the XML text representation.
        if(node.innerXML){
                return node.innerXML;   //      string
        }else if (node.xml){
                return node.xml;                //      string
        }else if(typeof XMLSerializer != "undefined"){
                return (new XMLSerializer()).serializeToString(node);   //      string
        }
}


}