lol_framework 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +4 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +30 -0
  6. data/Rakefile +1 -0
  7. data/lib/generators/lol_framework/setup/lol_framework.rb +27 -0
  8. data/lib/generators/lol_framework/setup/setup_generator.rb +17 -0
  9. data/lib/lol_framework.rb +8 -0
  10. data/lib/lol_framework/common.rb +20 -0
  11. data/lib/lol_framework/config.rb +17 -0
  12. data/lib/lol_framework/config/components.rb +16 -0
  13. data/lib/lol_framework/config/components/css.rb +44 -0
  14. data/lib/lol_framework/config/components/js.rb +75 -0
  15. data/lib/lol_framework/railtie.rb +14 -0
  16. data/lib/lol_framework/version.rb +3 -0
  17. data/lol_framework.gemspec +28 -0
  18. data/spec/lol_framework/config/components/css_spec.rb +5 -0
  19. data/spec/lol_framework/config/components/js_spec.rb +11 -0
  20. data/spec/lol_framework/config/components_spec.rb +24 -0
  21. data/spec/lol_framework/config_spec.rb +19 -0
  22. data/spec/lol_framework/lol_framework_spec.rb +13 -0
  23. data/spec/spec_helper.rb +20 -0
  24. data/vendor/assets/images/lol_framework/datatable/sorting_bg.png +0 -0
  25. data/vendor/assets/images/lol_framework/glyphicons-lol-origin-white.png +0 -0
  26. data/vendor/assets/images/lol_framework/glyphicons-lol-origin.png +0 -0
  27. data/vendor/assets/images/lol_framework/glyphicons-lol.png +0 -0
  28. data/vendor/assets/javascripts/.gitkeep +0 -0
  29. data/vendor/assets/javascripts/Jasmine/jasmine-html.js +616 -0
  30. data/vendor/assets/javascripts/Jasmine/jasmine.js +2529 -0
  31. data/vendor/assets/javascripts/lol.js +18 -0
  32. data/vendor/assets/javascripts/lol_framework/Ajax.coffee +183 -0
  33. data/vendor/assets/javascripts/lol_framework/Alert.coffee +113 -0
  34. data/vendor/assets/javascripts/lol_framework/Button.coffee +268 -0
  35. data/vendor/assets/javascripts/lol_framework/Core.coffee +85 -0
  36. data/vendor/assets/javascripts/lol_framework/Datatable.coffee +340 -0
  37. data/vendor/assets/javascripts/lol_framework/Date.coffee +0 -0
  38. data/vendor/assets/javascripts/lol_framework/Debug.coffee +45 -0
  39. data/vendor/assets/javascripts/lol_framework/I18n.coffee +81 -0
  40. data/vendor/assets/javascripts/lol_framework/Lang/en-us.coffee +54 -0
  41. data/vendor/assets/javascripts/lol_framework/Lang/pt-br.coffee +57 -0
  42. data/vendor/assets/javascripts/lol_framework/Library/date-functions.js +409 -0
  43. data/vendor/assets/javascripts/lol_framework/Library/jquery.dataTables.min.js +157 -0
  44. data/vendor/assets/javascripts/lol_framework/Library/jquery.mobile.js +14 -0
  45. data/vendor/assets/javascripts/lol_framework/Loader.coffee +83 -0
  46. data/vendor/assets/javascripts/lol_framework/Lol.coffee +4 -0
  47. data/vendor/assets/javascripts/lol_framework/Modal.coffee +221 -0
  48. data/vendor/assets/javascripts/lol_framework/Model.coffee +71 -0
  49. data/vendor/assets/javascripts/lol_framework/Model/Rest.coffee +15 -0
  50. data/vendor/assets/javascripts/lol_framework/Tests/Alert.coffee +83 -0
  51. data/vendor/assets/javascripts/lol_framework/Tests/Core.coffee +35 -0
  52. data/vendor/assets/javascripts/lol_framework/Tests/Debug.coffee +14 -0
  53. data/vendor/assets/javascripts/lol_framework/Tests/I18n.coffee +7 -0
  54. data/vendor/assets/javascripts/lol_framework/Tests/Lang.coffee +130 -0
  55. data/vendor/assets/javascripts/lol_framework/Tests/Library.coffee +13 -0
  56. data/vendor/assets/javascripts/lol_framework/Tests/Lol.coffee +4 -0
  57. data/vendor/assets/javascripts/lol_framework/Tests/Utils.coffee +22 -0
  58. data/vendor/assets/javascripts/lol_framework/Utils.coffee +42 -0
  59. data/vendor/assets/javascripts/lol_main_tests.js +43 -0
  60. data/vendor/assets/stylesheets/.gitkeep +0 -0
  61. data/vendor/assets/stylesheets/jasmine.css +81 -0
  62. data/vendor/assets/stylesheets/lol_framework/_mixin.scss +650 -0
  63. data/vendor/assets/stylesheets/lol_framework/_variable.scss +107 -0
  64. data/vendor/assets/stylesheets/lol_framework/components/_alert.scss +46 -0
  65. data/vendor/assets/stylesheets/lol_framework/components/_datatable.scss +172 -0
  66. data/vendor/assets/stylesheets/lol_framework/components/_loader.scss +15 -0
  67. data/vendor/assets/stylesheets/lol_framework/components/_modal.scss +68 -0
  68. metadata +222 -0
