31 |
31 |
32 Rkns.$ = jQuery; |
32 Rkns.$ = jQuery; |
33 |
33 |
34 Rkns._ = _; |
34 Rkns._ = _; |
35 |
35 |
36 Rkns.Serializers = {}; |
36 Rkns.RemoteModels = {}; |
37 |
37 |
38 Rkns.Serializers._Base = function(_project) { |
38 Rkns.RemoteModels._Base = function(_project, _opts) { |
39 if (typeof _project !== "undefined") { |
39 if (typeof _project !== "undefined") { |
40 this._project = _project; |
40 this._project = _project; |
41 this._callbackQueue = []; |
41 this._callbackQueue = []; |
42 this._loaded = false; |
42 this._loaded = false; |
43 } |
43 } |
44 } |
44 } |
45 |
45 |
46 Rkns.Serializers._Base.prototype.deserialize = function() {} |
46 Rkns.RemoteModels._Base.prototype.fullSave |
|
47 = Rkns.RemoteModels._Base.prototype.addUser |
|
48 = Rkns.RemoteModels._Base.prototype.addNode |
|
49 = Rkns.RemoteModels._Base.prototype.addEdge |
|
50 = Rkns.RemoteModels._Base.prototype.updateNode |
|
51 = Rkns.RemoteModels._Base.prototype.updateEdge |
|
52 = Rkns.RemoteModels._Base.prototype.removeNode |
|
53 = Rkns.RemoteModels._Base.prototype.removeEdge |
|
54 = function() {} |
47 |
55 |
48 Rkns.Serializers._Base.prototype.deferCallback = function(_callback) { |
56 Rkns.RemoteModels._Base.prototype.deferCallback = function(_callback) { |
49 var _this = this; |
57 var _this = this; |
50 Rkns._.defer(function() { |
58 Rkns._.defer(function() { |
51 _callback.call(_this); |
59 _callback.call(_this); |
52 }); |
60 }); |
53 } |
61 } |
54 |
62 |
55 Rkns.Serializers._Base.prototype.handleCallbacks = function() { |
63 Rkns.RemoteModels._Base.prototype.handleCallbacks = function() { |
56 this._loaded = true; |
64 this._loaded = true; |
57 while (this._callbackQueue.length) { |
65 while (this._callbackQueue.length) { |
58 this.deferCallback(this._callbackQueue.splice(0,1)[0]); |
66 this.deferCallback(this._callbackQueue.splice(0,1)[0]); |
59 } |
67 } |
60 } |
68 } |
61 |
69 |
62 Rkns.Serializers._Base.prototype.onLoad = function(_callback) { |
70 Rkns.RemoteModels._Base.prototype.onLoad = function(_callback) { |
63 if (this._loaded) { |
71 if (this._loaded) { |
64 this.deferCallback(_callback); |
72 this.deferCallback(_callback); |
65 } else { |
73 } else { |
66 this._callbackQueue.push(_callback); |
74 this._callbackQueue.push(_callback); |
67 } |
75 } |
68 } |
76 } |
69 |
77 |
70 Rkns.Serializers._Base.prototype.save = function() {} |
78 Rkns.RemoteModels._Base.prototype.save = function() {} |
71 |
79 |
72 Rkns.Project = function(_opts) { |
80 Rkns.Bins = {} |
73 if (typeof _opts.serializer == "undefined") { |
81 |
74 _opts.serializer = "BasicJson"; |
82 Rkns.Bins._Base = function(_project) { |
|
83 if (typeof _project !== "undefined") { |
|
84 this._project = _project; |
|
85 } |
|
86 } |
|
87 |
|
88 Rkns.Bins._Base.prototype.baseTemplate = ''; |
|
89 |
|
90 Rkns.Bins._Base.prototype.addTab = function(_title) { |
|
91 var _tabDiv = Rkns.$('<div>'); |
|
92 _tabDiv.addClass('Rk-TabDiv') |
|
93 .css("display","none") |
|
94 .appendTo('.Rk-TabDivs'); |
|
95 var _tabButton = Rkns.$('<li>'); |
|
96 _tabButton.addClass('Rk-TabButton') |
|
97 .html(_title) |
|
98 .click(function() { |
|
99 Rkns.$('.Rk-TabButton').removeClass("active"); |
|
100 Rkns.$(this).addClass("active"); |
|
101 Rkns.$('.Rk-TabDiv').hide(); |
|
102 _tabDiv.show(); |
|
103 }) |
|
104 .appendTo('.Rk-TabButtons'); |
|
105 return { |
|
106 button: _tabButton, |
|
107 contents: _tabDiv |
|
108 } |
|
109 } |
|
110 |
|
111 /* Point of entry */ |
|
112 |
|
113 Rkns.Renkan = function(_opts) { |
|
114 if (typeof _opts.remotemodel == "undefined") { |
|
115 _opts.remotemodel = "BasicJson"; |
75 } |
116 } |
76 if (typeof _opts.language == "undefined" || typeof Rkns.i18n[_opts.language] == "undefined") { |
117 if (typeof _opts.language == "undefined" || typeof Rkns.i18n[_opts.language] == "undefined") { |
77 _opts.language = "en"; |
118 _opts.language = "en"; |
78 } |
119 } |
79 this.l10n = Rkns.i18n[_opts.language]; |
120 if (typeof _opts.container == "undefined") { |
80 this._opts = _opts; |
121 _opts.container = "renkan"; |
81 this.users = new Rkns.Model.List(); |
|
82 this.nodes = new Rkns.Model.List(); |
|
83 this.edges = new Rkns.Model.List(); |
|
84 if (typeof this._opts.user === "object") { |
|
85 this.current_user = this.addUser(this._opts.user) |
|
86 } |
122 } |
87 this.serializer = new Rkns.Serializers[_opts.serializer](this); |
123 this.project = new Rkns.ViewModel.Project(); |
88 this.renderer = new Rkns.Renderer.Scene(this); |
124 this.project.l10n = Rkns.i18n[_opts.language]; |
|
125 if (typeof _opts.user === "object") { |
|
126 this.current_user = this.project.addUser(_opts.user) |
|
127 } |
|
128 Rkns.$("#" + _opts.container).html(this.template()); |
|
129 this.project.remotemodel = new Rkns.RemoteModels[_opts.remotemodel](this.project, _opts); |
|
130 this.project.renderer = new Rkns.Renderer.Scene(this.project, _opts); |
89 var _this = this; |
131 var _this = this; |
90 this.serializer.onLoad(function() { |
132 /* if (typeof _opts.bins === "object") { |
91 if (typeof _this.current_user === "undefined") { |
133 this.bins = Rkns._(_opts.bins).map(function(_type) { |
92 _this.current_user = _proj.users[0]; |
134 return new Rkns.Bins[_type](_this); |
|
135 }); |
|
136 Rkns.$('.Rk-TabButton:last').addClass("active"); |
|
137 Rkns.$('.Rk-TabDiv:last').show(); |
|
138 } */ |
|
139 this.project.remotemodel.onLoad(function() { |
|
140 if (typeof _this.project.current_user === "undefined") { |
|
141 _this.project.current_user = _this.project.users[0]; |
93 } |
142 } |
94 _this.renderer.draw(); |
143 _this.project.renderer.draw(); |
95 }); |
144 }); |
96 } |
145 } |
97 |
146 |
98 Rkns.Project.prototype.addNode = function(_props, _render_save) { |
147 Rkns.Renkan.prototype.template = Rkns._.template( |
99 var _node = new Rkns.Model.Node(this, _props); |
148 '<div class="Rk-Bins"></div><div class="Rk-Render"></div>' |
100 this.nodes.push(_node); |
149 ); |
101 if (typeof _render_save !== "undefined" && (_render_save&Rkns._RENDER)) { |
|
102 var _controller = this.renderer.addController("Node", _node); |
|
103 _controller.redraw(); |
|
104 } |
|
105 if (typeof _render_save !== "undefined" && (_render_save&Rkns._SAVE)) { |
|
106 this.serializer.save(); |
|
107 } |
|
108 return _node; |
|
109 } |
|
110 |
|
111 Rkns.Project.prototype.addEdge = function(_props, _render_save) { |
|
112 var _edge = new Rkns.Model.Edge(this, _props); |
|
113 this.edges.push(_edge); |
|
114 if (typeof _render_save !== "undefined" && (_render_save&Rkns._RENDER)) { |
|
115 var _controller = this.renderer.addController("Edge", _edge); |
|
116 _controller.redraw(); |
|
117 } |
|
118 if (typeof _render_save !== "undefined" && (_render_save&Rkns._SAVE)) { |
|
119 this.serializer.save(); |
|
120 } |
|
121 return _edge; |
|
122 } |
|
123 |
|
124 Rkns.Project.prototype.addUser = function(_props, _render_save) { |
|
125 var _user = new Rkns.Model.User(this, _props); |
|
126 this.users.push(_user); |
|
127 return _user; |
|
128 } |
|
129 |
|
130 Rkns.Project.prototype.updateElement = function(_element, _props, _render_save) { |
|
131 Rkns._(_props).each(function(_v, _k) { |
|
132 _element[_k] = _v; |
|
133 }); |
|
134 if (typeof _render_save !== "undefined" && (_render_save&Rkns._RENDER)) { |
|
135 if (typeof _element.__controller !== "undefined") { |
|
136 _element.__controller.redraw(); |
|
137 } else { |
|
138 this._renderer.redraw(); |
|
139 } |
|
140 } |
|
141 if (typeof _render_save !== "undefined" && (_render_save&Rkns._SAVE)) { |
|
142 this.serializer.save(); |
|
143 } |
|
144 } |
|
145 |
|
146 Rkns.Project.prototype.removeNode = function(_node, _render_save) { |
|
147 this.nodes.removeId(_node.id); |
|
148 if (typeof _node.__controller !== "undefined") { |
|
149 this.renderer.removeController(_node.__controller); |
|
150 } |
|
151 var _this = this; |
|
152 this.edges = this.edges.filter(function(_edge) { |
|
153 var _keep = _edge.from !== _node && _edge.to !== _node; |
|
154 if (!_keep && typeof _edge.__controller !== "undefined") { |
|
155 _this.renderer.removeController(_edge.__controller); |
|
156 } |
|
157 return _keep; |
|
158 }); |
|
159 if (typeof _render_save !== "undefined" && (_render_save&Rkns._RENDER)) { |
|
160 this.renderer.redraw(); |
|
161 } |
|
162 if (typeof _render_save !== "undefined" && (_render_save&Rkns._SAVE)) { |
|
163 this.serializer.save(); |
|
164 } |
|
165 return _node; |
|
166 } |
|
167 |
|
168 Rkns.Project.prototype.removeEdge = function(_edge, _render_save) { |
|
169 this.edges.removeId(_edge.id); |
|
170 if (typeof _edge.__controller !== "undefined") { |
|
171 this.renderer.removeController(_edge.__controller); |
|
172 } |
|
173 if (typeof _render_save !== "undefined" && (_render_save&Rkns._RENDER)) { |
|
174 this.renderer.redraw(); |
|
175 } |
|
176 if (typeof _render_save !== "undefined" && (_render_save&Rkns._SAVE)) { |
|
177 this.serializer.save(); |
|
178 } |
|
179 return _edge; |
|
180 } |
|
181 |
150 |
182 /* Utility functions */ |
151 /* Utility functions */ |
183 |
152 |
184 Rkns.Utils = { |
153 Rkns.Utils = { |
185 _ID_AUTO_INCREMENT : 0, |
154 _ID_AUTO_INCREMENT : 0, |