rsence 2.1.11 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. data/INSTALL.rdoc +5 -3
  2. data/README.rdoc +23 -22
  3. data/VERSION +1 -1
  4. data/conf/default_conf.yaml +65 -29
  5. data/conf/rsence_command_strings.yaml +101 -71
  6. data/js/comm/autosync/autosync.js +3 -3
  7. data/js/comm/jsloader/jsloader.js +16 -3
  8. data/js/comm/queue/queue.js +1 -1
  9. data/js/comm/transporter/transporter.js +106 -83
  10. data/js/comm/values/values.js +8 -2
  11. data/js/controls/button/button.js +9 -4
  12. data/js/controls/button/themes/default/button.css +1 -1
  13. data/js/controls/checkbox/themes/default/checkbox.css +1 -1
  14. data/js/controls/dialogs/sheet/sheet.js +27 -18
  15. data/js/controls/radiobutton/themes/default/radiobutton.css +1 -1
  16. data/js/controls/searchfield/searchfield.coffee +2 -0
  17. data/js/controls/searchfield/themes/default/searchfield.css +96 -0
  18. data/js/controls/searchfield/themes/default/searchfield.html +12 -0
  19. data/js/controls/searchfield/themes/default/searchfield_parts1-ie6.gif +0 -0
  20. data/js/controls/searchfield/themes/default/searchfield_parts1.png +0 -0
  21. data/js/controls/sliders/slider/slider.js +7 -1
  22. data/js/controls/stepper/stepper.js +6 -1
  23. data/js/controls/stringview/stringview.js +50 -39
  24. data/js/controls/tab/tab.js +103 -7
  25. data/js/controls/tab/themes/default/tab.css +2 -0
  26. data/js/controls/textarea/themes/default/textarea.css +4 -0
  27. data/js/controls/textcontrol/textcontrol.js +32 -2
  28. data/js/controls/textcontrol/themes/default/textcontrol.css +17 -2
  29. data/js/controls/uploader/themes/default/uploader.css +3 -3
  30. data/js/controls/uploader/themes/default/uploader.html +1 -1
  31. data/js/controls/uploader/uploader.coffee +110 -0
  32. data/js/controls/window/themes/default/window.css +28 -5
  33. data/js/controls/window/themes/default/window.html +2 -0
  34. data/js/controls/window/window.js +5 -1
  35. data/js/core/class/class.js +22 -4
  36. data/js/core/elem/elem.coffee +816 -0
  37. data/js/core/event/event.js +2 -2
  38. data/js/core/rsence_ns/rsence_ns.coffee +31 -0
  39. data/js/core/rsence_ns/rsence_ns.js +6 -6
  40. data/js/datetime/calendar/calendar.coffee +307 -0
  41. data/js/datetime/calendar/themes/default/calendar.css +90 -9
  42. data/js/datetime/calendar/themes/default/calendar.html +11 -0
  43. data/js/datetime/calendar/themes/default/calendar_bg-ie6.gif +0 -0
  44. data/js/datetime/calendar/themes/default/calendar_bg.png +0 -0
  45. data/js/datetime/calendar/themes/default/calendar_parts1-ie6.gif +0 -0
  46. data/js/datetime/calendar/themes/default/calendar_parts1.png +0 -0
  47. data/js/datetime/calendar/themes/default/calendar_parts2-ie6.gif +0 -0
  48. data/js/datetime/calendar/themes/default/calendar_parts2.png +0 -0
  49. data/js/datetime/datetimepicker/datetimepicker.js +217 -0
  50. data/js/datetime/datetimevalue/datetimevalue.js +22 -5
  51. data/js/datetime/timesheet/themes/default/timesheet.css +51 -22
  52. data/js/datetime/timesheet/themes/default/timesheet.html +4 -2
  53. data/js/datetime/timesheet/timesheet.js +782 -192
  54. data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -11
  55. data/js/datetime/timesheet_item/themes/default/timesheet_item.html +4 -2
  56. data/js/datetime/timesheet_item/themes/default/timesheet_item_icons.png +0 -0
  57. data/js/datetime/timesheet_item/timesheet_item.js +158 -254
  58. data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +0 -274
  59. data/js/foundation/application/application.js +52 -9
  60. data/js/foundation/control/eventresponder/eventresponder.js +7 -4
  61. data/js/foundation/control/valueaction/valueaction.js +71 -0
  62. data/js/foundation/eventmanager/eventmanager.js +71 -33
  63. data/js/foundation/geom/rect/rect.js +39 -7
  64. data/js/foundation/json_renderer/json_renderer.js +278 -62
  65. data/js/foundation/locale_settings/locale_settings.js +131 -0
  66. data/js/foundation/system/system.js +40 -13
  67. data/js/foundation/thememanager/thememanager.js +21 -0
  68. data/js/foundation/view/markupview/markupview.js +12 -12
  69. data/js/foundation/view/view.js +221 -27
  70. data/js/graphics/svgcontrol/svgcontrol.js +400 -0
  71. data/js/lists/checkboxlist/checkboxlist.js +18 -7
  72. data/js/lists/listitems/listitems.js +52 -38
  73. data/js/lists/radiobuttonlist/radiobuttonlist.js +23 -7
  74. data/js/menus/menuitem/menuitem.js +5 -0
  75. data/js/menus/menuitem/themes/default/menuitem.css +45 -0
  76. data/js/menus/menuitem/themes/default/menuitem.html +4 -0
  77. data/js/menus/minimenu/minimenu.js +47 -16
  78. data/js/menus/minimenuitem/minimenuitem.js +62 -0
  79. data/js/menus/{minimenu/minimenuitem → minimenuitem}/themes/default/minimenuitem.css +2 -2
  80. data/js/menus/{minimenu/minimenuitem → minimenuitem}/themes/default/minimenuitem.html +0 -0
  81. data/js/menus/{minimenu/minimenuitem → minimenuitem}/themes/default/minimenuitem_checkmark.png +0 -0
  82. data/js/menus/popupmenu/popupmenu.js +14 -0
  83. data/js/menus/popupmenu/themes/default/popupmenu.css +65 -0
  84. data/js/menus/popupmenu/themes/default/popupmenu.html +7 -0
  85. data/js/menus/popupmenu/themes/default/popupmenu.png +0 -0
  86. data/js/no_pkg/no_pkg.js +2 -0
  87. data/js/util/reloadapp/reloadapp.js +1 -1
  88. data/js/views/scrollview/scrollview.js +6 -0
  89. data/lib/rsence.rb +136 -3
  90. data/lib/rsence/argv.rb +218 -0
  91. data/lib/rsence/argv/argv_util.rb +58 -0
  92. data/lib/rsence/argv/env_check.rb +58 -0
  93. data/lib/rsence/argv/help_argv.rb +15 -0
  94. data/lib/rsence/argv/initenv_argv.rb +218 -0
  95. data/lib/rsence/argv/save_argv.rb +92 -0
  96. data/lib/rsence/argv/startup_argv.rb +118 -0
  97. data/lib/rsence/argv/status_argv.rb +132 -0
  98. data/lib/rsence/argv/test_port.rb +32 -0
  99. data/lib/{daemon → rsence}/daemon.rb +67 -23
  100. data/lib/{conf/default.rb → rsence/default_config.rb} +18 -10
  101. data/lib/{plugins → rsence}/dependencies.rb +0 -0
  102. data/lib/{util → rsence}/gzstring.rb +0 -0
  103. data/lib/rsence/http.rb +3 -0
  104. data/lib/{http → rsence/http}/broker.rb +106 -19
  105. data/lib/{http → rsence/http}/rackup.rb +0 -0
  106. data/lib/{http → rsence/http}/request.rb +0 -4
  107. data/lib/{http → rsence/http}/response.rb +0 -1
  108. data/lib/{session → rsence}/msg.rb +17 -1
  109. data/lib/{plugins → rsence}/pluginmanager.rb +29 -12
  110. data/lib/{plugins → rsence}/plugins.rb +7 -7
  111. data/lib/{plugins → rsence/plugins}/gui_plugin.rb +8 -3
  112. data/lib/{plugins → rsence/plugins}/guiparser.rb +9 -6
  113. data/lib/{plugins → rsence/plugins}/plugin.rb +23 -4
  114. data/lib/{plugins → rsence/plugins}/plugin_base.rb +11 -1
  115. data/lib/{plugins → rsence/plugins}/plugin_plugins.rb +2 -2
  116. data/lib/{plugins → rsence/plugins}/plugin_sqlite_db.rb +0 -0
  117. data/lib/{plugins → rsence/plugins}/servlet.rb +0 -0
  118. data/lib/{session → rsence}/sessionmanager.rb +101 -39
  119. data/lib/{session → rsence}/sessionstorage.rb +30 -16
  120. data/lib/{daemon → rsence}/sigcomm.rb +0 -0
  121. data/lib/{transporter → rsence}/transporter.rb +13 -11
  122. data/lib/{values/hvalue.rb → rsence/value.rb} +6 -1
  123. data/lib/{values → rsence}/valuemanager.rb +1 -1
  124. data/plugins/client_pkg/client_pkg.rb +14 -4
  125. data/plugins/client_pkg/info.yaml +2 -2
  126. data/plugins/client_pkg/lib/client_pkg_build.rb +145 -45
  127. data/plugins/client_pkg/lib/client_pkg_cache.rb +1 -1
  128. data/plugins/client_pkg/lib/client_pkg_serve.rb +1 -1
  129. data/plugins/main/main.rb +43 -3
  130. data/plugins/main/tmpl/index.html +2 -10
  131. data/plugins/main/values.yaml +3 -1
  132. data/plugins/ticket/lib/common.rb +6 -3
  133. data/plugins/ticket/ticket.rb +11 -3
  134. metadata +144 -174
  135. data/js/comm/autosync/js.inc +0 -0
  136. data/js/comm/js.inc +0 -0
  137. data/js/comm/jsloader/js.inc +0 -0
  138. data/js/comm/queue/js.inc +0 -0
  139. data/js/comm/session/js.inc +0 -0
  140. data/js/comm/sessionwatcher/js.inc +0 -0
  141. data/js/comm/transporter/js.inc +0 -0
  142. data/js/comm/urlresponder/js.inc +0 -0
  143. data/js/comm/values/js.inc +0 -0
  144. data/js/controls/button/js.inc +0 -0
  145. data/js/controls/checkbox/js.inc +0 -0
  146. data/js/controls/dialogs/alert_sheet/js.inc +0 -0
  147. data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
  148. data/js/controls/dialogs/sheet/js.inc +0 -0
  149. data/js/controls/imageview/js.inc +0 -0
  150. data/js/controls/passwordcontrol/js.inc +0 -0
  151. data/js/controls/progress/progressbar/js.inc +0 -0
  152. data/js/controls/progress/progressindicator/js.inc +0 -0
  153. data/js/controls/radiobutton/js.inc +0 -0
  154. data/js/controls/sliders/slider/js.inc +0 -0
  155. data/js/controls/sliders/vslider/js.inc +0 -0
  156. data/js/controls/stepper/js.inc +0 -0
  157. data/js/controls/stringview/js.inc +0 -0
  158. data/js/controls/tab/js.inc +0 -0
  159. data/js/controls/textarea/js.inc +0 -0
  160. data/js/controls/textcontrol/js.inc +0 -0
  161. data/js/controls/uploader/js.inc +0 -0
  162. data/js/controls/uploader/uploader.js +0 -154
  163. data/js/controls/validatorview/js.inc +0 -0
  164. data/js/controls/window/js.inc +0 -0
  165. data/js/core/class/js.inc +0 -0
  166. data/js/core/elem/elem.js +0 -1325
  167. data/js/core/elem/js.inc +0 -0
  168. data/js/core/event/js.inc +0 -0
  169. data/js/core/iefix/js.inc +0 -0
  170. data/js/core/rsence_ns/js.inc +0 -0
  171. data/js/datetime/calendar/calendar.js +0 -198
  172. data/js/datetime/calendar/js.inc +0 -0
  173. data/js/datetime/datetimevalue/js.inc +0 -0
  174. data/js/datetime/timesheet/js.inc +0 -0
  175. data/js/datetime/timesheet/old_timesheet.js +0 -292
  176. data/js/datetime/timesheet/themes/default/old_timesheet.css +0 -30
  177. data/js/datetime/timesheet/themes/default/old_timesheet.html +0 -2
  178. data/js/datetime/timesheet_item/js.inc +0 -0
  179. data/js/datetime/timesheet_item/old_timesheet_item.js +0 -308
  180. data/js/datetime/timesheet_item/themes/default/old_timesheet_item.css +0 -42
  181. data/js/datetime/timesheet_item/themes/default/old_timesheet_item.html +0 -8
  182. data/js/datetime/timesheet_item_edit/js.inc +0 -0
  183. data/js/datetime/timesheet_item_edit/old_timesheet_item_edit.js +0 -274
  184. data/js/foundation/application/js.inc +0 -0
  185. data/js/foundation/control/controldefaults/js.inc +0 -0
  186. data/js/foundation/control/dummyvalue/js.inc +0 -0
  187. data/js/foundation/control/dyncontrol/js.inc +0 -0
  188. data/js/foundation/control/eventresponder/js.inc +0 -0
  189. data/js/foundation/control/js.inc +0 -0
  190. data/js/foundation/control/valuematrix/js.inc +0 -0
  191. data/js/foundation/control/valueresponder/js.inc +0 -0
  192. data/js/foundation/eventmanager/js.inc +0 -0
  193. data/js/foundation/geom/point/js.inc +0 -0
  194. data/js/foundation/geom/rect/js.inc +0 -0
  195. data/js/foundation/json_renderer/js.inc +0 -0
  196. data/js/foundation/system/js.inc +0 -0
  197. data/js/foundation/thememanager/js.inc +0 -0
  198. data/js/foundation/value/js.inc +0 -0
  199. data/js/foundation/view/js.inc +0 -0
  200. data/js/foundation/view/markupview/js.inc +0 -0
  201. data/js/foundation/view/morphanimation/js.inc +0 -0
  202. data/js/foundation/view/viewdefaults/js.inc +0 -0
  203. data/js/lists/checkboxlist/js.inc +0 -0
  204. data/js/lists/listitems/js.inc +0 -0
  205. data/js/lists/propertylist/js.inc +0 -0
  206. data/js/lists/propertylist/propertylisteditor/js.inc +0 -0
  207. data/js/lists/radiobuttonlist/js.inc +0 -0
  208. data/js/menus/minimenu/js.inc +0 -0
  209. data/js/menus/minimenu/minimenuitem/js.inc +0 -0
  210. data/js/menus/minimenu/minimenuitem/minimenuitem.js +0 -33
  211. data/js/util/reloadapp/js.inc +0 -0
  212. data/js/util/sha/js.inc +0 -0
  213. data/js/views/centerview/js.inc +0 -0
  214. data/js/views/inlineview/js.inc +0 -0
  215. data/js/views/scrollview/js.inc +0 -0
  216. data/lib/conf/argv.rb +0 -880
