right-rails 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.textile +50 -0
  3. data/Rakefile +23 -0
  4. data/generators/right_rails/right_rails_generator.rb +41 -0
  5. data/generators/right_rails/templates/iframed.html.erb +10 -0
  6. data/generators/right_scaffold/right_scaffold_generator.rb +53 -0
  7. data/generators/right_scaffold/templates/controller.rb +99 -0
  8. data/generators/right_scaffold/templates/helper.rb +2 -0
  9. data/generators/right_scaffold/templates/layout.html.erb +18 -0
  10. data/generators/right_scaffold/templates/style.css +54 -0
  11. data/generators/right_scaffold/templates/view__form.html.erb +16 -0
  12. data/generators/right_scaffold/templates/view__item.html.erb +13 -0
  13. data/generators/right_scaffold/templates/view_edit.html.erb +6 -0
  14. data/generators/right_scaffold/templates/view_index.html.erb +9 -0
  15. data/generators/right_scaffold/templates/view_new.html.erb +5 -0
  16. data/generators/right_scaffold/templates/view_show.html.erb +10 -0
  17. data/init.rb +12 -0
  18. data/javascripts/right-autocompleter-src.js +303 -0
  19. data/javascripts/right-autocompleter.js +9 -0
  20. data/javascripts/right-behavior-src.js +240 -0
  21. data/javascripts/right-behavior.js +8 -0
  22. data/javascripts/right-calendar-src.js +855 -0
  23. data/javascripts/right-calendar.js +9 -0
  24. data/javascripts/right-dnd-src.js +555 -0
  25. data/javascripts/right-dnd.js +9 -0
  26. data/javascripts/right-effects-src.js +425 -0
  27. data/javascripts/right-effects.js +6 -0
  28. data/javascripts/right-events-src.js +369 -0
  29. data/javascripts/right-events.js +6 -0
  30. data/javascripts/right-json-src.js +176 -0
  31. data/javascripts/right-json.js +6 -0
  32. data/javascripts/right-lightbox-src.js +597 -0
  33. data/javascripts/right-lightbox.js +9 -0
  34. data/javascripts/right-rails-src.js +269 -0
  35. data/javascripts/right-rails.js +9 -0
  36. data/javascripts/right-rater-src.js +248 -0
  37. data/javascripts/right-rater.js +9 -0
  38. data/javascripts/right-selectable-src.js +507 -0
  39. data/javascripts/right-selectable.js +7 -0
  40. data/javascripts/right-slider-src.js +291 -0
  41. data/javascripts/right-slider.js +7 -0
  42. data/javascripts/right-sortable-src.js +221 -0
  43. data/javascripts/right-sortable.js +9 -0
  44. data/javascripts/right-src.js +4939 -0
  45. data/javascripts/right-tabs-src.js +776 -0
  46. data/javascripts/right-tabs.js +6 -0
  47. data/javascripts/right-tooltips-src.js +130 -0
  48. data/javascripts/right-tooltips.js +9 -0
  49. data/javascripts/right-ui-i18n-de.js +29 -0
  50. data/javascripts/right-ui-i18n-en-us.js +11 -0
  51. data/javascripts/right-ui-i18n-es.js +29 -0
  52. data/javascripts/right-ui-i18n-fr.js +29 -0
  53. data/javascripts/right-ui-i18n-jp.js +33 -0
  54. data/javascripts/right-ui-i18n-ru.js +29 -0
  55. data/javascripts/right-ui-i18n-uk.js +29 -0
  56. data/javascripts/right.js +10 -0
  57. data/lib/right-rails.rb +11 -0
  58. data/lib/right_rails/controller_extensions.rb +85 -0
  59. data/lib/right_rails/helpers/basic.rb +111 -0
  60. data/lib/right_rails/helpers/forms.rb +239 -0
  61. data/lib/right_rails/helpers/misc.rb +164 -0
  62. data/lib/right_rails/helpers/rails.rb +166 -0
  63. data/lib/right_rails/helpers.rb +5 -0
  64. data/lib/right_rails/java_script_generator.rb +313 -0
  65. data/lib/right_rails.rb +6 -0
  66. data/spec/lib/right_rails/controller_extensions_spec.rb +60 -0
  67. data/spec/lib/right_rails/helpers/basic_spec.rb +74 -0
  68. data/spec/lib/right_rails/helpers/forms_spec.rb +51 -0
  69. data/spec/lib/right_rails/helpers/misc_spec.rb +120 -0
  70. data/spec/lib/right_rails/helpers/rails_spec.rb +149 -0
  71. data/spec/lib/right_rails/java_script_generator_spec.rb +317 -0
  72. data/spec/spec.opts +5 -0
  73. data/spec/spec_helper.rb +15 -0
  74. metadata +128 -0
