www_app 1.3.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/README.md +42 -24
  4. data/VERSION +1 -1
  5. data/bin/www_app +15 -4
  6. data/lib/public/vendor/hogan-3.0.2.min.js +5 -0
  7. data/lib/public/vendor/instruct_instruct_instruct.js +247 -0
  8. data/lib/public/vendor/jquery-2.1.3.min.js +4 -0
  9. data/lib/public/vendor/lodash.min.js +89 -0
  10. data/lib/public/www_app.js +885 -625
  11. data/lib/www_app/CSS.rb +310 -0
  12. data/lib/www_app/HTML.rb +219 -0
  13. data/lib/www_app/JavaScript.rb +51 -0
  14. data/lib/www_app/TO.rb +897 -0
  15. data/lib/www_app.rb +324 -945
  16. data/playground/config.ru +102 -0
  17. data/specs/client-side/index.html +1 -1
  18. data/specs/client-side/index.js +31 -379
  19. data/specs/lib/config.ru +60 -31
  20. data/specs/lib/helpers.rb +24 -2
  21. data/specs/server-side/0000-new.rb +1 -1
  22. data/specs/server-side/0001-underscore-double.rb +38 -0
  23. data/specs/server-side/0001-underscore.rb +73 -0
  24. data/specs/server-side/0010-attrs.rb +3 -4
  25. data/specs/server-side/0011-id.rb +5 -5
  26. data/specs/server-side/0020-tag.rb +2 -2
  27. data/specs/server-side/0020-tag_content.rb +1 -1
  28. data/specs/server-side/0021-body.rb +1 -1
  29. data/specs/server-side/0021-script.rb +66 -20
  30. data/specs/server-side/{0021-page_title.rb → 0021-title.rb} +5 -3
  31. data/specs/server-side/0030-mustache.rb +27 -20
  32. data/specs/server-side/0030-style.rb +64 -21
  33. data/specs/server-side/0040-css.rb +4 -4
  34. data/specs/server-side/0041-pseudo.rb +55 -0
  35. data/specs/server-side/0042-slash.rb +20 -0
  36. data/specs/server-side/0060-text.rb +26 -0
  37. metadata +18 -13
  38. data/lib/public/jquery-2.1.1.js +0 -4
  39. data/lib/public/underscore-1.7.0.js +0 -6
  40. data/lib/public/underscore-min.map +0 -1
  41. data/lib/public/underscore.string-2.3.0.js +0 -1
  42. data/lib/www_app/Clean.rb +0 -169
  43. data/lib/www_app/dsl.rb +0 -86
  44. data/lib/www_app/source.rb +0 -53
  45. data/specs/server-side/0050-on.rb +0 -64
  46. data/specs/server-side/0060-string.rb +0 -32
  47. /data/lib/public/{jquery.serialize-object.min.js → vendor/jquery.serialize-object.min.js} +0 -0
@@ -1,824 +1,1084 @@
1
-
2
1
  "use strict";
3
2
 
4
-
5
- var WWW_App = null;
6
-
3
+ /* jshint undef: true, unused: false */
4
+ /* global Hogan , _ */
7
5
 
8
6
  (function () {
9
7
 
10
- var VALID_TOUCH_ACTIONS = ['mousedown', 'mouseup', 'focus', 'blur', 'click'];
11
- var all_scopes = [];
12
- var id_counter = -1;
13
- var INVALID_FORM_ACTION_CHARS = /[^a-z0-9\/\.\_]+/g;
14
- var MAIN = null;
15
- var WHITE_SPACE = /\s+/;
8
+ function throw_error (msg) {
9
+ Hogan.cache = {};
10
+ throw new Error(msg);
11
+ }
16
12
 
13
+ function findInScope(key, scope) {
14
+ var val;
15
+ if (scope && typeof scope === 'object' && scope[key] !== undefined && scope[key] !== null) {
16
+ val = scope[key];
17
+ }
17
18
 
18
- // ================================================================
19
- // Helper Functions
20
- // ================================================================
19
+ return val;
20
+ }
21
+
22
+ // === My monkey-patches to Hogan. ======
23
+ // When a variable is not found,
24
+ // I want to throw an Error.
25
+ // ======================================
26
+ Hogan.Template.prototype.f = function(key, ctx) {
27
+ var val = false,
28
+ v = null,
29
+ found = false,
30
+ doModelGet = this.options.modelGet;
31
+
32
+ for (var i = ctx.length - 1; i >= 0; i--) {
33
+ v = ctx[i];
34
+ val = findInScope(key, v, doModelGet);
35
+ if (val !== undefined && val !== null) {
36
+ found = true;
37
+ break;
38
+ }
39
+ }
21
40
 
22
- // From:
23
- // http://stackoverflow.com/questions/1026069/capitalize-the-first-letter-of-string-in-javascript
24
- var capitalize = function (s) {
25
- return s.charAt(0).toUpperCase() + s.substring(1);
26
- };
41
+ if (!found) {
42
+ throw_error("Value not found: " + key);
43
+ }
27
44
 
45
+ return val;
46
+ }; // === .f
28
47
 
29
- var classes = function (raw) {
30
- return _.str.trim($(raw).attr('class')).split(WHITE_SPACE);
31
- }; // function
48
+ Hogan.Template.prototype.d = function(key, ctx) {
49
+ var val,
50
+ names = key.split('.'),
51
+ data = _.detect(ctx, function (v) { return _.has(v, names[0]);});
32
52
 
53
+ if (key === '.' && _.isArray(ctx[ctx.length - 2])) {
54
+ throw new Error("Unknown key: " + key);
55
+ }
33
56
 
34
- var tag_name = function (raw) {
35
- return ($(raw).prop('tagName') || '').toLowerCase();
36
- }; // function
57
+ val = _.reduce(names, function (memo, v) { return memo && memo[v];}, data);
37
58
 
59
+ if (val === undefined || val === null) {
60
+ throw_error("Dot-notated value not found: " + key + " in: " + JSON.stringify(ctx));
61
+ }
62
+ return val;
63
+ }; // === .d
64
+ // ======================================
65
+ // End of monkey-patches for Hogan.
66
+ // ======================================
38
67
 
39
- var inspect = function (val) {
40
- var name = func_name(val.constructor || 'Unknown');
41
- return name + ': ' + val;
42
- };
68
+ })();
43
69
 
44
- var form_status = function (form, data, key) {
45
- var dom = form.find('div.status_msg:first');
46
- if (dom.length === 0) {
47
- form.find('div.buttons:first').before('<div class="status_msg"></div>');
48
- return form_status(form, data, key);
49
- }
50
70
 
51
- dom.addClass(key);
52
- dom.html(data.clean_html[key]);
53
- return dom;
54
- }; // function
55
71
 