@@ -15,7 +15,7 @@
15
15
  <div class="button_edge_left"></div>
16
16
  <div class="button_center"></div>
17
17
  <div class="button_edge_right"></div>
18
- <div class="button_label">OK</div>
18
+ <div class="button_label">#{this.getLocaleString('HUploader.strings.ok')}</div>
19
19
  <div class="button_antiselect"></div>
20
20
  </div>
21
21
  <form id="form#{this.elemId}" name="upload_form_#{this.elemId}" enctype="multipart/form-data" method="POST" action="/U/NoUploadKey" target="upload_target_#{this.elemId}" class="uploader_form">
@@ -0,0 +1,110 @@
1
+ ## RSence
2
+ # Copyright 2008-2011 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+ # The default locale settings, may be overridden on the server.
10
+ HLocale.components.HUploader =
11
+ strings:
12
+ ok: 'OK'
13
+ stateLabels:
14
+ # Upload success states:
15
+ '0': "Select file...",
16
+ '1': "Uploading...",
17
+ '2': "Processing data...",
18
+ '3': "Upload Complete",
19
+ '4': "Preparing upload",
20
+ # Upload failure states:
21
+ '-1': "Error: Invalid request",
22
+ '-2': "Error: Invalid upload key",
23
+ '-3': "Error: Invalid data format",
24
+ '-4': "Error: File too big",
25
+ '-6': "Error: Post-processing failed"
26
+
27
+ HUploader = HControl.extend
28
+ componentName: 'uploader'
29
+ uploadState: false
30
+ uploadKey: false
31
+ markupElemNames: [
32
+ 'form',
33
+ 'file',
34
+ 'iframe',
35
+ 'upload_progress',
36
+ 'progress_label',
37
+ 'progress_indicator',
38
+ 'button',
39
+ 'button_label',
40
+ 'value',
41
+ 'ack_button'
42
+ ]
43
+
44
+ defaultEvents:
45
+ click: true
46
+
47
+ setUploadKey: (_uploadKey, _label)->
48
+ @setStyleOfPart( 'upload_progress', 'visibility', 'hidden' )
49
+ @setStyleOfPart( 'progress_indicator', 'visibility', 'hidden' )
50
+ @setStyleOfPart( 'ack_button', 'visibility', 'hidden' )
51
+ @setMarkupOfPart( 'button_label', _label )
52
+ @setStyleOfPart( 'button', 'visibility', 'inherit' )
53
+ @setStyleOfPart( 'form', 'visibility', 'inherit' )
54
+ @setAttrOfPart( 'form', 'action', '/U/'+_uploadKey, true )
55
+ @setAttrOfPart( 'file', 'value', '', true )
56
+ @uploadKey = _uploadKey
57
+
58
+ setProgressState: (_state, _label)->
59
+ @setStyleOfPart( 'upload_progress', 'visibility', 'inherit' )
60
+ if _state == 3
61
+ @setStyleOfPart( 'progress_indicator', 'visibility', 'hidden' )
62
+ @setStyleOfPart( 'ack_button', 'visibility', 'inherit' )
63
+ else
64
+ @setStyleOfPart( 'progress_indicator', 'visibility', 'inherit' )
65
+ @setStyleOfPart( 'ack_button', 'visibility', 'hidden' )
66
+ @setMarkupOfPart( 'progress_label', _label )
67
+ @setStyleOfPart( 'button', 'visibility', 'hidden' )
68
+ @setStyleOfPart( 'form', 'visibility', 'hidden' )
69
+ if _state == 1
70
+ @elemOfPart( 'form' ).submit()
71
+
72
+ setErrorState: (_label)->
73
+ @setStyleOfPart( 'progress_indicator', 'visibility', 'hidden' )
74
+ @setStyleOfPart( 'ack_button', 'visibility', 'inherit' )
75
+ @setMarkupOfPart( 'progress_label', '<span style="color:red;">'+_label+'</span>' )
76
+ @setStyleOfPart( 'button', 'visibility', 'hidden' )
77
+ @setStyleOfPart( 'form', 'visibility', 'hidden' )
78
+
79
+ setUploadState: (_state, _uploadKey)->
80
+ if _state != @uploadState
81
+ @uploadState = _state
82
+ _stateKey = _state.toString()
83
+ _stateLabels = HLocale.components.HUploader.strings.stateLabels
84
+ if _stateLabels[_stateKey]?
85
+ _label = _stateLabels[_stateKey]
86
+ ELEM.get(@markupElemIds.value).value = @valueObj.id
87
+ if _state == 0
88
+ @setUploadKey( _uploadKey, _label )
89
+ else if _state >= 1 and _state <= 4
90
+ @setProgressState( _state, _label )
91
+ else if _state < 0
92
+ @setErrorState( _label )
93
+
94
+ refreshValue: ->
95
+ return unless typeof @value == 'string'
96
+ return if @value.indexOf(':::') == -1
97
+ _stateAndKey = @value.split(':::')
98
+ return unless _stateAndKey.length == 2
99
+ @setUploadState(
100
+ parseInt( _stateAndKey[0], 10),
101
+ _stateAndKey[1]
102
+ )
103
+ upload: ->
104
+ @setValue( '1:::'+@uploadKey )
105
+
106
+ getNewUploadKey: ->
107
+ @setValue( '4:::'+@uploadKey )
108
+
109
+ click: ->
110
+ @getNewUploadKey() if @uploadState == 3 or @uploadState < 0
@@ -1,5 +1,5 @@
1
1
 
