root / snf-cyclades-app / synnefo / ui / static / snf / js / lib / rivets.js @ aedcb7f3
History | View | Annotate | Download (33 kB)
1 | 6dcc461e | Kostas Papadimitriou | // Rivets.js
|
---|---|---|---|
2 | 6dcc461e | Kostas Papadimitriou | // version: 0.5.10
|
3 | 6dcc461e | Kostas Papadimitriou | // author: Michael Richards
|
4 | 6dcc461e | Kostas Papadimitriou | // license: MIT
|
5 | 6dcc461e | Kostas Papadimitriou | (function() {
|
6 | 6dcc461e | Kostas Papadimitriou | var Rivets,
|
7 | 6dcc461e | Kostas Papadimitriou | __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, |
8 | 6dcc461e | Kostas Papadimitriou | __slice = [].slice, |
9 | 6dcc461e | Kostas Papadimitriou | __hasProp = {}.hasOwnProperty, |
10 | 6dcc461e | Kostas Papadimitriou | __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
11 | 6dcc461e | Kostas Papadimitriou | __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; |
12 | 6dcc461e | Kostas Papadimitriou | |
13 | 6dcc461e | Kostas Papadimitriou | Rivets = {}; |
14 | 6dcc461e | Kostas Papadimitriou | |
15 | 6dcc461e | Kostas Papadimitriou | if (!String.prototype.trim) {
|
16 | 6dcc461e | Kostas Papadimitriou | String.prototype.trim = function() { |
17 | 6dcc461e | Kostas Papadimitriou | return this.replace(/^\s+|\s+$/g, ''); |
18 | 6dcc461e | Kostas Papadimitriou | }; |
19 | 6dcc461e | Kostas Papadimitriou | } |
20 | 6dcc461e | Kostas Papadimitriou | |
21 | 6dcc461e | Kostas Papadimitriou | Rivets.Binding = (function() {
|
22 | 6dcc461e | Kostas Papadimitriou | function Binding(view, el, type, key, keypath, options) { |
23 | 6dcc461e | Kostas Papadimitriou | var identifier, regexp, value, _ref;
|
24 | 6dcc461e | Kostas Papadimitriou | |
25 | 6dcc461e | Kostas Papadimitriou | this.view = view;
|
26 | 6dcc461e | Kostas Papadimitriou | this.el = el;
|
27 | 6dcc461e | Kostas Papadimitriou | this.type = type;
|
28 | 6dcc461e | Kostas Papadimitriou | this.key = key;
|
29 | 6dcc461e | Kostas Papadimitriou | this.keypath = keypath;
|
30 | 6dcc461e | Kostas Papadimitriou | this.options = options != null ? options : {}; |
31 | 6dcc461e | Kostas Papadimitriou | this.update = __bind(this.update, this); |
32 | 6dcc461e | Kostas Papadimitriou | this.unbind = __bind(this.unbind, this); |
33 | 6dcc461e | Kostas Papadimitriou | this.bind = __bind(this.bind, this); |
34 | 6dcc461e | Kostas Papadimitriou | this.publish = __bind(this.publish, this); |
35 | 6dcc461e | Kostas Papadimitriou | this.sync = __bind(this.sync, this); |
36 | 6dcc461e | Kostas Papadimitriou | this.set = __bind(this.set, this); |
37 | 6dcc461e | Kostas Papadimitriou | this.eventHandler = __bind(this.eventHandler, this); |
38 | 6dcc461e | Kostas Papadimitriou | this.formattedValue = __bind(this.formattedValue, this); |
39 | 6dcc461e | Kostas Papadimitriou | if (!(this.binder = Rivets.internalBinders[this.type] || this.view.binders[type])) { |
40 | 6dcc461e | Kostas Papadimitriou | _ref = this.view.binders;
|
41 | 6dcc461e | Kostas Papadimitriou | for (identifier in _ref) { |
42 | 6dcc461e | Kostas Papadimitriou | value = _ref[identifier]; |
43 | 6dcc461e | Kostas Papadimitriou | if (identifier !== '*' && identifier.indexOf('*') !== -1) { |
44 | 6dcc461e | Kostas Papadimitriou | regexp = new RegExp("^" + (identifier.replace('*', '.+')) + "$"); |
45 | 6dcc461e | Kostas Papadimitriou | if (regexp.test(type)) {
|
46 | 6dcc461e | Kostas Papadimitriou | this.binder = value;
|
47 | 6dcc461e | Kostas Papadimitriou | this.args = new RegExp("^" + (identifier.replace('*', '(.+)')) + "$").exec(type); |
48 | 6dcc461e | Kostas Papadimitriou | this.args.shift();
|
49 | 6dcc461e | Kostas Papadimitriou | } |
50 | 6dcc461e | Kostas Papadimitriou | } |
51 | 6dcc461e | Kostas Papadimitriou | } |
52 | 6dcc461e | Kostas Papadimitriou | } |
53 | 6dcc461e | Kostas Papadimitriou | this.binder || (this.binder = this.view.binders['*']); |
54 | 6dcc461e | Kostas Papadimitriou | if (this.binder instanceof Function) { |
55 | 6dcc461e | Kostas Papadimitriou | this.binder = {
|
56 | 6dcc461e | Kostas Papadimitriou | routine: this.binder |
57 | 6dcc461e | Kostas Papadimitriou | }; |
58 | 6dcc461e | Kostas Papadimitriou | } |
59 | 6dcc461e | Kostas Papadimitriou | this.formatters = this.options.formatters || []; |
60 | 6dcc461e | Kostas Papadimitriou | this.model = this.key ? this.view.models[this.key] : this.view.models; |
61 | 6dcc461e | Kostas Papadimitriou | } |
62 | 6dcc461e | Kostas Papadimitriou | |
63 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.formattedValue = function(value) { |
64 | 6dcc461e | Kostas Papadimitriou | var args, formatter, id, _i, _len, _ref;
|
65 | 6dcc461e | Kostas Papadimitriou | |
66 | 6dcc461e | Kostas Papadimitriou | _ref = this.formatters;
|
67 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
68 | 6dcc461e | Kostas Papadimitriou | formatter = _ref[_i]; |
69 | 6dcc461e | Kostas Papadimitriou | args = formatter.split(/\s+/);
|
70 | 6dcc461e | Kostas Papadimitriou | id = args.shift(); |
71 | 6dcc461e | Kostas Papadimitriou | |
72 | 6dcc461e | Kostas Papadimitriou | // lookup formatters on all view models
|
73 | 6dcc461e | Kostas Papadimitriou | var modelFormatter = this.model[id]; |
74 | 6dcc461e | Kostas Papadimitriou | if (!(modelFormatter instanceof Function)) { |
75 | 6dcc461e | Kostas Papadimitriou | _.each(this.view.models, function(m) { |
76 | 6dcc461e | Kostas Papadimitriou | if (m[id] && m[id] instanceof Function) { |
77 | 6dcc461e | Kostas Papadimitriou | modelFormatter = m[id]; |
78 | 6dcc461e | Kostas Papadimitriou | } |
79 | 6dcc461e | Kostas Papadimitriou | }); |
80 | 6dcc461e | Kostas Papadimitriou | } |
81 | 6dcc461e | Kostas Papadimitriou | |
82 | 6dcc461e | Kostas Papadimitriou | formatter = modelFormatter instanceof Function ? modelFormatter : this.view.formatters[id]; |
83 | 6dcc461e | Kostas Papadimitriou | if ((formatter != null ? formatter.read : void 0) instanceof Function) { |
84 | 6dcc461e | Kostas Papadimitriou | value = formatter.read.apply(formatter, [value].concat(__slice.call(args))); |
85 | 6dcc461e | Kostas Papadimitriou | } else if (formatter instanceof Function) { |
86 | 6dcc461e | Kostas Papadimitriou | value = formatter.apply(null, [value].concat(__slice.call(args)));
|
87 | 6dcc461e | Kostas Papadimitriou | } |
88 | 6dcc461e | Kostas Papadimitriou | } |
89 | 6dcc461e | Kostas Papadimitriou | return value;
|
90 | 6dcc461e | Kostas Papadimitriou | }; |
91 | 6dcc461e | Kostas Papadimitriou | |
92 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.eventHandler = function(fn) { |
93 | 6dcc461e | Kostas Papadimitriou | var binding, handler;
|
94 | 6dcc461e | Kostas Papadimitriou | |
95 | 6dcc461e | Kostas Papadimitriou | handler = (binding = this).view.config.handler;
|
96 | 6dcc461e | Kostas Papadimitriou | return function(ev) { |
97 | 6dcc461e | Kostas Papadimitriou | return handler.call(fn, this, ev, binding); |
98 | 6dcc461e | Kostas Papadimitriou | }; |
99 | 6dcc461e | Kostas Papadimitriou | }; |
100 | 6dcc461e | Kostas Papadimitriou | |
101 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.set = function(value) { |
102 | 6dcc461e | Kostas Papadimitriou | var _ref;
|
103 | 6dcc461e | Kostas Papadimitriou | value = value instanceof Function && !this.binder["function"] ? this.formattedValue(value.call(this.model)) : this.formattedValue(value); |
104 | 6dcc461e | Kostas Papadimitriou | if (this.keypath.indexOf('nics') >= 0) { |
105 | 6dcc461e | Kostas Papadimitriou | } |
106 | 6dcc461e | Kostas Papadimitriou | return (_ref = this.binder.routine) != null ? _ref.call(this, this.el, value) : void 0; |
107 | 6dcc461e | Kostas Papadimitriou | }; |
108 | 6dcc461e | Kostas Papadimitriou | |
109 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.sync = function() { |
110 | 6dcc461e | Kostas Papadimitriou | return this.set(this.options.bypass ? this.model[this.keypath] : this.view.config.adapter.read(this.model, this.keypath)); |
111 | 6dcc461e | Kostas Papadimitriou | }; |
112 | 6dcc461e | Kostas Papadimitriou | |
113 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.publish = function() { |
114 | 6dcc461e | Kostas Papadimitriou | var args, formatter, id, value, _i, _len, _ref, _ref1, _ref2;
|
115 | 6dcc461e | Kostas Papadimitriou | |
116 | 6dcc461e | Kostas Papadimitriou | value = Rivets.Util.getInputValue(this.el);
|
117 | 6dcc461e | Kostas Papadimitriou | _ref = this.formatters.slice(0).reverse(); |
118 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
119 | 6dcc461e | Kostas Papadimitriou | formatter = _ref[_i]; |
120 | 6dcc461e | Kostas Papadimitriou | args = formatter.split(/\s+/);
|
121 | 6dcc461e | Kostas Papadimitriou | id = args.shift(); |
122 | 6dcc461e | Kostas Papadimitriou | if ((_ref1 = this.view.formatters[id]) != null ? _ref1.publish : void 0) { |
123 | 6dcc461e | Kostas Papadimitriou | value = (_ref2 = this.view.formatters[id]).publish.apply(_ref2, [value].concat(__slice.call(args)));
|
124 | 6dcc461e | Kostas Papadimitriou | } |
125 | 6dcc461e | Kostas Papadimitriou | } |
126 | 6dcc461e | Kostas Papadimitriou | return this.view.config.adapter.publish(this.model, this.keypath, value); |
127 | 6dcc461e | Kostas Papadimitriou | }; |
128 | 6dcc461e | Kostas Papadimitriou | |
129 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.bind = function() { |
130 | 6dcc461e | Kostas Papadimitriou | var dependency, keypath, model, _i, _len, _ref, _ref1, _ref2, _results;
|
131 | 6dcc461e | Kostas Papadimitriou | |
132 | 6dcc461e | Kostas Papadimitriou | if ((_ref = this.binder.bind) != null) { |
133 | 6dcc461e | Kostas Papadimitriou | _ref.call(this, this.el); |
134 | 6dcc461e | Kostas Papadimitriou | } |
135 | 6dcc461e | Kostas Papadimitriou | if (this.options.bypass) { |
136 | 6dcc461e | Kostas Papadimitriou | this.sync();
|
137 | 6dcc461e | Kostas Papadimitriou | } else {
|
138 | 6dcc461e | Kostas Papadimitriou | this.view.config.adapter.subscribe(this.model, this.keypath, this.sync); |
139 | 6dcc461e | Kostas Papadimitriou | if (this.view.config.preloadData) { |
140 | 6dcc461e | Kostas Papadimitriou | this.sync();
|
141 | 6dcc461e | Kostas Papadimitriou | } |
142 | 6dcc461e | Kostas Papadimitriou | } |
143 | 6dcc461e | Kostas Papadimitriou | if ((_ref1 = this.options.dependencies) != null ? _ref1.length : void 0) { |
144 | 6dcc461e | Kostas Papadimitriou | _ref2 = this.options.dependencies;
|
145 | 6dcc461e | Kostas Papadimitriou | _results = []; |
146 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref2.length; _i < _len; _i++) { |
147 | 6dcc461e | Kostas Papadimitriou | dependency = _ref2[_i]; |
148 | 6dcc461e | Kostas Papadimitriou | if (/^\./.test(dependency)) { |
149 | 6dcc461e | Kostas Papadimitriou | model = this.model;
|
150 | 6dcc461e | Kostas Papadimitriou | keypath = dependency.substr(1);
|
151 | 6dcc461e | Kostas Papadimitriou | } else {
|
152 | 6dcc461e | Kostas Papadimitriou | dependency = dependency.split('.');
|
153 | 6dcc461e | Kostas Papadimitriou | model = this.view.models[dependency.shift()];
|
154 | 6dcc461e | Kostas Papadimitriou | keypath = dependency.join('.');
|
155 | 6dcc461e | Kostas Papadimitriou | } |
156 | 6dcc461e | Kostas Papadimitriou | _results.push(this.view.config.adapter.subscribe(model, keypath, this.sync)); |
157 | 6dcc461e | Kostas Papadimitriou | } |
158 | 6dcc461e | Kostas Papadimitriou | return _results;
|
159 | 6dcc461e | Kostas Papadimitriou | } |
160 | 6dcc461e | Kostas Papadimitriou | }; |
161 | 6dcc461e | Kostas Papadimitriou | |
162 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.unbind = function() { |
163 | 6dcc461e | Kostas Papadimitriou | var dependency, keypath, model, _i, _len, _ref, _ref1, _ref2, _results;
|
164 | 6dcc461e | Kostas Papadimitriou | |
165 | 6dcc461e | Kostas Papadimitriou | if ((_ref = this.binder.unbind) != null) { |
166 | 6dcc461e | Kostas Papadimitriou | _ref.call(this, this.el); |
167 | 6dcc461e | Kostas Papadimitriou | } |
168 | 6dcc461e | Kostas Papadimitriou | if (!this.options.bypass) { |
169 | 6dcc461e | Kostas Papadimitriou | this.view.config.adapter.unsubscribe(this.model, this.keypath, this.sync); |
170 | 6dcc461e | Kostas Papadimitriou | } |
171 | 6dcc461e | Kostas Papadimitriou | if ((_ref1 = this.options.dependencies) != null ? _ref1.length : void 0) { |
172 | 6dcc461e | Kostas Papadimitriou | _ref2 = this.options.dependencies;
|
173 | 6dcc461e | Kostas Papadimitriou | _results = []; |
174 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref2.length; _i < _len; _i++) { |
175 | 6dcc461e | Kostas Papadimitriou | dependency = _ref2[_i]; |
176 | 6dcc461e | Kostas Papadimitriou | if (/^\./.test(dependency)) { |
177 | 6dcc461e | Kostas Papadimitriou | model = this.model;
|
178 | 6dcc461e | Kostas Papadimitriou | keypath = dependency.substr(1);
|
179 | 6dcc461e | Kostas Papadimitriou | } else {
|
180 | 6dcc461e | Kostas Papadimitriou | dependency = dependency.split('.');
|
181 | 6dcc461e | Kostas Papadimitriou | model = this.view.models[dependency.shift()];
|
182 | 6dcc461e | Kostas Papadimitriou | keypath = dependency.join('.');
|
183 | 6dcc461e | Kostas Papadimitriou | } |
184 | 6dcc461e | Kostas Papadimitriou | _results.push(this.view.config.adapter.unsubscribe(model, keypath, this.sync)); |
185 | 6dcc461e | Kostas Papadimitriou | } |
186 | 6dcc461e | Kostas Papadimitriou | return _results;
|
187 | 6dcc461e | Kostas Papadimitriou | } |
188 | 6dcc461e | Kostas Papadimitriou | }; |
189 | 6dcc461e | Kostas Papadimitriou | |
190 | 6dcc461e | Kostas Papadimitriou | Binding.prototype.update = function(models) { |
191 | 6dcc461e | Kostas Papadimitriou | var _ref;
|
192 | 6dcc461e | Kostas Papadimitriou | |
193 | 6dcc461e | Kostas Papadimitriou | if (models == null) { |
194 | 6dcc461e | Kostas Papadimitriou | models = {}; |
195 | 6dcc461e | Kostas Papadimitriou | } |
196 | 6dcc461e | Kostas Papadimitriou | if (this.key) { |
197 | 6dcc461e | Kostas Papadimitriou | if (models[this.key]) { |
198 | 6dcc461e | Kostas Papadimitriou | if (!this.options.bypass) { |
199 | 6dcc461e | Kostas Papadimitriou | this.view.config.adapter.unsubscribe(this.model, this.keypath, this.sync); |
200 | 6dcc461e | Kostas Papadimitriou | } |
201 | 6dcc461e | Kostas Papadimitriou | this.model = models[this.key]; |
202 | 6dcc461e | Kostas Papadimitriou | if (this.options.bypass) { |
203 | 6dcc461e | Kostas Papadimitriou | this.sync();
|
204 | 6dcc461e | Kostas Papadimitriou | } else {
|
205 | 6dcc461e | Kostas Papadimitriou | this.view.config.adapter.subscribe(this.model, this.keypath, this.sync); |
206 | 6dcc461e | Kostas Papadimitriou | if (this.view.config.preloadData) { |
207 | 6dcc461e | Kostas Papadimitriou | this.sync();
|
208 | 6dcc461e | Kostas Papadimitriou | } |
209 | 6dcc461e | Kostas Papadimitriou | } |
210 | 6dcc461e | Kostas Papadimitriou | } |
211 | 6dcc461e | Kostas Papadimitriou | } else {
|
212 | 6dcc461e | Kostas Papadimitriou | this.sync();
|
213 | 6dcc461e | Kostas Papadimitriou | } |
214 | 6dcc461e | Kostas Papadimitriou | return (_ref = this.binder.update) != null ? _ref.call(this, models) : void 0; |
215 | 6dcc461e | Kostas Papadimitriou | }; |
216 | 6dcc461e | Kostas Papadimitriou | |
217 | 6dcc461e | Kostas Papadimitriou | return Binding;
|
218 | 6dcc461e | Kostas Papadimitriou | |
219 | 6dcc461e | Kostas Papadimitriou | })(); |
220 | 6dcc461e | Kostas Papadimitriou | |
221 | 6dcc461e | Kostas Papadimitriou | Rivets.ComponentBinding = (function(_super) {
|
222 | 6dcc461e | Kostas Papadimitriou | __extends(ComponentBinding, _super); |
223 | 6dcc461e | Kostas Papadimitriou | |
224 | 6dcc461e | Kostas Papadimitriou | function ComponentBinding(view, el, type) { |
225 | 6dcc461e | Kostas Papadimitriou | var attribute, _i, _len, _ref, _ref1;
|
226 | 6dcc461e | Kostas Papadimitriou | |
227 | 6dcc461e | Kostas Papadimitriou | this.view = view;
|
228 | 6dcc461e | Kostas Papadimitriou | this.el = el;
|
229 | 6dcc461e | Kostas Papadimitriou | this.type = type;
|
230 | 6dcc461e | Kostas Papadimitriou | this.unbind = __bind(this.unbind, this); |
231 | 6dcc461e | Kostas Papadimitriou | this.bind = __bind(this.bind, this); |
232 | 6dcc461e | Kostas Papadimitriou | this.update = __bind(this.update, this); |
233 | 6dcc461e | Kostas Papadimitriou | this.locals = __bind(this.locals, this); |
234 | 6dcc461e | Kostas Papadimitriou | this.component = Rivets.components[this.type]; |
235 | 6dcc461e | Kostas Papadimitriou | this.attributes = {};
|
236 | 6dcc461e | Kostas Papadimitriou | this.inflections = {};
|
237 | 6dcc461e | Kostas Papadimitriou | _ref = this.el.attributes || [];
|
238 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
239 | 6dcc461e | Kostas Papadimitriou | attribute = _ref[_i]; |
240 | 6dcc461e | Kostas Papadimitriou | if (_ref1 = attribute.name, __indexOf.call(this.component.attributes, _ref1) >= 0) { |
241 | 6dcc461e | Kostas Papadimitriou | this.attributes[attribute.name] = attribute.value;
|
242 | 6dcc461e | Kostas Papadimitriou | } else {
|
243 | 6dcc461e | Kostas Papadimitriou | this.inflections[attribute.name] = attribute.value;
|
244 | 6dcc461e | Kostas Papadimitriou | } |
245 | 6dcc461e | Kostas Papadimitriou | } |
246 | 6dcc461e | Kostas Papadimitriou | } |
247 | 6dcc461e | Kostas Papadimitriou | |
248 | 6dcc461e | Kostas Papadimitriou | ComponentBinding.prototype.sync = function() {}; |
249 | 6dcc461e | Kostas Papadimitriou | |
250 | 6dcc461e | Kostas Papadimitriou | ComponentBinding.prototype.locals = function(models) { |
251 | 6dcc461e | Kostas Papadimitriou | var inverse, key, model, result, _ref, _ref1;
|
252 | 6dcc461e | Kostas Papadimitriou | |
253 | 6dcc461e | Kostas Papadimitriou | if (models == null) { |
254 | 6dcc461e | Kostas Papadimitriou | models = this.view.models;
|
255 | 6dcc461e | Kostas Papadimitriou | } |
256 | 6dcc461e | Kostas Papadimitriou | result = {}; |
257 | 6dcc461e | Kostas Papadimitriou | _ref = this.inflections;
|
258 | 6dcc461e | Kostas Papadimitriou | for (key in _ref) { |
259 | 6dcc461e | Kostas Papadimitriou | inverse = _ref[key]; |
260 | 6dcc461e | Kostas Papadimitriou | result[key] = models[inverse]; |
261 | 6dcc461e | Kostas Papadimitriou | } |
262 | 6dcc461e | Kostas Papadimitriou | for (key in models) { |
263 | 6dcc461e | Kostas Papadimitriou | model = models[key]; |
264 | 6dcc461e | Kostas Papadimitriou | if ((_ref1 = result[key]) == null) { |
265 | 6dcc461e | Kostas Papadimitriou | result[key] = model; |
266 | 6dcc461e | Kostas Papadimitriou | } |
267 | 6dcc461e | Kostas Papadimitriou | } |
268 | 6dcc461e | Kostas Papadimitriou | return result;
|
269 | 6dcc461e | Kostas Papadimitriou | }; |
270 | 6dcc461e | Kostas Papadimitriou | |
271 | 6dcc461e | Kostas Papadimitriou | ComponentBinding.prototype.update = function(models) { |
272 | 6dcc461e | Kostas Papadimitriou | var _ref;
|
273 | 6dcc461e | Kostas Papadimitriou | |
274 | 6dcc461e | Kostas Papadimitriou | return (_ref = this.componentView) != null ? _ref.update(this.locals(models)) : void 0; |
275 | 6dcc461e | Kostas Papadimitriou | }; |
276 | 6dcc461e | Kostas Papadimitriou | |
277 | 6dcc461e | Kostas Papadimitriou | ComponentBinding.prototype.bind = function() { |
278 | 6dcc461e | Kostas Papadimitriou | var el, _ref;
|
279 | 6dcc461e | Kostas Papadimitriou | |
280 | 6dcc461e | Kostas Papadimitriou | if (this.componentView != null) { |
281 | 6dcc461e | Kostas Papadimitriou | return (_ref = this.componentView) != null ? _ref.bind() : void 0; |
282 | 6dcc461e | Kostas Papadimitriou | } else {
|
283 | 6dcc461e | Kostas Papadimitriou | el = this.component.build.call(this.attributes); |
284 | 6dcc461e | Kostas Papadimitriou | (this.componentView = new Rivets.View(el, this.locals(), this.view.options)).bind(); |
285 | 6dcc461e | Kostas Papadimitriou | return this.el.parentNode.replaceChild(el, this.el); |
286 | 6dcc461e | Kostas Papadimitriou | } |
287 | 6dcc461e | Kostas Papadimitriou | }; |
288 | 6dcc461e | Kostas Papadimitriou | |
289 | 6dcc461e | Kostas Papadimitriou | ComponentBinding.prototype.unbind = function() { |
290 | 6dcc461e | Kostas Papadimitriou | var _ref;
|
291 | 6dcc461e | Kostas Papadimitriou | |
292 | 6dcc461e | Kostas Papadimitriou | return (_ref = this.componentView) != null ? _ref.unbind() : void 0; |
293 | 6dcc461e | Kostas Papadimitriou | }; |
294 | 6dcc461e | Kostas Papadimitriou | |
295 | 6dcc461e | Kostas Papadimitriou | return ComponentBinding;
|
296 | 6dcc461e | Kostas Papadimitriou | |
297 | 6dcc461e | Kostas Papadimitriou | })(Rivets.Binding); |
298 | 6dcc461e | Kostas Papadimitriou | |
299 | 6dcc461e | Kostas Papadimitriou | Rivets.View = (function() {
|
300 | 6dcc461e | Kostas Papadimitriou | function View(els, models, options) { |
301 | 6dcc461e | Kostas Papadimitriou | var k, option, v, _base, _i, _len, _ref, _ref1, _ref2, _ref3;
|
302 | 6dcc461e | Kostas Papadimitriou | |
303 | 6dcc461e | Kostas Papadimitriou | this.els = els;
|
304 | 6dcc461e | Kostas Papadimitriou | this.models = models;
|
305 | 6dcc461e | Kostas Papadimitriou | this.options = options != null ? options : {}; |
306 | 6dcc461e | Kostas Papadimitriou | this.update = __bind(this.update, this); |
307 | 6dcc461e | Kostas Papadimitriou | this.publish = __bind(this.publish, this); |
308 | 6dcc461e | Kostas Papadimitriou | this.sync = __bind(this.sync, this); |
309 | 6dcc461e | Kostas Papadimitriou | this.unbind = __bind(this.unbind, this); |
310 | 6dcc461e | Kostas Papadimitriou | this.bind = __bind(this.bind, this); |
311 | 6dcc461e | Kostas Papadimitriou | this.select = __bind(this.select, this); |
312 | 6dcc461e | Kostas Papadimitriou | this.build = __bind(this.build, this); |
313 | 6dcc461e | Kostas Papadimitriou | this.componentRegExp = __bind(this.componentRegExp, this); |
314 | 6dcc461e | Kostas Papadimitriou | this.bindingRegExp = __bind(this.bindingRegExp, this); |
315 | 6dcc461e | Kostas Papadimitriou | if (!(this.els.jquery || this.els instanceof Array)) { |
316 | 6dcc461e | Kostas Papadimitriou | this.els = [this.els]; |
317 | 6dcc461e | Kostas Papadimitriou | } |
318 | 6dcc461e | Kostas Papadimitriou | _ref = ['config', 'binders', 'formatters']; |
319 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
320 | 6dcc461e | Kostas Papadimitriou | option = _ref[_i]; |
321 | 6dcc461e | Kostas Papadimitriou | this[option] = {};
|
322 | 6dcc461e | Kostas Papadimitriou | if (this.options[option]) { |
323 | 6dcc461e | Kostas Papadimitriou | _ref1 = this.options[option];
|
324 | 6dcc461e | Kostas Papadimitriou | for (k in _ref1) { |
325 | 6dcc461e | Kostas Papadimitriou | v = _ref1[k]; |
326 | 6dcc461e | Kostas Papadimitriou | this[option][k] = v;
|
327 | 6dcc461e | Kostas Papadimitriou | } |
328 | 6dcc461e | Kostas Papadimitriou | } |
329 | 6dcc461e | Kostas Papadimitriou | _ref2 = Rivets[option]; |
330 | 6dcc461e | Kostas Papadimitriou | for (k in _ref2) { |
331 | 6dcc461e | Kostas Papadimitriou | v = _ref2[k]; |
332 | 6dcc461e | Kostas Papadimitriou | if ((_ref3 = (_base = this[option])[k]) == null) { |
333 | 6dcc461e | Kostas Papadimitriou | _base[k] = v; |
334 | 6dcc461e | Kostas Papadimitriou | } |
335 | 6dcc461e | Kostas Papadimitriou | } |
336 | 6dcc461e | Kostas Papadimitriou | } |
337 | 6dcc461e | Kostas Papadimitriou | this.build();
|
338 | 6dcc461e | Kostas Papadimitriou | } |
339 | 6dcc461e | Kostas Papadimitriou | |
340 | 6dcc461e | Kostas Papadimitriou | View.prototype.bindingRegExp = function() { |
341 | 6dcc461e | Kostas Papadimitriou | var prefix;
|
342 | 6dcc461e | Kostas Papadimitriou | |
343 | 6dcc461e | Kostas Papadimitriou | prefix = this.config.prefix;
|
344 | 6dcc461e | Kostas Papadimitriou | if (prefix) {
|
345 | 6dcc461e | Kostas Papadimitriou | return new RegExp("^data-" + prefix + "-"); |
346 | 6dcc461e | Kostas Papadimitriou | } else {
|
347 | 6dcc461e | Kostas Papadimitriou | return /^data-/; |
348 | 6dcc461e | Kostas Papadimitriou | } |
349 | 6dcc461e | Kostas Papadimitriou | }; |
350 | 6dcc461e | Kostas Papadimitriou | |
351 | 6dcc461e | Kostas Papadimitriou | View.prototype.componentRegExp = function() { |
352 | 6dcc461e | Kostas Papadimitriou | var _ref, _ref1;
|
353 | 6dcc461e | Kostas Papadimitriou | |
354 | 6dcc461e | Kostas Papadimitriou | return new RegExp("^" + ((_ref = (_ref1 = this.config.prefix) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : 'RV') + "-"); |
355 | 6dcc461e | Kostas Papadimitriou | }; |
356 | 6dcc461e | Kostas Papadimitriou | |
357 | 6dcc461e | Kostas Papadimitriou | View.prototype.build = function() { |
358 | 6dcc461e | Kostas Papadimitriou | var bindingRegExp, buildBinding, componentRegExp, el, parse, skipNodes, _i, _len, _ref,
|
359 | 6dcc461e | Kostas Papadimitriou | _this = this;
|
360 | 6dcc461e | Kostas Papadimitriou | |
361 | 6dcc461e | Kostas Papadimitriou | this.bindings = [];
|
362 | 6dcc461e | Kostas Papadimitriou | skipNodes = []; |
363 | 6dcc461e | Kostas Papadimitriou | bindingRegExp = this.bindingRegExp();
|
364 | 6dcc461e | Kostas Papadimitriou | componentRegExp = this.componentRegExp();
|
365 | 6dcc461e | Kostas Papadimitriou | buildBinding = function(node, type, declaration) { |
366 | 6dcc461e | Kostas Papadimitriou | var context, ctx, dependencies, key, keypath, options, path, pipe, pipes, splitPath;
|
367 | 6dcc461e | Kostas Papadimitriou | |
368 | 6dcc461e | Kostas Papadimitriou | options = {}; |
369 | 6dcc461e | Kostas Papadimitriou | pipes = (function() {
|
370 | 6dcc461e | Kostas Papadimitriou | var _i, _len, _ref, _results;
|
371 | 6dcc461e | Kostas Papadimitriou | |
372 | 6dcc461e | Kostas Papadimitriou | _ref = declaration.split('|');
|
373 | 6dcc461e | Kostas Papadimitriou | _results = []; |
374 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
375 | 6dcc461e | Kostas Papadimitriou | pipe = _ref[_i]; |
376 | 6dcc461e | Kostas Papadimitriou | _results.push(pipe.trim()); |
377 | 6dcc461e | Kostas Papadimitriou | } |
378 | 6dcc461e | Kostas Papadimitriou | return _results;
|
379 | 6dcc461e | Kostas Papadimitriou | })(); |
380 | 6dcc461e | Kostas Papadimitriou | context = (function() {
|
381 | 6dcc461e | Kostas Papadimitriou | var _i, _len, _ref, _results;
|
382 | 6dcc461e | Kostas Papadimitriou | |
383 | 6dcc461e | Kostas Papadimitriou | _ref = pipes.shift().split('<');
|
384 | 6dcc461e | Kostas Papadimitriou | _results = []; |
385 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
386 | 6dcc461e | Kostas Papadimitriou | ctx = _ref[_i]; |
387 | 6dcc461e | Kostas Papadimitriou | _results.push(ctx.trim()); |
388 | 6dcc461e | Kostas Papadimitriou | } |
389 | 6dcc461e | Kostas Papadimitriou | return _results;
|
390 | 6dcc461e | Kostas Papadimitriou | })(); |
391 | 6dcc461e | Kostas Papadimitriou | path = context.shift(); |
392 | 6dcc461e | Kostas Papadimitriou | splitPath = path.split(/\.|:/);
|
393 | 6dcc461e | Kostas Papadimitriou | options.formatters = pipes; |
394 | 6dcc461e | Kostas Papadimitriou | options.bypass = path.indexOf(':') !== -1; |
395 | 6dcc461e | Kostas Papadimitriou | if (splitPath[0]) { |
396 | 6dcc461e | Kostas Papadimitriou | key = splitPath.shift(); |
397 | 6dcc461e | Kostas Papadimitriou | } else {
|
398 | 6dcc461e | Kostas Papadimitriou | key = null;
|
399 | 6dcc461e | Kostas Papadimitriou | splitPath.shift(); |
400 | 6dcc461e | Kostas Papadimitriou | } |
401 | 6dcc461e | Kostas Papadimitriou | keypath = splitPath.join('.');
|
402 | 6dcc461e | Kostas Papadimitriou | if (dependencies = context.shift()) {
|
403 | 6dcc461e | Kostas Papadimitriou | options.dependencies = dependencies.split(/\s+/);
|
404 | 6dcc461e | Kostas Papadimitriou | } |
405 | 6dcc461e | Kostas Papadimitriou | return _this.bindings.push(new Rivets.Binding(_this, node, type, key, keypath, options)); |
406 | 6dcc461e | Kostas Papadimitriou | }; |
407 | 6dcc461e | Kostas Papadimitriou | parse = function(node) { |
408 | 74fe3fbc | Kostas Papadimitriou | var attribute, attributes, binder, childNode, delimiters, identifier, n, parser, regexp, restTokens, startToken, text, token, tokens, type, value, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4, _results, _text_node_id;
|
409 | 74fe3fbc | Kostas Papadimitriou | |
410 | 6dcc461e | Kostas Papadimitriou | if (__indexOf.call(skipNodes, node) < 0) { |
411 | 74fe3fbc | Kostas Papadimitriou | _text_node_id = (window.Node && window.Node.TEXT_NODE) || 3;
|
412 | 74fe3fbc | Kostas Papadimitriou | if (node.nodeType === _text_node_id) {
|
413 | 6dcc461e | Kostas Papadimitriou | parser = Rivets.TextTemplateParser; |
414 | 6dcc461e | Kostas Papadimitriou | if (delimiters = _this.config.templateDelimiters) {
|
415 | 6dcc461e | Kostas Papadimitriou | if ((tokens = parser.parse(node.data, delimiters)).length) {
|
416 | 6dcc461e | Kostas Papadimitriou | if (!(tokens.length === 1 && tokens[0].type === parser.types.text)) { |
417 | 6dcc461e | Kostas Papadimitriou | startToken = tokens[0], restTokens = 2 <= tokens.length ? __slice.call(tokens, 1) : []; |
418 | 6dcc461e | Kostas Papadimitriou | node.data = startToken.value; |
419 | 6dcc461e | Kostas Papadimitriou | switch (startToken.type) {
|
420 | 6dcc461e | Kostas Papadimitriou | case 0: |
421 | 6dcc461e | Kostas Papadimitriou | node.data = startToken.value; |
422 | 6dcc461e | Kostas Papadimitriou | break;
|
423 | 6dcc461e | Kostas Papadimitriou | case 1: |
424 | 6dcc461e | Kostas Papadimitriou | buildBinding(node, 'textNode', startToken.value);
|
425 | 6dcc461e | Kostas Papadimitriou | } |
426 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = restTokens.length; _i < _len; _i++) { |
427 | 6dcc461e | Kostas Papadimitriou | token = restTokens[_i]; |
428 | 6dcc461e | Kostas Papadimitriou | node.parentNode.appendChild((text = document.createTextNode(token.value))); |
429 | 6dcc461e | Kostas Papadimitriou | if (token.type === 1) { |
430 | 6dcc461e | Kostas Papadimitriou | buildBinding(text, 'textNode', token.value);
|
431 | 6dcc461e | Kostas Papadimitriou | } |
432 | 6dcc461e | Kostas Papadimitriou | } |
433 | 6dcc461e | Kostas Papadimitriou | } |
434 | 6dcc461e | Kostas Papadimitriou | } |
435 | 6dcc461e | Kostas Papadimitriou | } |
436 | 6dcc461e | Kostas Papadimitriou | } else if (componentRegExp.test(node.tagName)) { |
437 | 6dcc461e | Kostas Papadimitriou | type = node.tagName.replace(componentRegExp, '').toLowerCase();
|
438 | 6dcc461e | Kostas Papadimitriou | _this.bindings.push(new Rivets.ComponentBinding(_this, node, type));
|
439 | 6dcc461e | Kostas Papadimitriou | } else if (node.attributes != null) { |
440 | 6dcc461e | Kostas Papadimitriou | _ref = node.attributes; |
441 | 6dcc461e | Kostas Papadimitriou | for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { |
442 | 6dcc461e | Kostas Papadimitriou | attribute = _ref[_j]; |
443 | 6dcc461e | Kostas Papadimitriou | if (bindingRegExp.test(attribute.name)) {
|
444 | 6dcc461e | Kostas Papadimitriou | type = attribute.name.replace(bindingRegExp, '');
|
445 | 6dcc461e | Kostas Papadimitriou | if (!(binder = _this.binders[type])) {
|
446 | 6dcc461e | Kostas Papadimitriou | _ref1 = _this.binders; |
447 | 6dcc461e | Kostas Papadimitriou | for (identifier in _ref1) { |
448 | 6dcc461e | Kostas Papadimitriou | value = _ref1[identifier]; |
449 | 6dcc461e | Kostas Papadimitriou | if (identifier !== '*' && identifier.indexOf('*') !== -1) { |
450 | 6dcc461e | Kostas Papadimitriou | regexp = new RegExp("^" + (identifier.replace('*', '.+')) + "$"); |
451 | 6dcc461e | Kostas Papadimitriou | if (regexp.test(type)) {
|
452 | 6dcc461e | Kostas Papadimitriou | binder = value; |
453 | 6dcc461e | Kostas Papadimitriou | } |
454 | 6dcc461e | Kostas Papadimitriou | } |
455 | 6dcc461e | Kostas Papadimitriou | } |
456 | 6dcc461e | Kostas Papadimitriou | } |
457 | 6dcc461e | Kostas Papadimitriou | binder || (binder = _this.binders['*']);
|
458 | 6dcc461e | Kostas Papadimitriou | if (binder.block) {
|
459 | 6dcc461e | Kostas Papadimitriou | _ref2 = node.childNodes; |
460 | 6dcc461e | Kostas Papadimitriou | for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { |
461 | 6dcc461e | Kostas Papadimitriou | n = _ref2[_k]; |
462 | 6dcc461e | Kostas Papadimitriou | skipNodes.push(n); |
463 | 6dcc461e | Kostas Papadimitriou | } |
464 | 6dcc461e | Kostas Papadimitriou | attributes = [attribute]; |
465 | 6dcc461e | Kostas Papadimitriou | } |
466 | 6dcc461e | Kostas Papadimitriou | } |
467 | 6dcc461e | Kostas Papadimitriou | } |
468 | 6dcc461e | Kostas Papadimitriou | _ref3 = attributes || node.attributes; |
469 | 6dcc461e | Kostas Papadimitriou | for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { |
470 | 6dcc461e | Kostas Papadimitriou | attribute = _ref3[_l]; |
471 | 6dcc461e | Kostas Papadimitriou | if (bindingRegExp.test(attribute.name)) {
|
472 | 6dcc461e | Kostas Papadimitriou | type = attribute.name.replace(bindingRegExp, '');
|
473 | 6dcc461e | Kostas Papadimitriou | buildBinding(node, type, attribute.value); |
474 | 6dcc461e | Kostas Papadimitriou | } |
475 | 6dcc461e | Kostas Papadimitriou | } |
476 | 6dcc461e | Kostas Papadimitriou | } |
477 | 6dcc461e | Kostas Papadimitriou | _ref4 = node.childNodes; |
478 | 6dcc461e | Kostas Papadimitriou | _results = []; |
479 | 6dcc461e | Kostas Papadimitriou | for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) { |
480 | 6dcc461e | Kostas Papadimitriou | childNode = _ref4[_m]; |
481 | 6dcc461e | Kostas Papadimitriou | _results.push(parse(childNode)); |
482 | 6dcc461e | Kostas Papadimitriou | } |
483 | 6dcc461e | Kostas Papadimitriou | return _results;
|
484 | 6dcc461e | Kostas Papadimitriou | } |
485 | 6dcc461e | Kostas Papadimitriou | }; |
486 | 6dcc461e | Kostas Papadimitriou | _ref = this.els;
|
487 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
488 | 6dcc461e | Kostas Papadimitriou | el = _ref[_i]; |
489 | 6dcc461e | Kostas Papadimitriou | parse(el); |
490 | 6dcc461e | Kostas Papadimitriou | } |
491 | 6dcc461e | Kostas Papadimitriou | }; |
492 | 6dcc461e | Kostas Papadimitriou | |
493 | 6dcc461e | Kostas Papadimitriou | View.prototype.select = function(fn) { |
494 | 6dcc461e | Kostas Papadimitriou | var binding, _i, _len, _ref, _results;
|
495 | 6dcc461e | Kostas Papadimitriou | |
496 | 6dcc461e | Kostas Papadimitriou | _ref = this.bindings;
|
497 | 6dcc461e | Kostas Papadimitriou | _results = []; |
498 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
499 | 6dcc461e | Kostas Papadimitriou | binding = _ref[_i]; |
500 | 6dcc461e | Kostas Papadimitriou | if (fn(binding)) {
|
501 | 6dcc461e | Kostas Papadimitriou | _results.push(binding); |
502 | 6dcc461e | Kostas Papadimitriou | } |
503 | 6dcc461e | Kostas Papadimitriou | } |
504 | 6dcc461e | Kostas Papadimitriou | return _results;
|
505 | 6dcc461e | Kostas Papadimitriou | }; |
506 | 6dcc461e | Kostas Papadimitriou | |
507 | 6dcc461e | Kostas Papadimitriou | View.prototype.bind = function() { |
508 | 6dcc461e | Kostas Papadimitriou | var binding, _i, _len, _ref, _results;
|
509 | 6dcc461e | Kostas Papadimitriou | |
510 | 6dcc461e | Kostas Papadimitriou | _ref = this.bindings;
|
511 | 6dcc461e | Kostas Papadimitriou | _results = []; |
512 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
513 | 6dcc461e | Kostas Papadimitriou | binding = _ref[_i]; |
514 | 6dcc461e | Kostas Papadimitriou | _results.push(binding.bind()); |
515 | 6dcc461e | Kostas Papadimitriou | } |
516 | 6dcc461e | Kostas Papadimitriou | return _results;
|
517 | 6dcc461e | Kostas Papadimitriou | }; |
518 | 6dcc461e | Kostas Papadimitriou | |
519 | 6dcc461e | Kostas Papadimitriou | View.prototype.unbind = function() { |
520 | 6dcc461e | Kostas Papadimitriou | var binding, _i, _len, _ref, _results;
|
521 | 6dcc461e | Kostas Papadimitriou | |
522 | 6dcc461e | Kostas Papadimitriou | _ref = this.bindings;
|
523 | 6dcc461e | Kostas Papadimitriou | _results = []; |
524 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
525 | 6dcc461e | Kostas Papadimitriou | binding = _ref[_i]; |
526 | 6dcc461e | Kostas Papadimitriou | _results.push(binding.unbind()); |
527 | 6dcc461e | Kostas Papadimitriou | } |
528 | 6dcc461e | Kostas Papadimitriou | return _results;
|
529 | 6dcc461e | Kostas Papadimitriou | }; |
530 | 6dcc461e | Kostas Papadimitriou | |
531 | 6dcc461e | Kostas Papadimitriou | View.prototype.sync = function() { |
532 | 6dcc461e | Kostas Papadimitriou | var binding, _i, _len, _ref, _results;
|
533 | 6dcc461e | Kostas Papadimitriou | |
534 | 6dcc461e | Kostas Papadimitriou | _ref = this.bindings;
|
535 | 6dcc461e | Kostas Papadimitriou | _results = []; |
536 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
537 | 6dcc461e | Kostas Papadimitriou | binding = _ref[_i]; |
538 | 6dcc461e | Kostas Papadimitriou | _results.push(binding.sync()); |
539 | 6dcc461e | Kostas Papadimitriou | } |
540 | 6dcc461e | Kostas Papadimitriou | return _results;
|
541 | 6dcc461e | Kostas Papadimitriou | }; |
542 | 6dcc461e | Kostas Papadimitriou | |
543 | 6dcc461e | Kostas Papadimitriou | View.prototype.publish = function() { |
544 | 6dcc461e | Kostas Papadimitriou | var binding, _i, _len, _ref, _results;
|
545 | 6dcc461e | Kostas Papadimitriou | |
546 | 6dcc461e | Kostas Papadimitriou | _ref = this.select(function(b) { |
547 | 6dcc461e | Kostas Papadimitriou | return b.binder.publishes;
|
548 | 6dcc461e | Kostas Papadimitriou | }); |
549 | 6dcc461e | Kostas Papadimitriou | _results = []; |
550 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
551 | 6dcc461e | Kostas Papadimitriou | binding = _ref[_i]; |
552 | 6dcc461e | Kostas Papadimitriou | _results.push(binding.publish()); |
553 | 6dcc461e | Kostas Papadimitriou | } |
554 | 6dcc461e | Kostas Papadimitriou | return _results;
|
555 | 6dcc461e | Kostas Papadimitriou | }; |
556 | 6dcc461e | Kostas Papadimitriou | |
557 | 6dcc461e | Kostas Papadimitriou | View.prototype.update = function(models) { |
558 | 6dcc461e | Kostas Papadimitriou | var binding, key, model, _i, _len, _ref, _results;
|
559 | 6dcc461e | Kostas Papadimitriou | |
560 | 6dcc461e | Kostas Papadimitriou | if (models == null) { |
561 | 6dcc461e | Kostas Papadimitriou | models = {}; |
562 | 6dcc461e | Kostas Papadimitriou | } |
563 | 6dcc461e | Kostas Papadimitriou | for (key in models) { |
564 | 6dcc461e | Kostas Papadimitriou | model = models[key]; |
565 | 6dcc461e | Kostas Papadimitriou | this.models[key] = model;
|
566 | 6dcc461e | Kostas Papadimitriou | } |
567 | 6dcc461e | Kostas Papadimitriou | _ref = this.bindings;
|
568 | 6dcc461e | Kostas Papadimitriou | _results = []; |
569 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
570 | 6dcc461e | Kostas Papadimitriou | binding = _ref[_i]; |
571 | 6dcc461e | Kostas Papadimitriou | _results.push(binding.update(models)); |
572 | 6dcc461e | Kostas Papadimitriou | } |
573 | 6dcc461e | Kostas Papadimitriou | return _results;
|
574 | 6dcc461e | Kostas Papadimitriou | }; |
575 | 6dcc461e | Kostas Papadimitriou | |
576 | 6dcc461e | Kostas Papadimitriou | return View;
|
577 | 6dcc461e | Kostas Papadimitriou | |
578 | 6dcc461e | Kostas Papadimitriou | })(); |
579 | 6dcc461e | Kostas Papadimitriou | |
580 | 6dcc461e | Kostas Papadimitriou | Rivets.TextTemplateParser = (function() {
|
581 | 6dcc461e | Kostas Papadimitriou | function TextTemplateParser() {} |
582 | 6dcc461e | Kostas Papadimitriou | |
583 | 6dcc461e | Kostas Papadimitriou | TextTemplateParser.types = { |
584 | 6dcc461e | Kostas Papadimitriou | text: 0, |
585 | 6dcc461e | Kostas Papadimitriou | binding: 1 |
586 | 6dcc461e | Kostas Papadimitriou | }; |
587 | 6dcc461e | Kostas Papadimitriou | |
588 | 6dcc461e | Kostas Papadimitriou | TextTemplateParser.parse = function(template, delimiters) { |
589 | 6dcc461e | Kostas Papadimitriou | var index, lastIndex, lastToken, length, substring, tokens, value;
|
590 | 6dcc461e | Kostas Papadimitriou | |
591 | 6dcc461e | Kostas Papadimitriou | tokens = []; |
592 | 6dcc461e | Kostas Papadimitriou | length = template.length; |
593 | 6dcc461e | Kostas Papadimitriou | index = 0;
|
594 | 6dcc461e | Kostas Papadimitriou | lastIndex = 0;
|
595 | 6dcc461e | Kostas Papadimitriou | while (lastIndex < length) {
|
596 | 6dcc461e | Kostas Papadimitriou | index = template.indexOf(delimiters[0], lastIndex);
|
597 | 6dcc461e | Kostas Papadimitriou | if (index < 0) { |
598 | 6dcc461e | Kostas Papadimitriou | tokens.push({ |
599 | 6dcc461e | Kostas Papadimitriou | type: this.types.text, |
600 | 6dcc461e | Kostas Papadimitriou | value: template.slice(lastIndex)
|
601 | 6dcc461e | Kostas Papadimitriou | }); |
602 | 6dcc461e | Kostas Papadimitriou | break;
|
603 | 6dcc461e | Kostas Papadimitriou | } else {
|
604 | 6dcc461e | Kostas Papadimitriou | if (index > 0 && lastIndex < index) { |
605 | 6dcc461e | Kostas Papadimitriou | tokens.push({ |
606 | 6dcc461e | Kostas Papadimitriou | type: this.types.text, |
607 | 6dcc461e | Kostas Papadimitriou | value: template.slice(lastIndex, index)
|
608 | 6dcc461e | Kostas Papadimitriou | }); |
609 | 6dcc461e | Kostas Papadimitriou | } |
610 | 6dcc461e | Kostas Papadimitriou | lastIndex = index + 2;
|
611 | 6dcc461e | Kostas Papadimitriou | index = template.indexOf(delimiters[1], lastIndex);
|
612 | 6dcc461e | Kostas Papadimitriou | if (index < 0) { |
613 | 6dcc461e | Kostas Papadimitriou | substring = template.slice(lastIndex - 2);
|
614 | 6dcc461e | Kostas Papadimitriou | lastToken = tokens[tokens.length - 1];
|
615 | 6dcc461e | Kostas Papadimitriou | if ((lastToken != null ? lastToken.type : void 0) === this.types.text) { |
616 | 6dcc461e | Kostas Papadimitriou | lastToken.value += substring; |
617 | 6dcc461e | Kostas Papadimitriou | } else {
|
618 | 6dcc461e | Kostas Papadimitriou | tokens.push({ |
619 | 6dcc461e | Kostas Papadimitriou | type: this.types.text, |
620 | 6dcc461e | Kostas Papadimitriou | value: substring
|
621 | 6dcc461e | Kostas Papadimitriou | }); |
622 | 6dcc461e | Kostas Papadimitriou | } |
623 | 6dcc461e | Kostas Papadimitriou | break;
|
624 | 6dcc461e | Kostas Papadimitriou | } |
625 | 6dcc461e | Kostas Papadimitriou | value = template.slice(lastIndex, index).trim(); |
626 | 6dcc461e | Kostas Papadimitriou | tokens.push({ |
627 | 6dcc461e | Kostas Papadimitriou | type: this.types.binding, |
628 | 6dcc461e | Kostas Papadimitriou | value: value
|
629 | 6dcc461e | Kostas Papadimitriou | }); |
630 | 6dcc461e | Kostas Papadimitriou | lastIndex = index + 2;
|
631 | 6dcc461e | Kostas Papadimitriou | } |
632 | 6dcc461e | Kostas Papadimitriou | } |
633 | 6dcc461e | Kostas Papadimitriou | return tokens;
|
634 | 6dcc461e | Kostas Papadimitriou | }; |
635 | 6dcc461e | Kostas Papadimitriou | |
636 | 6dcc461e | Kostas Papadimitriou | return TextTemplateParser;
|
637 | 6dcc461e | Kostas Papadimitriou | |
638 | 6dcc461e | Kostas Papadimitriou | })(); |
639 | 6dcc461e | Kostas Papadimitriou | |
640 | 6dcc461e | Kostas Papadimitriou | Rivets.Util = { |
641 | 6dcc461e | Kostas Papadimitriou | bindEvent: function(el, event, handler) { |
642 | 6dcc461e | Kostas Papadimitriou | if (window.jQuery != null) { |
643 | 6dcc461e | Kostas Papadimitriou | el = jQuery(el); |
644 | 6dcc461e | Kostas Papadimitriou | if (el.on != null) { |
645 | 6dcc461e | Kostas Papadimitriou | return el.on(event, handler);
|
646 | 6dcc461e | Kostas Papadimitriou | } else {
|
647 | 6dcc461e | Kostas Papadimitriou | return el.bind(event, handler);
|
648 | 6dcc461e | Kostas Papadimitriou | } |
649 | 6dcc461e | Kostas Papadimitriou | } else if (window.addEventListener != null) { |
650 | 6dcc461e | Kostas Papadimitriou | return el.addEventListener(event, handler, false); |
651 | 6dcc461e | Kostas Papadimitriou | } else {
|
652 | 6dcc461e | Kostas Papadimitriou | event = 'on' + event;
|
653 | 6dcc461e | Kostas Papadimitriou | return el.attachEvent(event, handler);
|
654 | 6dcc461e | Kostas Papadimitriou | } |
655 | 6dcc461e | Kostas Papadimitriou | }, |
656 | 6dcc461e | Kostas Papadimitriou | unbindEvent: function(el, event, handler) { |
657 | 6dcc461e | Kostas Papadimitriou | if (window.jQuery != null) { |
658 | 6dcc461e | Kostas Papadimitriou | el = jQuery(el); |
659 | 6dcc461e | Kostas Papadimitriou | if (el.off != null) { |
660 | 6dcc461e | Kostas Papadimitriou | return el.off(event, handler);
|
661 | 6dcc461e | Kostas Papadimitriou | } else {
|
662 | 6dcc461e | Kostas Papadimitriou | return el.unbind(event, handler);
|
663 | 6dcc461e | Kostas Papadimitriou | } |
664 | 6dcc461e | Kostas Papadimitriou | } else if (window.removeEventListener != null) { |
665 | 6dcc461e | Kostas Papadimitriou | return el.removeEventListener(event, handler, false); |
666 | 6dcc461e | Kostas Papadimitriou | } else {
|
667 | 6dcc461e | Kostas Papadimitriou | event = 'on' + event;
|
668 | 6dcc461e | Kostas Papadimitriou | return el.detachEvent(event, handler);
|
669 | 6dcc461e | Kostas Papadimitriou | } |
670 | 6dcc461e | Kostas Papadimitriou | }, |
671 | 6dcc461e | Kostas Papadimitriou | getInputValue: function(el) { |
672 | 6dcc461e | Kostas Papadimitriou | var o, _i, _len, _results;
|
673 | 6dcc461e | Kostas Papadimitriou | |
674 | 6dcc461e | Kostas Papadimitriou | if (window.jQuery != null) { |
675 | 6dcc461e | Kostas Papadimitriou | el = jQuery(el); |
676 | 6dcc461e | Kostas Papadimitriou | switch (el[0].type) { |
677 | 6dcc461e | Kostas Papadimitriou | case 'checkbox': |
678 | 6dcc461e | Kostas Papadimitriou | return el.is(':checked'); |
679 | 6dcc461e | Kostas Papadimitriou | default:
|
680 | 6dcc461e | Kostas Papadimitriou | return el.val();
|
681 | 6dcc461e | Kostas Papadimitriou | } |
682 | 6dcc461e | Kostas Papadimitriou | } else {
|
683 | 6dcc461e | Kostas Papadimitriou | switch (el.type) {
|
684 | 6dcc461e | Kostas Papadimitriou | case 'checkbox': |
685 | 6dcc461e | Kostas Papadimitriou | return el.checked;
|
686 | 6dcc461e | Kostas Papadimitriou | case 'select-multiple': |
687 | 6dcc461e | Kostas Papadimitriou | _results = []; |
688 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = el.length; _i < _len; _i++) { |
689 | 6dcc461e | Kostas Papadimitriou | o = el[_i]; |
690 | 6dcc461e | Kostas Papadimitriou | if (o.selected) {
|
691 | 6dcc461e | Kostas Papadimitriou | _results.push(o.value); |
692 | 6dcc461e | Kostas Papadimitriou | } |
693 | 6dcc461e | Kostas Papadimitriou | } |
694 | 6dcc461e | Kostas Papadimitriou | return _results;
|
695 | 6dcc461e | Kostas Papadimitriou | break;
|
696 | 6dcc461e | Kostas Papadimitriou | default:
|
697 | 6dcc461e | Kostas Papadimitriou | return el.value;
|
698 | 6dcc461e | Kostas Papadimitriou | } |
699 | 6dcc461e | Kostas Papadimitriou | } |
700 | 6dcc461e | Kostas Papadimitriou | } |
701 | 6dcc461e | Kostas Papadimitriou | }; |
702 | 6dcc461e | Kostas Papadimitriou | |
703 | 6dcc461e | Kostas Papadimitriou | Rivets.binders = { |
704 | 6dcc461e | Kostas Papadimitriou | enabled: function(el, value) { |
705 | 6dcc461e | Kostas Papadimitriou | return el.disabled = !value;
|
706 | 6dcc461e | Kostas Papadimitriou | }, |
707 | 6dcc461e | Kostas Papadimitriou | disabled: function(el, value) { |
708 | 6dcc461e | Kostas Papadimitriou | return el.disabled = !!value;
|
709 | 6dcc461e | Kostas Papadimitriou | }, |
710 | 6dcc461e | Kostas Papadimitriou | checked: {
|
711 | 6dcc461e | Kostas Papadimitriou | publishes: true, |
712 | 6dcc461e | Kostas Papadimitriou | bind: function(el) { |
713 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.bindEvent(el, 'change', this.publish); |
714 | 6dcc461e | Kostas Papadimitriou | }, |
715 | 6dcc461e | Kostas Papadimitriou | unbind: function(el) { |
716 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.unbindEvent(el, 'change', this.publish); |
717 | 6dcc461e | Kostas Papadimitriou | }, |
718 | 6dcc461e | Kostas Papadimitriou | routine: function(el, value) { |
719 | 6dcc461e | Kostas Papadimitriou | var _ref;
|
720 | 6dcc461e | Kostas Papadimitriou | |
721 | 6dcc461e | Kostas Papadimitriou | if (el.type === 'radio') { |
722 | 6dcc461e | Kostas Papadimitriou | return el.checked = ((_ref = el.value) != null ? _ref.toString() : void 0) === (value != null ? value.toString() : void 0); |
723 | 6dcc461e | Kostas Papadimitriou | } else {
|
724 | 6dcc461e | Kostas Papadimitriou | return el.checked = !!value;
|
725 | 6dcc461e | Kostas Papadimitriou | } |
726 | 6dcc461e | Kostas Papadimitriou | } |
727 | 6dcc461e | Kostas Papadimitriou | }, |
728 | 6dcc461e | Kostas Papadimitriou | unchecked: {
|
729 | 6dcc461e | Kostas Papadimitriou | publishes: true, |
730 | 6dcc461e | Kostas Papadimitriou | bind: function(el) { |
731 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.bindEvent(el, 'change', this.publish); |
732 | 6dcc461e | Kostas Papadimitriou | }, |
733 | 6dcc461e | Kostas Papadimitriou | unbind: function(el) { |
734 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.unbindEvent(el, 'change', this.publish); |
735 | 6dcc461e | Kostas Papadimitriou | }, |
736 | 6dcc461e | Kostas Papadimitriou | routine: function(el, value) { |
737 | 6dcc461e | Kostas Papadimitriou | var _ref;
|
738 | 6dcc461e | Kostas Papadimitriou | |
739 | 6dcc461e | Kostas Papadimitriou | if (el.type === 'radio') { |
740 | 6dcc461e | Kostas Papadimitriou | return el.checked = ((_ref = el.value) != null ? _ref.toString() : void 0) !== (value != null ? value.toString() : void 0); |
741 | 6dcc461e | Kostas Papadimitriou | } else {
|
742 | 6dcc461e | Kostas Papadimitriou | return el.checked = !value;
|
743 | 6dcc461e | Kostas Papadimitriou | } |
744 | 6dcc461e | Kostas Papadimitriou | } |
745 | 6dcc461e | Kostas Papadimitriou | }, |
746 | 6dcc461e | Kostas Papadimitriou | show: function(el, value) { |
747 | 6dcc461e | Kostas Papadimitriou | return el.style.display = value ? '' : 'none'; |
748 | 6dcc461e | Kostas Papadimitriou | }, |
749 | 6dcc461e | Kostas Papadimitriou | hide: function(el, value) { |
750 | 6dcc461e | Kostas Papadimitriou | return el.style.display = value ? 'none' : ''; |
751 | 6dcc461e | Kostas Papadimitriou | }, |
752 | 6dcc461e | Kostas Papadimitriou | html: function(el, value) { |
753 | 6dcc461e | Kostas Papadimitriou | return el.innerHTML = value != null ? value : ''; |
754 | 6dcc461e | Kostas Papadimitriou | }, |
755 | 6dcc461e | Kostas Papadimitriou | value: {
|
756 | 6dcc461e | Kostas Papadimitriou | publishes: true, |
757 | 6dcc461e | Kostas Papadimitriou | bind: function(el) { |
758 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.bindEvent(el, 'change', this.publish); |
759 | 6dcc461e | Kostas Papadimitriou | }, |
760 | 6dcc461e | Kostas Papadimitriou | unbind: function(el) { |
761 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.unbindEvent(el, 'change', this.publish); |
762 | 6dcc461e | Kostas Papadimitriou | }, |
763 | 6dcc461e | Kostas Papadimitriou | routine: function(el, value) { |
764 | 6dcc461e | Kostas Papadimitriou | var o, _i, _len, _ref, _ref1, _ref2, _results;
|
765 | 6dcc461e | Kostas Papadimitriou | |
766 | 6dcc461e | Kostas Papadimitriou | if (window.jQuery != null) { |
767 | 6dcc461e | Kostas Papadimitriou | el = jQuery(el); |
768 | 6dcc461e | Kostas Papadimitriou | if ((value != null ? value.toString() : void 0) !== ((_ref = el.val()) != null ? _ref.toString() : void 0)) { |
769 | 6dcc461e | Kostas Papadimitriou | return el.val(value != null ? value : ''); |
770 | 6dcc461e | Kostas Papadimitriou | } |
771 | 6dcc461e | Kostas Papadimitriou | } else {
|
772 | 6dcc461e | Kostas Papadimitriou | if (el.type === 'select-multiple') { |
773 | 6dcc461e | Kostas Papadimitriou | if (value != null) { |
774 | 6dcc461e | Kostas Papadimitriou | _results = []; |
775 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = el.length; _i < _len; _i++) { |
776 | 6dcc461e | Kostas Papadimitriou | o = el[_i]; |
777 | 6dcc461e | Kostas Papadimitriou | _results.push(o.selected = (_ref1 = o.value, __indexOf.call(value, _ref1) >= 0));
|
778 | 6dcc461e | Kostas Papadimitriou | } |
779 | 6dcc461e | Kostas Papadimitriou | return _results;
|
780 | 6dcc461e | Kostas Papadimitriou | } |
781 | 6dcc461e | Kostas Papadimitriou | } else if ((value != null ? value.toString() : void 0) !== ((_ref2 = el.value) != null ? _ref2.toString() : void 0)) { |
782 | 6dcc461e | Kostas Papadimitriou | return el.value = value != null ? value : ''; |
783 | 6dcc461e | Kostas Papadimitriou | } |
784 | 6dcc461e | Kostas Papadimitriou | } |
785 | 6dcc461e | Kostas Papadimitriou | } |
786 | 6dcc461e | Kostas Papadimitriou | }, |
787 | 6dcc461e | Kostas Papadimitriou | text: function(el, value) { |
788 | 6dcc461e | Kostas Papadimitriou | if (el.innerText != null) { |
789 | 6dcc461e | Kostas Papadimitriou | return el.innerText = value != null ? value : ''; |
790 | 6dcc461e | Kostas Papadimitriou | } else {
|
791 | 6dcc461e | Kostas Papadimitriou | return el.textContent = value != null ? value : ''; |
792 | 6dcc461e | Kostas Papadimitriou | } |
793 | 6dcc461e | Kostas Papadimitriou | }, |
794 | 6dcc461e | Kostas Papadimitriou | "if": {
|
795 | 6dcc461e | Kostas Papadimitriou | block: true, |
796 | 6dcc461e | Kostas Papadimitriou | bind: function(el) { |
797 | 6dcc461e | Kostas Papadimitriou | var attr, declaration;
|
798 | 6dcc461e | Kostas Papadimitriou | |
799 | 6dcc461e | Kostas Papadimitriou | if (this.marker == null) { |
800 | 6dcc461e | Kostas Papadimitriou | attr = ['data', this.view.config.prefix, this.type].join('-').replace('--', '-'); |
801 | 6dcc461e | Kostas Papadimitriou | declaration = el.getAttribute(attr); |
802 | 6dcc461e | Kostas Papadimitriou | this.marker = document.createComment(" rivets: " + this.type + " " + declaration + " "); |
803 | 6dcc461e | Kostas Papadimitriou | el.removeAttribute(attr); |
804 | 6dcc461e | Kostas Papadimitriou | el.parentNode.insertBefore(this.marker, el);
|
805 | 6dcc461e | Kostas Papadimitriou | return el.parentNode.removeChild(el);
|
806 | 6dcc461e | Kostas Papadimitriou | } |
807 | 6dcc461e | Kostas Papadimitriou | }, |
808 | 6dcc461e | Kostas Papadimitriou | unbind: function() { |
809 | 6dcc461e | Kostas Papadimitriou | var _ref;
|
810 | 6dcc461e | Kostas Papadimitriou | |
811 | 6dcc461e | Kostas Papadimitriou | return (_ref = this.nested) != null ? _ref.unbind() : void 0; |
812 | 6dcc461e | Kostas Papadimitriou | }, |
813 | 6dcc461e | Kostas Papadimitriou | routine: function(el, value) { |
814 | 6dcc461e | Kostas Papadimitriou | var key, model, models, options, _ref;
|
815 | 6dcc461e | Kostas Papadimitriou | |
816 | 6dcc461e | Kostas Papadimitriou | if (!!value === (this.nested == null)) { |
817 | 6dcc461e | Kostas Papadimitriou | if (value) {
|
818 | 6dcc461e | Kostas Papadimitriou | models = {}; |
819 | 6dcc461e | Kostas Papadimitriou | _ref = this.view.models;
|
820 | 6dcc461e | Kostas Papadimitriou | for (key in _ref) { |
821 | 6dcc461e | Kostas Papadimitriou | model = _ref[key]; |
822 | 6dcc461e | Kostas Papadimitriou | models[key] = model; |
823 | 6dcc461e | Kostas Papadimitriou | } |
824 | 6dcc461e | Kostas Papadimitriou | options = { |
825 | 6dcc461e | Kostas Papadimitriou | binders: this.view.options.binders, |
826 | 6dcc461e | Kostas Papadimitriou | formatters: this.view.options.formatters, |
827 | 6dcc461e | Kostas Papadimitriou | config: this.view.options.config |
828 | 6dcc461e | Kostas Papadimitriou | }; |
829 | 6dcc461e | Kostas Papadimitriou | (this.nested = new Rivets.View(el, models, options)).bind(); |
830 | 6dcc461e | Kostas Papadimitriou | return this.marker.parentNode.insertBefore(el, this.marker.nextSibling); |
831 | 6dcc461e | Kostas Papadimitriou | } else {
|
832 | 6dcc461e | Kostas Papadimitriou | el.parentNode.removeChild(el); |
833 | 6dcc461e | Kostas Papadimitriou | this.nested.unbind();
|
834 | 6dcc461e | Kostas Papadimitriou | return delete this.nested; |
835 | 6dcc461e | Kostas Papadimitriou | } |
836 | 6dcc461e | Kostas Papadimitriou | } |
837 | 6dcc461e | Kostas Papadimitriou | }, |
838 | 6dcc461e | Kostas Papadimitriou | update: function(models) { |
839 | 6dcc461e | Kostas Papadimitriou | return this.nested.update(models); |
840 | 6dcc461e | Kostas Papadimitriou | } |
841 | 6dcc461e | Kostas Papadimitriou | }, |
842 | 6dcc461e | Kostas Papadimitriou | unless: {
|
843 | 6dcc461e | Kostas Papadimitriou | block: true, |
844 | 6dcc461e | Kostas Papadimitriou | bind: function(el) { |
845 | 6dcc461e | Kostas Papadimitriou | return Rivets.binders["if"].bind.call(this, el); |
846 | 6dcc461e | Kostas Papadimitriou | }, |
847 | 6dcc461e | Kostas Papadimitriou | unbind: function() { |
848 | 6dcc461e | Kostas Papadimitriou | return Rivets.binders["if"].unbind.call(this); |
849 | 6dcc461e | Kostas Papadimitriou | }, |
850 | 6dcc461e | Kostas Papadimitriou | routine: function(el, value) { |
851 | 6dcc461e | Kostas Papadimitriou | return Rivets.binders["if"].routine.call(this, el, !value); |
852 | 6dcc461e | Kostas Papadimitriou | }, |
853 | 6dcc461e | Kostas Papadimitriou | update: function(models) { |
854 | 6dcc461e | Kostas Papadimitriou | return Rivets.binders["if"].update.call(this, models); |
855 | 6dcc461e | Kostas Papadimitriou | } |
856 | 6dcc461e | Kostas Papadimitriou | }, |
857 | 6dcc461e | Kostas Papadimitriou | "on-*": {
|
858 | 6dcc461e | Kostas Papadimitriou | "function": true, |
859 | 6dcc461e | Kostas Papadimitriou | unbind: function(el) { |
860 | 6dcc461e | Kostas Papadimitriou | if (this.handler) { |
861 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.unbindEvent(el, this.args[0], this.handler); |
862 | 6dcc461e | Kostas Papadimitriou | } |
863 | 6dcc461e | Kostas Papadimitriou | }, |
864 | 6dcc461e | Kostas Papadimitriou | routine: function(el, value) { |
865 | 6dcc461e | Kostas Papadimitriou | if (this.handler) { |
866 | 6dcc461e | Kostas Papadimitriou | Rivets.Util.unbindEvent(el, this.args[0], this.handler); |
867 | 6dcc461e | Kostas Papadimitriou | } |
868 | 6dcc461e | Kostas Papadimitriou | return Rivets.Util.bindEvent(el, this.args[0], this.handler = this.eventHandler(value)); |
869 | 6dcc461e | Kostas Papadimitriou | } |
870 | 6dcc461e | Kostas Papadimitriou | }, |
871 | 6dcc461e | Kostas Papadimitriou | "each-*": {
|
872 | 6dcc461e | Kostas Papadimitriou | block: true, |
873 | 6dcc461e | Kostas Papadimitriou | bind: function(el) { |
874 | 6dcc461e | Kostas Papadimitriou | var attr;
|
875 | 6dcc461e | Kostas Papadimitriou | if (this.marker == null) { |
876 | 6dcc461e | Kostas Papadimitriou | attr = ['data', this.view.config.prefix, this.type].join('-').replace('--', '-'); |
877 | 6dcc461e | Kostas Papadimitriou | this.marker = document.createComment(" rivets: " + this.type + " "); |
878 | 6dcc461e | Kostas Papadimitriou | this.iterated = [];
|
879 | 6dcc461e | Kostas Papadimitriou | el.removeAttribute(attr); |
880 | 6dcc461e | Kostas Papadimitriou | el.parentNode.insertBefore(this.marker, el);
|
881 | 6dcc461e | Kostas Papadimitriou | return el.parentNode.removeChild(el);
|
882 | 6dcc461e | Kostas Papadimitriou | } |
883 | 6dcc461e | Kostas Papadimitriou | }, |
884 | 6dcc461e | Kostas Papadimitriou | unbind: function(el) { |
885 | 6dcc461e | Kostas Papadimitriou | var view, _i, _len, _ref, _results;
|
886 | 6dcc461e | Kostas Papadimitriou | |
887 | 6dcc461e | Kostas Papadimitriou | if (this.iterated != null) { |
888 | 6dcc461e | Kostas Papadimitriou | _ref = this.iterated;
|
889 | 6dcc461e | Kostas Papadimitriou | _results = []; |
890 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
891 | 6dcc461e | Kostas Papadimitriou | view = _ref[_i]; |
892 | 6dcc461e | Kostas Papadimitriou | _results.push(view.unbind()); |
893 | 6dcc461e | Kostas Papadimitriou | } |
894 | 6dcc461e | Kostas Papadimitriou | return _results;
|
895 | 6dcc461e | Kostas Papadimitriou | } |
896 | 6dcc461e | Kostas Papadimitriou | }, |
897 | 6dcc461e | Kostas Papadimitriou | routine: function(el, collection) { |
898 | 6dcc461e | Kostas Papadimitriou | var data, i, index, k, key, model, modelName, options, previous, template, v, view, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3, _results;
|
899 | 6dcc461e | Kostas Papadimitriou | |
900 | 6dcc461e | Kostas Papadimitriou | modelName = this.args[0]; |
901 | 6dcc461e | Kostas Papadimitriou | collection = collection || []; |
902 | 6dcc461e | Kostas Papadimitriou | if (this.iterated.length > collection.length) { |
903 | 6dcc461e | Kostas Papadimitriou | _ref = Array(this.iterated.length - collection.length);
|
904 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
905 | 6dcc461e | Kostas Papadimitriou | i = _ref[_i]; |
906 | 6dcc461e | Kostas Papadimitriou | view = this.iterated.pop();
|
907 | 6dcc461e | Kostas Papadimitriou | view.unbind(); |
908 | 6dcc461e | Kostas Papadimitriou | this.marker.parentNode.removeChild(view.els[0]); |
909 | 6dcc461e | Kostas Papadimitriou | } |
910 | 6dcc461e | Kostas Papadimitriou | } |
911 | 6dcc461e | Kostas Papadimitriou | _results = []; |
912 | 6dcc461e | Kostas Papadimitriou | for (index = _j = 0, _len1 = collection.length; _j < _len1; index = ++_j) { |
913 | 6dcc461e | Kostas Papadimitriou | model = collection[index]; |
914 | 6dcc461e | Kostas Papadimitriou | data = {}; |
915 | 6dcc461e | Kostas Papadimitriou | data[modelName] = model; |
916 | 6dcc461e | Kostas Papadimitriou | if (this.iterated[index] == null) { |
917 | 6dcc461e | Kostas Papadimitriou | _ref1 = this.view.models;
|
918 | 6dcc461e | Kostas Papadimitriou | for (key in _ref1) { |
919 | 6dcc461e | Kostas Papadimitriou | model = _ref1[key]; |
920 | 6dcc461e | Kostas Papadimitriou | if ((_ref2 = data[key]) == null) { |
921 | 6dcc461e | Kostas Papadimitriou | data[key] = model; |
922 | 6dcc461e | Kostas Papadimitriou | } |
923 | 6dcc461e | Kostas Papadimitriou | } |
924 | 6dcc461e | Kostas Papadimitriou | previous = this.iterated.length ? this.iterated[this.iterated.length - 1].els[0] : this.marker; |
925 | 6dcc461e | Kostas Papadimitriou | options = { |
926 | 6dcc461e | Kostas Papadimitriou | binders: this.view.options.binders, |
927 | 6dcc461e | Kostas Papadimitriou | formatters: this.view.options.formatters, |
928 | 6dcc461e | Kostas Papadimitriou | config: {}
|
929 | 6dcc461e | Kostas Papadimitriou | }; |
930 | 6dcc461e | Kostas Papadimitriou | _ref3 = this.view.options.config;
|
931 | 6dcc461e | Kostas Papadimitriou | for (k in _ref3) { |
932 | 6dcc461e | Kostas Papadimitriou | v = _ref3[k]; |
933 | 6dcc461e | Kostas Papadimitriou | options.config[k] = v; |
934 | 6dcc461e | Kostas Papadimitriou | } |
935 | 6dcc461e | Kostas Papadimitriou | options.config.preloadData = true;
|
936 | 6dcc461e | Kostas Papadimitriou | template = el.cloneNode(true);
|
937 | 6dcc461e | Kostas Papadimitriou | view = new Rivets.View(template, data, options);
|
938 | 6dcc461e | Kostas Papadimitriou | view.bind(); |
939 | 6dcc461e | Kostas Papadimitriou | this.iterated.push(view);
|
940 | 6dcc461e | Kostas Papadimitriou | _results.push(this.marker.parentNode.insertBefore(template, previous.nextSibling));
|
941 | 6dcc461e | Kostas Papadimitriou | } else if (this.iterated[index].models[modelName] !== model) { |
942 | 6dcc461e | Kostas Papadimitriou | _results.push(this.iterated[index].update(data));
|
943 | 6dcc461e | Kostas Papadimitriou | } else {
|
944 | 6dcc461e | Kostas Papadimitriou | _results.push(void 0); |
945 | 6dcc461e | Kostas Papadimitriou | } |
946 | 6dcc461e | Kostas Papadimitriou | } |
947 | 6dcc461e | Kostas Papadimitriou | return _results;
|
948 | 6dcc461e | Kostas Papadimitriou | }, |
949 | 6dcc461e | Kostas Papadimitriou | update: function(models) { |
950 | 6dcc461e | Kostas Papadimitriou | var data, key, model, view, _i, _len, _ref, _results;
|
951 | 6dcc461e | Kostas Papadimitriou | |
952 | 6dcc461e | Kostas Papadimitriou | data = {}; |
953 | 6dcc461e | Kostas Papadimitriou | for (key in models) { |
954 | 6dcc461e | Kostas Papadimitriou | model = models[key]; |
955 | 6dcc461e | Kostas Papadimitriou | if (key !== this.args[0]) { |
956 | 6dcc461e | Kostas Papadimitriou | data[key] = model; |
957 | 6dcc461e | Kostas Papadimitriou | } |
958 | 6dcc461e | Kostas Papadimitriou | } |
959 | 6dcc461e | Kostas Papadimitriou | _ref = this.iterated;
|
960 | 6dcc461e | Kostas Papadimitriou | _results = []; |
961 | 6dcc461e | Kostas Papadimitriou | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
962 | 6dcc461e | Kostas Papadimitriou | view = _ref[_i]; |
963 | 6dcc461e | Kostas Papadimitriou | _results.push(view.update(data)); |
964 | 6dcc461e | Kostas Papadimitriou | } |
965 | 6dcc461e | Kostas Papadimitriou | return _results;
|
966 | 6dcc461e | Kostas Papadimitriou | } |
967 | 6dcc461e | Kostas Papadimitriou | }, |
968 | 6dcc461e | Kostas Papadimitriou | "class-*": function(el, value) { |
969 | 6dcc461e | Kostas Papadimitriou | var elClass;
|
970 | 6dcc461e | Kostas Papadimitriou | |
971 | 6dcc461e | Kostas Papadimitriou | elClass = " " + el.className + " "; |
972 | 6dcc461e | Kostas Papadimitriou | if (!value === (elClass.indexOf(" " + this.args[0] + " ") !== -1)) { |
973 | 6dcc461e | Kostas Papadimitriou | return el.className = value ? "" + el.className + " " + this.args[0] : elClass.replace(" " + this.args[0] + " ", ' ').trim(); |
974 | 6dcc461e | Kostas Papadimitriou | } |
975 | 6dcc461e | Kostas Papadimitriou | }, |
976 | 6dcc461e | Kostas Papadimitriou | "*": function(el, value) { |
977 | 6dcc461e | Kostas Papadimitriou | if (value) {
|
978 | 6dcc461e | Kostas Papadimitriou | return el.setAttribute(this.type, value); |
979 | 6dcc461e | Kostas Papadimitriou | } else {
|
980 | 6dcc461e | Kostas Papadimitriou | return el.removeAttribute(this.type); |
981 | 6dcc461e | Kostas Papadimitriou | } |
982 | 6dcc461e | Kostas Papadimitriou | } |
983 | 6dcc461e | Kostas Papadimitriou | }; |
984 | 6dcc461e | Kostas Papadimitriou | |
985 | 6dcc461e | Kostas Papadimitriou | Rivets.internalBinders = { |
986 | 6dcc461e | Kostas Papadimitriou | textNode: function(node, value) { |
987 | 6dcc461e | Kostas Papadimitriou | return node.data = value != null ? value : ''; |
988 | 6dcc461e | Kostas Papadimitriou | } |
989 | 6dcc461e | Kostas Papadimitriou | }; |
990 | 6dcc461e | Kostas Papadimitriou | |
991 | 6dcc461e | Kostas Papadimitriou | Rivets.components = {}; |
992 | 6dcc461e | Kostas Papadimitriou | |
993 | 6dcc461e | Kostas Papadimitriou | Rivets.config = { |
994 | 6dcc461e | Kostas Papadimitriou | preloadData: true, |
995 | 6dcc461e | Kostas Papadimitriou | handler: function(context, ev, binding) { |
996 | 6dcc461e | Kostas Papadimitriou | return this.call(context, ev, binding.view.models); |
997 | 6dcc461e | Kostas Papadimitriou | } |
998 | 6dcc461e | Kostas Papadimitriou | }; |
999 | 6dcc461e | Kostas Papadimitriou | |
1000 | 6dcc461e | Kostas Papadimitriou | Rivets.formatters = {}; |
1001 | 6dcc461e | Kostas Papadimitriou | |
1002 | 6dcc461e | Kostas Papadimitriou | Rivets.factory = function(exports) { |
1003 | 6dcc461e | Kostas Papadimitriou | exports._ = Rivets; |
1004 | 6dcc461e | Kostas Papadimitriou | exports.binders = Rivets.binders; |
1005 | 6dcc461e | Kostas Papadimitriou | exports.components = Rivets.components; |
1006 | 6dcc461e | Kostas Papadimitriou | exports.formatters = Rivets.formatters; |
1007 | 6dcc461e | Kostas Papadimitriou | exports.config = Rivets.config; |
1008 | 6dcc461e | Kostas Papadimitriou | exports.configure = function(options) { |
1009 | 6dcc461e | Kostas Papadimitriou | var property, value;
|
1010 | 6dcc461e | Kostas Papadimitriou | |
1011 | 6dcc461e | Kostas Papadimitriou | if (options == null) { |
1012 | 6dcc461e | Kostas Papadimitriou | options = {}; |
1013 | 6dcc461e | Kostas Papadimitriou | } |
1014 | 6dcc461e | Kostas Papadimitriou | for (property in options) { |
1015 | 6dcc461e | Kostas Papadimitriou | value = options[property]; |
1016 | 6dcc461e | Kostas Papadimitriou | Rivets.config[property] = value; |
1017 | 6dcc461e | Kostas Papadimitriou | } |
1018 | 6dcc461e | Kostas Papadimitriou | }; |
1019 | 6dcc461e | Kostas Papadimitriou | return exports.bind = function(el, models, options) { |
1020 | 6dcc461e | Kostas Papadimitriou | var view;
|
1021 | 6dcc461e | Kostas Papadimitriou | |
1022 | 6dcc461e | Kostas Papadimitriou | if (models == null) { |
1023 | 6dcc461e | Kostas Papadimitriou | models = {}; |
1024 | 6dcc461e | Kostas Papadimitriou | } |
1025 | 6dcc461e | Kostas Papadimitriou | if (options == null) { |
1026 | 6dcc461e | Kostas Papadimitriou | options = {}; |
1027 | 6dcc461e | Kostas Papadimitriou | } |
1028 | 6dcc461e | Kostas Papadimitriou | view = new Rivets.View(el, models, options);
|
1029 | 6dcc461e | Kostas Papadimitriou | view.bind(); |
1030 | 6dcc461e | Kostas Papadimitriou | return view;
|
1031 | 6dcc461e | Kostas Papadimitriou | }; |
1032 | 6dcc461e | Kostas Papadimitriou | }; |
1033 | 6dcc461e | Kostas Papadimitriou | |
1034 | 6dcc461e | Kostas Papadimitriou | if (typeof exports === 'object') { |
1035 | 6dcc461e | Kostas Papadimitriou | Rivets.factory(exports); |
1036 | 6dcc461e | Kostas Papadimitriou | } else if (typeof define === 'function' && define.amd) { |
1037 | 6dcc461e | Kostas Papadimitriou | define(['exports'], function(exports) { |
1038 | 6dcc461e | Kostas Papadimitriou | Rivets.factory(this.rivets = exports);
|
1039 | 6dcc461e | Kostas Papadimitriou | return exports;
|
1040 | 6dcc461e | Kostas Papadimitriou | }); |
1041 | 6dcc461e | Kostas Papadimitriou | } else {
|
1042 | 6dcc461e | Kostas Papadimitriou | Rivets.factory(this.rivets = {});
|
1043 | 6dcc461e | Kostas Papadimitriou | } |
1044 | 6dcc461e | Kostas Papadimitriou | |
1045 | 6dcc461e | Kostas Papadimitriou | }).call(this); |