right-rails 0.4.4 → 0.5.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.
- data/init.rb +37 -8
- data/javascripts/right-autocompleter-src.js +55 -41
- data/javascripts/right-autocompleter.js +2 -2
- data/javascripts/right-behavior-src.js +5 -5
- data/javascripts/right-behavior.js +2 -2
- data/javascripts/right-calendar-src.js +139 -67
- data/javascripts/right-calendar.js +2 -2
- data/javascripts/right-dnd-src.js +7 -7
- data/javascripts/right-dnd.js +2 -2
- data/javascripts/right-effects-src.js +9 -9
- data/javascripts/right-effects.js +2 -2
- data/javascripts/right-events-src.js +8 -8
- data/javascripts/right-events.js +2 -2
- data/javascripts/right-in-edit-src.js +10 -8
- data/javascripts/right-in-edit.js +2 -2
- data/javascripts/right-json-src.js +14 -15
- data/javascripts/right-json.js +2 -2
- data/javascripts/right-lightbox-src.js +141 -86
- data/javascripts/right-lightbox.js +3 -3
- data/javascripts/right-olds-src.js +26 -48
- data/javascripts/right-olds.js +2 -2
- data/javascripts/right-rails-src.js +109 -31
- data/javascripts/right-rails.js +2 -2
- data/javascripts/right-rater-src.js +20 -12
- data/javascripts/right-rater.js +2 -2
- data/javascripts/right-selectable-src.js +3 -3
- data/javascripts/right-selectable.js +1 -1
- data/javascripts/right-slider-src.js +3 -3
- data/javascripts/right-slider.js +1 -1
- data/javascripts/right-sortable-src.js +28 -28
- data/javascripts/right-sortable.js +2 -2
- data/javascripts/right-src.js +612 -405
- data/javascripts/right-tabs-src.js +115 -44
- data/javascripts/right-tabs.js +2 -2
- data/javascripts/right-tooltips-src.js +131 -74
- data/javascripts/right-tooltips.js +2 -2
- data/javascripts/right-ui-i18n-fr.js +4 -4
- data/javascripts/right-uploader-src.js +170 -0
- data/javascripts/right-uploader.js +9 -0
- data/javascripts/right.js +2 -4
- data/lib/right_rails.rb +1 -1
- data/lib/right_rails/helpers/basic.rb +10 -2
- data/lib/right_rails/helpers/misc.rb +16 -17
- data/lib/right_rails/helpers/rails.rb +0 -7
- data/spec/lib/right_rails/helpers/basic_spec.rb +0 -1
- data/spec/lib/right_rails/helpers/rails_spec.rb +24 -0
- data/spec/spec_helper.rb +9 -1
- metadata +14 -5
data/init.rb
CHANGED
@@ -1,12 +1,41 @@
|
|
1
1
|
# Include hook code here
|
2
|
+
if defined?(Rails)
|
3
|
+
if Rails::VERSION::MAJOR == 2
|
4
|
+
# Rails 2.x.x initalizer
|
5
|
+
|
6
|
+
if defined?(ActionController)
|
7
|
+
class ActionController::Base
|
8
|
+
include RightRails::ControllerExtensions
|
9
|
+
|
10
|
+
helper RightRails::Helpers::Basic,
|
11
|
+
RightRails::Helpers::Rails,
|
12
|
+
RightRails::Helpers::Forms,
|
13
|
+
RightRails::Helpers::Misc
|
14
|
+
end
|
15
|
+
end
|
2
16
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
17
|
+
else
|
18
|
+
# Rails 3 initializer
|
19
|
+
require 'action_controller/railtie'
|
20
|
+
|
21
|
+
if defined?(ActionController)
|
22
|
+
require 'right_rails'
|
23
|
+
require 'right_rails/controller_extensions'
|
24
|
+
require 'right_rails/java_script_generator'
|
25
|
+
require 'right_rails/helpers'
|
26
|
+
require 'right_rails/helpers/basic'
|
27
|
+
require 'right_rails/helpers/forms'
|
28
|
+
require 'right_rails/helpers/misc'
|
29
|
+
require 'right_rails/helpers/rails'
|
30
|
+
|
31
|
+
class ActionController::Base
|
32
|
+
include RightRails::ControllerExtensions
|
33
|
+
|
34
|
+
helper RightRails::Helpers::Basic,
|
35
|
+
RightRails::Helpers::Forms,
|
36
|
+
RightRails::Helpers::Misc,
|
37
|
+
RightRails::Helpers::Rails
|
38
|
+
end
|
39
|
+
end
|
11
40
|
end
|
12
41
|
end
|
@@ -3,14 +3,14 @@
|
|
3
3
|
*
|
4
4
|
* Home page: http://rightjs.org/ui/autocompleter
|
5
5
|
*
|
6
|
-
* @copyright (C) 2009 Nikolay V. Nemshilov
|
6
|
+
* @copyright (C) 2009-2010 Nikolay V. Nemshilov
|
7
7
|
*/
|
8
8
|
if (!RightJS) { throw "Gimme RightJS. Please." };
|
9
9
|
|
10
10
|
/**
|
11
11
|
* The RightJS UI Autocompleter unit base class
|
12
12
|
*
|
13
|
-
* Copyright (C) Nikolay V. Nemshilov
|
13
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
14
14
|
*/
|
15
15
|
var Autocompleter = new Class(Observer, {
|
16
16
|
extend: {
|
@@ -27,40 +27,29 @@ var Autocompleter = new Class(Observer, {
|
|
27
27
|
cache: true, // the use the results cache
|
28
28
|
local: null, // an optional local search results list
|
29
29
|
|
30
|
-
fxName: 'slide',
|
31
|
-
fxDuration: 'short',
|
30
|
+
fxName: 'slide', // list appearance fx name
|
31
|
+
fxDuration: 'short', // list appearance fx duration
|
32
32
|
|
33
|
-
spinner: 'native',
|
33
|
+
spinner: 'native', // spinner element reference
|
34
34
|
|
35
|
-
|
35
|
+
cssRule: '[rel^=autocompleter]'
|
36
36
|
},
|
37
37
|
|
38
|
-
//
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
if (url.match(/^['"].*?['"]$/)) {
|
54
|
-
options.local = eval('['+url+']');
|
55
|
-
} else if (!url.blank()) {
|
56
|
-
options.url = url;
|
57
|
-
}
|
58
|
-
}
|
59
|
-
|
60
|
-
new Autocompleter(input, options);
|
61
|
-
}
|
62
|
-
});
|
63
|
-
}
|
38
|
+
current: null, // reference to the currently active options list
|
39
|
+
instances: {}, // the input <-> instance map
|
40
|
+
|
41
|
+
// finds/instances an autocompleter for the event
|
42
|
+
find: function(event) {
|
43
|
+
var input = event.target;
|
44
|
+
if (input.match(Autocompleter.Options.cssRule)) {
|
45
|
+
var uid = $uid(input);
|
46
|
+
if (!Autocompleter.instances[uid])
|
47
|
+
new Autocompleter(input);
|
48
|
+
}
|
49
|
+
},
|
50
|
+
|
51
|
+
// DEPRECATED scans the document for autocompletion fields
|
52
|
+
rescan: function(scope) { }
|
64
53
|
},
|
65
54
|
|
66
55
|
/**
|
@@ -70,16 +59,17 @@ var Autocompleter = new Class(Observer, {
|
|
70
59
|
* @param Object options
|
71
60
|
*/
|
72
61
|
initialize: function(input, options) {
|
62
|
+
this.input = $(input); // don't low it down!
|
73
63
|
this.$super(options);
|
74
64
|
|
75
65
|
// storing the callbacks so we could detach them later
|
76
66
|
this._watch = this.watch.bind(this);
|
77
67
|
this._hide = this.hide.bind(this);
|
78
68
|
|
79
|
-
this.input
|
69
|
+
this.input.onKeyup(this._watch).onBlur(this._hide);
|
80
70
|
this.container = $E('div', {'class': 'autocompleter'}).insertTo(this.input, 'after');
|
81
71
|
|
82
|
-
this.input.autocompleter = this;
|
72
|
+
this.input.autocompleter = Autocompleter.instances[$uid(input)] = this;
|
83
73
|
},
|
84
74
|
|
85
75
|
// kills the autocompleter
|
@@ -91,7 +81,7 @@ var Autocompleter = new Class(Observer, {
|
|
91
81
|
|
92
82
|
// catching up with some additonal options
|
93
83
|
setOptions: function(options) {
|
94
|
-
this.$super(options);
|
84
|
+
this.$super(this.grabOptions(options));
|
95
85
|
|
96
86
|
// building the correct url template with a placeholder
|
97
87
|
if (!this.options.url.includes('%{search}')) {
|
@@ -151,6 +141,28 @@ var Autocompleter = new Class(Observer, {
|
|
151
141
|
|
152
142
|
// protected
|
153
143
|
|
144
|
+
// trying to extract the input element options
|
145
|
+
grabOptions: function(options) {
|
146
|
+
var input = this.input;
|
147
|
+
var options = options || eval('('+input.get('data-autocompleter-options')+')') || {};
|
148
|
+
var keys = Autocompleter.Options.cssRule.split('[').last().split(']')[0].split('^='),
|
149
|
+
key = keys[1], value = input.get(keys[0]), match;
|
150
|
+
|
151
|
+
// trying to extract options
|
152
|
+
if (value && (match = value.match(new RegExp('^'+ key +'+\\[(.*?)\\]$')))) {
|
153
|
+
match = match[1];
|
154
|
+
|
155
|
+
// deciding whether it's a list of local options or an url
|
156
|
+
if (match.match(/^['"].*?['"]$/)) {
|
157
|
+
options.local = eval('['+ match +']');
|
158
|
+
} else if (!match.blank()) {
|
159
|
+
options.url = match;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
return options;
|
164
|
+
},
|
165
|
+
|
154
166
|
// works with the 'prev' and 'next' methods
|
155
167
|
select: function(what, fallback) {
|
156
168
|
var current = this.container.first('li.current');
|
@@ -163,7 +175,7 @@ var Autocompleter = new Class(Observer, {
|
|
163
175
|
|
164
176
|
// receives the keyboard events out of the input element
|
165
177
|
watch: function(event) {
|
166
|
-
// skip the overlaping key codes that are already watched in the
|
178
|
+
// skip the overlaping key codes that are already watched in the document.js
|
167
179
|
if ([27,37,38,39,40,13].include(event.keyCode)) return;
|
168
180
|
|
169
181
|
if (this.input.value.length >= this.options.minLength) {
|
@@ -273,15 +285,12 @@ var Autocompleter = new Class(Observer, {
|
|
273
285
|
/**
|
274
286
|
* The document events hooking
|
275
287
|
*
|
276
|
-
* Copyright (C) Nikolay V. Nemshilov
|
288
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
277
289
|
*/
|
278
290
|
document.on({
|
279
|
-
ready: function() {
|
280
|
-
Autocompleter.rescan();
|
281
|
-
},
|
282
|
-
|
283
291
|
// the autocompletion list navigation
|
284
292
|
keydown: function(event) {
|
293
|
+
// if there is an active options list, hijacking the navigation buttons
|
285
294
|
if (Autocompleter.current) {
|
286
295
|
var name;
|
287
296
|
|
@@ -299,6 +308,11 @@ document.on({
|
|
299
308
|
event.stop();
|
300
309
|
}
|
301
310
|
}
|
311
|
+
|
312
|
+
// otherwise trying to find/instanciate an autocompliter
|
313
|
+
else {
|
314
|
+
Autocompleter.find(event);
|
315
|
+
}
|
302
316
|
}
|
303
317
|
});
|
304
318
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
*
|
4
4
|
* Home page: http://rightjs.org/ui/autocompleter
|
5
5
|
*
|
6
|
-
* @copyright (C) 2009 Nikolay V. Nemshilov
|
6
|
+
* @copyright (C) 2009-2010 Nikolay V. Nemshilov
|
7
7
|
*/
|
8
8
|
if (!RightJS) { throw "Gimme RightJS. Please." };
|
9
|
-
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})("
|
9
|
+
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})("29 16=99 Class(Observer,{extend:{EVENTS:$w('48 32 55 107 33 59'),63:{69:57.location.href,116:'53',80:'117',50:1,82:200,35:true,64:81,112:'slide',72:'short',25:'78',62:'[rel^=15]'},22:81,49:{},120:11(e){29 i=e.tar117;if(i.95(16.63.62)){29 u=125(i);if(!16.49[u])99 16(i)}},rescan:11(s){}},initialize:11(i,o){5.24=$(i);5.111(o);5.76=5.113.36(5);5._32=5.32.36(5);5.24.onKeyup(5.76).onBlur(5._32);5.19=$E('26',{'90':'15'}).94(5.24,'119');5.24.15=16.49[125(i)]=5},destroy:11(){5.24.52('keyup',5.76).52('blur',5._32);delete(5.24.15);18 5},set63:11(o){5.111(5.60(o));if(!5.17.69.93('%{53}'))5.17.69+=(5.17.69.93('?')?'&':'?')+5.17.116+'=%{53}'},48:11(){if(5.19.77()){29 d=5.24.74();5.19.56({71:(d.71+d.54)+'px',46:d.46+'px',67:d.67+'px'}).48(5.17.112,{duration:5.17.72,onFinish:5.45.36(5,'48')})}18 16.22=5},32:11(){if(5.19.96()){5.19.32();5.45.36(5,'32')}16.22=81;18 5},87:11(){18 5.33('87',5.19.33('li').105())},85:11(){18 5.33('85',5.19.61('li'))},59:11(c){29 c=c||5.19.61('li.22');if(c)5.24.89=c.innerHTML.stripTags();18 5.45('59').32()},60:11(o){29 i=5.24;29 o=o||122('('+i.117('data-15-17')+')')||{};29 a=16.63.62.68('[').105().68(']')[0].68('^='),k=a[1],v=i.117(a[0]),m;if(v&&(m=v.95(99 79('^'+k+'+\\\\[(.*?)\\\\]$')))){m=m[1];if(m.95(/^['\"].*?['\"]$/))o.64=122('['+m+']');58 if(!m.blank())o.69=m}18 o},33:11(w,f){29 c=5.19.61('li.22');if(c)c=c[w]('li')||c;18 5.45('33',(c||f).73('22'))},113:11(e){if([27,37,38,39,40,13].include(e.98))18;if(5.24.89.108>=5.17.50){if(5.44)5.44.cancel();5.44=5.102.36(5).delay(5.17.82)}58 18 5.32()},102:11(){5.44=81;5.35=5.35||{};29 s=5.24.89;if(s.108<5.17.50)18 5.32();if(5.35[s])5.42(5.35[s],s);58 if(5.17.64)5.42(5.84(s),s);58 5.request=Xhr.107(5.17.69.101('%{53}',encodeURIComponent(s)),{80:5.17.80,25:5.75(),onComplete:11(r){5.45('107').42(r.responseText,s)}.36(5)})},42:11(r,s){5.19.55(r).33('li').each(11(l){l.onmouseover=11(){l.73('22')};l.onmousedown=11(){5.59(l)}.36(5)},5);if(5.17.35)5.35[s]=r;18 5.45('55').48()},84:11(s){29 r=99 79(\"(\"+79.escape(s)+\")\",'ig');18 $E('ul').insert(5.17.64.128(11(o){if(r.test(o))18 $E('li',{121:o.101(r,'<109>$1</109>')})}).compact())},75:11(){5.21=5.21||5.17.25;if(5.21=='78'){5.21=$E('26',{'90':'15-25'}).94(5.24,'119');29 c='123'.68('').128(11(a){18 $E('26',{'90':'100-'+a,121:'»'})});(11(){29 d=c.shift();c.push(d);5.21.55(d)}.36(5)).periodical(400)}if(5.17.25=='78'){29 b=5.24.74();5.21.56('visiblity: 77').48();5.21.56({visibility:'96',71:(b.71+1)+'px',54:(b.54-2)+'px',lineHeight:(b.54-2)+'px',46:(b.46+b.67-5.21.offsetWidth-1)+'px'}).32()}18 5.21}});57.on({keydown:11(e){if(16.22){29 n;switch(e.98){47 27:n='32';41;47 37:n='87';41;47 39:n='85';41;47 38:n='87';41;47 40:n='85';41;47 13:n='59';41}if(n){16.22[n]();e.s71()}}58 16.120(e)}});57.write(\"<70 type=\\\"126/css\\\">26.15{104:30;88:91;z-118:83;28:30;34:0;43:0;31:white;-moz-129-110:#130 .86 .86 .114;-webkit-129-110:#130 .86 .86 .114;overflow:77}26.15 ul{124-70:30;34:0;43:0;28:30;31:30;*28-51:103 65 #97}26.15 ul li{124-70:30;106-weight:normal;34:0;43:.86 .114;28:103 65 #97;28-71:30;28-51:30;31:30;cursor:pointer}26.15 ul li:61-115{28-71:103 65 #97}26.15 ul li:105-115{28-51:103 65 #97;*28-51:30}26.15 ul li.22{31:#127}26.15-25{88:91;z-118:83;126-align:center;106-size:140%;106-family:Georgia;31:#127;color:#666;104:30;67:1em;34:0;43:0}26.15-25 26.100-1{34-46:-131}26.15-25 26.100-2{}26.15-25 26.100-3{34-46:131}</70>\");",",,,,,this,,,,,,function,,,,autocompleter,Autocompleter,options,return,container,,_spinner,current,,input,spinner,div,,border,var,none,background,hide,select,margin,cache,bind,,,,,break,suggest,padding,timeout,fire,left,case,show,instances,minLength,bottom,stopObserving,search,height,update,setStyle,document,else,done,grabOptions,first,cssRule,Options,local,solid,,width,split,url,style,top,fxDuration,radioClass,dimensions,getSpinner,_watch,hidden,native,RegExp,method,null,threshold,100000000,findLocal,next,2em,prev,position,value,class,absolute,_hide,includes,insertTo,match,visible,CCC,keyCode,new,dot,replace,trigger,1px,display,last,font,load,length,strong,shadow,$super,fxName,watch,4em,child,param,get,index,after,find,html,eval,,list,$uid,text,DDD,map,box,BBB,4px".split(",")));
|
@@ -3,7 +3,7 @@
|
|
3
3
|
*
|
4
4
|
* See http://rightjs.org/goods/behave for more details
|
5
5
|
*
|
6
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
6
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
7
7
|
*/
|
8
8
|
|
9
9
|
/**
|
@@ -14,7 +14,7 @@
|
|
14
14
|
* on the page, and will watch any updates on the page
|
15
15
|
* and refresh the behaves automatically
|
16
16
|
*
|
17
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
17
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
18
18
|
*/
|
19
19
|
var Behavior = new Class({
|
20
20
|
extend: {
|
@@ -207,9 +207,9 @@ document.onReady(Behavior.refresh);
|
|
207
207
|
/**
|
208
208
|
* The Element unit wrapups for automaticall behaves processing on the page updates
|
209
209
|
*
|
210
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
210
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
211
211
|
*/
|
212
|
-
Element.
|
212
|
+
Element.include((function(old_methods) {
|
213
213
|
var old_insert = old_methods.insert;
|
214
214
|
var old_update = old_methods.update;
|
215
215
|
|
@@ -238,7 +238,7 @@ return {
|
|
238
238
|
*
|
239
239
|
* "div#sidebar ul li".stopBehave('click', function() {...});
|
240
240
|
*
|
241
|
-
* Copyright (C) 2009 Nikolay V Nemshilov
|
241
|
+
* Copyright (C) 2009-2010 Nikolay V Nemshilov
|
242
242
|
*/
|
243
243
|
$ext(String.prototype, {
|
244
244
|
/**
|
@@ -3,6 +3,6 @@
|
|
3
3
|
*
|
4
4
|
* See http://rightjs.org/goods/behave for more details
|
5
5
|
*
|
6
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
6
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
7
7
|
*/
|
8
|
-
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})("8 4=28 Class({extend:{29:2(){8 a=$A(6);8 b=28 4(a.18());5 b.on.7(b,a).25()},16:2(r){8 b=4.10[r];if(b)b.16();5 b},delegate:2(r){5 2(a){8 e=$(a.target);24(8 s in r)if(e.match(s))5 r[s].7(3,6)}},9:2(){24(8 k in 4.10)4.10[k].9()},10:{}},12:21,17:21,14:21,initialize:2(){8 a=$A(6);3.12=a.18();3.on.7(3,a);3.14=[]},25:2(){5 4.10[3.12]=3.9()},16:2(){8 a=3.17;if(!isHash(a[0])){8 h={};h[a.18()]=a;a=h}27 a=a[0];$$(3.12).20(2(e){8 u=26(e);if(3.14[u])24(8 k in a){if(15(a[k])){a[k].20(2(o){if(15(o))e.11.7(e,[k].13(options[0]))});if(!15(a[k][0]))e.11.7(e,[k].13(a[k][0]))}27 e.11.7(e,[k].13(a[k]))}},3);3.14=[];delete(4.10[3.12]);5 3},10:2(){5 4.10[3.12]===3},on:2(){3.17=$A(6);5 3},9:2(){$$(3.12).20(2(e){8 u=26(e);if(!3.14[u]){e.on.7(e,3.17);3.14[u]=1}},3);5 3}});document.onReady(4.9);19.
|
8
|
+
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})("8 4=28 Class({extend:{29:2(){8 a=$A(6);8 b=28 4(a.18());5 b.on.7(b,a).25()},16:2(r){8 b=4.10[r];if(b)b.16();5 b},delegate:2(r){5 2(a){8 e=$(a.target);24(8 s in r)if(e.match(s))5 r[s].7(3,6)}},9:2(){24(8 k in 4.10)4.10[k].9()},10:{}},12:21,17:21,14:21,initialize:2(){8 a=$A(6);3.12=a.18();3.on.7(3,a);3.14=[]},25:2(){5 4.10[3.12]=3.9()},16:2(){8 a=3.17;if(!isHash(a[0])){8 h={};h[a.18()]=a;a=h}27 a=a[0];$$(3.12).20(2(e){8 u=26(e);if(3.14[u])24(8 k in a){if(15(a[k])){a[k].20(2(o){if(15(o))e.11.7(e,[k].13(options[0]))});if(!15(a[k][0]))e.11.7(e,[k].13(a[k][0]))}27 e.11.7(e,[k].13(a[k]))}},3);3.14=[];delete(4.10[3.12]);5 3},10:2(){5 4.10[3.12]===3},on:2(){3.17=$A(6);5 3},9:2(){$$(3.12).20(2(e){8 u=26(e);if(!3.14[u]){e.on.7(e,3.17);3.14[u]=1}},3);5 3}});document.onReady(4.9);19.include((2(a){8 o=a.23;8 b=a.22;5{23:2(){o.7(3,6);4.9();5 3},22:2(c){b.7(3,6);if(is30(c))4.9();5 3}}})(19.Methods));$ext(30.prototype,{behave:2(){5 4.29.7(4,[''+3].13($A(6)))},16Behave:2(){5 4.16.7(4,[''+3].13($A(6)))}});",",,function,this,Behavior,return,arguments,apply,var,refresh,active,stopObserving,rule,concat,regs,isArray,stop,args,shift,Element,each,null,update,insert,for,start,$uid,else,new,add,String".split(",")));
|
@@ -3,15 +3,14 @@
|
|
3
3
|
*
|
4
4
|
* Home page: http://rightjs.org/ui/calendar
|
5
5
|
*
|
6
|
-
* @copyright (C) 2009 Nikolay V. Nemshilov
|
6
|
+
* @copyright (C) 2009-2010 Nikolay V. Nemshilov
|
7
7
|
*/
|
8
8
|
if (!RightJS) { throw "Gimme RightJS. Please." };
|
9
9
|
|
10
10
|
/**
|
11
11
|
* The calendar widget for RightJS
|
12
12
|
*
|
13
|
-
*
|
14
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov aka St.
|
13
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
15
14
|
*/
|
16
15
|
var Calendar = new Class(Observer, {
|
17
16
|
extend: {
|
@@ -28,10 +27,11 @@ var Calendar = new Class(Observer, {
|
|
28
27
|
fxDuration: 200,
|
29
28
|
numberOfMonths: 1, // a number or [x, y] greed definition
|
30
29
|
timePeriod: 1, // the timepicker minimal periods (in minutes, might be bigger than 60)
|
31
|
-
|
32
|
-
relName: 'calendar',
|
30
|
+
|
33
31
|
twentyFourHour: null, // null for automatic, or true|false to enforce
|
34
|
-
listYears: false
|
32
|
+
listYears: false, // show/hide the years listing buttons
|
33
|
+
|
34
|
+
cssRule: '[rel^=calendar]' // css rule for calendar related elements
|
35
35
|
},
|
36
36
|
|
37
37
|
Formats: {
|
@@ -47,7 +47,7 @@ var Calendar = new Class(Observer, {
|
|
47
47
|
Next: 'Next Month',
|
48
48
|
Prev: 'Previous Month',
|
49
49
|
NextYear: 'Next Year',
|
50
|
-
PrevYear: '
|
50
|
+
PrevYear: 'Previous Year',
|
51
51
|
|
52
52
|
dayNames: $w('Sunday Monday Tuesday Wednesday Thursday Friday Saturday'),
|
53
53
|
dayNamesShort: $w('Sun Mon Tue Wed Thu Fri Sat'),
|
@@ -56,26 +56,22 @@ var Calendar = new Class(Observer, {
|
|
56
56
|
monthNamesShort: $w('Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec')
|
57
57
|
},
|
58
58
|
|
59
|
-
//
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
calendar.assignTo(element);
|
76
|
-
}
|
77
|
-
});
|
78
|
-
}
|
59
|
+
current: null, // marker to the currently visible calendar
|
60
|
+
instances: {}, // list of registered instances
|
61
|
+
|
62
|
+
// finds and/or instanciates a Calendar related to the event target
|
63
|
+
find: function(event) {
|
64
|
+
var element = event.target;
|
65
|
+
|
66
|
+
if (isElement(element) && element.match(Calendar.Options.cssRule)) {
|
67
|
+
var uid = $uid(element);
|
68
|
+
return Calendar.instances[uid] = Calendar.instances[uid] ||
|
69
|
+
new Calendar(eval('('+element.get('data-calendar-options')+')'));
|
70
|
+
}
|
71
|
+
},
|
72
|
+
|
73
|
+
// DEPRECATED scans for the auto-discoverable calendar inputs
|
74
|
+
rescan: function(scope) { }
|
79
75
|
},
|
80
76
|
|
81
77
|
/**
|
@@ -190,8 +186,7 @@ var Calendar = new Class(Observer, {
|
|
190
186
|
*/
|
191
187
|
show: function(position) {
|
192
188
|
this.element.show(this.options.fxName, {duration: this.options.fxDuration});
|
193
|
-
Calendar.current = this;
|
194
|
-
return this;
|
189
|
+
return Calendar.current = this;
|
195
190
|
},
|
196
191
|
|
197
192
|
/**
|
@@ -210,7 +205,7 @@ var Calendar = new Class(Observer, {
|
|
210
205
|
/**
|
211
206
|
* This module handles the calendar elemnts building/updating processes
|
212
207
|
*
|
213
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
208
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
214
209
|
*/
|
215
210
|
Calendar.include({
|
216
211
|
|
@@ -440,35 +435,8 @@ Calendar.include({
|
|
440
435
|
/**
|
441
436
|
* This module handles the events connection
|
442
437
|
*
|
443
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
444
|
-
*/
|
445
|
-
|
446
|
-
// the document keybindings hookup
|
447
|
-
document.onKeydown(function(event) {
|
448
|
-
if (Calendar.current) {
|
449
|
-
var name;
|
450
|
-
|
451
|
-
switch(event.keyCode) {
|
452
|
-
case 27: name = 'hide'; break;
|
453
|
-
case 37: name = 'prevDay'; break;
|
454
|
-
case 39: name = 'nextDay'; break;
|
455
|
-
case 38: name = 'prevWeek'; break;
|
456
|
-
case 40: name = 'nextWeek'; break;
|
457
|
-
case 34: name = 'nextMonth'; break;
|
458
|
-
case 33: name = 'prevMonth'; break;
|
459
|
-
case 13:
|
460
|
-
Calendar.current.select(Calendar.current.date);
|
461
|
-
name = 'done';
|
462
|
-
break;
|
463
|
-
}
|
464
|
-
|
465
|
-
if (name) {
|
466
|
-
Calendar.current[name]();
|
467
|
-
event.stop();
|
468
|
-
}
|
469
|
-
}
|
470
|
-
});
|
471
|
-
|
438
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
439
|
+
*/
|
472
440
|
Calendar.include({
|
473
441
|
/**
|
474
442
|
* Initiates the 'select' event on the object
|
@@ -607,7 +575,7 @@ Calendar.include({
|
|
607
575
|
/**
|
608
576
|
* This module handles the calendar assignment to an input field
|
609
577
|
*
|
610
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
578
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
611
579
|
*/
|
612
580
|
Calendar.include({
|
613
581
|
/**
|
@@ -634,7 +602,13 @@ Calendar.include({
|
|
634
602
|
} else {
|
635
603
|
input.on({
|
636
604
|
focus: this.showAt.bind(this, input),
|
637
|
-
|
605
|
+
|
606
|
+
click: function(e) {
|
607
|
+
e.stop();
|
608
|
+
if (this.element.hidden())
|
609
|
+
this.showAt(input);
|
610
|
+
}.bind(this),
|
611
|
+
|
638
612
|
keyDown: function(e) {
|
639
613
|
if (e.keyCode == 9 && this.element.visible())
|
640
614
|
this.hide();
|
@@ -642,8 +616,6 @@ Calendar.include({
|
|
642
616
|
});
|
643
617
|
}
|
644
618
|
|
645
|
-
document.onClick(this.hide.bind(this));
|
646
|
-
|
647
619
|
return this;
|
648
620
|
},
|
649
621
|
|
@@ -728,7 +700,7 @@ Calendar.include({
|
|
728
700
|
* %S - Second of the minute (00..60)
|
729
701
|
* %% - Literal ``%'' character
|
730
702
|
*
|
731
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
703
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
732
704
|
*/
|
733
705
|
Calendar.include({
|
734
706
|
|
@@ -794,7 +766,7 @@ Calendar.include({
|
|
794
766
|
date = new Date();
|
795
767
|
}
|
796
768
|
|
797
|
-
return date;
|
769
|
+
return isNaN(date.getTime()) ? new Date : date;
|
798
770
|
},
|
799
771
|
|
800
772
|
/**
|
@@ -848,9 +820,109 @@ Calendar.include({
|
|
848
820
|
/**
|
849
821
|
* Calendar fields autodiscovery via the rel="calendar" attribute
|
850
822
|
*
|
851
|
-
* Copyright (C) 2009 Nikolay V. Nemshilov
|
823
|
+
* Copyright (C) 2009-2010 Nikolay V. Nemshilov
|
852
824
|
*/
|
853
|
-
|
825
|
+
|
826
|
+
|
827
|
+
(function() {
|
828
|
+
// shows a calendar by an event
|
829
|
+
var show_calendar = function(event) {
|
830
|
+
var calendar = Calendar.find(Event.ext(event));
|
831
|
+
|
832
|
+
if (calendar) {
|
833
|
+
var input = event.target;
|
834
|
+
var rule = Calendar.Options.cssRule.split('[').last();
|
835
|
+
var key = rule.split('=').last().split(']').first();
|
836
|
+
var rel_id_re = new RegExp(key+'\\[(.+?)\\]');
|
837
|
+
var rel_id = input.get(rule.split('^=')[0]);
|
838
|
+
|
839
|
+
if (rel_id && (rel_id = rel_id.match(rel_id_re))) {
|
840
|
+
input = $(rel_id[1]);
|
841
|
+
event.stop();
|
842
|
+
}
|
843
|
+
|
844
|
+
calendar.showAt(input);
|
845
|
+
}
|
846
|
+
};
|
847
|
+
|
848
|
+
// on-click handler
|
849
|
+
var on_mousedown = function(event) {
|
850
|
+
show_calendar(event);
|
851
|
+
|
852
|
+
var target = event.target;
|
853
|
+
if ([target].concat(target.parents()).first('hasClass', 'right-calendar')) event.stop();
|
854
|
+
};
|
855
|
+
|
856
|
+
var on_click = function(event) {
|
857
|
+
var target = event.target;
|
858
|
+
|
859
|
+
if (Calendar.find(event)) {
|
860
|
+
if (target.tagName == 'A')
|
861
|
+
event.stop();
|
862
|
+
} else if (Calendar.current) {
|
863
|
+
if (![target].concat(target.parents()).first('hasClass', 'right-calendar'))
|
864
|
+
Calendar.current.hide();
|
865
|
+
}
|
866
|
+
};
|
867
|
+
|
868
|
+
// on-focus handler
|
869
|
+
var on_focus = function(event) {
|
870
|
+
show_calendar(event);
|
871
|
+
};
|
872
|
+
|
873
|
+
// on-blur handler
|
874
|
+
var on_blur = function(event) {
|
875
|
+
var calendar = Calendar.find(Event.ext(event));
|
876
|
+
|
877
|
+
if (calendar)
|
878
|
+
calendar.hide();
|
879
|
+
};
|
880
|
+
|
881
|
+
var on_keydown = function(event) {
|
882
|
+
if (Calendar.current) {
|
883
|
+
var name;
|
884
|
+
|
885
|
+
switch(event.keyCode) {
|
886
|
+
case 27: name = 'hide'; break;
|
887
|
+
case 37: name = 'prevDay'; break;
|
888
|
+
case 39: name = 'nextDay'; break;
|
889
|
+
case 38: name = 'prevWeek'; break;
|
890
|
+
case 40: name = 'nextWeek'; break;
|
891
|
+
case 34: name = 'nextMonth'; break;
|
892
|
+
case 33: name = 'prevMonth'; break;
|
893
|
+
case 13:
|
894
|
+
Calendar.current.select(Calendar.current.date);
|
895
|
+
name = 'done';
|
896
|
+
break;
|
897
|
+
}
|
898
|
+
|
899
|
+
if (name) {
|
900
|
+
Calendar.current[name]();
|
901
|
+
event.stop();
|
902
|
+
}
|
903
|
+
}
|
904
|
+
};
|
905
|
+
|
906
|
+
|
907
|
+
document.on({
|
908
|
+
mousedown: on_mousedown,
|
909
|
+
click: on_click,
|
910
|
+
keydown: on_keydown
|
911
|
+
});
|
912
|
+
|
913
|
+
// the focus and blur events need some extra care
|
914
|
+
if (Browser.IE) {
|
915
|
+
// IE version
|
916
|
+
document.attachEvent('onfocusin', on_focus);
|
917
|
+
document.attachEvent('onfocusout', on_blur);
|
918
|
+
} else {
|
919
|
+
// W3C version
|
920
|
+
document.addEventListener('focus', on_focus, true);
|
921
|
+
document.addEventListener('blur', on_blur, true);
|
922
|
+
}
|
923
|
+
})();
|
924
|
+
|
925
|
+
|
854
926
|
|
855
927
|
|
856
928
|
document.write("<style type=\"text/css\">div.right-calendar,div.right-calendar table,div.right-calendar table tr,div.right-calendar table th,div.right-calendar table td,div.right-calendar table tbody,div.right-calendar table thead{background:none;border:none;width:auto;height:auto;margin:0;padding:0}*.right-ui-button{display:inline-block;*display:inline;*zoom:1;height:1em;line-height:1em;padding:.2em .5em;text-align:center;border:1px solid #CCC;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em;cursor:pointer;color:#555;background-color:#FFF}*.right-ui-button:hover{color:#222;border-color:#999;background-color:#CCC}*.right-ui-button-disabled,*.right-ui-button-disabled:hover{color:#888;background:#EEE;border-color:#CCC;cursor:default}*.right-ui-buttons{margin-top:.5em}div.right-calendar{position:absolute;height:auto;border:1px solid #BBB;position:relative;padding:.5em;border-radius:.3em;-moz-border-radius:.3em;-webkit-border-radius:.3em;cursor:default;background-color:#EEE;-moz-box-shadow:.2em .4em .8em #666;-webkit-box-shadow:.2em .4em .8em #666}div.right-calendar-inline{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;-moz-box-shadow:none;-webkit-box-shadow:none}div.right-calendar-prev-button,div.right-calendar-next-button,div.right-calendar-prev-year-button,div.right-calendar-next-year-button{position:absolute;float:left;width:1em;padding:.15em .4em}div.right-calendar-next-button{right:.5em}div.right-calendar-prev-year-button{left:2.55em}div.right-calendar-next-year-button{right:2.55em}div.right-calendar-month-caption{text-align:center;height:1.2em;line-height:1.2em}table.right-calendar-greed{border-spacing:0px}table.right-calendar-greed td{vertical-align:top;padding-right:.4em}table.right-calendar-greed>tbody>td:last-child{padding:0}div.right-calendar-month table{margin-top:.2em;border-spacing:1px;border-collapse:separate}div.right-calendar-month table th{color:#777;text-align:center}div.right-calendar-month table td{text-align:right;padding:.1em .3em;background-color:#FFF;border:1px solid #CCC;cursor:pointer;color:#555;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em}div.right-calendar-month table td:hover{background-color:#CCC;border-color:#AAA;color:#000}div.right-calendar-month table td.right-calendar-day-blank{background:transparent;cursor:default;border:none}div.right-calendar-month table td.right-calendar-day-selected{background-color:#BBB;border-color:#AAA;color:#222;font-weight:bold;padding:.1em .2em}div.right-calendar-month table td.right-calendar-day-disabled{color:#888;background:#EEE;border-color:#CCC;cursor:default}div.right-calendar-time{border-top:1px solid #ccc;margin-top:.3em;padding-top:.5em;text-align:center}div.right-calendar-time select{margin:0 .4em}div.right-calendar-buttons div.right-ui-button{width:3.2em}div.right-calendar-done-button{position:absolute;right:.5em}</style>");
|