2
-
2
+ .window_shadow,
3
3
  .window_titlebar,
4
4
  .window_titlebar_edge_left,
5
5
  .window_titlebar_center,
@@ -23,6 +23,29 @@
23
23
  cursor: inherit;
24
24
  background-repeat: no-repeat;
25
25
  }
26
+ .window_bg, .window_body {
27
+ opacity: 0.95;
28
+ }
29
+ .window_titlebar {
30
+ opacity: 0.97;
31
+ }
32
+ .inactive .window_titlebar {
33
+ opacity: 0.95;
34
+ }
35
+
36
+ .window_shadow {
37
+ left: 4px; right: 4px; top: 4px; bottom: 4px;
38
+ overflow: visible;
39
+ -moz-box-shadow: 3px 3px 20px #333, 3px 3px 10px #000;
40
+ -webkit-box-shadow: 3px 3px 20px #333, 3px 3px 10px #000;
41
+ box-shadow: 3px 3px 20px #333, 3px 3px 10px #000;
42
+ }
43
+
44
+ .inactive .window_shadow {
45
+ -moz-box-shadow: 3px 3px 13px #333;
46
+ -webkit-box-shadow: 3px 3px 13px #333;
47
+ box-shadow: 3px 3px 13px #333;
48
+ }
26
49
 
