canvas api: prepending element to node element
[fnpeditor.git] / modules / documentCanvas / canvas / wlxmlManagers.js
1 define([
2 'libs/jquery-1.9.1.min',
3 'modules/documentCanvas/canvas/widgets'
4 ], function($, widgets) {
5     
6 'use strict';
7
8
9 var DocumentElementWrapper = function(documentElement) {
10     
11     this.documentElement = documentElement;
12
13     this.addWidget = function(widget) {
14         documentElement.dom().find('.canvas-widgets').append(widget);
15     };
16
17     this.clearWidgets = function() {
18         documentElement.dom().find('.canvas-widgets').empty();
19     }
20
21     this.setDisplayStyle = function(displayStyle) {
22         documentElement.dom().css('display', displayStyle);
23         documentElement._container().css('display', displayStyle);
24     };
25
26     this.tag = function() {
27         return documentElement.getWlxmlTag();
28     };
29
30     this.klass = function() {
31         return documentElement.getWlxmlClass();
32     };
33
34     this.toggle = function(toggle) {
35         documentElement._container().toggle(toggle);
36     }
37
38     var eventBus = documentElement.bound() ? documentElement.canvas.eventBus :
39         {trigger: function() {}};
40     this.trigger = function() {
41         eventBus.trigger.apply(eventBus, arguments);
42     }
43
44 }
45
46 var getDisplayStyle = function(tag, klass) {
47     if(tag === 'metadata')
48         return 'none';
49     if(tag === 'span')
50         return 'inline';
51     return 'block';
52 }
53
54 var GenericManager = function(wlxmlElement) {
55     this.el = wlxmlElement;
56 };
57
58 $.extend(GenericManager.prototype, {
59     setup: function() {
60         this.el.setDisplayStyle(getDisplayStyle(this.el.tag(), this.el.klass()));
61
62         this.el.clearWidgets();
63         this.el.addWidget(widgets.labelWidget(this.el.tag(), this.el.klass()));
64
65     },
66     toggle: function(toggle) {
67         this.el.toggle(toggle);
68     }
69
70 })
71
72 var managers = {
73     _m: {},
74     set: function(tag, klass, manager) {
75         if(!this._m[tag])
76             this._m[tag] = {};
77         this._m[tag][klass] = manager;
78     },
79     get: function(tag,klass) {
80         if(this._m[tag] && this._m[tag][klass])
81             return this._m[tag][klass];
82         return GenericManager;
83     }
84 }
85
86 var FootnoteManager = function(wlxmlElement) {
87     this.el = wlxmlElement;
88 };
89 $.extend(FootnoteManager.prototype, {
90     setup: function() {
91         this.el.clearWidgets();
92
93         var clickHandler = function() {
94             this.toggle(true);
95         }.bind(this);
96         this.footnoteHandler = widgets.footnoteHandler(clickHandler);
97         this.el.addWidget(this.footnoteHandler);
98
99         var closeHandler = function() {
100             this.toggle(false);
101
102         }.bind(this);
103         this.hideButton = widgets.hideButton(closeHandler);
104         this.el.addWidget(this.hideButton);
105
106         this.toggle(false, {silent: true});
107     },
108     toggle: function(toggle, options) {
109         options = options || {};
110         this.hideButton.toggle(toggle);
111         this.footnoteHandler.toggle(!toggle);
112         
113         this.el.setDisplayStyle(toggle ? 'block' : 'inline');
114         this.el.toggle(toggle);
115         if(!options.silent)
116             this.el.trigger('elementToggled', toggle, this.el.documentElement);
117     }
118 })
119 managers.set('aside', 'footnote', FootnoteManager);
120
121
122 return {
123     getFor: function(documentElement) {
124         var wlxmlElement = new DocumentElementWrapper(documentElement);
125         return new (managers.get(wlxmlElement.tag(), wlxmlElement.klass()))(wlxmlElement);
126
127     }
128 };
129
130 });