5e3983e3cfe9eb135e2461a1aa9fa8b46e5488be
[fnpeditor.git] / modules / documentCanvas / canvas / documentElement.js
1 define([
2 'libs/jquery-1.9.1.min'
3 ], function($) {
4     
5 'use strict';
6
7 // DocumentElement represents a node from WLXML document rendered inside Canvas
8 var DocumentElement = function(htmlElement) {
9     if(arguments.length === 0)
10         return;
11     this.$element = $(htmlElement);
12     this.wlxmlTag = this.$element.prop('tagName');
13 };
14
15 $.extend(DocumentElement.prototype, {
16     children: function() {
17         var toret = [];
18         if(this instanceof DocumentTextElement)
19             return toret;
20
21
22         var elementContent = this.$element.contents();
23         elementContent.each(function(idx) {
24             var element = documentElementFromHTMLElement(this);
25             if(idx === 0 && elementContent.length > 1 && elementContent[1].nodeType === Node.ELEMENT_NODE && (element instanceof DocumentTextElement) && $.trim($(this).text()) === '')
26                 return true;
27             if(idx > 0 && element instanceof DocumentTextElement) {
28                 if(toret[toret.length-1] instanceof DocumentNodeElement && $.trim($(this).text()) === '')
29                     return true;
30             }
31             toret.push(element);
32         });
33         return toret;
34     },
35     parent: function() {
36         return documentElementFromHTMLElement(this.$element.parent()[0]);
37     },
38
39     sameNode: function(other) {
40         return other && (typeof other === typeof this) && other.$element[0] === this.$element[0];
41     },
42
43     wrapWithNodeElement: function(wlxmlNode) {
44         this.$element.wrap($('<' + wlxmlNode.tag + ' class="' + wlxmlNode.klass + '"">')[0]);
45         return documentElementFromHTMLElement(this.$element.parent().get(0));
46     }
47 });
48
49 var DocumentNodeElement = function(htmlElement) {
50     DocumentElement.call(this, htmlElement);
51 };
52
53 var DocumentTextElement = function(htmlElement) {
54     DocumentElement.call(this, htmlElement);  
55 };
56
57 DocumentNodeElement.prototype = new DocumentElement();
58 DocumentTextElement.prototype = new DocumentElement();
59
60 $.extend(DocumentNodeElement.prototype, {
61     append: function(params) {
62         var to_append = DocumentNodeElement.createDOM(params.tag, params.klass);
63         this.$element.append(to_append);
64         return documentElementFromHTMLElement(to_append);
65     },
66     after: function(params) {
67         var to_append = DocumentNodeElement.createDOM(params.tag, params.klass);
68         this.$element.after(to_append);
69         return documentElementFromHTMLElement(to_append);   
70     }
71 });
72
73 DocumentNodeElement.createDOM = function(tag, klass) {
74     var dom = $('<' + tag + '>');
75     if(klass)
76         dom.attr('class', klass);
77     return dom;
78 };
79
80 var documentElementFromHTMLElement = function(htmlElement) {
81     if(htmlElement.nodeType === Node.ELEMENT_NODE)
82         return new DocumentNodeElement(htmlElement);
83     if(htmlElement.nodeType === Node.TEXT_NODE)
84         return new DocumentTextElement(htmlElement);
85 };
86
87 return {
88     wrap: function(htmlElement) {
89         return documentElementFromHTMLElement(htmlElement);
90     },
91     DocumentElement: DocumentElement,
92     DocumentNodeElement: DocumentNodeElement,
93     DocumentTextElement: DocumentTextElement
94 };
95
96 });