@@ -0,0 +1,369 @@
1
+ /**
2
+ * Advanced dom events handling module
3
+ *
4
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
5
+ */
6
+
7
+ /**
8
+ * The Event class additional functionality
9
+ *
10
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
11
+ */
12
+ Event.extend((function() {
13
+ var old_ext = Event.ext;
14
+
15
+ return {
16
+ /**
17
+ * extends a native object with additional functionality
18
+ *
19
+ * @param Event event
20
+ * @return Event same event but extended
21
+ */
22
+ ext: function(event) {
23
+ if (!event.stop) {
24
+ old_ext.call(Event, event);
25
+
26
+ if (Event.Mouse.NAMES.includes(event.type)) {
27
+ Event.Mouse.ext(event);
28
+ } else if (defined(event.keyCode)){
29
+ Event.Keyboard.ext(event);
30
+ }
31
+ }
32
+
33
+ return event;
34
+ },
35
+
36
+ // keyboard key codes
37
+ KEYS: {
38
+ BACKSPACE: 8,
39
+ TAB: 9,
40
+ ENTER: 13,
41
+ ESCAPE: 27,
42
+ SPACE: 32,
43
+ PAGE_UP: 33,
44
+ PAGE_DOWN: 34,
45
+ END: 35,
46
+ HOME: 36,
47
+ LEFT: 37,
48
+ UP: 38,
49
+ RIGHT: 39,
50
+ DOWN: 40,
51
+ INSERT: 45,
52
+ DELETE: 46
53
+ },
54
+
55
+ // mouse button codes
56
+ BUTTONS: (Browser.IE || Browser.Konqueror) ? {
57
+ LEFT: 1,
58
+ MIDDLE: 4,
59
+ RIGHT: 2
60
+ } : {
61
+ LEFT: 0,
62
+ MIDDLE: 1,
63
+ RIGHT: 2
64
+ }
65
+
66
+ }})());
67
+
68
+ Event.include({
69
+ /**
70
+ * constructor. pretty much plays a virtual factory, instances new events or extends
71
+ * existing ones and always returns an event instead of void as a normal constructor
72
+ *
73
+ * @param mixed native Event instance or String event name
74
+ * @param Object options
75
+ * @return Event instance
76
+ */
77
+ initialize: function() {
78
+ var args = $A(arguments), event = args.shift(), options = args.pop() || {};
79
+
80
+ if (isString(event)) {
81
+ var name = Event.cleanName(event);
82
+ if (Event.Mouse.NAMES.includes(name)) {
83
+ event = new Event.Mouse(name, options);
84
+ } else if (Event.Keyboard.NAMES.includes(name)) {
85
+ event = new Event.Keyboard(name, options);
86
+ } else {
87
+ event = new Event.Custom(name, options);
88
+ }
89
+ }
90
+
91
+ return Event.ext(event);
92
+ }
93
+ });
94
+ /**
95
+ * presents the basic events class
96
+ *
97
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
98
+ */
99
+ Event.Base = new Class({
100
+ extend: {
101
+ // basic default events options
102
+ Options: {
103
+ bubbles: true,
104
+ cancelable: true,
105
+ altKey: false,
106
+ ctrlKey: false,
107
+ shiftKey: false,
108
+ metaKey: false
109
+ }
110
+ },
111
+
112
+ /**
113
+ * basic constructor
114
+ *
115
+ * NOTE: that's a virtual constructor, it returns a new object instance
116
+ * not the actual class instance.
117
+ *
118
+ * @param String event name
119
+ * @param Object options
120
+ * @return Event new event
121
+ */
122
+ initialize: function(name, options) {
123
+ return this.build(this.options(name, options));
124
+ },
125
+
126
+ // protected
127
+
128
+ /**
129
+ * default building method
130
+ *
131
+ * the main purpose is that IE browsers share events instaciation interface
132
+ *
133
+ * @param Object options
134
+ * @return Event new event
135
+ */
136
+ build: Browser.IE ? function(options) {
137
+ var event = document.createEventObject();
138
+ event.type = event.eventType = "on" + options.name;
139
+ event.altKey = options.altKey;
140
+ event.ctrlKey = options.ctrlKey;
141
+ event.shiftKey = options.shiftKey;
142
+ return event;
143
+ } : null,
144
+
145
+ /**
146
+ * initial options parsing
147
+ *
148
+ * @params Sting event name
149
+ * @params Object user options
150
+ * @return Object clean options
151
+ */
152
+ options: function(name, options) {
153
+ options = Object.merge({}, Event.Base.Options, this.Options, options);
154
+ options.name = name;
155
+
156
+ return options;
157
+ }
158
+ });
159
+ /**
160
+ * presents the mouse events class
161
+ *
162
+ * NOTE: this class generally is for an internal usage, it builds a new clean
163
+ * unextended mouse event.
164
+ * Use the Event general constructor, if you need a usual extened event.
165
+ *
166
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
167
+ */
168
+ Event.Mouse = new Class(Event.Base, {
169
+
170
+ extend: {
171
+ NAMES: $w('click middleclick rightclick dblclick mousedown mouseup mouseover mouseout mousemove'),
172
+
173
+ Methods: {
174
+ isLeftClick: function() {
175
+ return this.which == 1;
176
+ },
177
+
178
+ isRightClick : function() {
179
+ return this.which == 3;
180
+ }
181
+ },
182
+
183
+ /**
184
+ * proceses the event extending as if it's a mouse event
185
+ *
186
+ * @param Event new event
187
+ * @return Event extended event
188
+ */
189
+ ext: function(event) {
190
+ $ext(event, this.Methods, true);
191
+
192
+ return event;
193
+ }
194
+ },
195
+
196
+ // default mouse events related options
197
+ Options: {
198
+ pointerX: 0,
199
+ pointerY: 0,
200
+ button: 0
201
+ },
202
+
203
+ // protecteds
204
+ build: function(options) {
205
+ var event = Browser.IE ? this.$super(options) : document.createEvent("MouseEvent");
206
+ this[Browser.IE ? 'initIE' : 'initW3C'](event, options);
207
+ return event;
208
+ },
209
+
210
+ options: function(name, options) {
211
+ options = this.$super(name, options);
212
+ options.button = Event.BUTTONS[options.name == 'rightclick' ? 'RIGHT' : options.name == 'middleclick' ? 'MIDDLE' : 'LEFT'];
213
+ options.name = Event.realName(options.name);
214
+
215
+ return options;
216
+ },
217
+
218
+ // private
219
+ initIE: function(event, options) {
220
+ event.clientX = options.pointerX;
221
+ event.clientY = options.pointerY;
222
+ event.button = options.button;
223
+ },
224
+
225
+ initW3C: function(event, options) {
226
+ event.initMouseEvent(options.name, options.bubbles, options.cancelable, document.defaultView,
227
+ name == 'dblclick' ? 2 : 1, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
228
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, options.element
229
+ );
230
+ }
231
+ });
232
+
233
+ try {
234
+ // boosting up the native events by preextending the prototype if available
235
+ $ext(Event.parent.prototype, Event.Mouse.Methods, true);
236
+ } catch(e) {};
237
+
238
+ /**
239
+ * presents the keyboard events class
240
+ *
241
+ * NOTE: this class generally is for an internal usage, it builds a new clean
242
+ * unextended mouse event.
243
+ * Use the Event general constructor, if you need a usual extened event.
244
+ *
245
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
246
+ */
247
+ Event.Keyboard = new Class(Event.Base, {
248
+
249
+ extend: {
250
+ NAMES: $w('keypress keydown keyup'),
251
+
252
+ /**
253
+ * automatically generates the key checking methods like
254
+ * isEscape()
255
+ * isEnter()
256
+ * etc
257
+ */
258
+ Methods: {}, // generated at the end of the file
259
+
260
+ /**
261
+ * processes the event extending as a keyboard event
262
+ *
263
+ * @param Event before extending
264
+ * @return Event after extending
265
+ */
266
+ ext: function(event) {
267
+ $ext(event, this.Methods, true);
268
+
269
+ return event;
270
+ }
271
+ },
272
+
273
+ // default keyboard related events options
274
+ Options: {
275
+ keyCode: 0,
276
+ charCode: 0
277
+ },
278
+
279
+ // protected
280
+ build: function(options) {
281
+ var event = null;
282
+
283
+ if (Browser.IE) {
284
+ event = this.$super(options);
285
+ this.initIE(event, options)
286
+ } else try {
287
+ // Gecko, WebKit, Chrome
288
+ event = document.createEvent('KeyboardEvent');
289
+ this['init'+(Browser.WebKit ? 'Webkit' : 'Gecko')](event, options);
290
+ } catch(e) {
291
+ // basically Opera
292
+ event = document.createEvent('UIEvent');
293
+ this.initDOM2(event, options);
294
+ }
295
+
296
+ return event;
297
+ },
298
+
299
+ initGecko: function(event, options) {
300
+ event.initKeyEvent(options.name,
301
+ options.bubbles, options.cancelable, document.defaultView,
302
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
303
+ options.keyCode, options.charCode
304
+ );
305
+ },
306
+
307
+ initWebkit: function(event, options) {
308
+ event.initKeyboardEvent(options.name,
309
+ options.bubbles, options.cancelable, document.defaultView,
310
+ null, 0, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey
311
+ );
312
+ },
313
+
314
+ initDOM2: function(event, options) {
315
+ event.initUIEvent(options.name, options.bubbles, options.cancelable, document.defaultView, 1);
316
+
317
+ event.keyCode = options.keyCode;
318
+ event.charCode = options.charCode;
319
+ event.altKey = options.altKey;
320
+ event.metaKey = options.metaKey;
321
+ event.ctrlKey = options.ctrlKey;
322
+ event.shiftKey = options.shiftKey;
323
+ },
324
+
325
+ initIE: function(event, options) {
326
+ event.keyCode = options.keyCode;
327
+ event.charCode = options.charCode;
328
+ }
329
+ });
330
+
331
+ // generates the key checking methods
332
+ (function() {
333
+ for (var key in Event.KEYS) {
334
+ (function(key, key_code) {
335
+ Event.Keyboard.Methods[('is_'+key.toLowerCase()).camelize()] = function() {
336
+ return this.keyCode == key_code;
337
+ };
338
+ })(key, Event.KEYS[key]);
339
+ };
340
+ try {
341
+ // boosting up the native events by preextending the prototype if available
342
+ $ext(Event.parent.prototype, Event.Keyboard.Methods, true);
343
+ } catch(e) {};
344
+ })();
345
+
346
+ /**
347
+ * Reassigning the element #fire method to support the native events dispatching
348
+ *
349
+ * @copyright 2009 Nikolay V. Nemshilov aka St.
350
+ */
351
+ Element.addMethods({
352
+ fire: function() {
353
+ var args = $A(arguments), event = new Event(args.shift(), Object.merge(args.shift(), {element: this}));
354
+
355
+ if (event instanceof Event.Custom) {
356
+ (this.$listeners || []).each(function(i) {
357
+ if (i.e == event.eventName) {
358
+ i.f.apply(this, [event].concat(i.a).concat(args));
359
+ }
360
+ }, this);
361
+ } else if (this.dispatchEvent) {
362
+ this.dispatchEvent(event);
363
+ } else {
364
+ this.fireEvent(event.eventType, event);
365
+ }
366
+
367
+ return this;
368
+ }
369
+ });
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Advanced dom events handling module
3
+ *
4
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
5
+ */
6
+ eval((function(s,d){for(var i=d.length-1;i>-1;i--)if(d[i])s=s.replace(new RegExp(i,'g'),d[i]);return s})("11.53((10(){47 o=11.54;14{54:10(e){if(!e.stop){o.call(11,e);if(11.31.48.57(e.90))11.31.54(e);49 if(defined(e.18))11.25.54(e)}14 e},82:{BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,67:37,UP:38,61:39,DOWN:40,INSERT:45,DELETE:46},78:(19.IE||19.Konqueror)?{67:1,65:4,61:2}:{67:0,65:1,61:2}}})());11.include({63:10(){47 a=$A(70),e=a.76(),o=a.pop()||{};if(isString(e)){47 n=11.clean91(e);if(11.31.48.57(n))e=56 11.31(n,o);49 if(11.25.48.57(n))e=56 11.25(n,o);49 e=56 11.83(n,o)}14 11.54(e)}});11.69=56 75({53:{30:{29:50,22:50,20:60,17:60,16:60,28:60}},63:10(n,o){14 12.62(12.58(n,o))},62:19.IE?10(o){47 e=15.create1185();e.90=e.71=\"on\"+o.23;e.20=o.20;e.17=o.17;e.16=o.16;14 e}:81,58:10(n,o){o=85.87({},11.69.30,12.30,o);o.23=n;14 o}});11.31=56 75(11.69,{53:{48:$w('click 59 64 77 mousedown mouseup mouseover mouseout mousemove'),21:{isLeft94:10(){14 12.88==1},isRight94:10(){14 12.88==3}},54:10(e){$54(e,12.21,50);14 e}},30:{42:0,43:0,44:0},62:10(o){47 e=19.IE?12.66(o):15.create11(\"3111\");12[19.IE?'55':'79'](e,o);14 e},58:10(n,o){o=12.66(n,o);o.44=11.78[o.23=='64'?'61':o.23=='59'?'65':'67'];o.23=11.real91(o.23);14 o},55:10(e,o){e.clientX=o.42;e.clientY=o.43;e.44=o.44},79:10(e,o){e.init3111(o.23,o.29,o.22,15.26,23=='77'?2:1,o.42,o.43,o.42,o.43,o.17,o.20,o.16,o.28,o.44,o.80)}});89{$54(11.86.72,11.31.21,50)}74(e){};11.25=56 75(11.69,{53:{48:$w('keypress keydown keyup'),21:{},54:10(e){$54(e,12.21,50);14 e}},30:{18:0,24:0},62:10(o){47 a=81;if(19.IE){a=12.66(o);12.55(a,o)}49 89{a=15.create11('2511');12['init'+(19.WebKit?'92':'93')](a,o)}74(e){a=15.create11('UI11');12.73(a,o)}14 a},init93:10(e,o){e.initKey11(o.23,o.29,o.22,15.26,o.17,o.20,o.16,o.28,o.18,o.24)},init92:10(e,o){e.init2511(o.23,o.29,o.22,15.26,81,0,o.17,o.20,o.16,o.28)},73:10(e,o){e.initUI11(o.23,o.29,o.22,15.26,1);e.18=o.18;e.24=o.24;e.20=o.20;e.28=o.28;e.17=o.17;e.16=o.16},55:10(e,o){e.18=o.18;e.24=o.24}});(10(){for(47 b in 11.82)(10(k,a){11.25.21[('is_'+k.toLowerCase()).camelize()]=10(){14 12.18==a}})(b,11.82[b]);;89{$54(11.86.72,11.25.21,50)}74(e){}})();Element.add21({fire:10(){47 b=$A(70),e=56 11(b.76(),85.87(b.76(),{80:12}));if(e instanceof 11.83){(12.$listeners||[]).each(10(a){if(a.e==e.event91)a.f.apply(12,[e].84(a.a).84(b))},12)}49 if(12.dispatch11)12.dispatch11(e);49 12.fire11(e.71,e);14 12}});",",,,,,,,,,,function,Event,this,,return,document,shiftKey,ctrlKey,keyCode,Browser,altKey,Methods,cancelable,name,charCode,Keyboard,defaultView,,metaKey,bubbles,Options,Mouse,,,,,,,,,,createEvent,pointerX,pointerY,button,,,var,NAMES,else,true,,dispatchEvent,extend,ext,initIE,new,includes,options,middleclick,false,RIGHT,build,initialize,rightclick,MIDDLE,$super,LEFT,$ext,Base,arguments,eventType,prototype,initDOM2,catch,Class,shift,dblclick,BUTTONS,initW3C,element,null,KEYS,Custom,concat,Object,parent,merge,which,try,type,Name,Webkit,Gecko,Click".split(",")));
@@ -0,0 +1,176 @@
1
+ /**
2
+ * The JSON encode/decode feature
3
+ *
4
+ * Copyright (C) 2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
5
+ */
6
+
7
+ /**
8
+ * String to JSON export
9
+ *
10
+ * Credits:
11
+ * Based on the original JSON escaping implementation
12
+ * http://www.json.org/json2.js
13
+ *
14
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
15
+ */
16
+ (function(String_proto) {
17
+ var specials = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'},
18
+ quotables = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
19
+
20
+ // quotes the string
21
+ function quote(string) {
22
+ return string.replace(quotables, function(chr) {
23
+ return specials[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
24
+ });
25
+ };
26
+
27
+ String_proto.toJSON = function() {
28
+ return '"'+ quote(this) + '"';
29
+ }
30
+
31
+ })(String.prototype);
32
+ /**
33
+ * Dates to JSON convertion
34
+ *
35
+ * Credits:
36
+ * Based on the original JSON escaping implementation
37
+ * http://www.json.org/json2.js
38
+ *
39
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
40
+ */
41
+ (function(Date_proto) {
42
+ var z = function(num) {
43
+ return (num < 10 ? '0' : '')+num;
44
+ };
45
+
46
+
47
+ Date_proto.toJSON = function() {
48
+ return this.getUTCFullYear() + '-' +
49
+ z(this.getUTCMonth() + 1) + '-' +
50
+ z(this.getUTCDate()) + 'T' +
51
+ z(this.getUTCHours()) + ':' +
52
+ z(this.getUTCMinutes()) + ':' +
53
+ z(this.getUTCSeconds()) + 'Z';
54
+ };
55
+
56
+ })(Date.prototype);
57
+ /**
58
+ * Number to JSON export
59
+ *
60
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
61
+ */
62
+ Number.prototype.toJSON = function() { return String(this+0); };
63
+ /**
64
+ * The boolean types to prototype export
65
+ *
66
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
67
+ */
68
+ Boolean.prototype.toJSON = function() { return String(this); };
69
+ /**
70
+ * Array instances to JSON export
71
+ *
72
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
73
+ */
74
+ Array.prototype.toJSON = function() {
75
+ return '['+this.map(JSON.encode).join(',')+']'
76
+ };
77
+ /**
78
+ * The Hash instances to JSON export
79
+ *
80
+ * Copyright (C) 2009 Nikolay V. Nemshilov
81
+ */
82
+ if (window['Hash']) {
83
+ window['Hash'].prototype.toJSON = function() {
84
+ return window['JSON'].encode(this.toObject());
85
+ };
86
+ }
87
+ /**
88
+ * The generic JSON interface
89
+ *
90
+ * Credits:
91
+ * Based on the original JSON escaping implementation
92
+ * http://www.json.org/json2.js
93
+ *
94
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
95
+ */
96
+ var JSON = {
97
+ encode: function(value) {
98
+ var result;
99
+
100
+ if (value === null) {
101
+ result = 'null';
102
+ } else if (value.toJSON) {
103
+ result = value.toJSON();
104
+ } else if (isHash(value)){
105
+ result = [];
106
+ for (var key in value) {
107
+ result.push(key.toJSON()+":"+JSON.encode(value[key]));
108
+ }
109
+ result = '{'+result+'}';
110
+ } else {
111
+ throw "JSON can't encode: "+value;
112
+ }
113
+
114
+ return result;
115
+ },
116
+
117
+ // see the original JSON decoder implementation for descriptions http://www.json.org/json2.js
118
+ cx: /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
119
+
120
+ decode: function(string) {
121
+ if (isString(string) && string) {
122
+ // getting back the UTF-8 symbols
123
+ string = string.replace(JSON.cx, function (a) {
124
+ return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
125
+ });
126
+
127
+ // checking the JSON string consistency
128
+ if (/^[\],:{}\s]*$/.test(string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
129
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
130
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, '')))
131
+
132
+ return eval('('+string+')');
133
+ }
134
+
135
+ throw "JSON parse error: "+string;
136
+ }
137
+ };
138
+ /**
139
+ * Wraps up the Cooke set/get methods so that the values
140
+ * were automatically exported/imported into JSON strings
141
+ * and it allowed transparent objects and arrays saving
142
+ *
143
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
144
+ */
145
+ if (window['Cookie']) {
146
+ (function(Cookie_prototype) {
147
+ var old_set = Cookie_prototype.set,
148
+ old_get = Cookie_prototype.get;
149
+
150
+ $ext(Cookie_prototype, {
151
+ set: function(value) {
152
+ return old_set.call(this, JSON.encode(value));
153
+ },
154
+
155
+ get: function() {
156
+ return JSON.decode(old_get.call(this));
157
+ }
158
+ });
159
+ })(Cookie.prototype);
160
+ }
161
+ /**
162
+ * Better JSON sanitizing for the Xhr requests
163
+ *
164
+ * Copyright (C) 2009 Nikolay V. Nemshilov
165
+ */
166
+ Xhr.prototype.sanitizedJSON = function() {
167
+ try {
168
+ return JSON.decode(this.text);
169
+ } catch(e) {
170
+ if (this.secureJSON) {
171
+ throw e;
172
+ } else {
173
+ return null;
174
+ }
175
+ }
176
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The JSON encode/decode feature
3
+ *
4
+ * Copyright (C) 2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
5
+ */
6
+ eval((function(s,d){for(var i=d.length-1;i>-1;i--)if(d[i])s=s.replace(new RegExp(i,'g'),d[i]);return s})("(3(S){22 b={'\\b':'\\\\b','\\t':'\\\\t','\\n':'\\\\n','\\f':'\\\\f','\\r':'\\\\r','\"':'\\\\\"','\\\\\': '\\\\\\\\\'},q=/[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\33\\46-\\41\\42\\47\\45\\35-\\43\\32-\\39\\37-\\36\\34\\38-\\40]/g;3 a(s){11 s.19(q,3(c){11 b[c]||'\\\\u'+('48'+c.23(0).to24(16)).44(-4)})};S.14=3(){11 '\"'+a(13)+'\"'}})(24.12);(3(D){22 z=3(n){11(n<10?'0':'')+n};D.14=3(){11 13.52UTCFullYear()+'-'+z(13.52UTCMonth()+1)+'-'+z(13.52UTC53())+'T'+z(13.52UTCHours())+':'+z(13.52UTCMinutes())+':'+z(13.52UTCSeconds())+'Z'}})(53.12);Number.12.14=3(){11 24(13+0)};Boolean.12.14=3(){11 24(13)};Array.12.14=3(){11 '['+13.map(15.18).join(',')+']'};if(21['50'])21['50'].12.14=3(){11 21['15'].18(13.toObject())};22 15={18:3(v){22 r;if(v===26)r='26';27 if(v.14)r=v.14();27 if(is50(v)){r=[];for(22 k in v)r.push(k.14()+\":\"+15.18(v[k]));r='{'+r+'}'}27 30 \"15 can't 18: \"+v;11 r},cx:/[\\u48\\33\\46-\\41\\42\\47\\45\\35-\\43\\32-\\39\\37-\\36\\34\\38-\\40]/g,25:3(s){if(is24(s)&&s){s=s.19(15.cx,3(b){11 '\\\\u'+('48'+b.23(0).to24(16)).44(-4)});if(/^[\\],:{}\\s]*$/.test(s.19(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').19(/\"[^\"\\\\\\n\\r]*\"|true|false|26|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,']').19(/(?:^|:|,)(?:\\s*\\[)+/g,'')))11 eval('('+s+')')}30 \"15 parse error: \"+s}};if(21['31'])(3(C){22 a=C.51,o=C.52;$ext(C,{51:3(v){11 a.49(13,15.18(v))},52:3(){11 15.25(o.49(13))}})})(31.12);Xhr.12.sanitized15=3(){try{11 15.25(13.text)}catch(e){if(13.secure15)30 e;27 11 26}};",",,,function,,,,,,,,return,prototype,this,toJSON,JSON,,,encode,replace,,window,var,charCodeAt,String,decode,null,else,,toString,throw,Cookie,u2028,u00ad,ufeff,u200c,u206f,u2060,ufff0,u202f,uffff,u0604,u070f,u200f,slice,u17b5,u0600,u17b4,0000,call,Hash,set,get,Date".split(",")));