﻿C4.Util.Xml = function(){

};

var Xml = C4.Util.Xml;

C4.Util.Xml.GetNamedValue = function(node, name, defaultValue, searchDescendants){
	if(!node || !name){
		return defaultValue;
	}
	var nodeValue = defaultValue;
    var attrNode = node.attributes.getNamedItem(name);
    if(attrNode) {
    	nodeValue = attrNode.value;
    } else {
        if (searchDescendants) {
            var childNode = node.getElementsByTagName(name);
            if(childNode && childNode.item(0) && childNode.item(0).firstChild) {
                nodeValue = childNode.item(0).firstChild.nodeValue;
    	    }else{
    	        // try to strip namespace for FireFox
    	        var index = name.indexOf(':');
    	        if(index > 0){
    	            return this.getNamedValue(node, name.substr(index+1), defaultValue);
    	        }
    	    }
    	} else {
            for (var i = 0; i < node.childNodes.length; i++) {
	            if (node.childNodes[i].nodeName == name) {
	                if (node.childNodes[i].firstChild) {
	                    nodeValue = node.childNodes[i].firstChild.nodeValue;
	                } else {
	                    nodeValue = '';
	                }
	            }
	        }
    	}
    }
    return nodeValue;
};


C4.Util.Xml.SetNamedValue = function(node, name, value){
	if(!node || !name){
		return;
	}
	var attrNode = node.attributes.getNamedItem(name);
    if(attrNode) {
    	attrNode.value = value;
    	return;
    }
    var childNode = node.getElementsByTagName(name);
    if(childNode && childNode.item(0)) {
        if (childNode.item(0).firstChild) {
            childNode.item(0).firstChild.nodeValue = value;
        } else {
            childNode.item(0).appendChild(node.ownerDocument.createTextNode(value));
        }
    }else{
	    // try to strip namespace for FireFox
	    var index = name.indexOf(':');
	    if(index > 0){
	        C4.Util.Xml.SetNamedValue(node, name.substr(index+1), value);
	    }
	}
};


C4.Util.Xml.ToString = function(node){
    var markup;
    if( Ext.isIE ) 
    {
        var xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
        xmlDocument = node;
        markup = xmlDocument.xml;
    } 
    else 
    {
        var xmlSerializer = new XMLSerializer();
        markup = xmlSerializer.serializeToString(node); 
    }
    
    return markup;

};




C4.Util.Xml.CreateDocument = function(xmlString){
    var xmlDocument;
    if( Ext.isIE ) {
      xmlDocument = new ActiveXObject("Microsoft.XMLDOM");
      xmlDocument.async = "false";
      xmlDocument.loadXML(xmlString);
    } 
    else 
    {  
        var parser = new DOMParser();
        xmlDocument = parser.parseFromString(xmlString,"text/xml");    
    }
    
    return xmlDocument;

};



C4.Util.Xml.RemoveAllChildren = function(node, ChildNodeName){
    
    if (ChildNodeName) {
        var children = Ext.DomQuery.select('/' + ChildNodeName, node);
        
        for (var i = 0, c; c = children[i]; i++) {
            c.parentNode.removeChild(c);
        }
    } else {
        while(node.firstChild){
            node.removeChild(node.firstChild);
        }
    }
};




C4.Util.Xml.CreateDom = function(o, parentNode) {
    if(!parentNode) parentNode = document;
    var el = parentNode.ownerDocument.createElement(o.tag||'div');
    //var useSet = el.setAttribute ? true : false; 
    for(var attr in o){
        if(attr == "tag" || attr == "children" || attr == "cn" || attr == "text" || attr == "cdata" || attr == "style" || typeof o[attr] == "function") continue;
        if(attr=="cls"){
            el.className = o["cls"];
        }else{
        /*
            if(useSet) el.setAttribute(attr, o[attr]);
            else el[attr] = o[attr];
        */
            try {
                el.setAttribute(attr, o[attr]);
            } catch (e) {
                el[attr] = o[attr];
            }
        }
    }
    Ext.DomHelper.applyStyles(el, o.style);
    var cn = o.children || o.cn;
    if(cn){
        if(cn instanceof Array){
            for(var i = 0, len = cn.length; i < len; i++) {
                C4.Util.Xml.CreateDom(cn[i], el);
            }
        }else{
            C4.Util.Xml.CreateDom(cn, el);
        }
    }
    if(o.text){
        var text = parentNode.ownerDocument.createTextNode(o.text);
        el.appendChild(text);
    }
    if(o.cdata){
        var cdata = parentNode.ownerDocument.createCDATASection(o.cdata);
        el.appendChild(cdata);
    }
    if(parentNode){
       parentNode.appendChild(el);
    }
    return el;
};



    
C4.Util.Xml.Append = function(x, o){
    x = Ext.getDom(x);
    var newNode = C4.Util.Xml.CreateDom(o, x);
    x.appendChild(newNode);
    
    return newNode;
};




