bhf 1.0.0.beta10 → 1.0.0.beta11

Sign up to get free protection for your applications and to get access to all the features.
@@ -325,7 +325,7 @@ var Picker = new Class({
325
325
  setTitle: function(content, fn){
326
326
  if (!fn) fn = Function.from;
327
327
  this.titleText.empty().adopt(
328
- Array.from(content).map(function(item, i){
328
+ Array.convert(content).map(function(item, i){
329
329
  return typeOf(item) == 'element'
330
330
  ? item
331
331
  : new Element('div.column', {text: fn(item, this.options)}).addClass('column_' + (i + 1));
@@ -53,8 +53,8 @@ Picker.Attach = new Class({
53
53
  if (typeOf(attachTo) == 'string') attachTo = document.id(attachTo);
54
54
  if (typeOf(toggle) == 'string') toggle = document.id(toggle);
55
55
 
56
- var elements = Array.from(attachTo),
57
- toggles = Array.from(toggle),
56
+ var elements = Array.convert(attachTo),
57
+ toggles = Array.convert(toggle),
58
58
  allElements = [].append(elements).combine(toggles),
59
59
  self = this;
60
60
 
@@ -128,8 +128,8 @@ Picker.Attach = new Class({
128
128
  if (typeOf(attachTo) == 'string') attachTo = document.id(attachTo);
129
129
  if (typeOf(toggle) == 'string') toggle = document.id(toggle);
130
130
 
131
- var elements = Array.from(attachTo),
132
- toggles = Array.from(toggle),
131
+ var elements = Array.convert(attachTo),
132
+ toggles = Array.convert(toggle),
133
133
  allElements = [].append(elements).combine(toggles),
134
134
  self = this;
135
135
 
@@ -86,7 +86,7 @@ this.DatePicker = Picker.Date = new Class({
86
86
  return (options.startView == what) && (options.startView = newViews[i]);
87
87
  });
88
88
 
89
- options.canAlwaysGoUp = options.canAlwaysGoUp ? Array.from(options.canAlwaysGoUp) : [];
89
+ options.canAlwaysGoUp = options.canAlwaysGoUp ? Array.convert(options.canAlwaysGoUp) : [];
90
90
 
91
91
  // Set the min and max dates as Date objects
92
92
  if (options.minDate){
@@ -195,7 +195,7 @@ this.DatePicker = Picker.Date = new Class({
195
195
 
196
196
  // start neatly at interval (eg. 1980 instead of 1987)
197
197
  date = date.clone().decrement('year', date.get('year') % perPage);
198
-
198
+
199
199
  var iterateDate = date.clone().decrement('year', Math.floor((pages - 1) / 2) * perPage);
200
200
 
201
201
  for (var i = pages; i--;){
@@ -1,11 +1,7 @@
1
1
  = node f, field do
2
2
  - file = f.object.send(field.name)
3
- - if file.present? && file.attachment.present?
4
- - file_blob_url = main_app.route_for(:rails_service_blob, file.blob.signed_id, file.blob.filename)
5
- - if file.blob.image?
6
- = link_to image_tag(main_app.route_for(:rails_representation, file.variant(resize: "200>")), class: 'uploaded_image'), file_blob_url
7
- - else
8
- = link_to file.blob.filename.to_s, file_blob_url, class: 'uploaded_file'
3
+ - if file.present?
4
+ = render partial: 'bhf/form/column/attachment_presenter', locals: {attachment: file.attachment}
9
5
 
10
6
  - if f.object.respond_to?(:"#{field.name}_destroy")
11
7
  .file_delete
@@ -0,0 +1,10 @@
1
+ = node f, field do
2
+ - f.object.send(field.name).attachments.each do |attachment|
3
+ - if attachment.present?
4
+ = render partial: 'bhf/form/column/attachment_presenter', locals: {attachment: attachment}
5
+ - if f.object.respond_to?(:"#{field.name}_destroy")
6
+ .file_delete
7
+ = f.check_box "#{field.name}_destroy"
8
+ = f.label "#{field.name}_destroy", t('bhf.helpers.file.delete')
9
+
10
+ =# f.file_field field.name, direct_upload: true, data: {:'direct-upload-url' => main_app.rails_direct_uploads_url}
@@ -0,0 +1,6 @@
1
+ - if attachment.present?
2
+ - file_blob_url = main_app.route_for(:rails_service_blob, attachment.blob.signed_id, attachment.blob.filename)
3
+ - if attachment.blob.image?
4
+ = link_to image_tag(main_app.route_for(:rails_representation, attachment.variant(resize: "200>")), class: 'uploaded_image'), file_blob_url
5
+ - else
6
+ = link_to attachment.blob.filename.to_s, file_blob_url, class: 'uploaded_file'
@@ -1,2 +1,2 @@
1
1
  = node f, field do
2
- = f.rich_text_area field.name, class: 'default_input'
2
+ = f.rich_text_area field.name, class: 'default_input trix-content'
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: bhf 1.0.0.beta10 ruby lib
5
+ # stub: bhf 1.0.0.beta11 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "bhf".freeze
9
- s.version = "1.0.0.beta10"
9
+ s.version = "1.0.0.beta11"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Anton Pawlik".freeze]
14
- s.date = "2019-12-28"
14
+ s.date = "2020-03-07"
15
15
  s.description = "A simple to use Rails-Engine-Gem that offers an admin interface for trusted user. Easy integratable and highly configurable and agnostic. Works with ActiveRecord and Mongoid.".freeze
16
16
  s.email = "anton.pawlik@gmail.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  "app/assets/images/bhf/small_ajax_loader.gif",
36
36
  "app/assets/images/bhf/small_ajax_loader_h.gif",
37
37
  "app/assets/images/bhf/wmd-buttons.png",
38
+ "app/assets/javascripts/bhf/MooTools-More-1.6.0.js",
38
39
  "app/assets/javascripts/bhf/application.js",
39
40
  "app/assets/javascripts/bhf/classes/Ajaxify.js",
40
41
  "app/assets/javascripts/bhf/classes/ArrayFields.js",
@@ -54,8 +55,6 @@ Gem::Specification.new do |s|
54
55
  "app/assets/javascripts/bhf/locales/Locale.de-DE.js",
55
56
  "app/assets/javascripts/bhf/locales/Locale.en-US.js",
56
57
  "app/assets/javascripts/bhf/locales/Locale.pt-PT.js",
57
- "app/assets/javascripts/bhf/mootools-core-1.5.0-full-compat.js",
58
- "app/assets/javascripts/bhf/mootools-more-1.5.0.js",
59
58
  "app/assets/javascripts/bhf/mootools_ujs.js",
60
59
  "app/assets/javascripts/bhf/trix.js",
61
60
  "app/assets/stylesheets/bhf/MooEditable.scss",
@@ -84,7 +83,9 @@ Gem::Specification.new do |s|
84
83
  "app/views/bhf/form/belongs_to/_select.html.haml",
85
84
  "app/views/bhf/form/belongs_to/_static.html.haml",
86
85
  "app/views/bhf/form/column/_activestorage_attachment.html.haml",
86
+ "app/views/bhf/form/column/_activestorage_attachments.html.haml",
87
87
  "app/views/bhf/form/column/_array.html.haml",
88
+ "app/views/bhf/form/column/_attachment_presenter.html.haml",
88
89
  "app/views/bhf/form/column/_boolean.html.haml",
89
90
  "app/views/bhf/form/column/_date.html.haml",
90
91
  "app/views/bhf/form/column/_hash.html.haml",
@@ -173,35 +174,24 @@ Gem::Specification.new do |s|
173
174
  ]
174
175
  s.homepage = "http://antpaw.github.io/bhf".freeze
175
176
  s.licenses = ["MIT".freeze]
176
- s.rubygems_version = "3.0.6".freeze
177
+ s.rubygems_version = "3.1.2".freeze
177
178
  s.summary = "A simple to use Rails-Engine-Gem that offers an admin interface for trusted user.".freeze
178
179
 
179
180
  if s.respond_to? :specification_version then
180
181
  s.specification_version = 4
182
+ end
181
183
 
182
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
183
- s.add_runtime_dependency(%q<rails>.freeze, [">= 5.2.2.1"])
184
- s.add_runtime_dependency(%q<sass-rails>.freeze, [">= 6"])
185
- s.add_runtime_dependency(%q<turbolinks>.freeze, [">= 2"])
186
- s.add_runtime_dependency(%q<kaminari>.freeze, [">= 0"])
187
- s.add_runtime_dependency(%q<haml-rails>.freeze, [">= 0"])
188
- s.add_development_dependency(%q<shoulda>.freeze, [">= 3"])
189
- s.add_development_dependency(%q<rdoc>.freeze, [">= 3"])
190
- s.add_development_dependency(%q<bundler>.freeze, [">= 1"])
191
- s.add_development_dependency(%q<jeweler>.freeze, [">= 2"])
192
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
193
- else
194
- s.add_dependency(%q<rails>.freeze, [">= 5.2.2.1"])
195
- s.add_dependency(%q<sass-rails>.freeze, [">= 6"])
196
- s.add_dependency(%q<turbolinks>.freeze, [">= 2"])
197
- s.add_dependency(%q<kaminari>.freeze, [">= 0"])
198
- s.add_dependency(%q<haml-rails>.freeze, [">= 0"])
199
- s.add_dependency(%q<shoulda>.freeze, [">= 3"])
200
- s.add_dependency(%q<rdoc>.freeze, [">= 3"])
201
- s.add_dependency(%q<bundler>.freeze, [">= 1"])
202
- s.add_dependency(%q<jeweler>.freeze, [">= 2"])
203
- s.add_dependency(%q<simplecov>.freeze, [">= 0"])
204
- end
184
+ if s.respond_to? :add_runtime_dependency then
185
+ s.add_runtime_dependency(%q<rails>.freeze, [">= 5.2.2.1"])
186
+ s.add_runtime_dependency(%q<sass-rails>.freeze, [">= 6"])
187
+ s.add_runtime_dependency(%q<turbolinks>.freeze, [">= 2"])
188
+ s.add_runtime_dependency(%q<kaminari>.freeze, [">= 0"])
189
+ s.add_runtime_dependency(%q<haml-rails>.freeze, [">= 0"])
190
+ s.add_development_dependency(%q<shoulda>.freeze, [">= 3"])
191
+ s.add_development_dependency(%q<rdoc>.freeze, [">= 3"])
192
+ s.add_development_dependency(%q<bundler>.freeze, [">= 1"])
193
+ s.add_development_dependency(%q<jeweler>.freeze, [">= 2"])
194
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
205
195
  else
206
196
  s.add_dependency(%q<rails>.freeze, [">= 5.2.2.1"])
207
197
  s.add_dependency(%q<sass-rails>.freeze, [">= 6"])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bhf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta10
4
+ version: 1.0.0.beta11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Pawlik
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-28 00:00:00.000000000 Z
11
+ date: 2020-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -176,6 +176,7 @@ files:
176
176
  - app/assets/images/bhf/small_ajax_loader.gif
177
177
  - app/assets/images/bhf/small_ajax_loader_h.gif
178
178
  - app/assets/images/bhf/wmd-buttons.png
179
+ - app/assets/javascripts/bhf/MooTools-More-1.6.0.js
179
180
  - app/assets/javascripts/bhf/application.js
180
181
  - app/assets/javascripts/bhf/classes/Ajaxify.js
181
182
  - app/assets/javascripts/bhf/classes/ArrayFields.js
@@ -195,8 +196,6 @@ files:
195
196
  - app/assets/javascripts/bhf/locales/Locale.de-DE.js
196
197
  - app/assets/javascripts/bhf/locales/Locale.en-US.js
197
198
  - app/assets/javascripts/bhf/locales/Locale.pt-PT.js
198
- - app/assets/javascripts/bhf/mootools-core-1.5.0-full-compat.js
199
- - app/assets/javascripts/bhf/mootools-more-1.5.0.js
200
199
  - app/assets/javascripts/bhf/mootools_ujs.js
201
200
  - app/assets/javascripts/bhf/trix.js
202
201
  - app/assets/stylesheets/bhf/MooEditable.scss
@@ -225,7 +224,9 @@ files:
225
224
  - app/views/bhf/form/belongs_to/_select.html.haml
226
225
  - app/views/bhf/form/belongs_to/_static.html.haml
227
226
  - app/views/bhf/form/column/_activestorage_attachment.html.haml
227
+ - app/views/bhf/form/column/_activestorage_attachments.html.haml
228
228
  - app/views/bhf/form/column/_array.html.haml
229
+ - app/views/bhf/form/column/_attachment_presenter.html.haml
229
230
  - app/views/bhf/form/column/_boolean.html.haml
230
231
  - app/views/bhf/form/column/_date.html.haml
231
232
  - app/views/bhf/form/column/_hash.html.haml
@@ -330,7 +331,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
330
331
  - !ruby/object:Gem::Version
331
332
  version: 1.3.1
332
333
  requirements: []
333
- rubygems_version: 3.0.6
334
+ rubygems_version: 3.1.2
334
335
  signing_key:
335
336
  specification_version: 4
336
337
  summary: A simple to use Rails-Engine-Gem that offers an admin interface for trusted
@@ -1,2561 +0,0 @@
1
- /*
2
- ---
3
- MooTools: the javascript framework
4
-
5
- web build:
6
- - http://mootools.net/more/335fff3ee615958016e5569b21c1d4cf
7
-
8
- packager build:
9
- - packager build More/Date More/String.Extras More/Sortables More/Assets More/IframeShim More/Locale More/Locale.en-US.Date More/Locale.de-DE.Date
10
-
11
- ...
12
- */
13
-
14
- /*
15
- ---
16
-
17
- script: More.js
18
-
19
- name: More
20
-
21
- description: MooTools More
22
-
23
- license: MIT-style license
24
-
25
- authors:
26
- - Guillermo Rauch
27
- - Thomas Aylott
28
- - Scott Kyle
29
- - Arian Stolwijk
30
- - Tim Wienk
31
- - Christoph Pojer
32
- - Aaron Newton
33
- - Jacob Thornton
34
-
35
- requires:
36
- - Core/MooTools
37
-
38
- provides: [MooTools.More]
39
-
40
- ...
41
- */
42
-
43
- MooTools.More = {
44
- version: '1.5.0',
45
- build: '73db5e24e6e9c5c87b3a27aebef2248053f7db37'
46
- };
47
-
48
-
49
- /*
50
- ---
51
-
52
- script: Object.Extras.js
53
-
54
- name: Object.Extras
55
-
56
- description: Extra Object generics, like getFromPath which allows a path notation to child elements.
57
-
58
- license: MIT-style license
59
-
60
- authors:
61
- - Aaron Newton
62
-
63
- requires:
64
- - Core/Object
65
- - MooTools.More
66
-
67
- provides: [Object.Extras]
68
-
69
- ...
70
- */
71
-
72
- (function(){
73
-
74
- var defined = function(value){
75
- return value != null;
76
- };
77
-
78
- var hasOwnProperty = Object.prototype.hasOwnProperty;
79
-
80
- Object.extend({
81
-
82
- getFromPath: function(source, parts){
83
- if (typeof parts == 'string') parts = parts.split('.');
84
- for (var i = 0, l = parts.length; i < l; i++){
85
- if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
86
- else return null;
87
- }
88
- return source;
89
- },
90
-
91
- cleanValues: function(object, method){
92
- method = method || defined;
93
- for (var key in object) if (!method(object[key])){
94
- delete object[key];
95
- }
96
- return object;
97
- },
98
-
99
- erase: function(object, key){
100
- if (hasOwnProperty.call(object, key)) delete object[key];
101
- return object;
102
- },
103
-
104
- run: function(object){
105
- var args = Array.slice(arguments, 1);
106
- for (var key in object) if (object[key].apply){
107
- object[key].apply(object, args);
108
- }
109
- return object;
110
- }
111
-
112
- });
113
-
114
- })();
115
-
116
-
117
- /*
118
- ---
119
-
120
- script: Locale.js
121
-
122
- name: Locale
123
-
124
- description: Provides methods for localization.
125
-
126
- license: MIT-style license
127
-
128
- authors:
129
- - Aaron Newton
130
- - Arian Stolwijk
131
-
132
- requires:
133
- - Core/Events
134
- - Object.Extras
135
- - MooTools.More
136
-
137
- provides: [Locale, Lang]
138
-
139
- ...
140
- */
141
-
142
- (function(){
143
-
144
- var current = null,
145
- locales = {},
146
- inherits = {};
147
-
148
- var getSet = function(set){
149
- if (instanceOf(set, Locale.Set)) return set;
150
- else return locales[set];
151
- };
152
-
153
- var Locale = this.Locale = {
154
-
155
- define: function(locale, set, key, value){
156
- var name;
157
- if (instanceOf(locale, Locale.Set)){
158
- name = locale.name;
159
- if (name) locales[name] = locale;
160
- } else {
161
- name = locale;
162
- if (!locales[name]) locales[name] = new Locale.Set(name);
163
- locale = locales[name];
164
- }
165
-
166
- if (set) locale.define(set, key, value);
167
-
168
-
169
-
170
- if (!current) current = locale;
171
-
172
- return locale;
173
- },
174
-
175
- use: function(locale){
176
- locale = getSet(locale);
177
-
178
- if (locale){
179
- current = locale;
180
-
181
- this.fireEvent('change', locale);
182
-
183
-
184
- }
185
-
186
- return this;
187
- },
188
-
189
- getCurrent: function(){
190
- return current;
191
- },
192
-
193
- get: function(key, args){
194
- return (current) ? current.get(key, args) : '';
195
- },
196
-
197
- inherit: function(locale, inherits, set){
198
- locale = getSet(locale);
199
-
200
- if (locale) locale.inherit(inherits, set);
201
- return this;
202
- },
203
-
204
- list: function(){
205
- return Object.keys(locales);
206
- }
207
-
208
- };
209
-
210
- Object.append(Locale, new Events);
211
-
212
- Locale.Set = new Class({
213
-
214
- sets: {},
215
-
216
- inherits: {
217
- locales: [],
218
- sets: {}
219
- },
220
-
221
- initialize: function(name){
222
- this.name = name || '';
223
- },
224
-
225
- define: function(set, key, value){
226
- var defineData = this.sets[set];
227
- if (!defineData) defineData = {};
228
-
229
- if (key){
230
- if (typeOf(key) == 'object') defineData = Object.merge(defineData, key);
231
- else defineData[key] = value;
232
- }
233
- this.sets[set] = defineData;
234
-
235
- return this;
236
- },
237
-
238
- get: function(key, args, _base){
239
- var value = Object.getFromPath(this.sets, key);
240
- if (value != null){
241
- var type = typeOf(value);
242
- if (type == 'function') value = value.apply(null, Array.from(args));
243
- else if (type == 'object') value = Object.clone(value);
244
- return value;
245
- }
246
-
247
- // get value of inherited locales
248
- var index = key.indexOf('.'),
249
- set = index < 0 ? key : key.substr(0, index),
250
- names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');
251
- if (!_base) _base = [];
252
-
253
- for (var i = 0, l = names.length; i < l; i++){
254
- if (_base.contains(names[i])) continue;
255
- _base.include(names[i]);
256
-
257
- var locale = locales[names[i]];
258
- if (!locale) continue;
259
-
260
- value = locale.get(key, args, _base);
261
- if (value != null) return value;
262
- }
263
-
264
- return '';
265
- },
266
-
267
- inherit: function(names, set){
268
- names = Array.from(names);
269
-
270
- if (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];
271
-
272
- var l = names.length;
273
- while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);
274
-
275
- return this;
276
- }
277
-
278
- });
279
-
280
-
281
-
282
- })();
283
-
284
-
285
- /*
286
- ---
287
-
288
- name: Locale.en-US.Date
289
-
290
- description: Date messages for US English.
291
-
292
- license: MIT-style license
293
-
294
- authors:
295
- - Aaron Newton
296
-
297
- requires:
298
- - Locale
299
-
300
- provides: [Locale.en-US.Date]
301
-
302
- ...
303
- */
304
-
305
- Locale.define('en-US', 'Date', {
306
-
307
- months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
308
- months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
309
- days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
310
- days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
311
-
312
- // Culture's date order: MM/DD/YYYY
313
- dateOrder: ['month', 'date', 'year'],
314
- shortDate: '%m/%d/%Y',
315
- shortTime: '%I:%M%p',
316
- AM: 'AM',
317
- PM: 'PM',
318
- firstDayOfWeek: 0,
319
-
320
- // Date.Extras
321
- ordinal: function(dayOfMonth){
322
- // 1st, 2nd, 3rd, etc.
323
- return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
324
- },
325
-
326
- lessThanMinuteAgo: 'less than a minute ago',
327
- minuteAgo: 'about a minute ago',
328
- minutesAgo: '{delta} minutes ago',
329
- hourAgo: 'about an hour ago',
330
- hoursAgo: 'about {delta} hours ago',
331
- dayAgo: '1 day ago',
332
- daysAgo: '{delta} days ago',
333
- weekAgo: '1 week ago',
334
- weeksAgo: '{delta} weeks ago',
335
- monthAgo: '1 month ago',
336
- monthsAgo: '{delta} months ago',
337
- yearAgo: '1 year ago',
338
- yearsAgo: '{delta} years ago',
339
-
340
- lessThanMinuteUntil: 'less than a minute from now',
341
- minuteUntil: 'about a minute from now',
342
- minutesUntil: '{delta} minutes from now',
343
- hourUntil: 'about an hour from now',
344
- hoursUntil: 'about {delta} hours from now',
345
- dayUntil: '1 day from now',
346
- daysUntil: '{delta} days from now',
347
- weekUntil: '1 week from now',
348
- weeksUntil: '{delta} weeks from now',
349
- monthUntil: '1 month from now',
350
- monthsUntil: '{delta} months from now',
351
- yearUntil: '1 year from now',
352
- yearsUntil: '{delta} years from now'
353
-
354
- });
355
-
356
-
357
- /*
358
- ---
359
-
360
- script: Date.js
361
-
362
- name: Date
363
-
364
- description: Extends the Date native object to include methods useful in managing dates.
365
-
366
- license: MIT-style license
367
-
368
- authors:
369
- - Aaron Newton
370
- - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
371
- - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
372
- - Scott Kyle - scott [at] appden.com; http://appden.com
373
-
374
- requires:
375
- - Core/Array
376
- - Core/String
377
- - Core/Number
378
- - MooTools.More
379
- - Locale
380
- - Locale.en-US.Date
381
-
382
- provides: [Date]
383
-
384
- ...
385
- */
386
-
387
- (function(){
388
-
389
- var Date = this.Date;
390
-
391
- var DateMethods = Date.Methods = {
392
- ms: 'Milliseconds',
393
- year: 'FullYear',
394
- min: 'Minutes',
395
- mo: 'Month',
396
- sec: 'Seconds',
397
- hr: 'Hours'
398
- };
399
-
400
- ['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
401
- 'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
402
- 'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'].each(function(method){
403
- Date.Methods[method.toLowerCase()] = method;
404
- });
405
-
406
- var pad = function(n, digits, string){
407
- if (digits == 1) return n;
408
- return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;
409
- };
410
-
411
- Date.implement({
412
-
413
- set: function(prop, value){
414
- prop = prop.toLowerCase();
415
- var method = DateMethods[prop] && 'set' + DateMethods[prop];
416
- if (method && this[method]) this[method](value);
417
- return this;
418
- }.overloadSetter(),
419
-
420
- get: function(prop){
421
- prop = prop.toLowerCase();
422
- var method = DateMethods[prop] && 'get' + DateMethods[prop];
423
- if (method && this[method]) return this[method]();
424
- return null;
425
- }.overloadGetter(),
426
-
427
- clone: function(){
428
- return new Date(this.get('time'));
429
- },
430
-
431
- increment: function(interval, times){
432
- interval = interval || 'day';
433
- times = times != null ? times : 1;
434
-
435
- switch (interval){
436
- case 'year':
437
- return this.increment('month', times * 12);
438
- case 'month':
439
- var d = this.get('date');
440
- this.set('date', 1).set('mo', this.get('mo') + times);
441
- return this.set('date', d.min(this.get('lastdayofmonth')));
442
- case 'week':
443
- return this.increment('day', times * 7);
444
- case 'day':
445
- return this.set('date', this.get('date') + times);
446
- }
447
-
448
- if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
449
-
450
- return this.set('time', this.get('time') + times * Date.units[interval]());
451
- },
452
-
453
- decrement: function(interval, times){
454
- return this.increment(interval, -1 * (times != null ? times : 1));
455
- },
456
-
457
- isLeapYear: function(){
458
- return Date.isLeapYear(this.get('year'));
459
- },
460
-
461
- clearTime: function(){
462
- return this.set({hr: 0, min: 0, sec: 0, ms: 0});
463
- },
464
-
465
- diff: function(date, resolution){
466
- if (typeOf(date) == 'string') date = Date.parse(date);
467
-
468
- return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month
469
- },
470
-
471
- getLastDayOfMonth: function(){
472
- return Date.daysInMonth(this.get('mo'), this.get('year'));
473
- },
474
-
475
- getDayOfYear: function(){
476
- return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
477
- - Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
478
- },
479
-
480
- setDay: function(day, firstDayOfWeek){
481
- if (firstDayOfWeek == null){
482
- firstDayOfWeek = Date.getMsg('firstDayOfWeek');
483
- if (firstDayOfWeek === '') firstDayOfWeek = 1;
484
- }
485
-
486
- day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
487
- var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;
488
-
489
- return this.increment('day', day - currentDay);
490
- },
491
-
492
- getWeek: function(firstDayOfWeek){
493
- if (firstDayOfWeek == null){
494
- firstDayOfWeek = Date.getMsg('firstDayOfWeek');
495
- if (firstDayOfWeek === '') firstDayOfWeek = 1;
496
- }
497
-
498
- var date = this,
499
- dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
500
- dividend = 0,
501
- firstDayOfYear;
502
-
503
- if (firstDayOfWeek == 1){
504
- // ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)
505
- var month = date.get('month'),
506
- startOfWeek = date.get('date') - dayOfWeek;
507
-
508
- if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year
509
-
510
- if (month == 0 && startOfWeek < -2){
511
- // Use a date from last year to determine the week
512
- date = new Date(date).decrement('day', dayOfWeek);
513
- dayOfWeek = 0;
514
- }
515
-
516
- firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;
517
- if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1
518
- } else {
519
- // In other cultures the first week of the year is always week 1 and the last week always 53 or 54.
520
- // Days in the same week can have a different weeknumber if the week spreads across two years.
521
- firstDayOfYear = new Date(date.get('year'), 0, 1).get('day');
522
- }
523
-
524
- dividend += date.get('dayofyear');
525
- dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week
526
- dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week
527
-
528
- return (dividend / 7);
529
- },
530
-
531
- getOrdinal: function(day){
532
- return Date.getMsg('ordinal', day || this.get('date'));
533
- },
534
-
535
- getTimezone: function(){
536
- return this.toString()
537
- .replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
538
- .replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
539
- },
540
-
541
- getGMTOffset: function(){
542
- var off = this.get('timezoneOffset');
543
- return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
544
- },
545
-
546
- setAMPM: function(ampm){
547
- ampm = ampm.toUpperCase();
548
- var hr = this.get('hr');
549
- if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
550
- else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
551
- return this;
552
- },
553
-
554
- getAMPM: function(){
555
- return (this.get('hr') < 12) ? 'AM' : 'PM';
556
- },
557
-
558
- parse: function(str){
559
- this.set('time', Date.parse(str));
560
- return this;
561
- },
562
-
563
- isValid: function(date){
564
- if (!date) date = this;
565
- return typeOf(date) == 'date' && !isNaN(date.valueOf());
566
- },
567
-
568
- format: function(format){
569
- if (!this.isValid()) return 'invalid date';
570
-
571
- if (!format) format = '%x %X';
572
- if (typeof format == 'string') format = formats[format.toLowerCase()] || format;
573
- if (typeof format == 'function') return format(this);
574
-
575
- var d = this;
576
- return format.replace(/%([a-z%])/gi,
577
- function($0, $1){
578
- switch ($1){
579
- case 'a': return Date.getMsg('days_abbr')[d.get('day')];
580
- case 'A': return Date.getMsg('days')[d.get('day')];
581
- case 'b': return Date.getMsg('months_abbr')[d.get('month')];
582
- case 'B': return Date.getMsg('months')[d.get('month')];
583
- case 'c': return d.format('%a %b %d %H:%M:%S %Y');
584
- case 'd': return pad(d.get('date'), 2);
585
- case 'e': return pad(d.get('date'), 2, ' ');
586
- case 'H': return pad(d.get('hr'), 2);
587
- case 'I': return pad((d.get('hr') % 12) || 12, 2);
588
- case 'j': return pad(d.get('dayofyear'), 3);
589
- case 'k': return pad(d.get('hr'), 2, ' ');
590
- case 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');
591
- case 'L': return pad(d.get('ms'), 3);
592
- case 'm': return pad((d.get('mo') + 1), 2);
593
- case 'M': return pad(d.get('min'), 2);
594
- case 'o': return d.get('ordinal');
595
- case 'p': return Date.getMsg(d.get('ampm'));
596
- case 's': return Math.round(d / 1000);
597
- case 'S': return pad(d.get('seconds'), 2);
598
- case 'T': return d.format('%H:%M:%S');
599
- case 'U': return pad(d.get('week'), 2);
600
- case 'w': return d.get('day');
601
- case 'x': return d.format(Date.getMsg('shortDate'));
602
- case 'X': return d.format(Date.getMsg('shortTime'));
603
- case 'y': return d.get('year').toString().substr(2);
604
- case 'Y': return d.get('year');
605
- case 'z': return d.get('GMTOffset');
606
- case 'Z': return d.get('Timezone');
607
- }
608
- return $1;
609
- }
610
- );
611
- },
612
-
613
- toISOString: function(){
614
- return this.format('iso8601');
615
- }
616
-
617
- }).alias({
618
- toJSON: 'toISOString',
619
- compare: 'diff',
620
- strftime: 'format'
621
- });
622
-
623
- // The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized
624
- var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
625
- rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
626
-
627
- var formats = {
628
- db: '%Y-%m-%d %H:%M:%S',
629
- compact: '%Y%m%dT%H%M%S',
630
- 'short': '%d %b %H:%M',
631
- 'long': '%B %d, %Y %H:%M',
632
- rfc822: function(date){
633
- return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');
634
- },
635
- rfc2822: function(date){
636
- return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');
637
- },
638
- iso8601: function(date){
639
- return (
640
- date.getUTCFullYear() + '-' +
641
- pad(date.getUTCMonth() + 1, 2) + '-' +
642
- pad(date.getUTCDate(), 2) + 'T' +
643
- pad(date.getUTCHours(), 2) + ':' +
644
- pad(date.getUTCMinutes(), 2) + ':' +
645
- pad(date.getUTCSeconds(), 2) + '.' +
646
- pad(date.getUTCMilliseconds(), 3) + 'Z'
647
- );
648
- }
649
- };
650
-
651
- var parsePatterns = [],
652
- nativeParse = Date.parse;
653
-
654
- var parseWord = function(type, word, num){
655
- var ret = -1,
656
- translated = Date.getMsg(type + 's');
657
- switch (typeOf(word)){
658
- case 'object':
659
- ret = translated[word.get(type)];
660
- break;
661
- case 'number':
662
- ret = translated[word];
663
- if (!ret) throw new Error('Invalid ' + type + ' index: ' + word);
664
- break;
665
- case 'string':
666
- var match = translated.filter(function(name){
667
- return this.test(name);
668
- }, new RegExp('^' + word, 'i'));
669
- if (!match.length) throw new Error('Invalid ' + type + ' string');
670
- if (match.length > 1) throw new Error('Ambiguous ' + type);
671
- ret = match[0];
672
- }
673
-
674
- return (num) ? translated.indexOf(ret) : ret;
675
- };
676
-
677
- var startCentury = 1900,
678
- startYear = 70;
679
-
680
- Date.extend({
681
-
682
- getMsg: function(key, args){
683
- return Locale.get('Date.' + key, args);
684
- },
685
-
686
- units: {
687
- ms: Function.from(1),
688
- second: Function.from(1000),
689
- minute: Function.from(60000),
690
- hour: Function.from(3600000),
691
- day: Function.from(86400000),
692
- week: Function.from(608400000),
693
- month: function(month, year){
694
- var d = new Date;
695
- return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;
696
- },
697
- year: function(year){
698
- year = year || new Date().get('year');
699
- return Date.isLeapYear(year) ? 31622400000 : 31536000000;
700
- }
701
- },
702
-
703
- daysInMonth: function(month, year){
704
- return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
705
- },
706
-
707
- isLeapYear: function(year){
708
- return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
709
- },
710
-
711
- parse: function(from){
712
- var t = typeOf(from);
713
- if (t == 'number') return new Date(from);
714
- if (t != 'string') return from;
715
- from = from.clean();
716
- if (!from.length) return null;
717
-
718
- var parsed;
719
- parsePatterns.some(function(pattern){
720
- var bits = pattern.re.exec(from);
721
- return (bits) ? (parsed = pattern.handler(bits)) : false;
722
- });
723
-
724
- if (!(parsed && parsed.isValid())){
725
- parsed = new Date(nativeParse(from));
726
- if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());
727
- }
728
- return parsed;
729
- },
730
-
731
- parseDay: function(day, num){
732
- return parseWord('day', day, num);
733
- },
734
-
735
- parseMonth: function(month, num){
736
- return parseWord('month', month, num);
737
- },
738
-
739
- parseUTC: function(value){
740
- var localDate = new Date(value);
741
- var utcSeconds = Date.UTC(
742
- localDate.get('year'),
743
- localDate.get('mo'),
744
- localDate.get('date'),
745
- localDate.get('hr'),
746
- localDate.get('min'),
747
- localDate.get('sec'),
748
- localDate.get('ms')
749
- );
750
- return new Date(utcSeconds);
751
- },
752
-
753
- orderIndex: function(unit){
754
- return Date.getMsg('dateOrder').indexOf(unit) + 1;
755
- },
756
-
757
- defineFormat: function(name, format){
758
- formats[name] = format;
759
- return this;
760
- },
761
-
762
-
763
-
764
- defineParser: function(pattern){
765
- parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
766
- return this;
767
- },
768
-
769
- defineParsers: function(){
770
- Array.flatten(arguments).each(Date.defineParser);
771
- return this;
772
- },
773
-
774
- define2DigitYearStart: function(year){
775
- startYear = year % 100;
776
- startCentury = year - startYear;
777
- return this;
778
- }
779
-
780
- }).extend({
781
- defineFormats: Date.defineFormat.overloadSetter()
782
- });
783
-
784
- var regexOf = function(type){
785
- return new RegExp('(?:' + Date.getMsg(type).map(function(name){
786
- return name.substr(0, 3);
787
- }).join('|') + ')[a-z]*');
788
- };
789
-
790
- var replacers = function(key){
791
- switch (key){
792
- case 'T':
793
- return '%H:%M:%S';
794
- case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
795
- return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
796
- case 'X':
797
- return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
798
- }
799
- return null;
800
- };
801
-
802
- var keys = {
803
- d: /[0-2]?[0-9]|3[01]/,
804
- H: /[01]?[0-9]|2[0-3]/,
805
- I: /0?[1-9]|1[0-2]/,
806
- M: /[0-5]?\d/,
807
- s: /\d+/,
808
- o: /[a-z]*/,
809
- p: /[ap]\.?m\.?/,
810
- y: /\d{2}|\d{4}/,
811
- Y: /\d{4}/,
812
- z: /Z|[+-]\d{2}(?::?\d{2})?/
813
- };
814
-
815
- keys.m = keys.I;
816
- keys.S = keys.M;
817
-
818
- var currentLanguage;
819
-
820
- var recompile = function(language){
821
- currentLanguage = language;
822
-
823
- keys.a = keys.A = regexOf('days');
824
- keys.b = keys.B = regexOf('months');
825
-
826
- parsePatterns.each(function(pattern, i){
827
- if (pattern.format) parsePatterns[i] = build(pattern.format);
828
- });
829
- };
830
-
831
- var build = function(format){
832
- if (!currentLanguage) return {format: format};
833
-
834
- var parsed = [];
835
- var re = (format.source || format) // allow format to be regex
836
- .replace(/%([a-z])/gi,
837
- function($0, $1){
838
- return replacers($1) || $0;
839
- }
840
- ).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
841
- .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
842
- .replace(/%([a-z%])/gi,
843
- function($0, $1){
844
- var p = keys[$1];
845
- if (!p) return $1;
846
- parsed.push($1);
847
- return '(' + p.source + ')';
848
- }
849
- ).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words
850
-
851
- return {
852
- format: format,
853
- re: new RegExp('^' + re + '$', 'i'),
854
- handler: function(bits){
855
- bits = bits.slice(1).associate(parsed);
856
- var date = new Date().clearTime(),
857
- year = bits.y || bits.Y;
858
-
859
- if (year != null) handle.call(date, 'y', year); // need to start in the right year
860
- if ('d' in bits) handle.call(date, 'd', 1);
861
- if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);
862
-
863
- for (var key in bits) handle.call(date, key, bits[key]);
864
- return date;
865
- }
866
- };
867
- };
868
-
869
- var handle = function(key, value){
870
- if (!value) return this;
871
-
872
- switch (key){
873
- case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
874
- case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
875
- case 'd': return this.set('date', value);
876
- case 'H': case 'I': return this.set('hr', value);
877
- case 'm': return this.set('mo', value - 1);
878
- case 'M': return this.set('min', value);
879
- case 'p': return this.set('ampm', value.replace(/\./g, ''));
880
- case 'S': return this.set('sec', value);
881
- case 's': return this.set('ms', ('0.' + value) * 1000);
882
- case 'w': return this.set('day', value);
883
- case 'Y': return this.set('year', value);
884
- case 'y':
885
- value = +value;
886
- if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
887
- return this.set('year', value);
888
- case 'z':
889
- if (value == 'Z') value = '+00';
890
- var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
891
- offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
892
- return this.set('time', this - offset * 60000);
893
- }
894
-
895
- return this;
896
- };
897
-
898
- Date.defineParsers(
899
- '%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
900
- '%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
901
- '%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
902
- '%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
903
- '%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
904
- '%Y %b( %d%o( %X)?)?', // Same as above with year coming first
905
- '%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009"
906
- '%T', // %H:%M:%S
907
- '%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05"
908
- );
909
-
910
- Locale.addEvent('change', function(language){
911
- if (Locale.get('Date')) recompile(language);
912
- }).fireEvent('change', Locale.getCurrent());
913
-
914
- })();
915
-
916
-
917
- /*
918
- ---
919
-
920
- script: String.Extras.js
921
-
922
- name: String.Extras
923
-
924
- description: Extends the String native object to include methods useful in managing various kinds of strings (query strings, urls, html, etc).
925
-
926
- license: MIT-style license
927
-
928
- authors:
929
- - Aaron Newton
930
- - Guillermo Rauch
931
- - Christopher Pitt
932
-
933
- requires:
934
- - Core/String
935
- - Core/Array
936
- - MooTools.More
937
-
938
- provides: [String.Extras]
939
-
940
- ...
941
- */
942
-
943
- (function(){
944
-
945
- var special = {
946
- 'a': /[àáâãäåăą]/g,
947
- 'A': /[ÀÁÂÃÄÅĂĄ]/g,
948
- 'c': /[ćčç]/g,
949
- 'C': /[ĆČÇ]/g,
950
- 'd': /[ďđ]/g,
951
- 'D': /[ĎÐ]/g,
952
- 'e': /[èéêëěę]/g,
953
- 'E': /[ÈÉÊËĚĘ]/g,
954
- 'g': /[ğ]/g,
955
- 'G': /[Ğ]/g,
956
- 'i': /[ìíîï]/g,
957
- 'I': /[ÌÍÎÏ]/g,
958
- 'l': /[ĺľł]/g,
959
- 'L': /[ĹĽŁ]/g,
960
- 'n': /[ñňń]/g,
961
- 'N': /[ÑŇŃ]/g,
962
- 'o': /[òóôõöøő]/g,
963
- 'O': /[ÒÓÔÕÖØ]/g,
964
- 'r': /[řŕ]/g,
965
- 'R': /[ŘŔ]/g,
966
- 's': /[ššş]/g,
967
- 'S': /[ŠŞŚ]/g,
968
- 't': /[ťţ]/g,
969
- 'T': /[ŤŢ]/g,
970
- 'u': /[ùúûůüµ]/g,
971
- 'U': /[ÙÚÛŮÜ]/g,
972
- 'y': /[ÿý]/g,
973
- 'Y': /[ŸÝ]/g,
974
- 'z': /[žźż]/g,
975
- 'Z': /[ŽŹŻ]/g,
976
- 'th': /[þ]/g,
977
- 'TH': /[Þ]/g,
978
- 'dh': /[ð]/g,
979
- 'DH': /[Ð]/g,
980
- 'ss': /[ß]/g,
981
- 'oe': /[œ]/g,
982
- 'OE': /[Œ]/g,
983
- 'ae': /[æ]/g,
984
- 'AE': /[Æ]/g
985
- },
986
-
987
- tidy = {
988
- ' ': /[\xa0\u2002\u2003\u2009]/g,
989
- '*': /[\xb7]/g,
990
- '\'': /[\u2018\u2019]/g,
991
- '"': /[\u201c\u201d]/g,
992
- '...': /[\u2026]/g,
993
- '-': /[\u2013]/g,
994
- // '--': /[\u2014]/g,
995
- '&raquo;': /[\uFFFD]/g
996
- },
997
-
998
- conversions = {
999
- ms: 1,
1000
- s: 1000,
1001
- m: 6e4,
1002
- h: 36e5
1003
- },
1004
-
1005
- findUnits = /(\d*.?\d+)([msh]+)/;
1006
-
1007
- var walk = function(string, replacements){
1008
- var result = string, key;
1009
- for (key in replacements) result = result.replace(replacements[key], key);
1010
- return result;
1011
- };
1012
-
1013
- var getRegexForTag = function(tag, contents){
1014
- tag = tag || '';
1015
- var regstr = contents ? "<" + tag + "(?!\\w)[^>]*>([\\s\\S]*?)<\/" + tag + "(?!\\w)>" : "<\/?" + tag + "([^>]+)?>",
1016
- reg = new RegExp(regstr, "gi");
1017
- return reg;
1018
- };
1019
-
1020
- String.implement({
1021
-
1022
- standardize: function(){
1023
- return walk(this, special);
1024
- },
1025
-
1026
- repeat: function(times){
1027
- return new Array(times + 1).join(this);
1028
- },
1029
-
1030
- pad: function(length, str, direction){
1031
- if (this.length >= length) return this;
1032
-
1033
- var pad = (str == null ? ' ' : '' + str)
1034
- .repeat(length - this.length)
1035
- .substr(0, length - this.length);
1036
-
1037
- if (!direction || direction == 'right') return this + pad;
1038
- if (direction == 'left') return pad + this;
1039
-
1040
- return pad.substr(0, (pad.length / 2).floor()) + this + pad.substr(0, (pad.length / 2).ceil());
1041
- },
1042
-
1043
- getTags: function(tag, contents){
1044
- return this.match(getRegexForTag(tag, contents)) || [];
1045
- },
1046
-
1047
- stripTags: function(tag, contents){
1048
- return this.replace(getRegexForTag(tag, contents), '');
1049
- },
1050
-
1051
- tidy: function(){
1052
- return walk(this, tidy);
1053
- },
1054
-
1055
- truncate: function(max, trail, atChar){
1056
- var string = this;
1057
- if (trail == null && arguments.length == 1) trail = '…';
1058
- if (string.length > max){
1059
- string = string.substring(0, max);
1060
- if (atChar){
1061
- var index = string.lastIndexOf(atChar);
1062
- if (index != -1) string = string.substr(0, index);
1063
- }
1064
- if (trail) string += trail;
1065
- }
1066
- return string;
1067
- },
1068
-
1069
- ms: function(){
1070
- // "Borrowed" from https://gist.github.com/1503944
1071
- var units = findUnits.exec(this);
1072
- if (units == null) return Number(this);
1073
- return Number(units[1]) * conversions[units[2]];
1074
- }
1075
-
1076
- });
1077
-
1078
- })();
1079
-
1080
-
1081
- /*
1082
- ---
1083
-
1084
- script: Drag.js
1085
-
1086
- name: Drag
1087
-
1088
- description: The base Drag Class. Can be used to drag and resize Elements using mouse events.
1089
-
1090
- license: MIT-style license
1091
-
1092
- authors:
1093
- - Valerio Proietti
1094
- - Tom Occhinno
1095
- - Jan Kassens
1096
-
1097
- requires:
1098
- - Core/Events
1099
- - Core/Options
1100
- - Core/Element.Event
1101
- - Core/Element.Style
1102
- - Core/Element.Dimensions
1103
- - MooTools.More
1104
-
1105
- provides: [Drag]
1106
- ...
1107
-
1108
- */
1109
-
1110
- var Drag = new Class({
1111
-
1112
- Implements: [Events, Options],
1113
-
1114
- options: {/*
1115
- onBeforeStart: function(thisElement){},
1116
- onStart: function(thisElement, event){},
1117
- onSnap: function(thisElement){},
1118
- onDrag: function(thisElement, event){},
1119
- onCancel: function(thisElement){},
1120
- onComplete: function(thisElement, event){},*/
1121
- snap: 6,
1122
- unit: 'px',
1123
- grid: false,
1124
- style: true,
1125
- limit: false,
1126
- handle: false,
1127
- invert: false,
1128
- preventDefault: false,
1129
- stopPropagation: false,
1130
- modifiers: {x: 'left', y: 'top'}
1131
- },
1132
-
1133
- initialize: function(){
1134
- var params = Array.link(arguments, {
1135
- 'options': Type.isObject,
1136
- 'element': function(obj){
1137
- return obj != null;
1138
- }
1139
- });
1140
-
1141
- this.element = document.id(params.element);
1142
- this.document = this.element.getDocument();
1143
- this.setOptions(params.options || {});
1144
- var htype = typeOf(this.options.handle);
1145
- this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element;
1146
- this.mouse = {'now': {}, 'pos': {}};
1147
- this.value = {'start': {}, 'now': {}};
1148
-
1149
- this.selection = 'selectstart' in document ? 'selectstart' : 'mousedown';
1150
-
1151
-
1152
- if ('ondragstart' in document && !('FileReader' in window) && !Drag.ondragstartFixed){
1153
- document.ondragstart = Function.from(false);
1154
- Drag.ondragstartFixed = true;
1155
- }
1156
-
1157
- this.bound = {
1158
- start: this.start.bind(this),
1159
- check: this.check.bind(this),
1160
- drag: this.drag.bind(this),
1161
- stop: this.stop.bind(this),
1162
- cancel: this.cancel.bind(this),
1163
- eventStop: Function.from(false)
1164
- };
1165
- this.attach();
1166
- },
1167
-
1168
- attach: function(){
1169
- this.handles.addEvent('mousedown', this.bound.start);
1170
- return this;
1171
- },
1172
-
1173
- detach: function(){
1174
- this.handles.removeEvent('mousedown', this.bound.start);
1175
- return this;
1176
- },
1177
-
1178
- start: function(event){
1179
- var options = this.options;
1180
-
1181
- if (event.rightClick) return;
1182
-
1183
- if (options.preventDefault) event.preventDefault();
1184
- if (options.stopPropagation) event.stopPropagation();
1185
- this.mouse.start = event.page;
1186
-
1187
- this.fireEvent('beforeStart', this.element);
1188
-
1189
- var limit = options.limit;
1190
- this.limit = {x: [], y: []};
1191
-
1192
- var z, coordinates;
1193
- for (z in options.modifiers){
1194
- if (!options.modifiers[z]) continue;
1195
-
1196
- var style = this.element.getStyle(options.modifiers[z]);
1197
-
1198
- // Some browsers (IE and Opera) don't always return pixels.
1199
- if (style && !style.match(/px$/)){
1200
- if (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent());
1201
- style = coordinates[options.modifiers[z]];
1202
- }
1203
-
1204
- if (options.style) this.value.now[z] = (style || 0).toInt();
1205
- else this.value.now[z] = this.element[options.modifiers[z]];
1206
-
1207
- if (options.invert) this.value.now[z] *= -1;
1208
-
1209
- this.mouse.pos[z] = event.page[z] - this.value.now[z];
1210
-
1211
- if (limit && limit[z]){
1212
- var i = 2;
1213
- while (i--){
1214
- var limitZI = limit[z][i];
1215
- if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI;
1216
- }
1217
- }
1218
- }
1219
-
1220
- if (typeOf(this.options.grid) == 'number') this.options.grid = {
1221
- x: this.options.grid,
1222
- y: this.options.grid
1223
- };
1224
-
1225
- var events = {
1226
- mousemove: this.bound.check,
1227
- mouseup: this.bound.cancel
1228
- };
1229
- events[this.selection] = this.bound.eventStop;
1230
- this.document.addEvents(events);
1231
- },
1232
-
1233
- check: function(event){
1234
- if (this.options.preventDefault) event.preventDefault();
1235
- var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
1236
- if (distance > this.options.snap){
1237
- this.cancel();
1238
- this.document.addEvents({
1239
- mousemove: this.bound.drag,
1240
- mouseup: this.bound.stop
1241
- });
1242
- this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
1243
- }
1244
- },
1245
-
1246
- drag: function(event){
1247
- var options = this.options;
1248
-
1249
- if (options.preventDefault) event.preventDefault();
1250
- this.mouse.now = event.page;
1251
-
1252
- for (var z in options.modifiers){
1253
- if (!options.modifiers[z]) continue;
1254
- this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];
1255
-
1256
- if (options.invert) this.value.now[z] *= -1;
1257
-
1258
- if (options.limit && this.limit[z]){
1259
- if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){
1260
- this.value.now[z] = this.limit[z][1];
1261
- } else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){
1262
- this.value.now[z] = this.limit[z][0];
1263
- }
1264
- }
1265
-
1266
- if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]);
1267
-
1268
- if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit);
1269
- else this.element[options.modifiers[z]] = this.value.now[z];
1270
- }
1271
-
1272
- this.fireEvent('drag', [this.element, event]);
1273
- },
1274
-
1275
- cancel: function(event){
1276
- this.document.removeEvents({
1277
- mousemove: this.bound.check,
1278
- mouseup: this.bound.cancel
1279
- });
1280
- if (event){
1281
- this.document.removeEvent(this.selection, this.bound.eventStop);
1282
- this.fireEvent('cancel', this.element);
1283
- }
1284
- },
1285
-
1286
- stop: function(event){
1287
- var events = {
1288
- mousemove: this.bound.drag,
1289
- mouseup: this.bound.stop
1290
- };
1291
- events[this.selection] = this.bound.eventStop;
1292
- this.document.removeEvents(events);
1293
- if (event) this.fireEvent('complete', [this.element, event]);
1294
- }
1295
-
1296
- });
1297
-
1298
- Element.implement({
1299
-
1300
- makeResizable: function(options){
1301
- var drag = new Drag(this, Object.merge({
1302
- modifiers: {
1303
- x: 'width',
1304
- y: 'height'
1305
- }
1306
- }, options));
1307
-
1308
- this.store('resizer', drag);
1309
- return drag.addEvent('drag', function(){
1310
- this.fireEvent('resize', drag);
1311
- }.bind(this));
1312
- }
1313
-
1314
- });
1315
-
1316
-
1317
- /*
1318
- ---
1319
-
1320
- script: Drag.Move.js
1321
-
1322
- name: Drag.Move
1323
-
1324
- description: A Drag extension that provides support for the constraining of draggables to containers and droppables.
1325
-
1326
- license: MIT-style license
1327
-
1328
- authors:
1329
- - Valerio Proietti
1330
- - Tom Occhinno
1331
- - Jan Kassens
1332
- - Aaron Newton
1333
- - Scott Kyle
1334
-
1335
- requires:
1336
- - Core/Element.Dimensions
1337
- - Drag
1338
-
1339
- provides: [Drag.Move]
1340
-
1341
- ...
1342
- */
1343
-
1344
- Drag.Move = new Class({
1345
-
1346
- Extends: Drag,
1347
-
1348
- options: {/*
1349
- onEnter: function(thisElement, overed){},
1350
- onLeave: function(thisElement, overed){},
1351
- onDrop: function(thisElement, overed, event){},*/
1352
- droppables: [],
1353
- container: false,
1354
- precalculate: false,
1355
- includeMargins: true,
1356
- checkDroppables: true
1357
- },
1358
-
1359
- initialize: function(element, options){
1360
- this.parent(element, options);
1361
- element = this.element;
1362
-
1363
- this.droppables = $$(this.options.droppables);
1364
- this.setContainer(this.options.container);
1365
-
1366
- if (this.options.style){
1367
- if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){
1368
- var parent = element.getOffsetParent(),
1369
- styles = element.getStyles('left', 'top');
1370
- if (parent && (styles.left == 'auto' || styles.top == 'auto')){
1371
- element.setPosition(element.getPosition(parent));
1372
- }
1373
- }
1374
-
1375
- if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute');
1376
- }
1377
-
1378
- this.addEvent('start', this.checkDroppables, true);
1379
- this.overed = null;
1380
- },
1381
-
1382
- setContainer: function(container) {
1383
- this.container = document.id(container);
1384
- if (this.container && typeOf(this.container) != 'element'){
1385
- this.container = document.id(this.container.getDocument().body);
1386
- }
1387
- },
1388
-
1389
- start: function(event){
1390
- if (this.container) this.options.limit = this.calculateLimit();
1391
-
1392
- if (this.options.precalculate){
1393
- this.positions = this.droppables.map(function(el){
1394
- return el.getCoordinates();
1395
- });
1396
- }
1397
-
1398
- this.parent(event);
1399
- },
1400
-
1401
- calculateLimit: function(){
1402
- var element = this.element,
1403
- container = this.container,
1404
-
1405
- offsetParent = document.id(element.getOffsetParent()) || document.body,
1406
- containerCoordinates = container.getCoordinates(offsetParent),
1407
- elementMargin = {},
1408
- elementBorder = {},
1409
- containerMargin = {},
1410
- containerBorder = {},
1411
- offsetParentPadding = {};
1412
-
1413
- ['top', 'right', 'bottom', 'left'].each(function(pad){
1414
- elementMargin[pad] = element.getStyle('margin-' + pad).toInt();
1415
- elementBorder[pad] = element.getStyle('border-' + pad).toInt();
1416
- containerMargin[pad] = container.getStyle('margin-' + pad).toInt();
1417
- containerBorder[pad] = container.getStyle('border-' + pad).toInt();
1418
- offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt();
1419
- }, this);
1420
-
1421
- var width = element.offsetWidth + elementMargin.left + elementMargin.right,
1422
- height = element.offsetHeight + elementMargin.top + elementMargin.bottom,
1423
- left = 0,
1424
- top = 0,
1425
- right = containerCoordinates.right - containerBorder.right - width,
1426
- bottom = containerCoordinates.bottom - containerBorder.bottom - height;
1427
-
1428
- if (this.options.includeMargins){
1429
- left += elementMargin.left;
1430
- top += elementMargin.top;
1431
- } else {
1432
- right += elementMargin.right;
1433
- bottom += elementMargin.bottom;
1434
- }
1435
-
1436
- if (element.getStyle('position') == 'relative'){
1437
- var coords = element.getCoordinates(offsetParent);
1438
- coords.left -= element.getStyle('left').toInt();
1439
- coords.top -= element.getStyle('top').toInt();
1440
-
1441
- left -= coords.left;
1442
- top -= coords.top;
1443
- if (container.getStyle('position') != 'relative'){
1444
- left += containerBorder.left;
1445
- top += containerBorder.top;
1446
- }
1447
- right += elementMargin.left - coords.left;
1448
- bottom += elementMargin.top - coords.top;
1449
-
1450
- if (container != offsetParent){
1451
- left += containerMargin.left + offsetParentPadding.left;
1452
- if (!offsetParentPadding.left && left < 0) left = 0;
1453
- top += offsetParent == document.body ? 0 : containerMargin.top + offsetParentPadding.top;
1454
- if (!offsetParentPadding.top && top < 0) top = 0;
1455
- }
1456
- } else {
1457
- left -= elementMargin.left;
1458
- top -= elementMargin.top;
1459
- if (container != offsetParent){
1460
- left += containerCoordinates.left + containerBorder.left;
1461
- top += containerCoordinates.top + containerBorder.top;
1462
- }
1463
- }
1464
-
1465
- return {
1466
- x: [left, right],
1467
- y: [top, bottom]
1468
- };
1469
- },
1470
-
1471
- getDroppableCoordinates: function(element){
1472
- var position = element.getCoordinates();
1473
- if (element.getStyle('position') == 'fixed'){
1474
- var scroll = window.getScroll();
1475
- position.left += scroll.x;
1476
- position.right += scroll.x;
1477
- position.top += scroll.y;
1478
- position.bottom += scroll.y;
1479
- }
1480
- return position;
1481
- },
1482
-
1483
- checkDroppables: function(){
1484
- var overed = this.droppables.filter(function(el, i){
1485
- el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el);
1486
- var now = this.mouse.now;
1487
- return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);
1488
- }, this).getLast();
1489
-
1490
- if (this.overed != overed){
1491
- if (this.overed) this.fireEvent('leave', [this.element, this.overed]);
1492
- if (overed) this.fireEvent('enter', [this.element, overed]);
1493
- this.overed = overed;
1494
- }
1495
- },
1496
-
1497
- drag: function(event){
1498
- this.parent(event);
1499
- if (this.options.checkDroppables && this.droppables.length) this.checkDroppables();
1500
- },
1501
-
1502
- stop: function(event){
1503
- this.checkDroppables();
1504
- this.fireEvent('drop', [this.element, this.overed, event]);
1505
- this.overed = null;
1506
- return this.parent(event);
1507
- }
1508
-
1509
- });
1510
-
1511
- Element.implement({
1512
-
1513
- makeDraggable: function(options){
1514
- var drag = new Drag.Move(this, options);
1515
- this.store('dragger', drag);
1516
- return drag;
1517
- }
1518
-
1519
- });
1520
-
1521
-
1522
- /*
1523
- ---
1524
-
1525
- script: Sortables.js
1526
-
1527
- name: Sortables
1528
-
1529
- description: Class for creating a drag and drop sorting interface for lists of items.
1530
-
1531
- license: MIT-style license
1532
-
1533
- authors:
1534
- - Tom Occhino
1535
-
1536
- requires:
1537
- - Core/Fx.Morph
1538
- - Drag.Move
1539
-
1540
- provides: [Sortables]
1541
-
1542
- ...
1543
- */
1544
-
1545
- var Sortables = new Class({
1546
-
1547
- Implements: [Events, Options],
1548
-
1549
- options: {/*
1550
- onSort: function(element, clone){},
1551
- onStart: function(element, clone){},
1552
- onComplete: function(element){},*/
1553
- opacity: 1,
1554
- clone: false,
1555
- revert: false,
1556
- handle: false,
1557
- dragOptions: {},
1558
- unDraggableTags: ['button', 'input', 'a', 'textarea', 'select', 'option']
1559
- },
1560
-
1561
- initialize: function(lists, options){
1562
- this.setOptions(options);
1563
-
1564
- this.elements = [];
1565
- this.lists = [];
1566
- this.idle = true;
1567
-
1568
- this.addLists($$(document.id(lists) || lists));
1569
-
1570
- if (!this.options.clone) this.options.revert = false;
1571
- if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({
1572
- duration: 250,
1573
- link: 'cancel'
1574
- }, this.options.revert));
1575
- },
1576
-
1577
- attach: function(){
1578
- this.addLists(this.lists);
1579
- return this;
1580
- },
1581
-
1582
- detach: function(){
1583
- this.lists = this.removeLists(this.lists);
1584
- return this;
1585
- },
1586
-
1587
- addItems: function(){
1588
- Array.flatten(arguments).each(function(element){
1589
- this.elements.push(element);
1590
- var start = element.retrieve('sortables:start', function(event){
1591
- this.start.call(this, event, element);
1592
- }.bind(this));
1593
- (this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start);
1594
- }, this);
1595
- return this;
1596
- },
1597
-
1598
- addLists: function(){
1599
- Array.flatten(arguments).each(function(list){
1600
- this.lists.include(list);
1601
- this.addItems(list.getChildren());
1602
- }, this);
1603
- return this;
1604
- },
1605
-
1606
- removeItems: function(){
1607
- return $$(Array.flatten(arguments).map(function(element){
1608
- this.elements.erase(element);
1609
- var start = element.retrieve('sortables:start');
1610
- (this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start);
1611
-
1612
- return element;
1613
- }, this));
1614
- },
1615
-
1616
- removeLists: function(){
1617
- return $$(Array.flatten(arguments).map(function(list){
1618
- this.lists.erase(list);
1619
- this.removeItems(list.getChildren());
1620
-
1621
- return list;
1622
- }, this));
1623
- },
1624
-
1625
- getDroppableCoordinates: function (element){
1626
- var offsetParent = element.getOffsetParent();
1627
- var position = element.getPosition(offsetParent);
1628
- var scroll = {
1629
- w: window.getScroll(),
1630
- offsetParent: offsetParent.getScroll()
1631
- };
1632
- position.x += scroll.offsetParent.x;
1633
- position.y += scroll.offsetParent.y;
1634
-
1635
- if (offsetParent.getStyle('position') == 'fixed'){
1636
- position.x -= scroll.w.x;
1637
- position.y -= scroll.w.y;
1638
- }
1639
-
1640
- return position;
1641
- },
1642
-
1643
- getClone: function(event, element){
1644
- if (!this.options.clone) return new Element(element.tagName).inject(document.body);
1645
- if (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list);
1646
- var clone = element.clone(true).setStyles({
1647
- margin: 0,
1648
- position: 'absolute',
1649
- visibility: 'hidden',
1650
- width: element.getStyle('width')
1651
- }).addEvent('mousedown', function(event){
1652
- element.fireEvent('mousedown', event);
1653
- });
1654
- //prevent the duplicated radio inputs from unchecking the real one
1655
- if (clone.get('html').test('radio')){
1656
- clone.getElements('input[type=radio]').each(function(input, i){
1657
- input.set('name', 'clone_' + i);
1658
- if (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true);
1659
- });
1660
- }
1661
-
1662
- return clone.inject(this.list).setPosition(this.getDroppableCoordinates(this.element));
1663
- },
1664
-
1665
- getDroppables: function(){
1666
- var droppables = this.list.getChildren().erase(this.clone).erase(this.element);
1667
- if (!this.options.constrain) droppables.append(this.lists).erase(this.list);
1668
- return droppables;
1669
- },
1670
-
1671
- insert: function(dragging, element){
1672
- var where = 'inside';
1673
- if (this.lists.contains(element)){
1674
- this.list = element;
1675
- this.drag.droppables = this.getDroppables();
1676
- } else {
1677
- where = this.element.getAllPrevious().contains(element) ? 'before' : 'after';
1678
- }
1679
- this.element.inject(element, where);
1680
- this.fireEvent('sort', [this.element, this.clone]);
1681
- },
1682
-
1683
- start: function(event, element){
1684
- if (
1685
- !this.idle ||
1686
- event.rightClick ||
1687
- (!this.options.handle && this.options.unDraggableTags.contains(event.target.get('tag')))
1688
- ) return;
1689
-
1690
- this.idle = false;
1691
- this.element = element;
1692
- this.opacity = element.getStyle('opacity');
1693
- this.list = element.getParent();
1694
- this.clone = this.getClone(event, element);
1695
-
1696
- this.drag = new Drag.Move(this.clone, Object.merge({
1697
-
1698
- droppables: this.getDroppables()
1699
- }, this.options.dragOptions)).addEvents({
1700
- onSnap: function(){
1701
- event.stop();
1702
- this.clone.setStyle('visibility', 'visible');
1703
- this.element.setStyle('opacity', this.options.opacity || 0);
1704
- this.fireEvent('start', [this.element, this.clone]);
1705
- }.bind(this),
1706
- onEnter: this.insert.bind(this),
1707
- onCancel: this.end.bind(this),
1708
- onComplete: this.end.bind(this)
1709
- });
1710
-
1711
- this.clone.inject(this.element, 'before');
1712
- this.drag.start(event);
1713
- },
1714
-
1715
- end: function(){
1716
- this.drag.detach();
1717
- this.element.setStyle('opacity', this.opacity);
1718
- var self = this;
1719
- if (this.effect){
1720
- var dim = this.element.getStyles('width', 'height'),
1721
- clone = this.clone,
1722
- pos = clone.computePosition(this.getDroppableCoordinates(clone));
1723
-
1724
- var destroy = function(){
1725
- this.removeEvent('cancel', destroy);
1726
- clone.destroy();
1727
- self.reset();
1728
- };
1729
-
1730
- this.effect.element = clone;
1731
- this.effect.start({
1732
- top: pos.top,
1733
- left: pos.left,
1734
- width: dim.width,
1735
- height: dim.height,
1736
- opacity: 0.25
1737
- }).addEvent('cancel', destroy).chain(destroy);
1738
- } else {
1739
- this.clone.destroy();
1740
- self.reset();
1741
- }
1742
-
1743
- },
1744
-
1745
- reset: function(){
1746
- this.idle = true;
1747
- this.fireEvent('complete', this.element);
1748
- },
1749
-
1750
- serialize: function(){
1751
- var params = Array.link(arguments, {
1752
- modifier: Type.isFunction,
1753
- index: function(obj){
1754
- return obj != null;
1755
- }
1756
- });
1757
- var serial = this.lists.map(function(list){
1758
- return list.getChildren().map(params.modifier || function(element){
1759
- return element.get('id');
1760
- }, this);
1761
- }, this);
1762
-
1763
- var index = params.index;
1764
- if (this.lists.length == 1) index = 0;
1765
- return (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial;
1766
- }
1767
-
1768
- });
1769
-
1770
-
1771
- /*
1772
- ---
1773
-
1774
- script: Assets.js
1775
-
1776
- name: Assets
1777
-
1778
- description: Provides methods to dynamically load JavaScript, CSS, and Image files into the document.
1779
-
1780
- license: MIT-style license
1781
-
1782
- authors:
1783
- - Valerio Proietti
1784
-
1785
- requires:
1786
- - Core/Element.Event
1787
- - MooTools.More
1788
-
1789
- provides: [Assets]
1790
-
1791
- ...
1792
- */
1793
-
1794
- var Asset = {
1795
-
1796
- javascript: function(source, properties){
1797
- if (!properties) properties = {};
1798
-
1799
- var script = new Element('script', {src: source, type: 'text/javascript'}),
1800
- doc = properties.document || document,
1801
- load = properties.onload || properties.onLoad;
1802
-
1803
- delete properties.onload;
1804
- delete properties.onLoad;
1805
- delete properties.document;
1806
-
1807
- if (load){
1808
- if (!script.addEventListener){
1809
- script.addEvent('readystatechange', function(){
1810
- if (['loaded', 'complete'].contains(this.readyState)) load.call(this);
1811
- });
1812
- } else {
1813
- script.addEvent('load', load);
1814
- }
1815
- }
1816
-
1817
- return script.set(properties).inject(doc.head);
1818
- },
1819
-
1820
- css: function(source, properties){
1821
- if (!properties) properties = {};
1822
-
1823
- var link = new Element('link', {
1824
- rel: 'stylesheet',
1825
- media: 'screen',
1826
- type: 'text/css',
1827
- href: source
1828
- });
1829
-
1830
- var load = properties.onload || properties.onLoad,
1831
- doc = properties.document || document;
1832
-
1833
- delete properties.onload;
1834
- delete properties.onLoad;
1835
- delete properties.document;
1836
-
1837
- if (load) link.addEvent('load', load);
1838
- return link.set(properties).inject(doc.head);
1839
- },
1840
-
1841
- image: function(source, properties){
1842
- if (!properties) properties = {};
1843
-
1844
- var image = new Image(),
1845
- element = document.id(image) || new Element('img');
1846
-
1847
- ['load', 'abort', 'error'].each(function(name){
1848
- var type = 'on' + name,
1849
- cap = 'on' + name.capitalize(),
1850
- event = properties[type] || properties[cap] || function(){};
1851
-
1852
- delete properties[cap];
1853
- delete properties[type];
1854
-
1855
- image[type] = function(){
1856
- if (!image) return;
1857
- if (!element.parentNode){
1858
- element.width = image.width;
1859
- element.height = image.height;
1860
- }
1861
- image = image.onload = image.onabort = image.onerror = null;
1862
- event.delay(1, element, element);
1863
- element.fireEvent(name, element, 1);
1864
- };
1865
- });
1866
-
1867
- image.src = element.src = source;
1868
- if (image && image.complete) image.onload.delay(1);
1869
- return element.set(properties);
1870
- },
1871
-
1872
- images: function(sources, options){
1873
- sources = Array.from(sources);
1874
-
1875
- var fn = function(){},
1876
- counter = 0;
1877
-
1878
- options = Object.merge({
1879
- onComplete: fn,
1880
- onProgress: fn,
1881
- onError: fn,
1882
- properties: {}
1883
- }, options);
1884
-
1885
- return new Elements(sources.map(function(source, index){
1886
- return Asset.image(source, Object.append(options.properties, {
1887
- onload: function(){
1888
- counter++;
1889
- options.onProgress.call(this, counter, index, source);
1890
- if (counter == sources.length) options.onComplete();
1891
- },
1892
- onerror: function(){
1893
- counter++;
1894
- options.onError.call(this, counter, index, source);
1895
- if (counter == sources.length) options.onComplete();
1896
- }
1897
- }));
1898
- }));
1899
- }
1900
-
1901
- };
1902
-
1903
-
1904
- /*
1905
- ---
1906
-
1907
- script: Element.Measure.js
1908
-
1909
- name: Element.Measure
1910
-
1911
- description: Extends the Element native object to include methods useful in measuring dimensions.
1912
-
1913
- credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz"
1914
-
1915
- license: MIT-style license
1916
-
1917
- authors:
1918
- - Aaron Newton
1919
-
1920
- requires:
1921
- - Core/Element.Style
1922
- - Core/Element.Dimensions
1923
- - MooTools.More
1924
-
1925
- provides: [Element.Measure]
1926
-
1927
- ...
1928
- */
1929
-
1930
- (function(){
1931
-
1932
- var getStylesList = function(styles, planes){
1933
- var list = [];
1934
- Object.each(planes, function(directions){
1935
- Object.each(directions, function(edge){
1936
- styles.each(function(style){
1937
- list.push(style + '-' + edge + (style == 'border' ? '-width' : ''));
1938
- });
1939
- });
1940
- });
1941
- return list;
1942
- };
1943
-
1944
- var calculateEdgeSize = function(edge, styles){
1945
- var total = 0;
1946
- Object.each(styles, function(value, style){
1947
- if (style.test(edge)) total = total + value.toInt();
1948
- });
1949
- return total;
1950
- };
1951
-
1952
- var isVisible = function(el){
1953
- return !!(!el || el.offsetHeight || el.offsetWidth);
1954
- };
1955
-
1956
-
1957
- Element.implement({
1958
-
1959
- measure: function(fn){
1960
- if (isVisible(this)) return fn.call(this);
1961
- var parent = this.getParent(),
1962
- toMeasure = [];
1963
- while (!isVisible(parent) && parent != document.body){
1964
- toMeasure.push(parent.expose());
1965
- parent = parent.getParent();
1966
- }
1967
- var restore = this.expose(),
1968
- result = fn.call(this);
1969
- restore();
1970
- toMeasure.each(function(restore){
1971
- restore();
1972
- });
1973
- return result;
1974
- },
1975
-
1976
- expose: function(){
1977
- if (this.getStyle('display') != 'none') return function(){};
1978
- var before = this.style.cssText;
1979
- this.setStyles({
1980
- display: 'block',
1981
- position: 'absolute',
1982
- visibility: 'hidden'
1983
- });
1984
- return function(){
1985
- this.style.cssText = before;
1986
- }.bind(this);
1987
- },
1988
-
1989
- getDimensions: function(options){
1990
- options = Object.merge({computeSize: false}, options);
1991
- var dim = {x: 0, y: 0};
1992
-
1993
- var getSize = function(el, options){
1994
- return (options.computeSize) ? el.getComputedSize(options) : el.getSize();
1995
- };
1996
-
1997
- var parent = this.getParent('body');
1998
-
1999
- if (parent && this.getStyle('display') == 'none'){
2000
- dim = this.measure(function(){
2001
- return getSize(this, options);
2002
- });
2003
- } else if (parent){
2004
- try { //safari sometimes crashes here, so catch it
2005
- dim = getSize(this, options);
2006
- }catch(e){}
2007
- }
2008
-
2009
- return Object.append(dim, (dim.x || dim.x === 0) ? {
2010
- width: dim.x,
2011
- height: dim.y
2012
- } : {
2013
- x: dim.width,
2014
- y: dim.height
2015
- }
2016
- );
2017
- },
2018
-
2019
- getComputedSize: function(options){
2020
-
2021
-
2022
- options = Object.merge({
2023
- styles: ['padding','border'],
2024
- planes: {
2025
- height: ['top','bottom'],
2026
- width: ['left','right']
2027
- },
2028
- mode: 'both'
2029
- }, options);
2030
-
2031
- var styles = {},
2032
- size = {width: 0, height: 0},
2033
- dimensions;
2034
-
2035
- if (options.mode == 'vertical'){
2036
- delete size.width;
2037
- delete options.planes.width;
2038
- } else if (options.mode == 'horizontal'){
2039
- delete size.height;
2040
- delete options.planes.height;
2041
- }
2042
-
2043
- getStylesList(options.styles, options.planes).each(function(style){
2044
- styles[style] = this.getStyle(style).toInt();
2045
- }, this);
2046
-
2047
- Object.each(options.planes, function(edges, plane){
2048
-
2049
- var capitalized = plane.capitalize(),
2050
- style = this.getStyle(plane);
2051
-
2052
- if (style == 'auto' && !dimensions) dimensions = this.getDimensions();
2053
-
2054
- style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt();
2055
- size['total' + capitalized] = style;
2056
-
2057
- edges.each(function(edge){
2058
- var edgesize = calculateEdgeSize(edge, styles);
2059
- size['computed' + edge.capitalize()] = edgesize;
2060
- size['total' + capitalized] += edgesize;
2061
- });
2062
-
2063
- }, this);
2064
-
2065
- return Object.append(size, styles);
2066
- }
2067
-
2068
- });
2069
-
2070
- })();
2071
-
2072
-
2073
- /*
2074
- ---
2075
-
2076
- script: Element.Position.js
2077
-
2078
- name: Element.Position
2079
-
2080
- description: Extends the Element native object to include methods useful positioning elements relative to others.
2081
-
2082
- license: MIT-style license
2083
-
2084
- authors:
2085
- - Aaron Newton
2086
- - Jacob Thornton
2087
-
2088
- requires:
2089
- - Core/Options
2090
- - Core/Element.Dimensions
2091
- - Element.Measure
2092
-
2093
- provides: [Element.Position]
2094
-
2095
- ...
2096
- */
2097
-
2098
- (function(original){
2099
-
2100
- var local = Element.Position = {
2101
-
2102
- options: {/*
2103
- edge: false,
2104
- returnPos: false,
2105
- minimum: {x: 0, y: 0},
2106
- maximum: {x: 0, y: 0},
2107
- relFixedPosition: false,
2108
- ignoreMargins: false,
2109
- ignoreScroll: false,
2110
- allowNegative: false,*/
2111
- relativeTo: document.body,
2112
- position: {
2113
- x: 'center', //left, center, right
2114
- y: 'center' //top, center, bottom
2115
- },
2116
- offset: {x: 0, y: 0}
2117
- },
2118
-
2119
- getOptions: function(element, options){
2120
- options = Object.merge({}, local.options, options);
2121
- local.setPositionOption(options);
2122
- local.setEdgeOption(options);
2123
- local.setOffsetOption(element, options);
2124
- local.setDimensionsOption(element, options);
2125
- return options;
2126
- },
2127
-
2128
- setPositionOption: function(options){
2129
- options.position = local.getCoordinateFromValue(options.position);
2130
- },
2131
-
2132
- setEdgeOption: function(options){
2133
- var edgeOption = local.getCoordinateFromValue(options.edge);
2134
- options.edge = edgeOption ? edgeOption :
2135
- (options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} :
2136
- {x: 'left', y: 'top'};
2137
- },
2138
-
2139
- setOffsetOption: function(element, options){
2140
- var parentOffset = {x: 0, y: 0};
2141
- var parentScroll = {x: 0, y: 0};
2142
- var offsetParent = element.measure(function(){
2143
- return document.id(this.getOffsetParent());
2144
- });
2145
-
2146
- if (!offsetParent || offsetParent == element.getDocument().body) return;
2147
-
2148
- parentScroll = offsetParent.getScroll();
2149
- parentOffset = offsetParent.measure(function(){
2150
- var position = this.getPosition();
2151
- if (this.getStyle('position') == 'fixed'){
2152
- var scroll = window.getScroll();
2153
- position.x += scroll.x;
2154
- position.y += scroll.y;
2155
- }
2156
- return position;
2157
- });
2158
-
2159
- options.offset = {
2160
- parentPositioned: offsetParent != document.id(options.relativeTo),
2161
- x: options.offset.x - parentOffset.x + parentScroll.x,
2162
- y: options.offset.y - parentOffset.y + parentScroll.y
2163
- };
2164
- },
2165
-
2166
- setDimensionsOption: function(element, options){
2167
- options.dimensions = element.getDimensions({
2168
- computeSize: true,
2169
- styles: ['padding', 'border', 'margin']
2170
- });
2171
- },
2172
-
2173
- getPosition: function(element, options){
2174
- var position = {};
2175
- options = local.getOptions(element, options);
2176
- var relativeTo = document.id(options.relativeTo) || document.body;
2177
-
2178
- local.setPositionCoordinates(options, position, relativeTo);
2179
- if (options.edge) local.toEdge(position, options);
2180
-
2181
- var offset = options.offset;
2182
- position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt();
2183
- position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt();
2184
-
2185
- local.toMinMax(position, options);
2186
-
2187
- if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position);
2188
- if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position);
2189
- if (options.ignoreMargins) local.toIgnoreMargins(position, options);
2190
-
2191
- position.left = Math.ceil(position.left);
2192
- position.top = Math.ceil(position.top);
2193
- delete position.x;
2194
- delete position.y;
2195
-
2196
- return position;
2197
- },
2198
-
2199
- setPositionCoordinates: function(options, position, relativeTo){
2200
- var offsetY = options.offset.y,
2201
- offsetX = options.offset.x,
2202
- calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(),
2203
- top = calc.y,
2204
- left = calc.x,
2205
- winSize = window.getSize();
2206
-
2207
- switch(options.position.x){
2208
- case 'left': position.x = left + offsetX; break;
2209
- case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break;
2210
- default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break;
2211
- }
2212
-
2213
- switch(options.position.y){
2214
- case 'top': position.y = top + offsetY; break;
2215
- case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break;
2216
- default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break;
2217
- }
2218
- },
2219
-
2220
- toMinMax: function(position, options){
2221
- var xy = {left: 'x', top: 'y'}, value;
2222
- ['minimum', 'maximum'].each(function(minmax){
2223
- ['left', 'top'].each(function(lr){
2224
- value = options[minmax] ? options[minmax][xy[lr]] : null;
2225
- if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value;
2226
- });
2227
- });
2228
- },
2229
-
2230
- toRelFixedPosition: function(relativeTo, position){
2231
- var winScroll = window.getScroll();
2232
- position.top += winScroll.y;
2233
- position.left += winScroll.x;
2234
- },
2235
-
2236
- toIgnoreScroll: function(relativeTo, position){
2237
- var relScroll = relativeTo.getScroll();
2238
- position.top -= relScroll.y;
2239
- position.left -= relScroll.x;
2240
- },
2241
-
2242
- toIgnoreMargins: function(position, options){
2243
- position.left += options.edge.x == 'right'
2244
- ? options.dimensions['margin-right']
2245
- : (options.edge.x != 'center'
2246
- ? -options.dimensions['margin-left']
2247
- : -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2));
2248
-
2249
- position.top += options.edge.y == 'bottom'
2250
- ? options.dimensions['margin-bottom']
2251
- : (options.edge.y != 'center'
2252
- ? -options.dimensions['margin-top']
2253
- : -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2));
2254
- },
2255
-
2256
- toEdge: function(position, options){
2257
- var edgeOffset = {},
2258
- dimensions = options.dimensions,
2259
- edge = options.edge;
2260
-
2261
- switch(edge.x){
2262
- case 'left': edgeOffset.x = 0; break;
2263
- case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break;
2264
- // center
2265
- default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break;
2266
- }
2267
-
2268
- switch(edge.y){
2269
- case 'top': edgeOffset.y = 0; break;
2270
- case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break;
2271
- // center
2272
- default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break;
2273
- }
2274
-
2275
- position.x += edgeOffset.x;
2276
- position.y += edgeOffset.y;
2277
- },
2278
-
2279
- getCoordinateFromValue: function(option){
2280
- if (typeOf(option) != 'string') return option;
2281
- option = option.toLowerCase();
2282
-
2283
- return {
2284
- x: option.test('left') ? 'left'
2285
- : (option.test('right') ? 'right' : 'center'),
2286
- y: option.test(/upper|top/) ? 'top'
2287
- : (option.test('bottom') ? 'bottom' : 'center')
2288
- };
2289
- }
2290
-
2291
- };
2292
-
2293
- Element.implement({
2294
-
2295
- position: function(options){
2296
- if (options && (options.x != null || options.y != null)){
2297
- return (original ? original.apply(this, arguments) : this);
2298
- }
2299
- var position = this.setStyle('position', 'absolute').calculatePosition(options);
2300
- return (options && options.returnPos) ? position : this.setStyles(position);
2301
- },
2302
-
2303
- calculatePosition: function(options){
2304
- return local.getPosition(this, options);
2305
- }
2306
-
2307
- });
2308
-
2309
- })(Element.prototype.position);
2310
-
2311
-
2312
- /*
2313
- ---
2314
-
2315
- script: Class.Occlude.js
2316
-
2317
- name: Class.Occlude
2318
-
2319
- description: Prevents a class from being applied to a DOM element twice.
2320
-
2321
- license: MIT-style license.
2322
-
2323
- authors:
2324
- - Aaron Newton
2325
-
2326
- requires:
2327
- - Core/Class
2328
- - Core/Element
2329
- - MooTools.More
2330
-
2331
- provides: [Class.Occlude]
2332
-
2333
- ...
2334
- */
2335
-
2336
- Class.Occlude = new Class({
2337
-
2338
- occlude: function(property, element){
2339
- element = document.id(element || this.element);
2340
- var instance = element.retrieve(property || this.property);
2341
- if (instance && !this.occluded)
2342
- return (this.occluded = instance);
2343
-
2344
- this.occluded = false;
2345
- element.store(property || this.property, this);
2346
- return this.occluded;
2347
- }
2348
-
2349
- });
2350
-
2351
-
2352
- /*
2353
- ---
2354
-
2355
- script: IframeShim.js
2356
-
2357
- name: IframeShim
2358
-
2359
- description: Defines IframeShim, a class for obscuring select lists and flash objects in IE.
2360
-
2361
- license: MIT-style license
2362
-
2363
- authors:
2364
- - Aaron Newton
2365
-
2366
- requires:
2367
- - Core/Element.Event
2368
- - Core/Element.Style
2369
- - Core/Options
2370
- - Core/Events
2371
- - Element.Position
2372
- - Class.Occlude
2373
-
2374
- provides: [IframeShim]
2375
-
2376
- ...
2377
- */
2378
-
2379
- (function(){
2380
-
2381
- var browsers = false;
2382
-
2383
-
2384
- this.IframeShim = new Class({
2385
-
2386
- Implements: [Options, Events, Class.Occlude],
2387
-
2388
- options: {
2389
- className: 'iframeShim',
2390
- src: 'javascript:false;document.write("");',
2391
- display: false,
2392
- zIndex: null,
2393
- margin: 0,
2394
- offset: {x: 0, y: 0},
2395
- browsers: browsers
2396
- },
2397
-
2398
- property: 'IframeShim',
2399
-
2400
- initialize: function(element, options){
2401
- this.element = document.id(element);
2402
- if (this.occlude()) return this.occluded;
2403
- this.setOptions(options);
2404
- this.makeShim();
2405
- return this;
2406
- },
2407
-
2408
- makeShim: function(){
2409
- if (this.options.browsers){
2410
- var zIndex = this.element.getStyle('zIndex').toInt();
2411
-
2412
- if (!zIndex){
2413
- zIndex = 1;
2414
- var pos = this.element.getStyle('position');
2415
- if (pos == 'static' || !pos) this.element.setStyle('position', 'relative');
2416
- this.element.setStyle('zIndex', zIndex);
2417
- }
2418
- zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1;
2419
- if (zIndex < 0) zIndex = 1;
2420
- this.shim = new Element('iframe', {
2421
- src: this.options.src,
2422
- scrolling: 'no',
2423
- frameborder: 0,
2424
- styles: {
2425
- zIndex: zIndex,
2426
- position: 'absolute',
2427
- border: 'none',
2428
- filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
2429
- },
2430
- 'class': this.options.className
2431
- }).store('IframeShim', this);
2432
- var inject = (function(){
2433
- this.shim.inject(this.element, 'after');
2434
- this[this.options.display ? 'show' : 'hide']();
2435
- this.fireEvent('inject');
2436
- }).bind(this);
2437
- if (!IframeShim.ready) window.addEvent('load', inject);
2438
- else inject();
2439
- } else {
2440
- this.position = this.hide = this.show = this.dispose = Function.from(this);
2441
- }
2442
- },
2443
-
2444
- position: function(){
2445
- if (!IframeShim.ready || !this.shim) return this;
2446
- var size = this.element.measure(function(){
2447
- return this.getSize();
2448
- });
2449
- if (this.options.margin != undefined){
2450
- size.x = size.x - (this.options.margin * 2);
2451
- size.y = size.y - (this.options.margin * 2);
2452
- this.options.offset.x += this.options.margin;
2453
- this.options.offset.y += this.options.margin;
2454
- }
2455
- this.shim.set({width: size.x, height: size.y}).position({
2456
- relativeTo: this.element,
2457
- offset: this.options.offset
2458
- });
2459
- return this;
2460
- },
2461
-
2462
- hide: function(){
2463
- if (this.shim) this.shim.setStyle('display', 'none');
2464
- return this;
2465
- },
2466
-
2467
- show: function(){
2468
- if (this.shim) this.shim.setStyle('display', 'block');
2469
- return this.position();
2470
- },
2471
-
2472
- dispose: function(){
2473
- if (this.shim) this.shim.dispose();
2474
- return this;
2475
- },
2476
-
2477
- destroy: function(){
2478
- if (this.shim) this.shim.destroy();
2479
- return this;
2480
- }
2481
-
2482
- });
2483
-
2484
- })();
2485
-
2486
- window.addEvent('load', function(){
2487
- IframeShim.ready = true;
2488
- });
2489
-
2490
-
2491
- /*
2492
- ---
2493
-
2494
- name: Locale.de-DE.Date
2495
-
2496
- description: Date messages for German.
2497
-
2498
- license: MIT-style license
2499
-
2500
- authors:
2501
- - Christoph Pojer
2502
- - Frank Rossi
2503
- - Ulrich Petri
2504
- - Fabian Beiner
2505
-
2506
- requires:
2507
- - Locale
2508
-
2509
- provides: [Locale.de-DE.Date]
2510
-
2511
- ...
2512
- */
2513
-
2514
- Locale.define('de-DE', 'Date', {
2515
-
2516
- months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
2517
- months_abbr: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
2518
- days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
2519
- days_abbr: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
2520
-
2521
- // Culture's date order: DD.MM.YYYY
2522
- dateOrder: ['date', 'month', 'year'],
2523
- shortDate: '%d.%m.%Y',
2524
- shortTime: '%H:%M',
2525
- AM: 'vormittags',
2526
- PM: 'nachmittags',
2527
- firstDayOfWeek: 1,
2528
-
2529
- // Date.Extras
2530
- ordinal: '.',
2531
-
2532
- lessThanMinuteAgo: 'vor weniger als einer Minute',
2533
- minuteAgo: 'vor einer Minute',
2534
- minutesAgo: 'vor {delta} Minuten',
2535
- hourAgo: 'vor einer Stunde',
2536
- hoursAgo: 'vor {delta} Stunden',
2537
- dayAgo: 'vor einem Tag',
2538
- daysAgo: 'vor {delta} Tagen',
2539
- weekAgo: 'vor einer Woche',
2540
- weeksAgo: 'vor {delta} Wochen',
2541
- monthAgo: 'vor einem Monat',
2542
- monthsAgo: 'vor {delta} Monaten',
2543
- yearAgo: 'vor einem Jahr',
2544
- yearsAgo: 'vor {delta} Jahren',
2545
-
2546
- lessThanMinuteUntil: 'in weniger als einer Minute',
2547
- minuteUntil: 'in einer Minute',
2548
- minutesUntil: 'in {delta} Minuten',
2549
- hourUntil: 'in ca. einer Stunde',
2550
- hoursUntil: 'in ca. {delta} Stunden',
2551
- dayUntil: 'in einem Tag',
2552
- daysUntil: 'in {delta} Tagen',
2553
- weekUntil: 'in einer Woche',
2554
- weeksUntil: 'in {delta} Wochen',
2555
- monthUntil: 'in einem Monat',
2556
- monthsUntil: 'in {delta} Monaten',
2557
- yearUntil: 'in einem Jahr',
2558
- yearsUntil: 'in {delta} Jahren'
2559
-
2560
- });
2561
-