@@ -0,0 +1,81 @@
1
+ ###
2
+ @summary Lol Framework
3
+ @description Framework of RIAs applications
4
+ @version 1.0.0
5
+ @file Ajax.js
6
+ @author Welington Sampaio (http://welington.zaez.net/)
7
+ @contact http://welington.zaez.net/site/contato
8
+
9
+ @copyright Copyright 2012 Welington Sampaio, all rights reserved.
10
+
11
+ This source file is free software, under the license MIT, available at:
12
+ http://lolframework.zaez.net/license
13
+
14
+ This source file is distributed in the hope that it will be useful, but
15
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16
+ or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
17
+
18
+ For details please refer to: http://welington.zaez.net
19
+ ###
20
+
21
+ ###
22
+ Create a new instance of I18n.
23
+
24
+ @classDescription This class creates a new I18n.
25
+ @param {Object} Receives configuration to create the I18n
26
+ @return {I18n}    Returns a new I18n.
27
+ @type {Object}
28
+ ###
29
+ class Lol.I18n
30
+ # the methods
31
+ constructor: ->
32
+ throw 'Required jQuery library' if jQuery == undefined
33
+ Lol.I18n.language = if not navigator.language then 'en-us' else new String(navigator.language).toLowerCase()
34
+ @tDate()
35
+ tDate: ->
36
+ Date.monthNames =
37
+ [
38
+ Lol.t "date_months_january"
39
+ Lol.t "date_months_february"
40
+ Lol.t "date_months_march"
41
+ Lol.t "date_months_april"
42
+ Lol.t "date_months_may"
43
+ Lol.t "date_months_june"
44
+ Lol.t "date_months_july"
45
+ Lol.t "date_months_august"
46
+ Lol.t "date_months_september"
47
+ Lol.t "date_months_october"
48
+ Lol.t "date_months_november"
49
+ Lol.t "date_months_december"
50
+ ]
51
+ Date.dayNames =
52
+ [
53
+ Lol.t "date_days_sunday"
54
+ Lol.t "date_days_monday"
55
+ Lol.t "date_days_tuesday"
56
+ Lol.t "date_days_wednesday"
57
+ Lol.t "date_days_thursday"
58
+ Lol.t "date_days_friday"
59
+ Lol.t "date_days_saturday"
60
+ ]
61
+ ###
62
+ Method translation framework
63
+ @param {String}
64
+ ###
65
+ @translate: (name)->
66
+ return Lol.i18n[Lol.I18n.language][name] if Lol.i18n[Lol.I18n.language].hasOwnProperty(name)
67
+ return name
68
+
69
+ ###
70
+ Method translation framework
71
+ @see Lol.I18n.tralate
72
+ @param {String}
73
+ @example
74
+ *-* translating *-*
75
+ var january = Lol.t('date_months_january'); // January
76
+ ###
77
+ Lol.t = (name)->
78
+ return Lol.I18n.translate(name)
79
+
80
+ ## Initializing the Lol.I18n
81
+ new Lol.I18n()
@@ -0,0 +1,54 @@
1
+ Lol.i18n = Lol.i18n || {}
2
+ Lol.i18n['en-us'] =
3
+ # Commom
4
+ search: 'search'
5
+ #buttons names
6
+ OK : 'OK'
7
+ CANCEL: 'CANCEL'
8
+ YES : 'YES'
9
+ NO : 'NO'
10
+ # Datatable
11
+ datatable_oAria_sSortAscending : ": activate to sort column ascending"
12
+ datatable_oAria_sSortDescending: ": activate to sort column descending"
13
+ datatable_oPaginate_sFirst : "First"
14
+ datatable_oPaginate_sLast : "Last"
15
+ datatable_oPaginate_sNext : "Next"
16
+ datatable_oPaginate_sPrevious: "Previous"
17
+ datatable_sEmptyTable : "No data available in table"
18
+ datatable_sInfo : "Showing _START_ to _END_ of _TOTAL_ entries"
19
+ datatable_sInfoEmpty : "Showing 0 to 0 of 0 entries"
20
+ datatable_sInfoFiltered : "(filtered from _MAX_ total entries)"
21
+ datatable_sInfoPostFix : ""
22
+ datatable_sInfoThousands : ","
23
+ datatable_sLengthMenu : "Show _MENU_ entries"
24
+ datatable_sLoadingRecords: "Loading..."
25
+ datatable_sProcessing : "Processing..."
26
+ datatable_sSearch : "<i class='icon-search'></i>"
27
+ datatable_search : "search..."
28
+ datatable_sUrl : ""
29
+ datatable_sZeroRecords : "No matching records found"
30
+ datatable_view : 'view'
31
+ datatable_edit : 'edit'
32
+ datatable_delete : 'delete'
33
+ datatable_confirm_delete : 'Are you sure you want to delete this record?<br />This operation can not be undone.'
34
+ datatable_confirm_delete_title : 'Lol Framework'
35
+ # Date Object
36
+ date_months_january : 'January'
37
+ date_months_february : 'February'
38
+ date_months_march : 'March'
39
+ date_months_april : 'April'
40
+ date_months_may : 'May'
41
+ date_months_june : 'June'
42
+ date_months_july : 'July'
43
+ date_months_august : 'August'
44
+ date_months_september : 'September'
45
+ date_months_october : 'October'
46
+ date_months_november : 'November'
47
+ date_months_december : 'December'
48
+ date_days_sunday : 'Sunday'
49
+ date_days_monday : 'Monday'
50
+ date_days_tuesday : 'Tuesday'
51
+ date_days_wednesday : 'Wednesday'
52
+ date_days_thursday : 'Thursday'
53
+ date_days_friday : 'Friday'
54
+ date_days_saturday : 'Saturday'
@@ -0,0 +1,57 @@
1
+ Lol.i18n = Lol.i18n || {}
2
+ Lol.i18n['pt-br'] =
3
+ #Common
4
+ search : 'pesquisa'
5
+ #buttons names
6
+ OK : 'OK'
7
+ CANCEL: 'CANCELAR'
8
+ YES : 'SIM'
9
+ NO : 'NÃO'
10
+ # Datatable
11
+ datatable_oAria_sSortAscending : ": ativar para classificar coluna ascendente"
12
+ datatable_oAria_sSortDescending: ": ativar para classificar coluna descendente"
13
+ datatable_oPaginate_sFirst : "Primeiro"
14
+ datatable_oPaginate_sLast : "Último"
15
+ datatable_oPaginate_sNext : "Seguinte"
16
+ datatable_oPaginate_sPrevious: "Anterior"
17
+ datatable_sEmptyTable : "Não há dados disponíveis na tabela"
18
+ datatable_sInfo : "Mostrando de _START_ até _END_ de _TOTAL_ registros"
19
+ datatable_sInfoEmpty : "Mostrando de 0 até 0 de 0 registros"
20
+ datatable_sInfoFiltered : "(filtrado de _MAX_ registros no total)"
21
+ datatable_sInfoPostFix : ""
22
+ datatable_sInfoThousands : ","
23
+ datatable_sLengthMenu : "Mostrar _MENU_ registros"
24
+ datatable_sLoadingRecords: "Carregando..."
25
+ datatable_sProcessing : "Processando..."
26
+ datatable_sSearch : "<i class='icon-search'></i>"
27
+ datatable_search : "buscar"
28
+ datatable_sUrl : ""
29
+ datatable_sZeroRecords : "Não foram encontrados resultados"
30
+ datatable_view : 'visualizar'
31
+ datatable_edit : 'editar'
32
+ datatable_delete : 'remover'
33
+ datatable_confirm_delete : 'Você tem certeza que deseja excluir este registro?<br />Esta operação não poderá ser desfeita.'
34
+ datatable_confirm_delete_title : 'Lol Framework'
35
+ # Date Object
36
+ date_months_january : 'Janeiro'
37
+ date_months_february : 'Fevereiro'
38
+ date_months_march : 'Março'
39
+ date_months_april : 'Abril'
40
+ date_months_may : 'Maio'
41
+ date_months_june : 'Junho'
42
+ date_months_july : 'Julho'
43
+ date_months_august : 'Agosto'
44
+ date_months_september : 'Setembro'
45
+ date_months_october : 'Outubro'
46
+ date_months_november : 'Novembro'
47
+ date_months_december : 'Dezembro'
48
+ date_days_sunday : 'Domingo'
49
+ date_days_monday : 'Segunda'
50
+ date_days_tuesday : 'Terça'
51
+ date_days_wednesday : 'Quarta'
52
+ date_days_thursday : 'Quinta'
53
+ date_days_friday : 'Sexta'
54
+ date_days_saturday : 'Sábado'
55
+
56
+ ## Alias
57
+ Lol.i18n['pt'] = Lol.i18n['pt-br']
@@ -0,0 +1,409 @@
1
+ /*
2
+ * Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
3
+ *
4
+ * This program is free software; you can redistribute it and/or modify it
5
+ * under the terms of the GNU Lesser General Public License as published by the
6
+ * Free Software Foundation, version 2.1.
7
+ *
8
+ * This program is distributed in the hope that it will be useful, but WITHOUT
9
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
11
+ * details.
12
+ */
13
+
14
+ Date.parseFunctions = {count:0};
15
+ Date.parseRegexes = [];
16
+ Date.formatFunctions = {count:0};
17
+
18
+ Date.prototype.dateFormat = function(format) {
19
+ if (Date.formatFunctions[format] == null) {
20
+ Date.createNewFormat(format);
21
+ }
22
+ var func = Date.formatFunctions[format];
23
+ return this[func]();
24
+ }
25
+
26
+ Date.createNewFormat = function(format) {
27
+ var funcName = "format" + Date.formatFunctions.count++;
28
+ Date.formatFunctions[format] = funcName;
29
+ var code = "Date.prototype." + funcName + " = function(){return ";
30
+ var special = false;
31
+ var ch = '';
32
+ for (var i = 0; i < format.length; ++i) {
33
+ ch = format.charAt(i);
34
+ if (!special && ch == "\\") {
35
+ special = true;
36
+ }
37
+ else if (special) {
38
+ special = false;
39
+ code += "'" + String.escape(ch) + "' + ";
40
+ }
41
+ else {
42
+ code += Date.getFormatCode(ch);
43
+ }
44
+ }
45
+ eval(code.substring(0, code.length - 3) + ";}");
46
+ }
47
+
48
+ Date.getFormatCode = function(character) {
49
+ switch (character) {
50
+ case "d":
51
+ return "String.leftPad(this.getDate(), 2, '0') + ";
52
+ case "D":
53
+ return "Date.dayNames[this.getDay()].substring(0, 3) + ";
54
+ case "j":
55
+ return "this.getDate() + ";
56
+ case "l":
57
+ return "Date.dayNames[this.getDay()] + ";
58
+ case "S":
59
+ return "this.getSuffix() + ";
60
+ case "w":
61
+ return "this.getDay() + ";
62
+ case "z":
63
+ return "this.getDayOfYear() + ";
64
+ case "W":
65
+ return "this.getWeekOfYear() + ";
66
+ case "F":
67
+ return "Date.monthNames[this.getMonth()] + ";
68
+ case "m":
69
+ return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
70
+ case "M":
71
+ return "Date.monthNames[this.getMonth()].substring(0, 3) + ";
72
+ case "n":
73
+ return "(this.getMonth() + 1) + ";
74
+ case "t":
75
+ return "this.getDaysInMonth() + ";
76
+ case "L":
77
+ return "(this.isLeapYear() ? 1 : 0) + ";
78
+ case "Y":
79
+ return "this.getFullYear() + ";
80
+ case "y":
81
+ return "('' + this.getFullYear()).substring(2, 4) + ";
82
+ case "a":
83
+ return "(this.getHours() < 12 ? 'am' : 'pm') + ";
84
+ case "A":
85
+ return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
86
+ case "g":
87
+ return "((this.getHours() %12) ? this.getHours() % 12 : 12) + ";
88
+ case "G":
89
+ return "this.getHours() + ";
90
+ case "h":
91
+ return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";
92
+ case "H":
93
+ return "String.leftPad(this.getHours(), 2, '0') + ";
94
+ case "i":
95
+ return "String.leftPad(this.getMinutes(), 2, '0') + ";
96
+ case "s":
97
+ return "String.leftPad(this.getSeconds(), 2, '0') + ";
98
+ case "O":
99
+ return "this.getGMTOffset() + ";
100
+ case "T":
101
+ return "this.getTimezone() + ";
102
+ case "Z":
103
+ return "(this.getTimezoneOffset() * -60) + ";
104
+ default:
105
+ return "'" + String.escape(character) + "' + ";
106
+ }
107
+ }
108
+
109
+ Date.parseDate = function(input, format) {
110
+ if (Date.parseFunctions[format] == null) {
111
+ Date.createParser(format);
112
+ }
113
+ var func = Date.parseFunctions[format];
114
+ return Date[func](input);
115
+ }
116
+
117
+ Date.createParser = function(format) {
118
+ var funcName = "parse" + Date.parseFunctions.count++;
119
+ var regexNum = Date.parseRegexes.length;
120
+ var currentGroup = 1;
121
+ Date.parseFunctions[format] = funcName;
122
+
123
+ var code = "Date." + funcName + " = function(input){\n"
124
+ + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"
125
+ + "var d = new Date();\n"
126
+ + "y = d.getFullYear();\n"
127
+ + "m = d.getMonth();\n"
128
+ + "d = d.getDate();\n"
129
+ + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
130
+ + "if (results && results.length > 0) {"
131
+ var regex = "";
132
+
133
+ var special = false;
134
+ var ch = '';
135
+ for (var i = 0; i < format.length; ++i) {
136
+ ch = format.charAt(i);
137
+ if (!special && ch == "\\") {
138
+ special = true;
139
+ }
140
+ else if (special) {
141
+ special = false;
142
+ regex += String.escape(ch);
143
+ }
144
+ else {
145
+ obj = Date.formatCodeToRegex(ch, currentGroup);
146
+ currentGroup += obj.g;
147
+ regex += obj.s;
148
+ if (obj.g && obj.c) {
149
+ code += obj.c;
150
+ }
151
+ }
152
+ }
153
+
154
+ code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
155
+ + "{return new Date(y, m, d, h, i, s);}\n"
156
+ + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
157
+ + "{return new Date(y, m, d, h, i);}\n"
158
+ + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"
159
+ + "{return new Date(y, m, d, h);}\n"
160
+ + "else if (y > 0 && m >= 0 && d > 0)\n"
161
+ + "{return new Date(y, m, d);}\n"
162
+ + "else if (y > 0 && m >= 0)\n"
163
+ + "{return new Date(y, m);}\n"
164
+ + "else if (y > 0)\n"
165
+ + "{return new Date(y);}\n"
166
+ + "}return null;}";
167
+
168
+ Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$");
169
+ eval(code);
170
+ }
171
+
172
+ Date.formatCodeToRegex = function(character, currentGroup) {
173
+ switch (character) {
174
+ case "D":
175
+ return {g:0,
176
+ c:null,
177
+ s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};
178
+ case "j":
179
+ case "d":
180
+ return {g:1,
181
+ c:"d = parseInt(results[" + currentGroup + "], 10);\n",
182
+ s:"(\\d{1,2})"};
183
+ case "l":
184
+ return {g:0,
185
+ c:null,
186
+ s:"(?:" + Date.dayNames.join("|") + ")"};
187
+ case "S":
188
+ return {g:0,
189
+ c:null,
190
+ s:"(?:st|nd|rd|th)"};
191
+ case "w":
192
+ return {g:0,
193
+ c:null,
194
+ s:"\\d"};
195
+ case "z":
196
+ return {g:0,
197
+ c:null,
198
+ s:"(?:\\d{1,3})"};
199
+ case "W":
200
+ return {g:0,
201
+ c:null,
202
+ s:"(?:\\d{2})"};
203
+ case "F":
204
+ return {g:1,
205
+ c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n",
206
+ s:"(" + Date.monthNames.join("|") + ")"};
207
+ case "M":
208
+ return {g:1,
209
+ c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n",
210
+ s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};
211
+ case "n":
212
+ case "m":
213
+ return {g:1,
214
+ c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n",
215
+ s:"(\\d{1,2})"};
216
+ case "t":
217
+ return {g:0,
218
+ c:null,
219
+ s:"\\d{1,2}"};
220
+ case "L":
221
+ return {g:0,
222
+ c:null,
223
+ s:"(?:1|0)"};
224
+ case "Y":
225
+ return {g:1,
226
+ c:"y = parseInt(results[" + currentGroup + "], 10);\n",
227
+ s:"(\\d{4})"};
228
+ case "y":
229
+ return {g:1,
230
+ c:"var ty = parseInt(results[" + currentGroup + "], 10);\n"
231
+ + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
232
+ s:"(\\d{1,2})"};
233
+ case "a":
234
+ return {g:1,
235
+ c:"if (results[" + currentGroup + "] == 'am') {\n"
236
+ + "if (h == 12) { h = 0; }\n"
237
+ + "} else { if (h < 12) { h += 12; }}",
238
+ s:"(am|pm)"};
239
+ case "A":
240
+ return {g:1,
241
+ c:"if (results[" + currentGroup + "] == 'AM') {\n"
242
+ + "if (h == 12) { h = 0; }\n"
243
+ + "} else { if (h < 12) { h += 12; }}",
244
+ s:"(AM|PM)"};
245
+ case "g":
246
+ case "G":
247
+ case "h":
248
+ case "H":
249
+ return {g:1,
250
+ c:"h = parseInt(results[" + currentGroup + "], 10);\n",
251
+ s:"(\\d{1,2})"};
252
+ case "i":
253
+ return {g:1,
254
+ c:"i = parseInt(results[" + currentGroup + "], 10);\n",
255
+ s:"(\\d{2})"};
256
+ case "s":
257
+ return {g:1,
258
+ c:"s = parseInt(results[" + currentGroup + "], 10);\n",
259
+ s:"(\\d{2})"};
260
+ case "O":
261
+ return {g:0,
262
+ c:null,
263
+ s:"[+-]\\d{4}"};
264
+ case "T":
265
+ return {g:0,
266
+ c:null,
267
+ s:"[A-Z]{3}"};
268
+ case "Z":
269
+ return {g:0,
270
+ c:null,
271
+ s:"[+-]\\d{1,5}"};
272
+ default:
273
+ return {g:0,
274
+ c:null,
275
+ s:String.escape(character)};
276
+ }
277
+ }
278
+
279
+ Date.prototype.getTimezone = function() {
280
+ return this.toString().replace(
281
+ /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace(
282
+ /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
283
+ }
284
+
285
+ Date.prototype.getGMTOffset = function() {
286
+ return (this.getTimezoneOffset() > 0 ? "-" : "+")
287
+ + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
288
+ + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
289
+ }
290
+
291
+ Date.prototype.getDayOfYear = function() {
292
+ var num = 0;
293
+ Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
294
+ for (var i = 0; i < this.getMonth(); ++i) {
295
+ num += Date.daysInMonth[i];
296
+ }
297
+ return num + this.getDate() - 1;
298
+ }
299
+
300
+ Date.prototype.getWeekOfYear = function() {
301
+ // Skip to Thursday of this week
302
+ var now = this.getDayOfYear() + (4 - this.getDay());
303
+ // Find the first Thursday of the year
304
+ var jan1 = new Date(this.getFullYear(), 0, 1);
305
+ var then = (7 - jan1.getDay() + 4);
306
+ document.write(then);
307
+ return String.leftPad(((now - then) / 7) + 1, 2, "0");
308
+ }
309
+
310
+ Date.prototype.isLeapYear = function() {
311
+ var year = this.getFullYear();
312
+ return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
313
+ }
314
+
315
+ Date.prototype.getFirstDayOfMonth = function() {
316
+ var day = (this.getDay() - (this.getDate() - 1)) % 7;
317
+ return (day < 0) ? (day + 7) : day;
318
+ }
319
+
320
+ Date.prototype.getLastDayOfMonth = function() {
321
+ var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
322
+ return (day < 0) ? (day + 7) : day;
323
+ }
324
+
325
+ Date.prototype.getDaysInMonth = function() {
326
+ Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
327
+ return Date.daysInMonth[this.getMonth()];
328
+ }
329
+
330
+ Date.prototype.getSuffix = function() {
331
+ switch (this.getDate()) {
332
+ case 1:
333
+ case 21:
334
+ case 31:
335
+ return "st";
336
+ case 2:
337
+ case 22:
338
+ return "nd";
339
+ case 3:
340
+ case 23:
341
+ return "rd";
342
+ default:
343
+ return "th";
344
+ }
345
+ }
346
+
347
+ String.escape = function(string) {
348
+ return string.replace(/('|\\)/g, "\\$1");
349
+ }
350
+
351
+ String.leftPad = function (val, size, ch) {
352
+ var result = new String(val);
353
+ if (ch == null) {
354
+ ch = " ";
355
+ }
356
+ while (result.length < size) {
357
+ result = ch + result;
358
+ }
359
+ return result;
360
+ }
361
+
362
+ Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
363
+ Date.monthNames =
364
+ ["January",
365
+ "February",
366
+ "March",
367
+ "April",
368
+ "May",
369
+ "June",
370
+ "July",
371
+ "August",
372
+ "September",
373
+ "October",
374
+ "November",
375
+ "December"];
376
+ Date.dayNames =
377
+ ["Sunday",
378
+ "Monday",
379
+ "Tuesday",
380
+ "Wednesday",
381
+ "Thursday",
382
+ "Friday",
383
+ "Saturday"];
384
+ Date.y2kYear = 50;
385
+ Date.monthNumbers = {
386
+ Jan:0,
387
+ Feb:1,
388
+ Mar:2,
389
+ Apr:3,
390
+ May:4,
391
+ Jun:5,
392
+ Jul:6,
393
+ Aug:7,
394
+ Sep:8,
395
+ Oct:9,
396
+ Nov:10,
397
+ Dec:11};
398
+ Date.patterns = {
399
+ ISO8601LongPattern:"Y-m-d H:i:s",
400
+ ISO8601ShortPattern:"Y-m-d",
401
+ ShortDatePattern: "n/j/Y",
402
+ LongDatePattern: "l, F d, Y",
403
+ FullDateTimePattern: "l, F d, Y g:i:s A",
404
+ MonthDayPattern: "F d",
405
+ ShortTimePattern: "g:i A",
406
+ LongTimePattern: "g:i:s A",
407
+ SortableDateTimePattern: "Y-m-d\\TH:i:s",
408
+ UniversalSortableDateTimePattern: "Y-m-d H:i:sO",
409
+ YearMonthPattern: "F, Y"};