www_app 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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