27
50
  .window_controls * {
28
51
  cursor: pointer;
@@ -134,7 +157,7 @@
134
157
 
135
158
  .window_label {
136
159
  left: 0px; top: 0px; right: 0px; height: 24px;
137
- line-height: 25px;
160
+ line-height: 26px;
138
161
  text-align: center;
139
162
  vertical-align: middle;
140
163
  font-family: Arial, sans-serif;
@@ -177,7 +200,7 @@
177
200
  }
178
201
 
179
202
  .window_controls_close {
180
- left: 8px;
203
+ #{BROWSER_TYPE.mac?'left':'right'}: 8px;
181
204
  background-position: 0px 0px;
182
205
  }
183
206
 
@@ -191,7 +214,7 @@
191
214
 
192
215
 
193
216
  .window_controls_collapse {
194
- left: 27px;
217
+ #{BROWSER_TYPE.mac?'left: 27px':'right: 46px'};
195
218
  background-position: -30px 0px;
196
219
  }
197
220
 
@@ -205,7 +228,7 @@
205
228
 
206
229
 
207
230
  .window_controls_zoom {
208
- left: 46px;
231
+ #{BROWSER_TYPE.mac?'left: 46px':'right: 27px'};
209
232
  background-position: -15px 0px;
210
233
  }
211
234
 
@@ -1,3 +1,5 @@
1
+ ${this.setStyle('overflow','visible')}
2
+ <div class="window_shadow"></div>
1
3
  <div class="window_titlebar">
2
4
  <div class="window_titlebar_edge_left"></div>
3
5
  <div class="window_titlebar_center"></div>
@@ -173,7 +173,9 @@ HWindow = HDynControl.extend({
173
173
  }
174
174
  return _rect;
175
175
  },
176
-
176
+
177
+ hasWindowFocus: false,
178
+
177
179
  /** Reports to HSystem that this window has the focus and the
178
180
  * previously active window needs to blur
179
181
  **/
@@ -184,6 +186,7 @@ HWindow = HDynControl.extend({
184
186
  /** HSystem calls this method, whenever this window is allowed to be focused
185
187
  **/
186
188
  windowFocus: function(){
189
+ this.hasWindowFocus = true;
187
190
  this.toggleCSSClass(this.elemId, 'inactive', false);
188
191
  },
189
192
 
@@ -191,6 +194,7 @@ HWindow = HDynControl.extend({
191
194
  * focus (another window focused)
192
195
  **/
193
196
  windowBlur: function(){
197
+ this.hasWindowFocus = false;
194
198
  this.toggleCSSClass(this.elemId, 'inactive', true);
195
199
  this.setStyle('cursor','default');
196
200
  },
@@ -70,7 +70,7 @@ HClass.prototype = {
70
70
  /* The property copying method. */
71
71
  extend: function(_source, _value) {
72
72
  var _extend = HClass.prototype.extend,
73
- _ancestor, _method, _previous, _returnValue, i, _name, _prototype, _protected;
73
+ _ancestor, _method, _returnValue, i, _name, _prototype, _protected;
74
74
  if (arguments.length === 2) {
75
75
  _ancestor = this[_source];
76
76
  // only methods are inherited
@@ -79,7 +79,7 @@ HClass.prototype = {
79
79
  _method = _value;
80
80
  _value = function() {
81
81
  // saves the this.base that is the this.base method of this child
82
- _previous = this.base;
82
+ var _previous = this.base;
83
83
  // copies previous this.base from the direction from HClass
84
84
  this.base = _ancestor;
85
85
  // current class's method is called
@@ -129,6 +129,10 @@ HClass.prototype = {
129
129
  } )
130
130
  )( arguments );
131
131
  };
132
+ this.hasAncestor = function( _obj ){
133
+ return this.ancestors.indexOf( _obj ) !== -1;
134
+ };
135
+ this['new'] = this.nu;
132
136
  return this;
133
137
  },
134
138
  /** = Description
@@ -189,7 +193,8 @@ HClass.prototype = {
189
193
  HClass.extend = function(_instance, _static) {
190
194
  // reference to HClass's prototype extend method (HClass's class structure extend method)
191
195
  var _extend = HClass.prototype.extend,
192
- _prototype, _constructor, _klass, _object;
196
+ _prototype, _constructor, _klass, _object,
197
+ _ancestors, i=0;
193
198
  // if _instance is undefined,null,"" etc. creates object so that code below works
194
199
  if (!_instance) {
195
200
  _instance = {};
@@ -205,11 +210,13 @@ HClass.extend = function(_instance, _static) {
205
210
  _prototype.constructor = this;
206
211
  delete HClass._prototyping;
207
212
 
213
+ _ancestors = [];
208
214
  _klass = function() {
209
215
  if (!HClass._prototyping) {
210
216
  _constructor.apply(this, arguments);
211
217
  }
212
218
  this.constructor = _klass;
219
+ this.ancestors = _ancestors;
213
220
  };
214
221
  // this is the new class's prototype (class structure)
215
222
  _klass.prototype = _prototype;
@@ -231,8 +238,14 @@ HClass.extend = function(_instance, _static) {
231
238
  if (_object.init instanceof Function) {
232
239
  _object.init();
233
240
  }
241
+ _ancestors.push( _object );
242
+ for( ; i < this.ancestors.length; i++ ){
243
+ _ancestors.push( this.ancestors[i] );
244
+ }
245
+ _object.ancestors = _ancestors;
234
246
  return _object;
235
247
  };
248
+ HClass.ancestors = [ HClass ];
236
249
 
237
250
  /** = Description
238
251
  * Copies the prototype properties and methods from _interface or if it is an object it's properties and functions
@@ -300,6 +313,12 @@ if ([]['indexOf']===undefined) {
300
313
  };
301
314
  }
302
315
 
316
+ // String fix
317
+ if(typeof String.prototype.trim !== 'function') {
318
+ String.prototype.trim = function() {
319
+ return this.replace(/^\s+|\s+$/g, '');
320
+ };
321
+ }
303
322
 
304
323
  // ff version 3.0.3 fails on this, when firebug installed: try/catch block
305
324
  try {
@@ -315,4 +334,3 @@ if(window['console']===undefined){
315
334
 
316
335
  } catch(e) {}
317
336
 
318
-
@@ -0,0 +1,816 @@
1
+
2
+ ###
3
+ BROWSER_TYPE contains browser types.
4
+ Used for quick checks mostly in layout code
5
+ ###
6
+ BROWSER_TYPE =
7
+ mac: false
8
+ win: false
9
+ ie: false
10
+ ie6: false
11
+ ie7: false
12
+ ie8: false
13
+ ie9: false
14
+ ie10: false
15
+ opera: false
16
+ safari: false
17
+ symbian: false
18
+ chrome: false
19
+ firefox: false
20
+ firefox2: false
21
+ firefox3: false
22
+ firefox4: false # version 4 or newer
23
+
24
+ ###
25
+ The DOM Element abstraction engine
26
+ ###
27
+ ELEM = HClass.extend
28
+
29
+ constructor: null
30
+
31
+ ###
32
+ Main control for refresh speed
33
+ ###
34
+ ELEMTickerInterval: 33
35
+
36
+ ###
37
+ Sets up object members
38
+ ###
39
+ reset: ->
40
+
41
+ # Startup queue stuff
42
+ @_domLoadQueue = []
43
+ @_domLoadTimer = null
44
+
45
+ # Flag which turns to true, when the document body is detected as loaded
46
+ @_domLoadStatus = false
47
+
48
+ @_flushTime = 0
49
+ @_flushCounter = 0
50
+ @_idleDelay = 500
51
+
52
+ @_timer = null
53
+ @_minDelay = @ELEMTickerInterval
54
+ @_flushing = false
55
+ @_needFlush = false
56
+ @_slowness = 1
57
+
58
+ @_elements = {}
59
+ @_nextElemId = 0
60
+ @_freeElemIds = []
61
+
62
+ @_styleCache = {}
63
+ @_styleTodo = {}
64
+ @_attrTodo = {}
65
+ @_attrCache = {}
66
+ @_elemTodo = []
67
+ @_elemTodoH = {}
68
+ @_blockElems = ",ADDRESS,BLOCKQUOTE,CENTER,DIR,DIV,DL,FIELDSET,FORM,H1,H2,H3,H4,H5,H6,HR,ISINDEX,MENU,NOFRAMES,NOSCRIPT,OL,P,PRE,TABLE,UL,"
69
+ null
70
+
71
+ ###
72
+ Adds an element reference
73
+ Returns the element id
74
+ ###
75
+ _add: (_elem)->
76
+ if @_freeElemIds.length != 0
77
+ _id = @_freeElemIds.shift()
78
+ else
79
+ _id = @_nextElemId
80
+ @_nextElemId++
81
+ @_elements[_id] = _elem
82
+ _id
83
+
84
+ ###
85
+ Initializes cache object helpers
86
+ ###
87
+ _initCache: (_id)->
88
+ @_styleTodo[_id] = []
89
+ @_styleCache[_id] = {}
90
+ @_attrTodo[_id] = []
91
+ @_attrCache[_id] = {}
92
+ @_elemTodoH[_id] = false
93
+ null
94
+
95
+ ###
96
+ Adds an existing document element by its id attribute
97
+ ###
98
+ bindId: (_attrId)->
99
+ _elem = document.getElementById( _attrId )
100
+ _id = @_add( _elem )
101
+ @_initCache( _id )
102
+ _id
103
+
104
+ ###
105
+ Binds the document element
106
+ ###
107
+ bind: (_elem)->
108
+ _id = @_add( _elem )
109
+ @_initCache( _id )
110
+ _id
111
+
112
+ ###
113
+ Returns an element by its id
114
+ ###
115
+ get: (_id)->
116
+ @_elements[_id]
117
+
118
+ ###
119
+ Sets the innerHTML contents of the element
120
+ ###
121
+ setHTML: (_id, _html)->
122
+ @_elements[_id].innerHTML = _html unless @_elements[_id].innerHTML == _html
123
+ null
124
+
125
+ ###
126
+ Returns the innerHTML of the element
127
+ ###
128
+ getHTML: (_id)->
129
+ @_elements[_id].innerHTML
130
+
131
+ ###
132
+ Deletes an element and its associated metadata
133
+ ###
134
+ del: (_id)->
135
+ _elem = @_elements[_id]
136
+ i = @_elemTodo.indexOf( _id )
137
+ @_elemTodo.splice( i, 1 ) unless i == -1
138
+ delete @_attrTodo[_id]
139
+ delete @_styleCache[_id]
140
+ delete @_attrCache[_id]
141
+ delete @_elemTodoH[_id]
142
+ delete @_elements[_id]
143
+ @_freeElemIds.push(_id)
144
+ _elem.parentNode.removeChild( _elem )
145
+ null
146
+
147
+ ###
148
+ Places the source element inside the target element
149
+ ###
150
+ append: (_srcId, _tgtId)->
151
+ @_elements[_tgtId].appendChild @_elements[_srcId]
152
+
153
+ ###
154
+ Replaces all styles of an element with a block of css text
155
+ ###
156
+ setCSS: (_id, _css)->
157
+ @_elements[_id].style.cssText = _css
158
+ null
159
+
160
+ ###
161
+ Returns the current css text of an element
162
+ ###
163
+ getCSS: (_id)->
164
+ @_elements[_id].style.cssText
165
+
166
+ ###
167
+ Returns the visible size of an element as a [ width, height ] tuple
168
+ ###
169
+ getVisibleSize: (_id)->
170
+ _elem = @_elements[_id]
171
+ [ _body, _visible, _overflow ] = [ 'body', 'visible', 'overflow' ]
172
+ [ w, h ] = [ _elem.offsetWidth, _elem.offsetHeight ]
173
+ _parent = _elem.parentNode
174
+ while _parent and _parent.nodeName.toLowerCase() != _body
175
+ if _visible == @_getComputedStyle( _parent, _overflow )
176
+ [ _parentClientWidth, _parentClientHeight ] = [ _parent.clientWidth, _parent.clientHeight ]
177
+ w = _parentClientWidth - _elem.offsetLeft if w > _parentClientWidth
178
+ h = _parentClientWidth - _elem.offsetTop if h > _parentClientHeight
179
+ _elem = _elem.parentNode
180
+ break unless _parent.parentNode
181
+ _parent = _parent.parentNode
182
+ [ w, h ]
183
+
184
+ ###
185
+ Returns the full offset size of the element as a [ width, height ] tuple
186
+ ###
187
+ getSize: (_id)->
188
+ _elem = @_elements[_id]
189
+ [ _elem.offsetWidth, _elem.offsetHeight ]
190
+
191
+ ###
192
+ Returns the position of the element as a [ x, y ] tuple
193
+ ###
194
+ getPosition: (_id)->
195
+ _elem = @_elements[_id]
196
+ [ _elem.offsetLeft, _elem.offsetTop ]
197
+
198
+ ###
199
+ Returns the scroll position of the element as a [ x, y ] tuple
200
+ ###
201
+ getScrollPosition: (_id)->
202
+ _elem = @_elements[_id]
203
+ [ _elem.scrollLeft, _elem.scrollTop ]
204
+
205
+ ###
206
+ Returns the scroll size of the element as a [ width, height ] tuple
207
+ ###
208
+ getScrollSize: (_id)->
209
+ _elem = @_elements[_id]
210
+ [ _elem.scrollWidth, _elem.scrollHeight ]
211
+
212
+ ###
213
+ Calculates the visible left position of an element
214
+ ###
215
+ _getVisibleLeftPosition: (_id)->
216
+ _elem = @_elements[_id]
217
+ x = 0
218
+ while _elem != document
219
+ x += _elem.offsetLeft - _elem.scrollLeft
220
+ _elem = _elem.parentNode
221
+ x
222
+
223
+ ###
224
+ Calculates the visible top position of an element
225
+ ###
226
+ _getVisibleTopPosition: (_id)->
227
+ _elem = @_elements[_id]
228
+ y = 0
229
+ while _elem != document
230
+ y += _elem.offsetTop - _elem.scrollTop
231
+ _elem = _elem.parentNode
232
+ y
233
+
234
+ ###
235
+ Returns the visible position of the element as a [ left, top ] tuble
236
+ ###
237
+ getVisiblePosition: (_id)->
238
+ [ @_getVisibleLeftPosition(_id), @_getVisibleTopPosition(_id) ]
239
+
240
+ ###
241
+ Returns the opacity on the element as a number equaling or between 0 and 1
242
+ ###
243
+ getOpacity: (_id)->
244
+ _elem = @_elements[_id]
245
+ _opacity = @_getComputedStyle( _elem, 'opacity' )
246
+ parseFloat( _opacity )
247
+
248
+ ###
249
+ Sets ActiveX alpha filter for IE6-8
250
+ ###
251
+ _setOpacityIE: (_id, _opacity)->
252
+ _prevFilter = @getStyle( _id, 'filter', true )
253
+ if _opacity == 1
254
+ @_elements[_id].style.setAttribute('filter', _prevFilter.replace(/alpha([^)]*)/gi, '') )
255
+ else
256
+ @_elements[_id].style.setAttribute('filter', _prevFilter.replace(/alpha([^)]*)/gi, '') + 'alpha(opacity='+(_opacity*100)+')')
257
+ null
258
+
259
+ ###
260
+ Sets the opcity of the element as a number equaling or between 0 and 1
261
+ ###
262
+ setOpacity: (_id, _opacity)->
263
+ if BROWSER_TYPE.ie6 or BROWSER_TYPE.ie7 or BROWSER_TYPE.ie8
264
+ @_setOpacityIE( _id, _opacity)
265
+ else
266
+ @_elements[_id].style.setProperty('opacity', _opacity.toString(), '')
267
+ null
268
+
269
+ ###
270
+ Wrapper for getStyle, returns an integer number instead of a string
271
+ ###
272
+ getIntStyle: (_id, _key)->
273
+ parseInt( @getStyle(_id, _key), 10 )
274
+
275
+ ###
276
+ Sets box coordinates [ x, y, width, height ]
277
+ ###
278
+ setBoxCoords: (_id, _coords)->
279
+ [ x, y, w, h ] = _coords
280
+ @setStyle( _id, 'left', x+'px' )
281
+ @setStyle( _id, 'top', y+'px' )
282
+ @setStyle( _id, 'width', w+'px' )
283
+ @setStyle( _id, 'height', h+'px' )
284
+ null
285
+
286
+ ###
287
+ Gets box coordinates [ x, y, width, height )
288
+ ###
289
+ getBoxCoords: (_id)->
290
+ [ x, y ] = @getPosition( _id )
291
+ [ w, h ] = @getSize( _id )
292
+ [ x, y, w, h ]
293
+
294
+ ###
295
+ Computes extra size (padding and border size) of element
296
+ ###
297
+ _getExtraSize: (_id, _side)->
298
+ @getIntStyle( _id, 'padding-'+_side ) + @getIntStyle( _id, 'border-'+_side+'-width' )
299
+
300
+ ###
301
+ Returns left-side padding and border size
302
+ ###
303
+ _getExtraLeftWidth: (_id)->
304
+ @_getExtraSize( _id, 'left' )
305
+
306
+ ###
307
+ Returns right-side padding and border size
308
+ ###
309
+ _getExtraRightWidth: (_id)->
310
+ @_getExtraSize( _id, 'right' )
311
+
312
+ ###
313
+ Returns top-side padding and border size
314
+ ###
315
+ _getExtraTopWidth: (_id)->
316
+ @_getExtraSize( _id, 'top' )
317
+
318
+ ###
319
+ Returns right-side padding and border size
320
+ ###
321
+ _getExtraBottomWidth: (_id)->
322
+ @_getExtraSize( _id, 'bottom' )
323
+
324
+ ###
325
+ Returns extra width of element (caused by padding and borders)
326
+ ###
327
+ getExtraWidth: (_id)->
328
+ @_getExtraSize( _id, 'left' ) + @_getExtraSize( _id, 'right' )
329
+
330
+ ###
331
+ Returns extra height of element (caused by padding and borders)
332
+ ###
333
+ getExtraHeight: (_id)->
334
+ @_getExtraSize( _id, 'top' ) + @_getExtraSize( _id, 'bottom' )
335
+
336
+ ###
337
+ Sets delay between refreshes based on the target frame rate
338
+ ###
339
+ setFPS: (_fps)->
340
+ @_minDelay = 1000/_fps
341
+ @_minDelay = @ELEMTickerInterval if @_minDelay < @ELEMTickerInterval
342
+ null
343
+
344
+ ###
345
+ Sets slowness (weighted additional multiplier for slow browsers; frame-skip)
346
+ The d-efault 1.0 does not change the FPS, larger numbers gives more time for logic by skipping frames
347
+ ###
348
+ setSlowness: (_slow)->
349
+ @_slowness = _slow
350
+ null
351
+
352
+ ###
353
+ Sets the idle delay in ms
354
+ This is the maximum time between setting a style or property into the buffer and flushing the buffer to the DOM
355
+ ###
356
+ setIdleDelay: (_idleDelay)->
357
+ @_idleDelay = _idleDelay
358
+ null
359
+
360
+ ###
361
+ A flag that signals iefix (for IE6) if it needs to re-run or not
362
+ ###
363
+ _ieFixesNeeded: false
364
+
365
+ ###
366
+ Applies fixes for IE6
367
+ ###
368
+ _ieFixes: ->
369
+ iefix._traverseTree()
370
+ @_ieFixesNeeded = false
371
+ null
372
+
373
+ ###
374
+ Re-sets the flushLoop
375
+ ###
376
+ _resetFlushLoop: (_delay, _timeDelay)->
377
+ _timeDelay = _delay unless _timeDelay
378
+ @_timer = setTimeout( ->
379
+ ELEM.flushLoop( _delay )
380
+ , _timeDelay )
381
+ null
382
+
383
+ ###
384
+ Computes a default delay time based on various params
385
+ ###
386
+ _defaultDelay: ->
387
+ _delay = Math.round( @_slowness * (@_flushTime / @_flushCounter) ) # + @ELEMTickerInterval ??
388
+ _delay = @_minDelay if _delay < @_minDelay or !_delay
389
+ _delay
390
+
391
+ ###
392
+ Flushes buffered styles and properties into the DOM
393
+ ###
394
+ flushLoop: (_delay)->
395
+ _delay = @_defaultDelay() unless _delay?
396
+ @_ieFixes() if BROWSER_TYPE.ie6 and @_ieFixesNeeded
397
+ clearTimeout(@_timer)
398
+ if @_flushing
399
+ _delay *= 2
400
+ @_resetFlushLoop( _delay )
401
+ else
402
+ unless @_needFlush
403
+ # go into 'sleep mode'
404
+ @_ieFixes() if BROWSER_TYPE.ie6 and @_ieFixesNeeded
405
+ @_resetFlushLoop( _delay, @_idleDelay )
406
+ return
407
+ _delay = @_defaultDelay()
408
+ @_flushing = true
409
+ @_resetFlushLoop( _delay )
410
+ @_performFlush()
411
+ @_flushing = false
412
+ null
413
+
414
+ # Alias for flushLoop
415
+ flush: ->
416
+ @flushLoop()
417
+
418
+ ###
419
+ Performs the flush of flushLoop
420
+ ###
421
+ _performFlush: ->
422
+ _flushStartTime = new Date().getTime()
423
+ @_flushTime -= _flushStartTime
424
+ _loopMaxL = @_elemTodo.length
425
+ if _loopMaxL > 0
426
+ _currTodo = @_elemTodo.splice( 0, _loopMaxL )
427
+ for i in [ 1.._loopMaxL ]
428
+ @_flushLoopFlushed++
429
+ _id = _currTodo.shift()
430
+ if _id == null
431
+ console.log('no id:',_id)
432
+ continue
433
+ @_elemTodoH[_id] = false
434
+ @_flushStyleCache( _id )
435
+ @_flushAttrCache( _id )
436
+ @_flushCounter++
437
+ @_flushTime += new Date().getTime()
438
+ @_needFlush = @_elemTodo.length != 0 # unless @_needFlush
439
+ null
440
+
441
+ ###
442
+ Flushes the attribute cache
443
+ ###
444
+ _flushAttrCache: (_id)->
445
+ _attrTodo = @_attrTodo[_id]
446
+ return null if _attrTodo.length == 0
447
+ _attrCache = @_attrCache[_id]
448
+ _elem = @_elements[_id]
449
+ _loopMaxL = _attrTodo.length
450
+ _currTodo = _attrTodo.splice( 0, _loopMaxL )
451
+ for i in [ 1.._loopMaxL ]
452
+ _key = _currTodo.shift()
453
+ _val = _attrCache[_key]
454
+ _elem.setAttribute( _key, _val )
455
+ null
456
+
457
+ ###
458
+ Gets an element attribute directly from the element
459
+ ###
460
+ _getAttrDirect: (_id, _key)->
461
+ _elem = @_elements[_id]
462
+ _elem.getAttribute( _key )
463
+
464
+ ###
465
+ Gets a named element attribute from the cache or selectively direct
466
+ ###
467
+ getAttr: (_id, _key, _noCache)->
468
+ if _noCache
469
+ _val = @_getAttrDirect( _id, _key )
470
+ else
471
+ _val = @_attrCache[_id][_key]
472
+ @_attrCache[_id][_key] = _val
473
+ _val
474
+
475
+ ###
476
+ Sets a named element attribute into the cache and buffer or selectively direct
477
+ ###
478
+ setAttr: (_id, _key, _value, _noCache)->
479
+ _attrTodo = @_attrTodo[_id]
480
+ _attrCache = @_attrCache[_id]
481
+ @_elements[_id].setAttribute( _key, _value ) if _noCache
482
+ _reCache = _value != @getAttr( _id, _key )
483
+ if _reCache or _noCache
484
+ _attrCache[_key] = _value
485
+ unless _noCache
486
+ _attrTodo.push( _key ) if _attrTodo.indexOf( _key ) == -1
487
+ unless @_elemTodoH[_id]
488
+ @_elemTodo.push( _id )
489
+ @_elemTodoH[ _id ] = true
490
+ @_checkNeedFlush()
491
+ null
492
+
493
+ ###
494
+ Deletes a named element attribute
495
+ ###
496
+ delAttr: (_id, _key)->
497
+ _attrTodo = @_attrtodo[_id]
498
+ _attrCache = @_attrCache[_id]
499
+ delete _attrCache[_key]
500
+ @_elements[_id].removeAttribute( _key )
501
+ _todoIndex = _attrTodo.indexOf( _key )
502
+ _attrTodo.splice( _todoIndex, 1 ) unless _todoIndex == -1
503
+ @_checkNeedFlush()
504
+ null
505
+
506
+ ###
507
+ Checks if the element has a named CSS className
508
+ ###
509
+ hasClassName: (_id, _className)->
510
+ _classNames = @_elements[_id].className.split(' ')
511
+ return _classNames.indexOf( _className ) != -1
512
+
513
+ ###
514
+ Adds a named CSS className to the element
515
+ ###
516
+ addClassName: (_id, _className)->
517
+ unless @hasClassName( _id, _className )
518
+ _elem = @_elements[_id]
519
+ if _elem.className.trim() == ''
520
+ _elem.className = _className
521
+ else
522
+ _classNames = _elem.className.trim().split(' ')
523
+ _classNames.push(_className)
524
+ _elem.className = _classNames.join(' ')
525
+ null
526
+
527
+ ###
528
+ Removes a named CSS className of the element
529
+ ###
530
+ removeClassName: (_id, _className)->
531
+ if @hasClassName( _id, _className )
532
+ _elem = @_elements[_id]
533
+ _classNames = _elem.className.split(' ')
534
+ _classNames.splice( _classNames.indexOf( _className ), 1 )
535
+ _elem.className = _classNames.join(' ')
536
+ null
537
+
538
+ ###
539
+ Checks if buffers need to be flushed
540
+ ###
541
+ _checkNeedFlush: ->
542
+ unless @_needFlush
543
+ @_needFlush = true
544
+ unless @_flushing
545
+ clearTimeout( @_timer)
546
+ @_resetFlushLoop( @_minDelay )
547
+ null
548
+
549
+ ###
550
+ Low-level style property setter
551
+ ###
552
+ _setElementStyle: (_elem, _key, _value)->
553
+ _elem.style.setProperty( _key, _value, '' )
554
+ null
555
+
556
+ ###
557
+ Camelizes string (mostly used for IE attribute name conversions)
558
+ ###
559
+ _camelize: (_str)->
560
+ _str.replace( /((-)([a-z])(\w))/g, ($0, $1, $2, $3, $4)->
561
+ $3.toUpperCase()+$4
562
+ )
563
+
564
+ ###
565
+ Decamelizes string (used for js property to css property conversion)
566
+ ###
567
+ _deCamelize: (_str)->
568
+ _str.replace( /(([A-Z])(\w))/g, ($0, $1, $2, $3)->
569
+ '-'+$2.toLowerCase()+$3
570
+ )
571
+
572
+ ###
573
+ IE version of _setElementStyle
574
+ ###
575
+ _setElementStyleIE: (_elem, _key, _value)->
576
+ _elem.style[@_camelize(_key)] = _value
577
+ if BROWSER_TYPE.ie6
578
+ unless iefix._traverseStyleProperties.indexOf(_key) == -1
579
+ @_ieFixesNeeded = true
580
+ null
581
+
582
+ ###
583
+ Sets and buffers the named style attribute value or selectively direct
584
+ ###
585
+ setStyle: (_id, _key, _value, _noCache)->
586
+ if _id == undefined
587
+ console.log('ERROR; undefined id in ELEM#setStyle(',_id, _key, _value, _noCache,')')
588
+ _noCache = true if BROWSER_TYPE.ie9
589
+ try
590
+ _cached = @_styleCache[_id]
591
+ catch e
592
+ console.error( e, this )
593
+ _elem = @_elements[_id]
594
+ if _cached == undefined
595
+ @_initCache( _id )
596
+ _cached = @_styleCache[_id]
597
+ _key = @_deCamelize( _key )
598
+ unless _value == _cached[_key]
599
+ _cached[_key] = _value
600
+ if _noCache
601
+ if _key == 'opacity'
602
+ @setOpacity( _id, _value )
603
+ else
604
+ @_setElementStyle( _elem, _key, _value )
605
+ else
606
+ _styleTodo = @_styleTodo[_id]
607
+ _styleTodo.push( _key ) if _styleTodo.indexOf( _key ) == -1
608
+ unless @_elemTodoH[_id]
609
+ @_elemTodo.push( _id )
610
+ @_elemTodoH[_id] = true
611
+ @_checkNeedFlush()
612
+ null
613
+
614
+ ###
615
+ Creates a new element inside another element
616
+ ###
617
+ make: (_targetId, _tagName, _options)->
618
+ _targetId = 0 if _targetId == undefined
619
+ if _tagName == undefined
620
+ _tagName = 'DIV'
621
+ else
622
+ _tagName = _tagName.toUpperCase()
623
+ _elem = document.createElement( _tagName )
624
+ _id = @_add( _elem )
625
+ @_initCache( _id )
626
+ unless _options == undefined
627
+ if _options.attrs
628
+ for _attr in _options.attrs
629
+ @setAttr( _id, _attr[0], _attr[1], true )
630
+ @_elements[_targetId].appendChild(_elem)
631
+ _id
632
+
633
+ ###
634
+ Returns inner size of the browser window as [ width, height ]
635
+ ###
636
+ windowSize: ->
637
+ _size = [ window.innerWidth, window.innerHeight ]
638
+ if _size[0] == undefined or _size[1] == undefined
639
+ _docElem = document.documentElement
640
+ _size = [ _docElem.clientWidth, _docElem.clientHeight ]
641
+ _size
642
+
643
+ ###
644
+ Returns computed style of element
645
+ ###
646
+ _getComputedStyle: (_elem, _key)->
647
+ document.defaultView.getComputedStyle( _elem, null ).getPropertyValue( _key )
648
+
649
+ ###
650
+ IE version of _getComputedStyle
651
+ ###
652
+ _getComputedStyleIE: (_elem, _key)->
653
+ return _elem.clientWidth if _key == 'width'
654
+ return _elem.clientHeight if _key == 'height'
655
+ _elem.currentStyle[@_camelize(_key)]
656
+
657
+ ###
658
+ Gets the named element style attribute value.
659
+ ###
660
+ getStyle: (_id, _key, _noCache)->
661
+ _cached = @_styleCache[_id]
662
+ _key = @_deCamelize(_key)
663
+ if _cached[_key] == undefined or _noCache
664
+ if _key == 'opacity'
665
+ _value = @getOpacity(_id)
666
+ else
667
+ _value = @_getComputedStyle( @_elements[_id], _key )
668
+ _value = -1 if _key == 'z-index' and _value == 'auto'
669
+ _cached[_key] = _value
670
+ else
671
+ _value = _cached[_key]
672
+ _value
673
+
674
+ ###
675
+ Style buffer flushing method
676
+ ###
677
+ _flushStyleCache: (_id)->
678
+ _elem = @_elements[_id]
679
+ return unless _elem
680
+ _styleTodo = @_styleTodo[_id]
681
+ _cached = @_styleCache[_id]
682
+ _loopMaxP = _styleTodo.length
683
+ return null if _loopMaxP == 0
684
+ _currTodo = _styleTodo.splice( 0, _loopMaxP )
685
+ for i in [ 1.._loopMaxP ]
686
+ _key = _currTodo.shift()
687
+ if _key == 'opacity'
688
+ @setOpacity( _id, _cached[_key] )
689
+ else
690
+ console.log( 'invalid style key:',_elem, _key, _cached) unless _key
691
+ @_setElementStyle( _elem, _key, _cached[_key] )
692
+ null
693
+
694
+ ###
695
+ Final phase of startup, when document is loaded
696
+ ###
697
+ _init: ->
698
+ RSenceInit() if RSenceInit?
699
+ if BROWSER_TYPE.ie
700
+ @_getComputedStyle = @_getComputedStyleIE
701
+ @_setElementStyle = @_setElementStyleIE
702
+ @bind( document.body ) unless @_timer
703
+ if BROWSER_TYPE.symbian
704
+ TestClass = HClass.extend({test:true, constructor:null})
705
+ # The Symbian JS implementation gets corrupted if the page is reloaded (loaded from cache), this tests that:
706
+ unless TestClass.test
707
+ if confirm('Your Web Browser fails. Please restart the S60 Web Browser or install a better browser.\nDo you want to download and install Opera Mobile now?')
708
+ location.href = 'http://www.opera.com/download/get.pl?sub=++++&id=32792&location=270&nothanks=yes'
709
+ # Can't do anything with such badly broken js engine
710
+ return
711
+ @_flushDomLoadQueue() until @_initDone
712
+ @_resetFlushLoop( @_minDelay )
713
+ null
714
+
715
+ ###
716
+ Runs a cmd
717
+ ###
718
+ _runCmd: (_cmd)->
719
+ _type = ( typeof _cmd )
720
+ if _type == 'function'
721
+ _cmd.call()
722
+ else if _type == 'string'
723
+ console.log("Evaluation of LOAD strings no longer supported. Please convert to anonymous function: "+_cmd)
724
+ null
725
+
726
+ ###
727
+ Processes the queue for tasks to run upon completion of document load
728
+ ###
729
+ _flushDomLoadQueue: ->
730
+ if @_domLoadQueue.length == 0
731
+ @_initDone = true
732
+ return
733
+ else
734
+ @_runCmd( @_domLoadQueue.shift() )
735
+ null
736
+
737
+ ###
738
+ Does browser version checks and starts the document loaded check poll
739
+ ###
740
+ _warmup: ->
741
+ _ua = navigator.userAgent
742
+ _browserType = BROWSER_TYPE
743
+ _browserType.opera = _ua.indexOf('Opera') != -1
744
+ _browserType.safari = _ua.indexOf('KHTML') != -1
745
+ _browserType.symbian = _ua.indexOf('SymbianOS') != -1
746
+ _browserType.chrome = _ua.indexOf('Chrome') != -1
747
+ _isIE = document.all and not _browserType.opera
748
+ if _isIE
749
+ _browserType.ie = _isIE
750
+ _browserType.ie6 = _ua.indexOf('MSIE 6') != -1
751
+ _browserType.ie7 = _ua.indexOf('MSIE 7') != -1
752
+ _browserType.ie8 = _ua.indexOf('MSIE 8') != -1
753
+ _browserType.ie9 = _ua.indexOf('MSIE 9') != -1
754
+ _browserType.ie10 = _ua.indexOf('MSIE 10') != -1
755
+ unless _browserType.ie9
756
+ _browserType.ie9 = _browserType.ie10 # IE 10 is treated like IE 9
757
+ _browserType.mac = _ua.indexOf('Macintosh') != -1
758
+ _browserType.win = _ua.indexOf('Windows') != -1
759
+ _browserType.firefox = _ua.indexOf('Firefox') != -1
760
+ _browserType.firefox2 = _ua.indexOf('Firefox/2.') != -1
761
+ _browserType.firefox3 = _ua.indexOf('Firefox/3.') != -1
762
+ _browserType.firefox4 = _browserType.firefox and not _browserType.firefox2 and not _browserType.firefox3
763
+ @_domWaiter()
764
+ null
765
+
766
+ ###
767
+ Adds tasks to run when the document load check is completed
768
+ ###
769
+ _domLoader: (_cmd)->
770
+ if ELEM._initDone
771
+ ELEM._runCmd( _cmd )
772
+ else
773
+ ELEM._domLoadQueue.push( _cmd )
774
+ null
775
+
776
+ ###
777
+ Checks if the document is fully loaded
778
+ ###
779
+ _domWaiter: ->
780
+ if BROWSER_TYPE.ie6 or BROWSER_TYPE.ie7 or BROWSER_TYPE.ie8
781
+ if location.protocol == 'https:'
782
+ _ie_proto = 'src=//0'
783
+ else
784
+ _ie_proto = 'javascript:void(0)'
785
+ _s1 = '<scr'
786
+ _s2 = 'ipt id=__ie_onload defer src='
787
+ _s3 = '></scr'
788
+ _s4 = 'ipt>'
789
+ document.write(_s1+_s2+_ie_proto+_s3+_s4)
790
+ document.getElementById('__ie_onload').onreadystatechange = ->
791
+ if this.readyState == 'complete'
792
+ clearTimeout( ELEM._domLoadTimer )
793
+ ELEM._domLoadStatus = true
794
+ ELEM._init()
795
+ return
796
+ else if BROWSER_TYPE.safari and document.readyState == 'complete'
797
+ ELEM._domLoadStatus = true
798
+ else if document.body
799
+ ELEM._domLoadStatus = true
800
+
801
+ if ELEM._domLoadStatus
802
+ clearTimeout( @_domLoadTimer )
803
+ BROWSER_TYPE.symbian = document.body.innerHTML == 'fastinnerhtml!' if BROWSER_TYPE.symbian
804
+ @_init()
805
+ else
806
+ ELEM._domLoadTimer = setTimeout( =>
807
+ ELEM._domWaiter()
808
+ , 10 )
809
+ null
810
+ ELEM.reset()
811
+
812
+ ElementManager = ELEM
813
+
814
+ LOAD = ELEM._domLoader
815
+
816
+ ELEM._warmup()