merb-admin 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. data/.gitignore +29 -27
  2. data/Gemfile +24 -22
  3. data/Gemfile.lock +86 -0
  4. data/LICENSE +20 -20
  5. data/README.rdoc +54 -58
  6. data/Rakefile +11 -44
  7. data/app/controllers/application.rb +6 -6
  8. data/app/controllers/main.rb +191 -191
  9. data/app/helpers/application_helper.rb +64 -64
  10. data/app/helpers/main_helper.rb +167 -167
  11. data/app/models/.gitkeep +0 -0
  12. data/app/views/layout/_message.html.erb +10 -10
  13. data/app/views/layout/dashboard.html.erb +34 -34
  14. data/app/views/layout/form.html.erb +48 -48
  15. data/app/views/layout/list.html.erb +42 -42
  16. data/app/views/main/_belongs_to.html.erb +29 -29
  17. data/app/views/main/_big_decimal.html.erb +12 -12
  18. data/app/views/main/_boolean.html.erb +7 -7
  19. data/app/views/main/_date.html.erb +12 -12
  20. data/app/views/main/_datetime.html.erb +12 -12
  21. data/app/views/main/_float.html.erb +12 -12
  22. data/app/views/main/_has_many.html.erb +16 -16
  23. data/app/views/main/_has_one.html.erb +30 -30
  24. data/app/views/main/_integer.html.erb +12 -12
  25. data/app/views/main/_properties.html.erb +18 -18
  26. data/app/views/main/_string.html.erb +15 -15
  27. data/app/views/main/_text.html.erb +11 -11
  28. data/app/views/main/_time.html.erb +12 -12
  29. data/app/views/main/_timestamp.html.erb +12 -12
  30. data/app/views/main/delete.html.erb +28 -28
  31. data/app/views/main/edit.html.erb +19 -19
  32. data/app/views/main/index.html.erb +22 -22
  33. data/app/views/main/list.html.erb +93 -93
  34. data/app/views/main/new.html.erb +16 -16
  35. data/config/init.rb +30 -0
  36. data/config/router.rb +4 -0
  37. data/lib/abstract_model.rb +84 -86
  38. data/lib/active_record_support.rb +147 -147
  39. data/lib/datamapper_support.rb +139 -140
  40. data/lib/generic_support.rb +13 -13
  41. data/lib/merb-admin.rb +99 -99
  42. data/lib/merb-admin/merbtasks.rb +103 -103
  43. data/lib/merb-admin/slicetasks.rb +174 -174
  44. data/lib/merb-admin/spectasks.rb +55 -55
  45. data/lib/merb-admin/version.rb +3 -0
  46. data/lib/sequel_support.rb +275 -275
  47. data/merb-admin.gemspec +42 -232
  48. data/public/javascripts/CollapsedFieldsets.js +85 -85
  49. data/public/javascripts/DateTimeShortcuts.js +255 -255
  50. data/public/javascripts/RelatedObjectLookups.js +96 -96
  51. data/public/javascripts/SelectBox.js +111 -111
  52. data/public/javascripts/SelectFilter2.js +113 -113
  53. data/public/javascripts/actions.js +39 -39
  54. data/public/javascripts/calendar.js +143 -143
  55. data/public/javascripts/core.js +176 -176
  56. data/public/javascripts/dateparse.js +233 -233
  57. data/public/javascripts/getElementsBySelector.js +167 -167
  58. data/public/javascripts/i18n.js +33 -33
  59. data/public/javascripts/ordering.js +137 -137
  60. data/public/javascripts/timeparse.js +94 -94
  61. data/public/javascripts/urlify.js +140 -140
  62. data/public/stylesheets/base.css +746 -746
  63. data/public/stylesheets/changelists.css +269 -269
  64. data/public/stylesheets/dashboard.css +24 -24
  65. data/public/stylesheets/forms.css +327 -327
  66. data/public/stylesheets/global.css +142 -142
  67. data/public/stylesheets/ie.css +50 -50
  68. data/public/stylesheets/layout.css +29 -29
  69. data/public/stylesheets/login.css +54 -54
  70. data/public/stylesheets/master.css +1 -1
  71. data/public/stylesheets/patch-iewin.css +7 -7
  72. data/public/stylesheets/rtl.css +206 -206
  73. data/public/stylesheets/widgets.css +506 -506
  74. data/screenshots/create.png +0 -0
  75. data/screenshots/delete.png +0 -0
  76. data/screenshots/edit.png +0 -0
  77. data/screenshots/index.png +0 -0
  78. data/screenshots/list.png +0 -0
  79. data/screenshots/new.png +0 -0
  80. data/spec/controllers/main_spec.rb +25 -25
  81. data/spec/migrations/activerecord/001_create_divisions_migration.rb +13 -13
  82. data/spec/migrations/activerecord/002_create_drafts_migration.rb +19 -19
  83. data/spec/migrations/activerecord/003_create_leagues_migration.rb +12 -12
  84. data/spec/migrations/activerecord/004_create_players_migration.rb +19 -20
  85. data/spec/migrations/activerecord/005_create_teams_migration.rb +22 -22
  86. data/spec/migrations/sequel/001_create_divisions_migration.rb +15 -15
  87. data/spec/migrations/sequel/002_create_drafts_migration.rb +21 -21
  88. data/spec/migrations/sequel/003_create_leagues_migration.rb +14 -14
  89. data/spec/migrations/sequel/004_create_players_migration.rb +21 -22
  90. data/spec/migrations/sequel/005_create_teams_migration.rb +24 -24
  91. data/spec/models/activerecord/division.rb +7 -7
  92. data/spec/models/activerecord/draft.rb +11 -11
  93. data/spec/models/activerecord/league.rb +6 -6
  94. data/spec/models/activerecord/player.rb +8 -8
  95. data/spec/models/activerecord/team.rb +13 -13
  96. data/spec/models/datamapper/division.rb +12 -12
  97. data/spec/models/datamapper/draft.rb +18 -18
  98. data/spec/models/datamapper/league.rb +11 -11
  99. data/spec/models/datamapper/player.rb +20 -21
  100. data/spec/models/datamapper/team.rb +22 -22
  101. data/spec/models/sequel/division.rb +15 -15
  102. data/spec/models/sequel/draft.rb +19 -19
  103. data/spec/models/sequel/league.rb +14 -14
  104. data/spec/models/sequel/player.rb +18 -18
  105. data/spec/models/sequel/team.rb +21 -21
  106. data/spec/requests/main_spec.rb +763 -763
  107. data/spec/spec_helper.rb +113 -112
  108. metadata +247 -41
  109. data/VERSION +0 -1