56
- var form_reset_class = function (form, css_class) {
57
- form.removeClass('submitted');
58
- form.removeClass('loading');
59
- form.removeClass('error');
60
- form.removeClass('errors');
72
+ // ======================================
73
+ // Start of client-side WWW_App.
74
+ // ======================================
61
75
 
62
- if (css_class === 'errors')
63
- css_class = 'error';
76
+ var WWW_App = {};
64
77
 
65
- if (css_class) {
66
- form.addClass(css_class);
67
- }
68
- return form;
69
- }; // function
78
+ (function () {
70
79
 
80
+ var SPACES = /\s+/;
81
+ var ALL_KNOWN_CLASSES = 'no_reset reset page_load prepend append no_reset'.split(SPACES);
82
+ var script_meta = {};
83
+ var the_scripts = $('script[type="text/hogan"]');
71
84
 
72
- var id = function (str_or_o) {
73
- var target = $(str_or_o);
74
- if (!target.attr('id')) {
75
- id_counter = id_counter + 1;
76
- target.attr('id', target.prop('tagName').toLowerCase() + '_client_default_id_' + id_counter);
85
+ // ================================ Helpers
86
+ var auto_id = function (o) {
87
+ if (!_.isNumber(auto_id.counter)) {
88
+ auto_id.counter = -1;
77
89
  }
90
+ auto_id.counter = auto_id.counter + 1;
78
91
 
79
- return '#' + target.attr('id');
80
- }; // function
92
+ if (o.attr('id')) {
93
+ return o.attr('id');
94
+ }
81
95
 
96
+ var new_id = "auto_id_" + auto_id.counter;
97
+ $(o).attr('id', new_id);
98
+ return new_id;
99
+ };
82
100
 
83
101
  var is_numeric = function (val) {
84
102
  return _.isNumber(val) && !_.isNaN(val);
85
103
  };
86
104
 
87
-
88
105
  var log = function () {
89
106
  if (!window.console) { return; }
90
- return console.log.apply(console, arguments);
107
+ return console['log'].apply(console, arguments);
91
108
  };
92
109
 
110
+ var classes = function (j) {
111
+ var raw = j.attr('class');
93
112
 
94
- var func_name = function (raw) {
95
- var s = null;
96
- var name = null;
113
+ if (!raw)
114
+ return [];
97
115
 
98
- if (_.isString(raw)) {
99
- s = raw;
100
- } else {
101
- s = ('' + raw);
102
- }
116
+ var str = _.trim(raw);
103
117
 
104
- name = _.last( _.first(s.split('(')).split('function ') );
105
- return name;
118
+ if (_.isEmpty(str))
119
+ return [];
120
+
121
+ return str.split(SPACES);
106
122
  };
107
123
 
108
- var each = function (arr, func) {
109
- var l = arr.length;
110
- var i = 0;
111
- var each_o = {
124
+ var known_classes = function (j) {
125
+ var arr = _.select(classes(j), function (v) {
126
+ return _.contains(ALL_KNOWN_CLASSES, v);
127
+ });
128
+ };
112
129
 
113
- next: function () {
114
- if (each_o.is_last()) {
115
- throw new Error('No more items: i: ' + i + ' total: ' + l);
116
- }
117
- return arr[i + 1];
118
- }, // === next
130
+ var custom_classes = function (j) {
131
+ return _.reject(classes(j) ,function (v) {
132
+ return _.contains(ALL_KNOWN_CLASSES, v);
133
+ });
134
+ };
119
135
 
120
- prev : function () {
121
- if (each_o.is_first()) {
122
- throw new Error('No previous items: i: ' + i + ' total: ' + l);
123
- }
124
- return arr[i - 1];
125
- },
126
-
127
- next_or_null: function () {
128
- if (each_o.is_last()) { return null; }
129
- return arr[i + 1];
130
- },
131
-
132
- prev_or_null : function () {
133
- if (each_o.is_first()) { return null; }
134
- return arr[i - 1];
135
- },
136
-
137
- is_first: function () {
138
- return i < 1;
139
- },
140
-
141
- is_last: function () {
142
- return i >= (l - 1);
143
- },
144
-
145
- grab_next: function () {
146
- if (each_o.is_last()) {
147
- throw new Error('Can\'t grab next because already at last position.');
148
- }
149
- i = i + 1;
150
- return arr[i];
151
- }
136
+ var every = function (val, func) {
137
+ if (!_.isArray(val)) {
138
+ throw new Error("Value is not an array: " + typeof val);
139
+ }
152
140
 
153
- }; // === each_o
141
+ if (_.isEmpty(val))
142
+ return false;
154
143
 
155
- while ( i < l ) {
156
- each_o.i = i;
157
- func(arr[i], each_o);
158
- i = i + 1;
159
- } // while
144
+ return _.every(val, func);
145
+ };
160
146
 
161
- }; // === each
147
+ // ==============================================
148
+ // End of helpers.
149
+ // ==============================================
162
150
 
151
+ var run = WWW_App.run = function (arr_of_data) {
152
+ if (!_.isArray(arr_of_data)) {
153
+ throw new Error("Not an array.");
154
+ }
163
155
 
164
- var to_number_name = function (num) {
165
- var name = null;
166
- switch (num) {
167
- case 0:
168
- name = 'first';
169
- break;
156
+ _.each(arr_of_data, function (data, arr_of_data_i) {
157
+ var displays = _.has(data, 'display_as') && ((_.isArray(data.display_as) && !_.isEmpty(data.display_as)) || _.isString(data.display_as)) ? data.display_as : null;
158
+ var bag = _.has(data, 'display_as') ? data.data : data;
159
+ var main_class = null;
160
+ var scripts = null;
161
+ var is_array = _.isArray(data);
162
+
163
+ if (displays) {
164
+ main_class = displays[0];
165
+ scripts = $(_.select(the_scripts, function (o) { return $(o).hasClass(main_class); }));
166
+ } else {
167
+ scripts = the_scripts;
168
+ }
170
169
 
171
- case 1:
172
- name = 'second';
173
- break;
170
+ scripts.each(function (i) {
174
171
 
175
- case 2:
176
- name = 'third';
177
- break;
172
+ var o = $(this);
173
+ var id = auto_id(o);
178
174
 
179
- case 3:
180
- name = 'fourth';
181
- break;
175
+ var all_script_class = classes(o);
176
+ var custom_script_classes = custom_classes(o);
177
+ var known_script_classes = known_classes(o);
182
178
 
183
- case 4:
184
- name = 'fifth';
185
- break;
179
+ var childs = null;
180
+ var reset_it = !o.hasClass('no_reset') && !is_array;
181
+ var old_childs = script_meta[id];
182
+ var render_it = (!displays && (o.hasClass('page_load') || _.isEmpty(custom_script_classes))) || (displays && every(displays, function (c) { return o.hasClass(c); }));
186
183
 
187
- case 5:
188
- name = 'sixth';
189
- break;
190
184
 
191
- default:
192
- throw new Error("Unknown value: " + num);
193
- } // === switch num
194
- return name;
195
- }; // function
185
+ // === Reset script.
186
+ //
187
+ if (reset_it && old_childs) {
188
+ old_childs.remove();
189
+ }
196
190
 
191
+ if (render_it) {
192
+ // === Compile.
193
+ //
194
+ childs = $(Hogan.compile("{{=!{ }!=}} \n" + o.html()).render(bag));
197
195
 
198
- var last_types = function (stack, types, stack_name) {
199
- var o = {};
200
196
 
201
- if (types.length === 0) {
202
- throw new Error("No arguments.");
203
- }
197
+ if (_.isEmpty(childs.html())) {
198
+ childs = null;
199
+ }
204
200
 
205
- if (types.length === 1 && types[0] === 'all') {
206
- return stack;
207
- }
201
+ if (reset_it && childs)
202
+ script_meta[id] = childs;
203
+
204
+ // === Add to DOM.
205
+ //
206
+ if (childs) {
207
+ if (o.hasClass('prepend') || (is_array && !o.parent().hasClass('append'))) {
208
+ o.parent().prepend(childs);
209
+ } else if (o.hasClass('append') || (is_array && o.parent().hasClass('append'))) {
210
+ o.parent().append(childs);
211
+ } else {
212
+ o.before(childs);
213
+ }
214
+ }
208
215
 
209
- var vals = _.last(stack, types.length);
216
+ } // === if render_it
210
217
 
211
- if (vals.length !== types.length) {
212
- throw new Error('Not enough values in ' + stack_name + '.');
213
- }
218
+ // === Save results for reset.
219
+ //
220
+ script_meta[id] = childs;
221
+ }); // === each scripts
214
222
 
215
- _.each(types, function (t, i) {
216
- var val = vals[i];
217
- var ignore_type = t === 'any' || t === 'last';
223
+ }); // === each data
218
224
 
219
- if (!ignore_type) {
220
- if (_.isString(t)) {
221
- throw new Error('Unknown position or type: ' + t);
222
- }
223
225
 
224
- if (val.constructor !== t) {
225
- throw new Error('Value in ' + stack_name + " is not a " + func_name(t) + ': ' + inspect(val));
226
- }
226
+ return this;
227
+ };
228
+
229
+ var context = WWW_App.context = [
230
+ {
231
+ html: {
232
+ first: 'Hans',
233
+ last: 'Hoppe',
234
+ movie: 'Sky Captain &amp; The World of Tomorrow',
235
+ author: 'Hoppe'
236
+ }
237
+ },
238
+ {
239
+ display_as: ['news', 'good'],
240
+ data: {
241
+ html : {
242
+ msg: 'Good'
227
243
  }
244
+ }
245
+ }
246
+ ];
228
247
 
229
- o[to_number_name(i)] = val;
230
- });
248
+ run(context);
249
+ WWW_App.run = run;
231
250
 
232
- if (types.length === 1) {
233
- return o.first;
234
- }
251
+ })(); // === WWW_App scope
235
252
 
236
- return o;
237
- }; // last_types
253
+ // var load = WWW_App.load;
254
+ // var context = WWW_App.context;
238
255
 
239
- // ================================================================
240
- // === End Helper Functions =======================================
241
- // ================================================================
256
+ /**
242
257
 
258
+ 1) it "adds childs before the script tag"
259
+ 4) it "does not reset script if data is an Array"
243
260
 
244
- // ================================================================
245
- // Scope
246
- // ================================================================
247
- var Scope = function (parent) {
261
+ 2) it "prepends to parent if script class has 'prepend'"
262
+ 5) it "prepends to parent if data is an Array"
248
263
 
249
- var o = {};
250
- var vars = {};
251
- var stack = [];
252
- var events = [];
253
- var scope_log_stack = [];
254
- var top = o;
264
+ 3) it "appends to parent if script class has 'append'"
265
+ 6) it "appends to parent if data is an Array and script class has 'append'"
255
266
 
256
- if (parent) {
257
- o.parent = parent;
258
- while(top.parent) {
259
- top = top.parent;
260
- }
261
- }
267
+ 7) Error is thrown if value is underfined in "data".
268
+ 7) Error is thrown if value is null in "data".
262
269
 
263
- all_scopes.push(o);
270
+ 8) it "does not render template if script tag does not contain data.display_as classes"
271
+ 9) it "renders template if script tag has no classes and there is no data.display_as defined"
272
+ 9) it "renders template if script tag has a known class (append, prepend, etc) and there is no data.display_as defined"
264
273
 
265
- var scope_log = function () {
266
- return _.each(_.toArray(arguments), function (val) {
267
- top.log.push(val);
268
- });
269
- }; // function
270
274
 
271
- var on = function (name, raw_target) {
275
+ **/
272
276
 
273
- if (name === 'defaults') { // =================================
277
+ // (function () {
274
278
 
275
- // ========= Setup default actions for "button" tags: =======
276
- _.each( $('button'), function (raw_b) {
277
- on('click', raw_b);
278
- }); // === _.each
279
+ // var VALID_TOUCH_ACTIONS = ['mousedown', 'mouseup', 'focus', 'blur', 'click'];
280
+ // var all_scopes = [];
281
+ // var id_counter = -1;
282
+ // var INVALID_FORM_ACTION_CHARS = /[^a-z0-9\/\.\_]+/g;
283
+ // var MAIN = null;
284
+ // var WHITE_SPACE = /\s+/;
279
285
 
280
- // ========= Setup default actions for "a" tags: ============
281
- _.each( $('a[href]'), function (raw_a) {
282
- var a = $(raw_a);
283
- var href = a.attr('href');
284
- if (href.indexOf('#') !== 0)
285
- return false;
286
286
 
287
- var anchor = $('a[name="' + href.replace('#', '') + '"]');
288
- if (anchor.length > 0)
289
- return false;
287
+ // // ================================================================
288
+ // // Helper Functions
289
+ // // ================================================================
290
290
 
291
- on('click', a);
292
- });
291
+ // // From:
292
+ // // http://stackoverflow.com/questions/1026069/capitalize-the-first-letter-of-string-in-javascript
293
+ // var capitalize = function (s) {
294
+ // return s.charAt(0).toUpperCase() + s.substring(1);
295
+ // };
293
296
 
294
- return o;
295
- } // if 'defaults' ============================================
296
297
 
297
- if (!_.contains(VALID_TOUCH_ACTIONS, name)) {
298
- throw new Error('Unknown event name: ' + name);
299
- }
298
+ // var classes = function (raw) {
299
+ // return _.str.trim($(raw).attr('class')).split(WHITE_SPACE);
300
+ // }; // function
300
301
 
301
- var target = $(raw_target);
302
- target.off(name);
303
- target.on(name, function (e) {
304
-
305
- e.preventDefault();
306
- e.stopPropagation();
307
- e.stopImmediatePropagation();
308
-
309
- run_does(name, e.target, {event: e});
310
-
311
- var tag = tag_name(target);
312
- var is_click = name === 'click';
313
- var is_a = tag === 'a';
314
- var is_button = tag === 'button';
315
- var is_submit = target.hasClass('submit') && target.parents('form:first').length > 0;
316
- var is_hash = is_a && target.attr('href').indexOf('#') === 0;
317
- var form_parents = target.parents('form');
318
- var is_touch = _.contains(VALID_TOUCH_ACTIONS, name);
319
-
320
- if (is_click && is_button && !is_submit ) {
321
- _.each(classes(target), function (css) {
322
- run_does(css, target, {event: e});
323
- });
324
- return false;
325
- }
326
302
 
327
- if (is_click && is_a && !is_submit && is_hash) {
328
- var action = target.attr('href').replace('#', '');
329
- var no_anchors = $('a[name="' + action + '"]').length === 0;
330
- if (no_anchors)
331
- run_does(action, target, {event: e});
332
- return false;
333
- }
303
+ // var tag_name = function (raw) {
304
+ // return ($(raw).prop('tagName') || '').toLowerCase();
305
+ // }; // function
334
306
 
335
- if (is_submit) {
336
- submit_form(e.target, {event: e});
337
- return false;
338
- }
339
307
 
340
- if (is_touch) {
341
- _.each(classes(target), function (css) {
342
- run_does(css, target, {event: e});
343
- });
344
- }
308
+ // var inspect = function (val) {
309
+ // var name = func_name(val.constructor || 'Unknown');
310
+ // return name + ': ' + val;
311
+ // };
345
312
 
346
- return false;
347
- }); // target.on
313
+ // var form_status = function (form, data, key) {
314
+ // var dom = form.find('div.status_msg:first');
315
+ // if (dom.length === 0) {
316
+ // form.find('div.buttons:first').before('<div class="status_msg"></div>');
317
+ // return form_status(form, data, key);
318
+ // }
348
319
 
349
- }; // === on
320
+ // dom.addClass(key);
321
+ // dom.html(data.clean_html[key]);
322
+ // return dom;
323
+ // }; // function
350
324
 
351
- var click_button = function (name, raw_target, options) {
352
- var target = $(raw_target);
353
- var do_click = !target.hasClass('submit');
325
+ // var form_reset_class = function (form, css_class) {
326
+ // form.removeClass('submitted');
327
+ // form.removeClass('loading');
328
+ // form.removeClass('error');
329
+ // form.removeClass('errors');
354
330
 
355
- if (!do_click)
356
- return false;
331
+ // if (css_class === 'errors')
332
+ // css_class = 'error';
357
333
 
358
- }; // function
334
+ // if (css_class) {
335
+ // form.addClass(css_class);
336
+ // }
337
+ // return form;
338
+ // }; // function
359
339
 
360
- var submit_form = function (raw_target, options) {
361
- var e = options.event;
362
- var target = $(raw_target);
363
- var form = target.parents('form:first');
364
- var tag = tag_name(target);
365
340
 
366
- var form_type = _.detect('GET POST PUT DELETE'.split(/\s+/), function (val) {
367
- return target.hasClass(val.toLowerCase());
368
- }) || 'POST';
341
+ // var id = function (str_or_o) {
342
+ // var target = $(str_or_o);
343
+ // if (!target.attr('id')) {
344
+ // id_counter = id_counter + 1;
345
+ // target.attr('id', target.prop('tagName').toLowerCase() + '_client_default_id_' + id_counter);
346
+ // }
369
347
 
370
- var form_data = form.serializeObject();
371
- if (form_type !== 'GET' && form_type !== 'POST') {
372
- form_data._method = form_type;
373
- form_type = 'POST';
374
- }
348
+ // return '#' + target.attr('id');
349
+ // }; // function
375
350
 
376
- var is_success = false;
377
- var url = form.attr('action');
378
- var settings = {
379
- type : form_type,
380
- dataType : "json",
381
- data : form_data,
382
- success : function (data,status_str, jxhr) {
383
- is_success = true;
384
- if (data.clean_html.error_msg) {
385
- form_status(form, data, 'error_msg');
386
- form_reset_class(form, 'error');
387
- run_does('error', target, {event: e, vars: {data: data.data}});
388
- } else {
389
- form_status(form, data, 'success_msg');
390
- form_reset_class(form, 'success');
391
- run_does('success', target, {event: e, vars: {data: data.data}});
392
- }
393
- },
394
- error : function (data) {
395
- form_status(form, {clean_html: {error_msg: 'An unknown network error has occurred.'}}, 'error_msg');
396
- form_reset_class(form, 'error');
397
- },
398
- complete : function (a,b,c) {
399
- form.removeClass('loading');
400
- form.addClass('complete');
401
- if (!is_success) {
402
- form_reset_class(form, 'error');
403
- form_status(form, 'An unknown error has occurred.');
404
- }
405
- }
406
- };
407
351
 
408
- var invalid = url.match(INVALID_FORM_ACTION_CHARS);
409
- if (invalid) {
410
- throw new Error('Invalid chars in form action url: ' + invalid.join('') );
411
- }
412
352
 
413
- form_reset_class(form, 'loading');
414
- $.ajax(url, settings);
415
353
 
416
- }; // submit_form_if_needed
354
+ // var func_name = function (raw) {
355
+ // var s = null;
356
+ // var name = null;
417
357
 
418
- var run_does = function (event_name, raw_target, options) {
358
+ // if (_.isString(raw)) {
359
+ // s = raw;
360
+ // } else {
361
+ // s = ('' + raw);
362
+ // }
419
363
 
420
- var target = $(raw_target);
364
+ // name = _.last( _.first(s.split('(')).split('function ') );
365
+ // return name;
366
+ // };
421
367
 
422
- _.each(events, function (meta) {
423
- var first = meta.path_tokens[0];
368
+ // var each = function (arr, func) {
369
+ // var l = arr.length;
370
+ // var i = 0;
371
+ // var each_o = {
424
372
 
425
- if (first !== event_name)
426
- return false;
373
+ // next: function () {
374
+ // if (each_o.is_last()) {
375
+ // throw new Error('No more items: i: ' + i + ' total: ' + l);
376
+ // }
377
+ // return arr[i + 1];
378
+ // }, // === next
427
379
 
428
- var second = meta.path_tokens[1];
429
- var third = meta.path_tokens[2];
430
- var relative = (third || second) ? relative_id(target, (third || second)) : null;
380
+ // prev : function () {
381
+ // if (each_o.is_first()) {
382
+ // throw new Error('No previous items: i: ' + i + ' total: ' + l);
383
+ // }
384
+ // return arr[i - 1];
385
+ // },
431
386
 
432
- var is_touch = _.contains(VALID_TOUCH_ACTIONS, event_name);
433
- var is_target = second && $(second).is(target);
434
- var is_css = target.hasClass(event_name);
435
- var is_href = tag_name(target) === 'a' && target.attr('href') === ('#' + event_name);
436
- var push_target = null;
387
+ // next_or_null: function () {
388
+ // if (each_o.is_last()) { return null; }
389
+ // return arr[i + 1];
390
+ // },
437
391
 
438
- // === "/click/button.something/relative"
439
- if (is_touch && is_target && third && relative)
440
- push_target = relative;
392
+ // prev_or_null : function () {
393
+ // if (each_o.is_first()) { return null; }
394
+ // return arr[i - 1];
395
+ // },
441
396
 
442
- else { // === "/click/button.something"
443
- if (is_touch && is_target && !third)
444
- push_target = id(target);
397
+ // is_first: function () {
398
+ // return i < 1;
399
+ // },
445
400
 
446
- else { // === "/red/relative"
447
- if ((is_css || is_href) && !third && relative)
448
- push_target = relative;
401
+ // is_last: function () {
402
+ // return i >= (l - 1);
403
+ // },
449
404
 
450
- else { // "/red"
451
- if (is_css && !second && !third)
452
- push_target = id(target);
405
+ // grab_next: function () {
406
+ // if (each_o.is_last()) {
407
+ // throw new Error('Can\'t grab next because already at last position.');
408
+ // }
409
+ // i = i + 1;
410
+ // return arr[i];
411
+ // }
412
+
413
+ // }; // === each_o
414
+
415
+ // while ( i < l ) {
416
+ // each_o.i = i;
417
+ // func(arr[i], each_o);
418
+ // i = i + 1;
419
+ // } // while
420
+
421
+ // }; // === each
422
+
423
+
424
+ // var to_number_name = function (num) {
425
+ // var name = null;
426
+ // switch (num) {
427
+ // case 0:
428
+ // name = 'first';
429
+ // break;
453
430
 
454
- else { // /success/#form_1
455
- if (!third && first === event_name && relative)
456
- push_target = relative;
457
- }
458
- }
459
- }
460
- }
431
+ // case 1:
432
+ // name = 'second';
433
+ // break;
461
434
 
462
- if (push_target)
463
- return child(options.vars).push(push_target).run(meta.code);
435
+ // case 2:
436
+ // name = 'third';
437
+ // break;
464
438
 
465
- return false;
466
- });
467
- }; // function
439
+ // case 3:
440
+ // name = 'fourth';
441
+ // break;
442
+
443
+ // case 4:
444
+ // name = 'fifth';
445
+ // break;
468
446
 
447
+ // case 5:
448
+ // name = 'sixth';
449
+ // break;
469
450
 
470
- // ==============================================================
471
- // ============== stack functions ===============================
472
- // ==============================================================
451
+ // default:
452
+ // throw new Error("Unknown value: " + num);
453
+ // } // === switch num
454
+ // return name;
455
+ // }; // function
456
+
457
+
458
+ // var last_types = function (stack, types, stack_name) {
459
+ // var o = {};
460
+
461
+ // if (types.length === 0) {
462
+ // throw new Error("No arguments.");
463
+ // }
464
+
465
+ // if (types.length === 1 && types[0] === 'all') {
466
+ // return stack;
467
+ // }
468
+
469
+ // var vals = _.last(stack, types.length);
470
+
471
+ // if (vals.length !== types.length) {
472
+ // throw new Error('Not enough values in ' + stack_name + '.');
473
+ // }
474
+
475
+ // _.each(types, function (t, i) {
476
+ // var val = vals[i];
477
+ // var ignore_type = t === 'any' || t === 'last';
478
+
479
+ // if (!ignore_type) {
480
+ // if (_.isString(t)) {
481
+ // throw new Error('Unknown position or type: ' + t);
482
+ // }
483
+
484
+ // if (val.constructor !== t) {
485
+ // throw new Error('Value in ' + stack_name + " is not a " + func_name(t) + ': ' + inspect(val));
486
+ // }
487
+ // }
488
+
489
+ // o[to_number_name(i)] = val;
490
+ // });
491
+
492
+ // if (types.length === 1) {
493
+ // return o.first;
494
+ // }
495
+
496
+ // return o;
497
+ // }; // last_types
498
+
499
+ // // ================================================================
500
+ // // === End Helper Functions =======================================
501
+ // // ================================================================
502
+
503
+
504
+ // // ================================================================
505
+ // // Scope
506
+ // // ================================================================
507
+ // var Scope = function (parent) {
508
+
509
+ // var o = {};
510
+ // var vars = {};
511
+ // var stack = [];
512
+ // var events = [];
513
+ // var scope_log_stack = [];
514
+ // var top = o;
515
+
516
+ // if (parent) {
517
+ // o.parent = parent;
518
+ // while(top.parent) {
519
+ // top = top.parent;
520
+ // }
521
+ // }
522
+
523
+ // all_scopes.push(o);
524
+
525
+ // var scope_log = function () {
526
+ // return _.each(_.toArray(arguments), function (val) {
527
+ // top.log.push(val);
528
+ // });
529
+ // }; // function
530
+
531
+ // var on = function (name, raw_target) {
532
+
533
+ // if (name === 'defaults') { // =================================
534
+
535
+ // // ========= Setup default actions for "button" tags: =======
536
+ // _.each( $('button'), function (raw_b) {
537
+ // on('click', raw_b);
538
+ // }); // === _.each
539
+
540
+ // // ========= Setup default actions for "a" tags: ============
541
+ // _.each( $('a[href]'), function (raw_a) {
542
+ // var a = $(raw_a);
543
+ // var href = a.attr('href');
544
+ // if (href.indexOf('#') !== 0)
545
+ // return false;
546
+
547
+ // var anchor = $('a[name="' + href.replace('#', '') + '"]');
548
+ // if (anchor.length > 0)
549
+ // return false;
550
+
551
+ // on('click', a);
552
+ // });
553
+
554
+ // return o;
555
+ // } // if 'defaults' ============================================
556
+
557
+ // if (!_.contains(VALID_TOUCH_ACTIONS, name)) {
558
+ // throw new Error('Unknown event name: ' + name);
559
+ // }
560
+
561
+ // var target = $(raw_target);
562
+ // target.off(name);
563
+ // target.on(name, function (e) {
564
+
565
+ // e.preventDefault();
566
+ // e.stopPropagation();
567
+ // e.stopImmediatePropagation();
568
+
569
+ // run_does(name, e.target, {event: e});
570
+
571
+ // var tag = tag_name(target);
572
+ // var is_click = name === 'click';
573
+ // var is_a = tag === 'a';
574
+ // var is_button = tag === 'button';
575
+ // var is_submit = target.hasClass('submit') && target.parents('form:first').length > 0;
576
+ // var is_hash = is_a && target.attr('href').indexOf('#') === 0;
577
+ // var form_parents = target.parents('form');
578
+ // var is_touch = _.contains(VALID_TOUCH_ACTIONS, name);
579
+
580
+ // if (is_click && is_button && !is_submit ) {
581
+ // _.each(classes(target), function (css) {
582
+ // run_does(css, target, {event: e});
583
+ // });
584
+ // return false;
585
+ // }
586
+
587
+ // if (is_click && is_a && !is_submit && is_hash) {
588
+ // var action = target.attr('href').replace('#', '');
589
+ // var no_anchors = $('a[name="' + action + '"]').length === 0;
590
+ // if (no_anchors)
591
+ // run_does(action, target, {event: e});
592
+ // return false;
593
+ // }
594
+
595
+ // if (is_submit) {
596
+ // submit_form(e.target, {event: e});
597
+ // return false;
598
+ // }
599
+
600
+ // if (is_touch) {
601
+ // _.each(classes(target), function (css) {
602
+ // run_does(css, target, {event: e});
603
+ // });
604
+ // }
605
+
606
+ // return false;
607
+ // }); // target.on
608
+
609
+ // }; // === on
610
+
611
+ // var click_button = function (name, raw_target, options) {
612
+ // var target = $(raw_target);
613
+ // var do_click = !target.hasClass('submit');
614
+
615
+ // if (!do_click)
616
+ // return false;
617
+
618
+ // }; // function
619
+
620
+ // var submit_form = function (raw_target, options) {
621
+ // var e = options.event;
622
+ // var target = $(raw_target);
623
+ // var form = target.parents('form:first');
624
+ // var tag = tag_name(target);
625
+
626
+ // var form_type = _.detect('GET POST PUT DELETE'.split(/\s+/), function (val) {
627
+ // return target.hasClass(val.toLowerCase());
628
+ // }) || 'POST';
629
+
630
+ // var form_data = form.serializeObject();
631
+ // if (form_type !== 'GET' && form_type !== 'POST') {
632
+ // form_data._method = form_type;
633
+ // form_type = 'POST';
634
+ // }
635
+
636
+ // var is_success = false;
637
+ // var url = form.attr('action');
638
+ // var settings = {
639
+ // type : form_type,
640
+ // dataType : "json",
641
+ // data : form_data,
642
+ // success : function (data,status_str, jxhr) {
643
+ // is_success = true;
644
+ // if (data.clean_html.error_msg) {
645
+ // form_status(form, data, 'error_msg');
646
+ // form_reset_class(form, 'error');
647
+ // run_does('error', target, {event: e, vars: {data: data.data}});
648
+ // } else {
649
+ // form_status(form, data, 'success_msg');
650
+ // form_reset_class(form, 'success');
651
+ // run_does('success', target, {event: e, vars: {data: data.data}});
652
+ // }
653
+ // },
654
+ // error : function (data) {
655
+ // form_status(form, {clean_html: {error_msg: 'An unknown network error has occurred.'}}, 'error_msg');
656
+ // form_reset_class(form, 'error');
657
+ // },
658
+ // complete : function (a,b,c) {
659
+ // form.removeClass('loading');
660
+ // form.addClass('complete');
661
+ // if (!is_success) {
662
+ // form_reset_class(form, 'error');
663
+ // form_status(form, 'An unknown error has occurred.');
664
+ // }
665
+ // }
666
+ // };
667
+
668
+ // var invalid = url.match(INVALID_FORM_ACTION_CHARS);
669
+ // if (invalid) {
670
+ // throw new Error('Invalid chars in form action url: ' + invalid.join('') );
671
+ // }
672
+
673
+ // form_reset_class(form, 'loading');
674
+ // $.ajax(url, settings);
675
+
676
+ // }; // submit_form_if_needed
677
+
678
+ // var run_does = function (event_name, raw_target, options) {
679
+
680
+ // var target = $(raw_target);
681
+
682
+ // _.each(events, function (meta) {
683
+ // var first = meta.path_tokens[0];
684
+
685
+ // if (first !== event_name)
686
+ // return false;
687
+
688
+ // var second = meta.path_tokens[1];
689
+ // var third = meta.path_tokens[2];
690
+ // var relative = (third || second) ? relative_id(target, (third || second)) : null;
691
+
692
+ // var is_touch = _.contains(VALID_TOUCH_ACTIONS, event_name);
693
+ // var is_target = second && $(second).is(target);
694
+ // var is_css = target.hasClass(event_name);
695
+ // var is_href = tag_name(target) === 'a' && target.attr('href') === ('#' + event_name);
696
+ // var push_target = null;
697
+
698
+ // // === "/click/button.something/relative"
699
+ // if (is_touch && is_target && third && relative)
700
+ // push_target = relative;
701
+
702
+ // else { // === "/click/button.something"
703
+ // if (is_touch && is_target && !third)
704
+ // push_target = id(target);
705
+
706
+ // else { // === "/red/relative"
707
+ // if ((is_css || is_href) && !third && relative)
708
+ // push_target = relative;
709
+
710
+ // else { // "/red"
711
+ // if (is_css && !second && !third)
712
+ // push_target = id(target);
713
+
714
+ // else { // /success/#form_1
715
+ // if (!third && first === event_name && relative)
716
+ // push_target = relative;
717
+ // }
718
+ // }
719
+ // }
720
+ // }
721
+
722
+ // if (push_target)
723
+ // return child(options.vars).push(push_target).run(meta.code);
724
+
725
+ // return false;
726
+ // });
727
+ // }; // function
728
+
729
+
730
+ // // ==============================================================
731
+ // // ============== stack functions ===============================
732
+ // // ==============================================================
733
+
734
+ // var right = function () {
735
+ // return last_types(stack, _.toArray(arguments), 'stack');
736
+ // };
737
+
738
+
739
+ // var push = function () {
740
+ // var args = _.toArray(arguments);
741
+ // _.each(args, function (v) {
742
+ // stack.push(v);
743
+ // });
744
+ // return o;
745
+ // }; // push ========================================
746
+
747
+
748
+ // var concat = function (arr) {
749
+ // push.apply(null, arr);
750
+ // return arr;
751
+ // }; // concat ================================
473
752
 
474
- var right = function () {
475
- return last_types(stack, _.toArray(arguments), 'stack');
476
- };
477
753
 
754
+ // var relative_id = function (target, selector) {
755
+ // if (!selector)
756
+ // throw new Error('Invalid selector: ' + selector);
478
757
 
479
- var push = function () {
480
- var args = _.toArray(arguments);
481
- _.each(args, function (v) {
482
- stack.push(v);
483
- });
484
- return o;
485
- }; // push ========================================
758
+ // var relative = $(target).find(selector)[0] || $(target).parents(selector)[0] || ($(target).is($(selector)) && target);
759
+ // if (relative) {
760
+ // return id(relative);
761
+ // }
762
+ // return null;
763
+ // };
486
764
 
765
+ // // ==============================================================
766
+ // // ================ run functions ===============================
767
+ // // ==============================================================
487
768
 
488
- var concat = function (arr) {
489
- push.apply(null, arr);
490
- return arr;
491
- }; // concat ================================
769
+ // var run = function (code_array) {
770
+ // each(code_array, function (item, l) {
492
771
 
772
+ // if (_.isArray(item)) {
773
+ // throw new Error("Syntax error: args w/o function name.");
493
774
 
494
- var relative_id = function (target, selector) {
495
- if (!selector)
496
- throw new Error('Invalid selector: ' + selector);
775
+ // } else if (_.isString(item), _.isArray(l.next_or_null())) {
776
+ // run_func(item, l.grab_next());
497
777
 
498
- var relative = $(target).find(selector)[0] || $(target).parents(selector)[0] || ($(target).is($(selector)) && target);
499
- if (relative) {
500
- return id(relative);
501
- }
502
- return null;
503
- };
778
+ // } else {
779
+ // stack.push(item);
780
+ // } // === if
504
781
 
505
- // ==============================================================
506
- // ================ run functions ===============================
507
- // ==============================================================
782
+ // }); // === .each
508
783
 
509
- var run = function (code_array) {
510
- each(code_array, function (item, l) {
784
+ // return o;
785
+ // }; // run ========================================
511
786
 
512
- if (_.isArray(item)) {
513
- throw new Error("Syntax error: args w/o function name.");
787
+ // var run_func = function (name, raw_args) {
514
788
 
515
- } else if (_.isString(item), _.isArray(l.next_or_null())) {
516
- run_func(item, l.grab_next());
789
+ // var compiled_args = null;
790
+ // var first = null;
791
+ // var second = null;
792
+ // var left_args = null;
793
+ // var target = null;
517
794
 
518
- } else {
519
- stack.push(item);
520
- } // === if
795
+ // var run_args = function () {
796
+ // if (!compiled_args) {
797
+ // compiled_args = child().run(raw_args).right('all');
798
+ // }
521
799
 
522
- }); // === .each
800
+ // return compiled_args;
801
+ // }; // run_args
523
802
 
524
- return o;
525
- }; // run ========================================
803
+ // var left = function () {
804
+ // return last_types(run_args(), _.toArray(arguments), 'args');
805
+ // };
526
806
 
527
- var run_func = function (name, raw_args) {
807
+ // var replace_left = function (arr) {
808
+ // compiled_args = arr;
809
+ // return compiled_args;
810
+ // };
528
811
 
529
- var compiled_args = null;
530
- var first = null;
531
- var second = null;
532
- var left_args = null;
533
- var target = null;
812
+ // switch (name) {
534
813
 
535
- var run_args = function () {
536
- if (!compiled_args) {
537
- compiled_args = child().run(raw_args).right('all');
538
- }
814
+ // case 'get':
815
+ // return push(get(left(String)));
539
816
 
540
- return compiled_args;
541
- }; // run_args
817
+ // case 'focus on ancestor':
818
+ // set('the focus', the_focus().parents(left(String)));
819
+ // return get('the focus');
542
820
 
543
- var left = function () {
544
- return last_types(run_args(), _.toArray(arguments), 'args');
545
- };
821
+ // case 'submit':
822
+ // var form = the_focus();
823
+ // var action = form.attr('action');
824
+ // if (/[^a-zA-Z0-9\_\-\/]+/.test(action)) {
825
+ // throw new Error("Invalid chars in #" + form.attr('id') + " action: " + action);
826
+ // }
827
+ // return null;
546
828
 
547
- var replace_left = function (arr) {
548
- compiled_args = arr;
549
- return compiled_args;
550
- };
829
+ // case 'array':
830
+ // push(run_args());
831
+ // return right('last');
551
832
 
552
- switch (name) {
833
+ // case 'remove class':
834
+ // the_focus().removeClass(left(String));
835
+ // return left('last');
553
836
 
554
- case 'get':
555
- return push(get(left(String)));
837
+ // case 'add class':
838
+ // the_focus().addClass(left(String));
839
+ // return left('last');
556
840
 
557
- case 'focus on ancestor':
558
- set('the focus', the_focus().parents(left(String)));
559
- return get('the focus');
841
+ // case 'add to stack':
842
+ // concat( run_args() );
843
+ // return run_args();
560
844
 
561
- case 'submit':
562
- var form = the_focus();
563
- var action = form.attr('action');
564
- if (/[^a-zA-Z0-9\_\-\/]+/.test(action)) {
565
- throw new Error("Invalid chars in #" + form.attr('id') + " action: " + action);
566
- }
567
- return null;
845
+ // case "and":
846
+ // first = right(Boolean);
847
+ // second = null;
848
+ // left_args = null;
568
849
 
569
- case 'array':
570
- push(run_args());
571
- return right('last');
850
+ // if (first === true) {
851
+ // second = left(Boolean);
572
852
 
573
- case 'remove class':
574
- the_focus().removeClass(left(String));
575
- return left('last');
853
+ // if (first === true && second === true) {
854
+ // push(true);
855
+ // return true;
856
+ // }
857
+ // }
576
858
 
577
- case 'add class':
578
- the_focus().addClass(left(String));
579
- return left('last');
859
+ // push(false);
860
+ // return false;
580
861
 
581
- case 'add to stack':
582
- concat( run_args() );
583
- return run_args();
862
+ // case "or":
863
+ // first = right(Boolean);
864
+ // second = null;
865
+ // left_args = null;
584
866
 
585
- case "and":
586
- first = right(Boolean);
587
- second = null;
588
- left_args = null;
867
+ // if (first === true) {
868
+ // push(true);
869
+ // return true;
870
+ // }
589
871
 
590
- if (first === true) {
591
- second = left(Boolean);
872
+ // second = left(Boolean);
592
873
 
593
- if (first === true && second === true) {
594
- push(true);
595
- return true;
596
- }
597
- }
874
+ // if (second === true) {
875
+ // push(true);
876
+ // return true;
877
+ // }
598
878
 
599
- push(false);
600
- return false;
879
+ // push(false);
880
+ // return false;
601
881
 
602
- case "or":
603
- first = right(Boolean);
604
- second = null;
605
- left_args = null;
882
+ // case "if true":
883
+ // first = right(Boolean);
606
884
 
607
- if (first === true) {
608
- push(true);
609
- return true;
610
- }
885
+ // if (first) {
886
+ // run_args();
887
+ // }
611
888
 
612
- second = left(Boolean);
889
+ // return null;
613
890
 
614
- if (second === true) {
615
- push(true);
616
- return true;
617
- }
891
+ // case "if false":
892
+ // first = right(Boolean);
618
893
 
619
- push(false);
620
- return false;
894
+ // if (!first) {
895
+ // run_args();
896
+ // }
621
897
 
622
- case "if true":
623
- first = right(Boolean);
898
+ // return null;
624
899
 
625
- if (first) {
626
- run_args();
627
- }
900
+ // case 'log':
901
+ // scope_log.apply(null, run_args());
902
+ // return run_args();
628
903
 
629
- return null;
904
+ // case "on click":
905
+ // var focus_selector = get('the focus');
906
+ // var scope = child();
907
+ // scope.set('the focus', focus_selector);
630
908
 
631
- case "if false":
632
- first = right(Boolean);
909
+ // $(focus_selector).click(function () {
910
+ // scope.run(raw_args);
911
+ // });
633
912
 
634
- if (!first) {
635
- run_args();
636
- }
913
+ // return null;
637
914
 
638
- return null;
915
+ // case "on":
916
+ // throw new Error('Not ready yet: on');
639
917
 
640
- case 'log':
641
- scope_log.apply(null, run_args());
642
- return run_args();
918
+ // case 'bigger or equal':
919
+ // return run_func('compare numbers', ['>=', left(Number)]);
643
920
 
644
- case "on click":
645
- var focus_selector = get('the focus');
646
- var scope = child();
647
- scope.set('the focus', focus_selector);
921
+ // case 'bigger':
922
+ // return run_func('compare numbers', ['>', left(Number)]);
648
923
 
649
- $(focus_selector).click(function () {
650
- scope.run(raw_args);
651
- });
924
+ // case 'less':
925
+ // return run_func('compare numbers', ['<', left(Number)]);
652
926
 
653
- return null;
927
+ // case 'less or equal':
928
+ // return run_func('compare numbers', ['<=', left(Number)]);
654
929
 
655
- case "on":
656
- throw new Error('Not ready yet: on');
930
+ // case 'equal':
931
+ // first = right('any');
932
+ // second = left('any');
933
+ // push(first === second);
934
+ // return right('last');
657
935
 
658
- case 'bigger or equal':
659
- return run_func('compare numbers', ['>=', left(Number)]);
936
+ // case 'compare numbers':
937
+ // first = right(Number);
660
938
 
661
- case 'bigger':
662
- return run_func('compare numbers', ['>', left(Number)]);
939
+ // var args = left(String, Number);
940
+ // var compare = args.first;
941
+ // second = args.second;
663
942
 
664
- case 'less':
665
- return run_func('compare numbers', ['<', left(Number)]);
943
+ // var result = null;
666
944
 
667
- case 'less or equal':
668
- return run_func('compare numbers', ['<=', left(Number)]);
945
+ // switch (compare) {
669
946
 
670
- case 'equal':
671
- first = right('any');
672
- second = left('any');
673
- push(first === second);
674
- return right('last');
947
+ // case '===':
948
+ // result = first === second;
949
+ // break;
675
950
 
676
- case 'compare numbers':
677
- first = right(Number);
951
+ // case '<=':
952
+ // result = first <= second;
953
+ // break;
678
954
 
679
- var args = left(String, Number);
680
- var compare = args.first;
681
- second = args.second;
955
+ // case '<':
956
+ // result = first < second;
957
+ // break;
682
958
 
683
- var result = null;
959
+ // case '>=':
960
+ // result = first >= second;
961
+ // break;
684
962
 
685
- switch (compare) {
963
+ // case '>':
964
+ // result = first > second;
965
+ // break;
686
966
 
687
- case '===':
688
- result = first === second;
689
- break;
967
+ // default:
968
+ // throw new Error("Unknown value : " + compare);
969
+ // } // === switch
690
970
 
691
- case '<=':
692
- result = first <= second;
693
- break;
971
+ // push(result);
972
+ // return result;
694
973
 
695
- case '<':
696
- result = first < second;
697
- break;
974
+ // case 'allows':
975
+ // var event_name = left(String);
976
+ // target = $(right(String));
698
977
 
699
- case '>=':
700
- result = first >= second;
701
- break;
978
+ // on(event_name, target);
979
+ // return event_name;
702
980
 
703
- case '>':
704
- result = first > second;
705
- break;
981
+ // case 'does':
982
+ // var path = right(String);
706
983
 
707
- default:
708
- throw new Error("Unknown value : " + compare);
709
- } // === switch
984
+ // var meta = {};
985
+ // meta.path_tokens = _.map(path.split('/'), function (v) {
986
+ // return _.str.trim(v);
987
+ // });
710
988
 
711
- push(result);
712
- return result;
989
+ // if (meta.path_tokens[0] === '') {
990
+ // meta.path_tokens.shift();
991
+ // }
713
992
 
714
- case 'allows':
715
- var event_name = left(String);
716
- target = $(right(String));
993
+ // if (meta.path_tokens.length < 1 || meta.path_tokens.length > 3) {
994
+ // throw new Error('Unknown path: ' + path);
995
+ // }
717
996
 
718
- on(event_name, target);
719
- return event_name;
997
+ // events.push({
998
+ // code : raw_args,
999
+ // path : path,
1000
+ // path_tokens : meta.path_tokens
1001
+ // });
720
1002
 
721
- case 'does':
722
- var path = right(String);
1003
+ // return path;
723
1004
 
724
- var meta = {};
725
- meta.path_tokens = _.map(path.split('/'), function (v) {
726
- return _.str.trim(v);
727
- });
1005
+ // case 'remove':
1006
+ // $(right(String)).find(left(String)).remove();
1007
+ // return null;
728
1008
 
729
- if (meta.path_tokens[0] === '') {
730
- meta.path_tokens.shift();
731
- }
732
1009
 
733
- if (meta.path_tokens.length < 1 || meta.path_tokens.length > 3) {
734
- throw new Error('Unknown path: ' + path);
735
- }
1010
+ // default:
1011
+ // throw new Error("Function not found: " + name);
1012
+ // } // === switch name
736
1013
 
737
- events.push({
738
- code : raw_args,
739
- path : path,
740
- path_tokens : meta.path_tokens
741
- });
1014
+ // }; // run_func ===================================
742
1015
 
743
- return path;
744
1016
 
745
- case 'remove':
746
- $(right(String)).find(left(String)).remove();
747
- return null;
1017
+ // // ==============================================================
1018
+ // // ============= miscel. functions ==============================
1019
+ // // ==============================================================
748
1020
 
1021
+ // var child = function (vars) {
1022
+ // var s = new Scope(o);
1023
+ // if (vars) {
1024
+ // _.each(vars, function (val, key) {
1025
+ // s.set(key, val);
1026
+ // });
1027
+ // }
1028
+ // return( s );
1029
+ // };
749
1030
 
750
- default:
751
- throw new Error("Function not found: " + name);
752
- } // === switch name
1031
+ // var the_focus = function () {
1032
+ // return $(right(String));
1033
+ // };
753
1034
 
754
- }; // run_func ===================================
1035
+ // var set = function (name, val) {
1036
+ // vars[name] = val;
1037
+ // return val;
1038
+ // }; // function
755
1039
 
1040
+ // var get = function (name) {
1041
+ // if (!vars.hasOwnProperty(name) && !parent) {
1042
+ // throw new Error('No var found with name: ' + name);
1043
+ // }
756
1044
 
757
- // ==============================================================
758
- // ============= miscel. functions ==============================
759
- // ==============================================================
1045
+ // return (vars.hasOwnProperty(name)) ?
1046
+ // vars[name] :
1047
+ // parent.get(name);
1048
+ // }; // val =========================================
760
1049
 
761
- var child = function (vars) {
762
- var s = new Scope(o);
763
- if (vars) {
764
- _.each(vars, function (val, key) {
765
- s.set(key, val);
766
- });
767
- }
768
- return( s );
769
- };
770
1050
 
771
- var the_focus = function () {
772
- return $(right(String));
773
- };
1051
+ // o.run = run;
774
1052
 
775
- var set = function (name, val) {
776
- vars[name] = val;
777
- return val;
778
- }; // function
1053
+ // // ====================================================
1054
+ // // The following functions
1055
+ // // are meant to be used by WWW_App.run.
1056
+ // // Don't use them.
1057
+ // // ====================================================
1058
+ // o.right = right;
1059
+ // o.get = get;
1060
+ // o.set = set;
1061
+ // o.push = push;
1062
+ // o.on = on;
1063
+ // o.log = scope_log_stack;
1064
+ // // ====================================================
779
1065
 
780
- var get = function (name) {
781
- if (!vars.hasOwnProperty(name) && !parent) {
782
- throw new Error('No var found with name: ' + name);
783
- }
1066
+ // return o;
784
1067
 
785
- return (vars.hasOwnProperty(name)) ?
786
- vars[name] :
787
- parent.get(name);
788
- }; // val =========================================
789
-
790
-
791
- o.run = run;
792
-
793
- // ====================================================
794
- // The following functions
795
- // are meant to be used by WWW_App.run.
796
- // Don't use them.
797
- // ====================================================
798
- o.right = right;
799
- o.get = get;
800
- o.set = set;
801
- o.push = push;
802
- o.on = on;
803
- o.log = scope_log_stack;
804
- // ====================================================
805
-
806
- return o;
807
-
808
- // ================================================================
809
- }; // ===== Scope =================================================
810
- // ================================================================
811
-
812
- WWW_App = {
813
- run : function (code_array) {
814
- WWW_App.MAIN = (new Scope()).on('defaults').run(code_array);
815
- return WWW_App.MAIN;
816
- }
817
- };
1068
+ // // ================================================================
1069
+ // }; // ===== Scope =================================================
1070
+ // // ================================================================
818
1071
 
819
- WWW_App.run([]);
1072
+ // WWW_App = {
1073
+ // run : function (code_array) {
1074
+ // WWW_App.MAIN = (new Scope()).on('defaults').run(code_array);
1075
+ // return WWW_App.MAIN;
1076
+ // }
1077
+ // };
1078
+
1079
+ // WWW_App.run([]);
820
1080
 
821
- })(); // === WWW_App scope
1081
+ // })(); // === WWW_App scope
822
1082
 
823
1083
 
824
1084