var XML = new Singletone({
    toObject: function (node) {
        switch (node.nodeType) {
        
        case DOM.TEXT_NODE:
        case DOM.CDATA_SECTION_NODE:
            return node.nodeValue;
            
        case DOM.ELEMENT_NODE:
            var data = {};
            for (var i = 0; i < node.attributes.length; i ++) {
                if (node.attributes[i].nodeName != '_key') {
                    data[node.attributes[i].nodeName] = node.attributes[i].nodeValue;
                } 
            }
            var allow_text_nodes = true;
            for (var i = 0; i < node.childNodes.length; i ++) {
                var child = self.toObject(node.childNodes[i]);
                if (child instanceof Object) {
                    if (!(data instanceof Object)) {
                        data = {};
                    }
                    if (data.exists(child.name)) {
                        if (!(data[child.name] instanceof Array)) {
                            data[child.name] = [data[child.name]];
                        }
                        data[child.name].push(child.content);
//                    } else if (node.childNodes[i].hasAttribute && node.childNodes[i].hasAttribute('_key')) {
                    } else if (node.childNodes[i].getAttribute('_key') != null) {
                        data[child.name] = [child.content];
                    } else {
                        data[child.name] = child.content;
                    }
                    allow_text_nodes = false;
                } else if (allow_text_nodes) {
                    data = child;
                }
            }
            return {name: node.nodeName, content: data};
            
        case DOM.DOCUMENT_NODE:
            var data = self.toObject(node.documentElement);
            return data.content;
            
        default:
            // TODO:
            debug(node.nodeType);
        }
    }
});