@@ -1,39 +1,39 @@
1
- var Actions = {
2
- init: function() {
3
- var selectAll = document.getElementById('action-toggle');
4
- if (selectAll) {
5
- selectAll.style.display = 'inline';
6
- addEvent(selectAll, 'click', function() {
7
- Actions.checker(selectAll.checked);
8
- });
9
- }
10
- var changelistTable = document.getElementsBySelector('#changelist table')[0];
11
- if (changelistTable) {
12
- addEvent(changelistTable, 'click', function(e) {
13
- if (!e) { var e = window.event; }
14
- var target = e.target ? e.target : e.srcElement;
15
- if (target.nodeType == 3) { target = target.parentNode; }
16
- if (target.className == 'action-select') {
17
- var tr = target.parentNode.parentNode;
18
- Actions.toggleRow(tr, target.checked);
19
- }
20
- });
21
- }
22
- },
23
- toggleRow: function(tr, checked) {
24
- if (checked && tr.className.indexOf('selected') == -1) {
25
- tr.className += ' selected';
26
- } else if (!checked) {
27
- tr.className = tr.className.replace(' selected', '');
28
- }
29
- },
30
- checker: function(checked) {
31
- var actionCheckboxes = document.getElementsBySelector('tr input.action-select');
32
- for(var i = 0; i < actionCheckboxes.length; i++) {
33
- actionCheckboxes[i].checked = checked;
34
- Actions.toggleRow(actionCheckboxes[i].parentNode.parentNode, checked);
35
- }
36
- }
37
- };
38
-
39
- addEvent(window, 'load', Actions.init);
1
+ var Actions = {
2
+ init: function() {
3
+ var selectAll = document.getElementById('action-toggle');
4
+ if (selectAll) {
5
+ selectAll.style.display = 'inline';
6
+ addEvent(selectAll, 'click', function() {
7
+ Actions.checker(selectAll.checked);
8
+ });
9
+ }
10
+ var changelistTable = document.getElementsBySelector('#changelist table')[0];
11
+ if (changelistTable) {
12
+ addEvent(changelistTable, 'click', function(e) {
13
+ if (!e) { var e = window.event; }
14
+ var target = e.target ? e.target : e.srcElement;
15
+ if (target.nodeType == 3) { target = target.parentNode; }
16
+ if (target.className == 'action-select') {
17
+ var tr = target.parentNode.parentNode;
18
+ Actions.toggleRow(tr, target.checked);
19
+ }
20
+ });
21
+ }
22
+ },
23
+ toggleRow: function(tr, checked) {
24
+ if (checked && tr.className.indexOf('selected') == -1) {
25
+ tr.className += ' selected';
26
+ } else if (!checked) {
27
+ tr.className = tr.className.replace(' selected', '');
28
+ }
29
+ },
30
+ checker: function(checked) {
31
+ var actionCheckboxes = document.getElementsBySelector('tr input.action-select');
32
+ for(var i = 0; i < actionCheckboxes.length; i++) {
33
+ actionCheckboxes[i].checked = checked;
34
+ Actions.toggleRow(actionCheckboxes[i].parentNode.parentNode, checked);
35
+ }
36
+ }
37
+ };
38
+
39
+ addEvent(window, 'load', Actions.init);
@@ -1,143 +1,143 @@
1
- /*
2
- calendar.js - Calendar functions by Adrian Holovaty
3
- */
4
-
5
- function removeChildren(a) { // "a" is reference to an object
6
- while (a.hasChildNodes()) a.removeChild(a.lastChild);
7
- }
8
-
9
- // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
10
- function quickElement() {
11
- var obj = document.createElement(arguments[0]);
12
- if (arguments[2] != '' && arguments[2] != null) {
13
- var textNode = document.createTextNode(arguments[2]);
14
- obj.appendChild(textNode);
15
- }
16
- var len = arguments.length;
17
- for (var i = 3; i < len; i += 2) {
18
- obj.setAttribute(arguments[i], arguments[i+1]);
19
- }
20
- arguments[1].appendChild(obj);
21
- return obj;
22
- }
23
-
24
- // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
25
- var CalendarNamespace = {
26
- monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
27
- daysOfWeek: gettext('S M T W T F S').split(' '),
28
- isLeapYear: function(year) {
29
- return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
30
- },
31
- getDaysInMonth: function(month,year) {
32
- var days;
33
- if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
34
- days = 31;
35
- }
36
- else if (month==4 || month==6 || month==9 || month==11) {
37
- days = 30;
38
- }
39
- else if (month==2 && CalendarNamespace.isLeapYear(year)) {
40
- days = 29;
41
- }
42
- else {
43
- days = 28;
44
- }
45
- return days;
46
- },
47
- draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
48
- month = parseInt(month);
49
- year = parseInt(year);
50
- var calDiv = document.getElementById(div_id);
51
- removeChildren(calDiv);
52
- var calTable = document.createElement('table');
53
- quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
54
- var tableBody = quickElement('tbody', calTable);
55
-
56
- // Draw days-of-week header
57
- var tableRow = quickElement('tr', tableBody);
58
- for (var i = 0; i < 7; i++) {
59
- quickElement('th', tableRow, CalendarNamespace.daysOfWeek[i]);
60
- }
61
-
62
- var startingPos = new Date(year, month-1, 1).getDay();
63
- var days = CalendarNamespace.getDaysInMonth(month, year);
64
-
65
- // Draw blanks before first of month
66
- tableRow = quickElement('tr', tableBody);
67
- for (var i = 0; i < startingPos; i++) {
68
- var _cell = quickElement('td', tableRow, ' ');
69
- _cell.style.backgroundColor = '#f3f3f3';
70
- }
71
-
72
- // Draw days of month
73
- var currentDay = 1;
74
- for (var i = startingPos; currentDay <= days; i++) {
75
- if (i%7 == 0 && currentDay != 1) {
76
- tableRow = quickElement('tr', tableBody);
77
- }
78
- var cell = quickElement('td', tableRow, '');
79
- quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
80
- currentDay++;
81
- }
82
-
83
- // Draw blanks after end of month (optional, but makes for valid code)
84
- while (tableRow.childNodes.length < 7) {
85
- var _cell = quickElement('td', tableRow, ' ');
86
- _cell.style.backgroundColor = '#f3f3f3';
87
- }
88
-
89
- calDiv.appendChild(calTable);
90
- }
91
- }
92
-
93
- // Calendar -- A calendar instance
94
- function Calendar(div_id, callback) {
95
- // div_id (string) is the ID of the element in which the calendar will
96
- // be displayed
97
- // callback (string) is the name of a JavaScript function that will be
98
- // called with the parameters (year, month, day) when a day in the
99
- // calendar is clicked
100
- this.div_id = div_id;
101
- this.callback = callback;
102
- this.today = new Date();
103
- this.currentMonth = this.today.getMonth() + 1;
104
- this.currentYear = this.today.getFullYear();
105
- }
106
- Calendar.prototype = {
107
- drawCurrent: function() {
108
- CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
109
- },
110
- drawDate: function(month, year) {
111
- this.currentMonth = month;
112
- this.currentYear = year;
113
- this.drawCurrent();
114
- },
115
- drawPreviousMonth: function() {
116
- if (this.currentMonth == 1) {
117
- this.currentMonth = 12;
118
- this.currentYear--;
119
- }
120
- else {
121
- this.currentMonth--;
122
- }
123
- this.drawCurrent();
124
- },
125
- drawNextMonth: function() {
126
- if (this.currentMonth == 12) {
127
- this.currentMonth = 1;
128
- this.currentYear++;
129
- }
130
- else {
131
- this.currentMonth++;
132
- }
133
- this.drawCurrent();
134
- },
135
- drawPreviousYear: function() {
136
- this.currentYear--;
137
- this.drawCurrent();
138
- },
139
- drawNextYear: function() {
140
- this.currentYear++;
141
- this.drawCurrent();
142
- }
143
- }
1
+ /*
2
+ calendar.js - Calendar functions by Adrian Holovaty
3
+ */
4
+
5
+ function removeChildren(a) { // "a" is reference to an object
6
+ while (a.hasChildNodes()) a.removeChild(a.lastChild);
7
+ }
8
+
9
+ // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
10
+ function quickElement() {
11
+ var obj = document.createElement(arguments[0]);
12
+ if (arguments[2] != '' && arguments[2] != null) {
13
+ var textNode = document.createTextNode(arguments[2]);
14
+ obj.appendChild(textNode);
15
+ }
16
+ var len = arguments.length;
17
+ for (var i = 3; i < len; i += 2) {
18
+ obj.setAttribute(arguments[i], arguments[i+1]);
19
+ }
20
+ arguments[1].appendChild(obj);
21
+ return obj;
22
+ }
23
+
24
+ // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
25
+ var CalendarNamespace = {
26
+ monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
27
+ daysOfWeek: gettext('S M T W T F S').split(' '),
28
+ isLeapYear: function(year) {
29
+ return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
30
+ },
31
+ getDaysInMonth: function(month,year) {
32
+ var days;
33
+ if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
34
+ days = 31;
35
+ }
36
+ else if (month==4 || month==6 || month==9 || month==11) {
37
+ days = 30;
38
+ }
39
+ else if (month==2 && CalendarNamespace.isLeapYear(year)) {
40
+ days = 29;
41
+ }
42
+ else {
43
+ days = 28;
44
+ }
45
+ return days;
46
+ },
47
+ draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
48
+ month = parseInt(month);
49
+ year = parseInt(year);
50
+ var calDiv = document.getElementById(div_id);
51
+ removeChildren(calDiv);
52
+ var calTable = document.createElement('table');
53
+ quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
54
+ var tableBody = quickElement('tbody', calTable);
55
+
56
+ // Draw days-of-week header
57
+ var tableRow = quickElement('tr', tableBody);
58
+ for (var i = 0; i < 7; i++) {
59
+ quickElement('th', tableRow, CalendarNamespace.daysOfWeek[i]);
60
+ }
61
+
62
+ var startingPos = new Date(year, month-1, 1).getDay();
63
+ var days = CalendarNamespace.getDaysInMonth(month, year);
64
+
65
+ // Draw blanks before first of month
66
+ tableRow = quickElement('tr', tableBody);
67
+ for (var i = 0; i < startingPos; i++) {
68
+ var _cell = quickElement('td', tableRow, ' ');
69
+ _cell.style.backgroundColor = '#f3f3f3';
70
+ }
71
+
72
+ // Draw days of month
73
+ var currentDay = 1;
74
+ for (var i = startingPos; currentDay <= days; i++) {
75
+ if (i%7 == 0 && currentDay != 1) {
76
+ tableRow = quickElement('tr', tableBody);
77
+ }
78
+ var cell = quickElement('td', tableRow, '');
79
+ quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
80
+ currentDay++;
81
+ }
82
+
83
+ // Draw blanks after end of month (optional, but makes for valid code)
84
+ while (tableRow.childNodes.length < 7) {
85
+ var _cell = quickElement('td', tableRow, ' ');
86
+ _cell.style.backgroundColor = '#f3f3f3';
87
+ }
88
+
89
+ calDiv.appendChild(calTable);
90
+ }
91
+ }
92
+
93
+ // Calendar -- A calendar instance
94
+ function Calendar(div_id, callback) {
95
+ // div_id (string) is the ID of the element in which the calendar will
96
+ // be displayed
97
+ // callback (string) is the name of a JavaScript function that will be
98
+ // called with the parameters (year, month, day) when a day in the
99
+ // calendar is clicked
100
+ this.div_id = div_id;
101
+ this.callback = callback;
102
+ this.today = new Date();
103
+ this.currentMonth = this.today.getMonth() + 1;
104
+ this.currentYear = this.today.getFullYear();
105
+ }
106
+ Calendar.prototype = {
107
+ drawCurrent: function() {
108
+ CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
109
+ },
110
+ drawDate: function(month, year) {
111
+ this.currentMonth = month;
112
+ this.currentYear = year;
113
+ this.drawCurrent();
114
+ },
115
+ drawPreviousMonth: function() {
116
+ if (this.currentMonth == 1) {
117
+ this.currentMonth = 12;
118
+ this.currentYear--;
119
+ }
120
+ else {
121
+ this.currentMonth--;
122
+ }
123
+ this.drawCurrent();
124
+ },
125
+ drawNextMonth: function() {
126
+ if (this.currentMonth == 12) {
127
+ this.currentMonth = 1;
128
+ this.currentYear++;
129
+ }
130
+ else {
131
+ this.currentMonth++;
132
+ }
133
+ this.drawCurrent();
134
+ },
135
+ drawPreviousYear: function() {
136
+ this.currentYear--;
137
+ this.drawCurrent();
138
+ },
139
+ drawNextYear: function() {
140
+ this.currentYear++;
141
+ this.drawCurrent();
142
+ }
143
+ }
@@ -1,176 +1,176 @@
1
- // Core javascript helper functions
2
-
3
- // basic browser identification & version
4
- var isOpera = (navigator.userAgent.indexOf("Opera")>=0) && parseFloat(navigator.appVersion);
5
- var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
6
-
7
- // Cross-browser event handlers.
8
- function addEvent(obj, evType, fn) {
9
- if (obj.addEventListener) {
10
- obj.addEventListener(evType, fn, false);
11
- return true;
12
- } else if (obj.attachEvent) {
13
- var r = obj.attachEvent("on" + evType, fn);
14
- return r;
15
- } else {
16
- return false;
17
- }
18
- }
19
-
20
- function removeEvent(obj, evType, fn) {
21
- if (obj.removeEventListener) {
22
- obj.removeEventListener(evType, fn, false);
23
- return true;
24
- } else if (obj.detachEvent) {
25
- obj.detachEvent("on" + evType, fn);
26
- return true;
27
- } else {
28
- return false;
29
- }
30
- }
31
-
32
- // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
33
- function quickElement() {
34
- var obj = document.createElement(arguments[0]);
35
- if (arguments[2] != '' && arguments[2] != null) {
36
- var textNode = document.createTextNode(arguments[2]);
37
- obj.appendChild(textNode);
38
- }
39
- var len = arguments.length;
40
- for (var i = 3; i < len; i += 2) {
41
- obj.setAttribute(arguments[i], arguments[i+1]);
42
- }
43
- arguments[1].appendChild(obj);
44
- return obj;
45
- }
46
-
47
- // ----------------------------------------------------------------------------
48
- // Cross-browser xmlhttp object
49
- // from http://jibbering.com/2002/4/httprequest.html
50
- // ----------------------------------------------------------------------------
51
- var xmlhttp;
52
- /*@cc_on @*/
53
- /*@if (@_jscript_version >= 5)
54
- try {
55
- xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
56
- } catch (e) {
57
- try {
58
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
59
- } catch (E) {
60
- xmlhttp = false;
61
- }
62
- }
63
- @else
64
- xmlhttp = false;
65
- @end @*/
66
- if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
67
- xmlhttp = new XMLHttpRequest();
68
- }
69
-
70
- // ----------------------------------------------------------------------------
71
- // Find-position functions by PPK
72
- // See http://www.quirksmode.org/js/findpos.html
73
- // ----------------------------------------------------------------------------
74
- function findPosX(obj) {
75
- var curleft = 0;
76
- if (obj.offsetParent) {
77
- while (obj.offsetParent) {
78
- curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);
79
- obj = obj.offsetParent;
80
- }
81
- // IE offsetParent does not include the top-level
82
- if (isIE && obj.parentElement){
83
- curleft += obj.offsetLeft - obj.scrollLeft;
84
- }
85
- } else if (obj.x) {
86
- curleft += obj.x;
87
- }
88
- return curleft;
89
- }
90
-
91
- function findPosY(obj) {
92
- var curtop = 0;
93
- if (obj.offsetParent) {
94
- while (obj.offsetParent) {
95
- curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);
96
- obj = obj.offsetParent;
97
- }
98
- // IE offsetParent does not include the top-level
99
- if (isIE && obj.parentElement){
100
- curtop += obj.offsetTop - obj.scrollTop;
101
- }
102
- } else if (obj.y) {
103
- curtop += obj.y;
104
- }
105
- return curtop;
106
- }
107
-
108
- //-----------------------------------------------------------------------------
109
- // Date object extensions
110
- // ----------------------------------------------------------------------------
111
- Date.prototype.getCorrectYear = function() {
112
- // Date.getYear() is unreliable --
113
- // see http://www.quirksmode.org/js/introdate.html#year
114
- var y = this.getYear() % 100;
115
- return (y < 38) ? y + 2000 : y + 1900;
116
- }
117
-
118
- Date.prototype.getTwoDigitMonth = function() {
119
- return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);
120
- }
121
-
122
- Date.prototype.getTwoDigitDate = function() {
123
- return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
124
- }
125
-
126
- Date.prototype.getTwoDigitHour = function() {
127
- return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
128
- }
129
-
130
- Date.prototype.getTwoDigitMinute = function() {
131
- return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
132
- }
133
-
134
- Date.prototype.getTwoDigitSecond = function() {
135
- return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
136
- }
137
-
138
- Date.prototype.getISODate = function() {
139
- return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate();
140
- }
141
-
142
- Date.prototype.getHourMinute = function() {
143
- return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
144
- }
145
-
146
- Date.prototype.getHourMinuteSecond = function() {
147
- return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
148
- }
149
-
150
- // ----------------------------------------------------------------------------
151
- // String object extensions
152
- // ----------------------------------------------------------------------------
153
- String.prototype.pad_left = function(pad_length, pad_string) {
154
- var new_string = this;
155
- for (var i = 0; new_string.length < pad_length; i++) {
156
- new_string = pad_string + new_string;
157
- }
158
- return new_string;
159
- }
160
-
161
- // ----------------------------------------------------------------------------
162
- // Get the computed style for and element
163
- // ----------------------------------------------------------------------------
164
- function getStyle(oElm, strCssRule){
165
- var strValue = "";
166
- if(document.defaultView && document.defaultView.getComputedStyle){
167
- strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
168
- }
169
- else if(oElm.currentStyle){
170
- strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
171
- return p1.toUpperCase();
172
- });
173
- strValue = oElm.currentStyle[strCssRule];
174
- }
175
- return strValue;
176
- }
1
+ // Core javascript helper functions
2
+
3
+ // basic browser identification & version
4
+ var isOpera = (navigator.userAgent.indexOf("Opera")>=0) && parseFloat(navigator.appVersion);
5
+ var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
6
+
7
+ // Cross-browser event handlers.
8
+ function addEvent(obj, evType, fn) {
9
+ if (obj.addEventListener) {
10
+ obj.addEventListener(evType, fn, false);
11
+ return true;
12
+ } else if (obj.attachEvent) {
13
+ var r = obj.attachEvent("on" + evType, fn);
14
+ return r;
15
+ } else {
16
+ return false;
17
+ }
18
+ }
19
+
20
+ function removeEvent(obj, evType, fn) {
21
+ if (obj.removeEventListener) {
22
+ obj.removeEventListener(evType, fn, false);
23
+ return true;
24
+ } else if (obj.detachEvent) {
25
+ obj.detachEvent("on" + evType, fn);
26
+ return true;
27
+ } else {
28
+ return false;
29
+ }
30
+ }
31
+
32
+ // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
33
+ function quickElement() {
34
+ var obj = document.createElement(arguments[0]);
35
+ if (arguments[2] != '' && arguments[2] != null) {
36
+ var textNode = document.createTextNode(arguments[2]);
37
+ obj.appendChild(textNode);
38
+ }
39
+ var len = arguments.length;
40
+ for (var i = 3; i < len; i += 2) {
41
+ obj.setAttribute(arguments[i], arguments[i+1]);
42
+ }
43
+ arguments[1].appendChild(obj);
44
+ return obj;
45
+ }
46
+
47
+ // ----------------------------------------------------------------------------
48
+ // Cross-browser xmlhttp object
49
+ // from http://jibbering.com/2002/4/httprequest.html
50
+ // ----------------------------------------------------------------------------
51
+ var xmlhttp;
52
+ /*@cc_on @*/
53
+ /*@if (@_jscript_version >= 5)
54
+ try {
55
+ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
56
+ } catch (e) {
57
+ try {
58
+ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
59
+ } catch (E) {
60
+ xmlhttp = false;
61
+ }
62
+ }
63
+ @else
64
+ xmlhttp = false;
65
+ @end @*/
66
+ if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
67
+ xmlhttp = new XMLHttpRequest();
68
+ }
69
+
70
+ // ----------------------------------------------------------------------------
71
+ // Find-position functions by PPK
72
+ // See http://www.quirksmode.org/js/findpos.html
73
+ // ----------------------------------------------------------------------------
74
+ function findPosX(obj) {
75
+ var curleft = 0;
76
+ if (obj.offsetParent) {
77
+ while (obj.offsetParent) {
78
+ curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);
79
+ obj = obj.offsetParent;
80
+ }
81
+ // IE offsetParent does not include the top-level
82
+ if (isIE && obj.parentElement){
83
+ curleft += obj.offsetLeft - obj.scrollLeft;
84
+ }
85
+ } else if (obj.x) {
86
+ curleft += obj.x;
87
+ }
88
+ return curleft;
89
+ }
90
+
91
+ function findPosY(obj) {
92
+ var curtop = 0;
93
+ if (obj.offsetParent) {
94
+ while (obj.offsetParent) {
95
+ curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);
96
+ obj = obj.offsetParent;
97
+ }
98
+ // IE offsetParent does not include the top-level
99
+ if (isIE && obj.parentElement){
100
+ curtop += obj.offsetTop - obj.scrollTop;
101
+ }
102
+ } else if (obj.y) {
103
+ curtop += obj.y;
104
+ }
105
+ return curtop;
106
+ }
107
+
108
+ //-----------------------------------------------------------------------------
109
+ // Date object extensions
110
+ // ----------------------------------------------------------------------------
111
+ Date.prototype.getCorrectYear = function() {
112
+ // Date.getYear() is unreliable --
113
+ // see http://www.quirksmode.org/js/introdate.html#year
114
+ var y = this.getYear() % 100;
115
+ return (y < 38) ? y + 2000 : y + 1900;
116
+ }
117
+
118
+ Date.prototype.getTwoDigitMonth = function() {
119
+ return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);
120
+ }
121
+
122
+ Date.prototype.getTwoDigitDate = function() {
123
+ return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
124
+ }
125
+
126
+ Date.prototype.getTwoDigitHour = function() {
127
+ return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
128
+ }
129
+
130
+ Date.prototype.getTwoDigitMinute = function() {
131
+ return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
132
+ }
133
+
134
+ Date.prototype.getTwoDigitSecond = function() {
135
+ return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
136
+ }
137
+
138
+ Date.prototype.getISODate = function() {
139
+ return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate();
140
+ }
141
+
142
+ Date.prototype.getHourMinute = function() {
143
+ return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
144
+ }
145
+
146
+ Date.prototype.getHourMinuteSecond = function() {
147
+ return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
148
+ }
149
+
150
+ // ----------------------------------------------------------------------------
151
+ // String object extensions
152
+ // ----------------------------------------------------------------------------
153
+ String.prototype.pad_left = function(pad_length, pad_string) {
154
+ var new_string = this;
155
+ for (var i = 0; new_string.length < pad_length; i++) {
156
+ new_string = pad_string + new_string;
157
+ }
158
+ return new_string;
159
+ }
160
+
161
+ // ----------------------------------------------------------------------------
162
+ // Get the computed style for and element
163
+ // ----------------------------------------------------------------------------
164
+ function getStyle(oElm, strCssRule){
165
+ var strValue = "";
166
+ if(document.defaultView && document.defaultView.getComputedStyle){
167
+ strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
168
+ }
169
+ else if(oElm.currentStyle){
170
+ strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
171
+ return p1.toUpperCase();
172
+ });
173
+ strValue = oElm.currentStyle[strCssRule];
174
+ }
175
+ return strValue;
176
+ }