f6fae6486129009870638a5e3102fa861ad1f0d9
[fnpeditor.git] / src / smartxml / smartxml.js
1 define([
2     'libs/jquery'
3 ], function($) {
4     
5 'use strict';
6
7
8 var parseXML = function(xml) {
9     return $(xml)[0];
10 }
11
12 var Document = function(nativeNode) {
13     var $document = $(nativeNode);
14
15
16     Object.defineProperty(this, 'root', {get: function() { return new ElementNode($document[0])}}); 
17 }
18
19
20 var ElementNode = function(nativeNode) {
21     this.nativeNode = nativeNode;
22     this._$ = $(nativeNode);
23 };
24
25 $.extend(ElementNode.prototype, {
26     nodeType: Node.ELEMENT_NODE,
27
28     getTagName: function() {
29         return this.nativeNode.tagName.toLowerCase();
30     },
31
32     append: function(documentNode) {
33         this._$.append(documentNode.nativeNode);
34     },
35
36     contents: function() {
37         var toret = [];
38         this._$.contents().each(function() {
39             if(this.nodeType === Node.ELEMENT_NODE)
40                 toret.push(new ElementNode(this));
41             else if(this.nodeType === Node.TEXT_NODE)
42                 toret.push(new TextNode(this));
43         });
44         return toret;
45     },
46
47
48     sameNode: function(otherNode) {
49         return this.nativeNode === otherNode.nativeNode;
50     }
51
52 });
53
54 var TextNode = function(nativeNode) {
55     this.nativeNode = nativeNode;
56     this._$ = $(nativeNode);
57 }
58
59 $.extend(TextNode.prototype, {
60     nodeType: Node.TEXT_NODE
61 })
62
63
64 return {
65     documentFromXML: function(xml) {
66         return new Document(parseXML(xml));
67     },
68
69     elementNodeFromXML: function(xml) {
70         return new ElementNode(parseXML(xml));
71     }
72 };
73
74 });