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.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/README.md +42 -24
- data/VERSION +1 -1
- data/bin/www_app +15 -4
- data/lib/public/vendor/hogan-3.0.2.min.js +5 -0
- data/lib/public/vendor/instruct_instruct_instruct.js +247 -0
- data/lib/public/vendor/jquery-2.1.3.min.js +4 -0
- data/lib/public/vendor/lodash.min.js +89 -0
- data/lib/public/www_app.js +885 -625
- data/lib/www_app/CSS.rb +310 -0
- data/lib/www_app/HTML.rb +219 -0
- data/lib/www_app/JavaScript.rb +51 -0
- data/lib/www_app/TO.rb +897 -0
- data/lib/www_app.rb +324 -945
- data/playground/config.ru +102 -0
- data/specs/client-side/index.html +1 -1
- data/specs/client-side/index.js +31 -379
- data/specs/lib/config.ru +60 -31
- data/specs/lib/helpers.rb +24 -2
- data/specs/server-side/0000-new.rb +1 -1
- data/specs/server-side/0001-underscore-double.rb +38 -0
- data/specs/server-side/0001-underscore.rb +73 -0
- data/specs/server-side/0010-attrs.rb +3 -4
- data/specs/server-side/0011-id.rb +5 -5
- data/specs/server-side/0020-tag.rb +2 -2
- data/specs/server-side/0020-tag_content.rb +1 -1
- data/specs/server-side/0021-body.rb +1 -1
- data/specs/server-side/0021-script.rb +66 -20
- data/specs/server-side/{0021-page_title.rb → 0021-title.rb} +5 -3
- data/specs/server-side/0030-mustache.rb +27 -20
- data/specs/server-side/0030-style.rb +64 -21
- data/specs/server-side/0040-css.rb +4 -4
- data/specs/server-side/0041-pseudo.rb +55 -0
- data/specs/server-side/0042-slash.rb +20 -0
- data/specs/server-side/0060-text.rb +26 -0
- metadata +18 -13
- data/lib/public/jquery-2.1.1.js +0 -4
- data/lib/public/underscore-1.7.0.js +0 -6
- data/lib/public/underscore-min.map +0 -1
- data/lib/public/underscore.string-2.3.0.js +0 -1
- data/lib/www_app/Clean.rb +0 -169
- data/lib/www_app/dsl.rb +0 -86
- data/lib/www_app/source.rb +0 -53
- data/specs/server-side/0050-on.rb +0 -64
- data/specs/server-side/0060-string.rb +0 -32
- /data/lib/public/{jquery.serialize-object.min.js → vendor/jquery.serialize-object.min.js} +0 -0
data/lib/public/www_app.js
CHANGED
@@ -1,824 +1,1084 @@
|
|
1
|
-
|
2
1
|
"use strict";
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
/* jshint undef: true, unused: false */
|
4
|
+
/* global Hogan , _ */
|
7
5
|
|
8
6
|
(function () {
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
57
|
-
|
58
|
-
|
59
|
-
form.removeClass('error');
|
60
|
-
form.removeClass('errors');
|
72
|
+
// ======================================
|
73
|
+
// Start of client-side WWW_App.
|
74
|
+
// ======================================
|
61
75
|
|
62
|
-
|
63
|
-
css_class = 'error';
|
76
|
+
var WWW_App = {};
|
64
77
|
|
65
|
-
|
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
|
-
|
73
|
-
|
74
|
-
if (!
|
75
|
-
|
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
|
-
|
80
|
-
|
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
|
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
|
-
|
95
|
-
|
96
|
-
var name = null;
|
113
|
+
if (!raw)
|
114
|
+
return [];
|
97
115
|
|
98
|
-
|
99
|
-
s = raw;
|
100
|
-
} else {
|
101
|
-
s = ('' + raw);
|
102
|
-
}
|
116
|
+
var str = _.trim(raw);
|
103
117
|
|
104
|
-
|
105
|
-
|
118
|
+
if (_.isEmpty(str))
|
119
|
+
return [];
|
120
|
+
|
121
|
+
return str.split(SPACES);
|
106
122
|
};
|
107
123
|
|
108
|
-
var
|
109
|
-
var
|
110
|
-
|
111
|
-
|
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
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
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
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
141
|
+
if (_.isEmpty(val))
|
142
|
+
return false;
|
154
143
|
|
155
|
-
|
156
|
-
|
157
|
-
func(arr[i], each_o);
|
158
|
-
i = i + 1;
|
159
|
-
} // while
|
144
|
+
return _.every(val, func);
|
145
|
+
};
|
160
146
|
|
161
|
-
|
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
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
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
|
-
|
172
|
-
name = 'second';
|
173
|
-
break;
|
170
|
+
scripts.each(function (i) {
|
174
171
|
|
175
|
-
|
176
|
-
|
177
|
-
break;
|
172
|
+
var o = $(this);
|
173
|
+
var id = auto_id(o);
|
178
174
|
|
179
|
-
|
180
|
-
|
181
|
-
|
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
|
-
|
184
|
-
|
185
|
-
|
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
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
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
|
-
|
202
|
-
|
203
|
-
|
197
|
+
if (_.isEmpty(childs.html())) {
|
198
|
+
childs = null;
|
199
|
+
}
|
204
200
|
|
205
|
-
|
206
|
-
|
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
|
-
|
216
|
+
} // === if render_it
|
210
217
|
|
211
|
-
|
212
|
-
|
213
|
-
|
218
|
+
// === Save results for reset.
|
219
|
+
//
|
220
|
+
script_meta[id] = childs;
|
221
|
+
}); // === each scripts
|
214
222
|
|
215
|
-
|
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
|
-
|
225
|
-
|
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 & 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
|
-
|
230
|
-
|
248
|
+
run(context);
|
249
|
+
WWW_App.run = run;
|
231
250
|
|
232
|
-
|
233
|
-
return o.first;
|
234
|
-
}
|
251
|
+
})(); // === WWW_App scope
|
235
252
|
|
236
|
-
|
237
|
-
|
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
|
-
|
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
|
-
|
250
|
-
|
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
|
-
|
257
|
-
|
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
|
-
|
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
|
-
|
275
|
+
**/
|
272
276
|
|
273
|
-
|
277
|
+
// (function () {
|
274
278
|
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
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
|
-
|
288
|
-
|
289
|
-
|
287
|
+
// // ================================================================
|
288
|
+
// // Helper Functions
|
289
|
+
// // ================================================================
|
290
290
|
|
291
|
-
|
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
|
-
|
298
|
-
|
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
|
-
|
328
|
-
|
329
|
-
|
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
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
}
|
308
|
+
// var inspect = function (val) {
|
309
|
+
// var name = func_name(val.constructor || 'Unknown');
|
310
|
+
// return name + ': ' + val;
|
311
|
+
// };
|
345
312
|
|
346
|
-
|
347
|
-
|
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
|
-
|
320
|
+
// dom.addClass(key);
|
321
|
+
// dom.html(data.clean_html[key]);
|
322
|
+
// return dom;
|
323
|
+
// }; // function
|
350
324
|
|
351
|
-
|
352
|
-
|
353
|
-
|
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
|
-
|
356
|
-
|
331
|
+
// if (css_class === 'errors')
|
332
|
+
// css_class = 'error';
|
357
333
|
|
358
|
-
|
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
|
-
|
367
|
-
|
368
|
-
|
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
|
-
|
371
|
-
|
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
|
-
|
354
|
+
// var func_name = function (raw) {
|
355
|
+
// var s = null;
|
356
|
+
// var name = null;
|
417
357
|
|
418
|
-
|
358
|
+
// if (_.isString(raw)) {
|
359
|
+
// s = raw;
|
360
|
+
// } else {
|
361
|
+
// s = ('' + raw);
|
362
|
+
// }
|
419
363
|
|
420
|
-
|
364
|
+
// name = _.last( _.first(s.split('(')).split('function ') );
|
365
|
+
// return name;
|
366
|
+
// };
|
421
367
|
|
422
|
-
|
423
|
-
|
368
|
+
// var each = function (arr, func) {
|
369
|
+
// var l = arr.length;
|
370
|
+
// var i = 0;
|
371
|
+
// var each_o = {
|
424
372
|
|
425
|
-
|
426
|
-
|
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
|
-
|
429
|
-
|
430
|
-
|
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
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
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
|
-
|
439
|
-
if (
|
440
|
-
|
392
|
+
// prev_or_null : function () {
|
393
|
+
// if (each_o.is_first()) { return null; }
|
394
|
+
// return arr[i - 1];
|
395
|
+
// },
|
441
396
|
|
442
|
-
|
443
|
-
|
444
|
-
|
397
|
+
// is_first: function () {
|
398
|
+
// return i < 1;
|
399
|
+
// },
|
445
400
|
|
446
|
-
|
447
|
-
|
448
|
-
|
401
|
+
// is_last: function () {
|
402
|
+
// return i >= (l - 1);
|
403
|
+
// },
|
449
404
|
|
450
|
-
|
451
|
-
|
452
|
-
|
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
|
-
|
455
|
-
|
456
|
-
|
457
|
-
}
|
458
|
-
}
|
459
|
-
}
|
460
|
-
}
|
431
|
+
// case 1:
|
432
|
+
// name = 'second';
|
433
|
+
// break;
|
461
434
|
|
462
|
-
|
463
|
-
|
435
|
+
// case 2:
|
436
|
+
// name = 'third';
|
437
|
+
// break;
|
464
438
|
|
465
|
-
|
466
|
-
|
467
|
-
|
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
|
-
|
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
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
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
|
489
|
-
|
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
|
-
|
495
|
-
|
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
|
-
|
499
|
-
|
500
|
-
|
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
|
-
|
510
|
-
|
784
|
+
// return o;
|
785
|
+
// }; // run ========================================
|
511
786
|
|
512
|
-
|
513
|
-
throw new Error("Syntax error: args w/o function name.");
|
787
|
+
// var run_func = function (name, raw_args) {
|
514
788
|
|
515
|
-
|
516
|
-
|
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
|
-
|
519
|
-
|
520
|
-
|
795
|
+
// var run_args = function () {
|
796
|
+
// if (!compiled_args) {
|
797
|
+
// compiled_args = child().run(raw_args).right('all');
|
798
|
+
// }
|
521
799
|
|
522
|
-
|
800
|
+
// return compiled_args;
|
801
|
+
// }; // run_args
|
523
802
|
|
524
|
-
|
525
|
-
|
803
|
+
// var left = function () {
|
804
|
+
// return last_types(run_args(), _.toArray(arguments), 'args');
|
805
|
+
// };
|
526
806
|
|
527
|
-
|
807
|
+
// var replace_left = function (arr) {
|
808
|
+
// compiled_args = arr;
|
809
|
+
// return compiled_args;
|
810
|
+
// };
|
528
811
|
|
529
|
-
|
530
|
-
var first = null;
|
531
|
-
var second = null;
|
532
|
-
var left_args = null;
|
533
|
-
var target = null;
|
812
|
+
// switch (name) {
|
534
813
|
|
535
|
-
|
536
|
-
|
537
|
-
compiled_args = child().run(raw_args).right('all');
|
538
|
-
}
|
814
|
+
// case 'get':
|
815
|
+
// return push(get(left(String)));
|
539
816
|
|
540
|
-
|
541
|
-
|
817
|
+
// case 'focus on ancestor':
|
818
|
+
// set('the focus', the_focus().parents(left(String)));
|
819
|
+
// return get('the focus');
|
542
820
|
|
543
|
-
|
544
|
-
|
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
|
-
|
548
|
-
|
549
|
-
|
550
|
-
};
|
829
|
+
// case 'array':
|
830
|
+
// push(run_args());
|
831
|
+
// return right('last');
|
551
832
|
|
552
|
-
|
833
|
+
// case 'remove class':
|
834
|
+
// the_focus().removeClass(left(String));
|
835
|
+
// return left('last');
|
553
836
|
|
554
|
-
case '
|
555
|
-
|
837
|
+
// case 'add class':
|
838
|
+
// the_focus().addClass(left(String));
|
839
|
+
// return left('last');
|
556
840
|
|
557
|
-
case '
|
558
|
-
|
559
|
-
return
|
841
|
+
// case 'add to stack':
|
842
|
+
// concat( run_args() );
|
843
|
+
// return run_args();
|
560
844
|
|
561
|
-
case
|
562
|
-
|
563
|
-
|
564
|
-
|
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
|
-
|
570
|
-
|
571
|
-
return right('last');
|
850
|
+
// if (first === true) {
|
851
|
+
// second = left(Boolean);
|
572
852
|
|
573
|
-
|
574
|
-
|
575
|
-
|
853
|
+
// if (first === true && second === true) {
|
854
|
+
// push(true);
|
855
|
+
// return true;
|
856
|
+
// }
|
857
|
+
// }
|
576
858
|
|
577
|
-
|
578
|
-
|
579
|
-
return left('last');
|
859
|
+
// push(false);
|
860
|
+
// return false;
|
580
861
|
|
581
|
-
case
|
582
|
-
|
583
|
-
|
862
|
+
// case "or":
|
863
|
+
// first = right(Boolean);
|
864
|
+
// second = null;
|
865
|
+
// left_args = null;
|
584
866
|
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
867
|
+
// if (first === true) {
|
868
|
+
// push(true);
|
869
|
+
// return true;
|
870
|
+
// }
|
589
871
|
|
590
|
-
|
591
|
-
second = left(Boolean);
|
872
|
+
// second = left(Boolean);
|
592
873
|
|
593
|
-
|
594
|
-
|
595
|
-
|
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 "
|
603
|
-
first
|
604
|
-
second = null;
|
605
|
-
left_args = null;
|
882
|
+
// case "if true":
|
883
|
+
// first = right(Boolean);
|
606
884
|
|
607
|
-
if (first
|
608
|
-
|
609
|
-
|
610
|
-
}
|
885
|
+
// if (first) {
|
886
|
+
// run_args();
|
887
|
+
// }
|
611
888
|
|
612
|
-
|
889
|
+
// return null;
|
613
890
|
|
614
|
-
|
615
|
-
|
616
|
-
return true;
|
617
|
-
}
|
891
|
+
// case "if false":
|
892
|
+
// first = right(Boolean);
|
618
893
|
|
619
|
-
|
620
|
-
|
894
|
+
// if (!first) {
|
895
|
+
// run_args();
|
896
|
+
// }
|
621
897
|
|
622
|
-
|
623
|
-
first = right(Boolean);
|
898
|
+
// return null;
|
624
899
|
|
625
|
-
|
626
|
-
|
627
|
-
|
900
|
+
// case 'log':
|
901
|
+
// scope_log.apply(null, run_args());
|
902
|
+
// return run_args();
|
628
903
|
|
629
|
-
|
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
|
-
|
632
|
-
|
909
|
+
// $(focus_selector).click(function () {
|
910
|
+
// scope.run(raw_args);
|
911
|
+
// });
|
633
912
|
|
634
|
-
|
635
|
-
run_args();
|
636
|
-
}
|
913
|
+
// return null;
|
637
914
|
|
638
|
-
|
915
|
+
// case "on":
|
916
|
+
// throw new Error('Not ready yet: on');
|
639
917
|
|
640
|
-
case '
|
641
|
-
|
642
|
-
return run_args();
|
918
|
+
// case 'bigger or equal':
|
919
|
+
// return run_func('compare numbers', ['>=', left(Number)]);
|
643
920
|
|
644
|
-
case
|
645
|
-
|
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
|
-
|
650
|
-
|
651
|
-
});
|
924
|
+
// case 'less':
|
925
|
+
// return run_func('compare numbers', ['<', left(Number)]);
|
652
926
|
|
653
|
-
|
927
|
+
// case 'less or equal':
|
928
|
+
// return run_func('compare numbers', ['<=', left(Number)]);
|
654
929
|
|
655
|
-
case
|
656
|
-
|
930
|
+
// case 'equal':
|
931
|
+
// first = right('any');
|
932
|
+
// second = left('any');
|
933
|
+
// push(first === second);
|
934
|
+
// return right('last');
|
657
935
|
|
658
|
-
case '
|
659
|
-
|
936
|
+
// case 'compare numbers':
|
937
|
+
// first = right(Number);
|
660
938
|
|
661
|
-
|
662
|
-
|
939
|
+
// var args = left(String, Number);
|
940
|
+
// var compare = args.first;
|
941
|
+
// second = args.second;
|
663
942
|
|
664
|
-
|
665
|
-
return run_func('compare numbers', ['<', left(Number)]);
|
943
|
+
// var result = null;
|
666
944
|
|
667
|
-
|
668
|
-
return run_func('compare numbers', ['<=', left(Number)]);
|
945
|
+
// switch (compare) {
|
669
946
|
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
push(first === second);
|
674
|
-
return right('last');
|
947
|
+
// case '===':
|
948
|
+
// result = first === second;
|
949
|
+
// break;
|
675
950
|
|
676
|
-
|
677
|
-
|
951
|
+
// case '<=':
|
952
|
+
// result = first <= second;
|
953
|
+
// break;
|
678
954
|
|
679
|
-
|
680
|
-
|
681
|
-
|
955
|
+
// case '<':
|
956
|
+
// result = first < second;
|
957
|
+
// break;
|
682
958
|
|
683
|
-
|
959
|
+
// case '>=':
|
960
|
+
// result = first >= second;
|
961
|
+
// break;
|
684
962
|
|
685
|
-
|
963
|
+
// case '>':
|
964
|
+
// result = first > second;
|
965
|
+
// break;
|
686
966
|
|
687
|
-
|
688
|
-
|
689
|
-
|
967
|
+
// default:
|
968
|
+
// throw new Error("Unknown value : " + compare);
|
969
|
+
// } // === switch
|
690
970
|
|
691
|
-
|
692
|
-
|
693
|
-
break;
|
971
|
+
// push(result);
|
972
|
+
// return result;
|
694
973
|
|
695
|
-
|
696
|
-
|
697
|
-
|
974
|
+
// case 'allows':
|
975
|
+
// var event_name = left(String);
|
976
|
+
// target = $(right(String));
|
698
977
|
|
699
|
-
|
700
|
-
|
701
|
-
break;
|
978
|
+
// on(event_name, target);
|
979
|
+
// return event_name;
|
702
980
|
|
703
|
-
|
704
|
-
|
705
|
-
break;
|
981
|
+
// case 'does':
|
982
|
+
// var path = right(String);
|
706
983
|
|
707
|
-
|
708
|
-
|
709
|
-
|
984
|
+
// var meta = {};
|
985
|
+
// meta.path_tokens = _.map(path.split('/'), function (v) {
|
986
|
+
// return _.str.trim(v);
|
987
|
+
// });
|
710
988
|
|
711
|
-
|
712
|
-
|
989
|
+
// if (meta.path_tokens[0] === '') {
|
990
|
+
// meta.path_tokens.shift();
|
991
|
+
// }
|
713
992
|
|
714
|
-
|
715
|
-
|
716
|
-
|
993
|
+
// if (meta.path_tokens.length < 1 || meta.path_tokens.length > 3) {
|
994
|
+
// throw new Error('Unknown path: ' + path);
|
995
|
+
// }
|
717
996
|
|
718
|
-
|
719
|
-
|
997
|
+
// events.push({
|
998
|
+
// code : raw_args,
|
999
|
+
// path : path,
|
1000
|
+
// path_tokens : meta.path_tokens
|
1001
|
+
// });
|
720
1002
|
|
721
|
-
|
722
|
-
var path = right(String);
|
1003
|
+
// return path;
|
723
1004
|
|
724
|
-
|
725
|
-
|
726
|
-
|
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
|
-
|
734
|
-
|
735
|
-
|
1010
|
+
// default:
|
1011
|
+
// throw new Error("Function not found: " + name);
|
1012
|
+
// } // === switch name
|
736
1013
|
|
737
|
-
|
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
|
-
|
746
|
-
|
747
|
-
|
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
|
-
|
751
|
-
|
752
|
-
|
1031
|
+
// var the_focus = function () {
|
1032
|
+
// return $(right(String));
|
1033
|
+
// };
|
753
1034
|
|
754
|
-
|
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
|
-
|
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
|
-
|
772
|
-
return $(right(String));
|
773
|
-
};
|
1051
|
+
// o.run = run;
|
774
1052
|
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
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
|
-
|
781
|
-
if (!vars.hasOwnProperty(name) && !parent) {
|
782
|
-
throw new Error('No var found with name: ' + name);
|
783
|
-
}
|
1066
|
+
// return o;
|
784
1067
|
|
785
|
-
|
786
|
-
|
787
|
-
|
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
|
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
|
|