rsence-pre 3.0.0.10 → 3.0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/client/conf/client_pkg.yaml +17 -1
- data/client/ext/Rakefile +42 -12
- data/client/js/comm/transporter/transporter.js +1 -0
- data/client/js/controls/numerictextcontrol/numerictextcontrol.coffee +10 -11
- data/client/js/controls/searchfield/themes/default/searchfield.css +56 -91
- data/client/js/controls/searchfield/themes/default/searchfield.html +10 -10
- data/client/js/controls/textcontrol/textcontrol.coffee +71 -65
- data/client/js/core/elem/elem.coffee +5 -0
- data/client/js/datetime/datepicker/datepicker.coffee +1 -0
- data/client/js/datetime/momentjs/momentjs.js +12 -4
- data/client/js/foundation/control/eventresponder/eventresponder.js +14 -0
- data/client/js/foundation/json_renderer/json_renderer.js +12 -12
- data/client/js/foundation/view/view.js +13 -4
- data/client/js/lists/radiobuttonlist/radiobuttonlist.js +9 -8
- data/client/js/media/mediaelement/mediaelement.js +1890 -0
- data/client/js/media/mediaelement_defaults/mediaelement_defaults.coffee +1 -0
- data/client/js/media/mediaelement_resources/mediaelement_resources.js +1 -0
- data/client/js/media/mediaelement_resources/themes/mejs/flashmediaelement.swf +0 -0
- data/client/js/media/mediaelement_resources/themes/mejs/mediaelement_resources.css +0 -0
- data/client/js/media/mediaelement_resources/themes/mejs/mediaelement_resources.html +0 -0
- data/client/js/media/mediaelement_resources/themes/mejs/silverlightmediaelement.xap +0 -0
- data/client/js/menus/combobox/combobox.coffee +6 -1
- data/client/js/menus/menuitem/themes/default/menuitem.css +5 -8
- data/client/js/menus/minimenu/minimenu.js +2 -2
- data/client/js/menus/minimenu/themes/default/minimenu.css +6 -22
- data/client/js/menus/minimenuitem/themes/default/minimenuitem.css +5 -8
- data/client/js/menus/popupmenu/themes/default/popupmenu.css +6 -27
- data/plugins/client_pkg/lib/client_pkg_build.rb +5 -1
- metadata +8 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9b6d8279d4e6c4428be24337adf68655670640e
|
4
|
+
data.tar.gz: 0a2beb7fecc41ddb17883bd6b41bcebebc85eed1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44011410d1f605a478e1e29ac4116c6235326ac5e0b80c33fe0624b2f1b6763828e3dbb600ac61a34f2bd1f90f145fd66d9b1dab1602047b7bdbf5bad5c34ecf
|
7
|
+
data.tar.gz: 074b547410ecac12f7ba3f9600aacbe4f966c41f6b54541f1c8fbe6d3c1bf8932324aa6a484358e117a2d0500871c7dad0d376d3a1d3e78f4c8f3759741772f1
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.0.
|
1
|
+
3.0.0.11.pre
|
data/client/conf/client_pkg.yaml
CHANGED
@@ -7,6 +7,8 @@
|
|
7
7
|
# List of theme names to include and pack
|
8
8
|
:theme_names:
|
9
9
|
- default # Makes default_theme.js containing css and html templates
|
10
|
+
- mejs # MediaElement.js resources
|
11
|
+
# - codemirror # default CodeMirror css theme
|
10
12
|
|
11
13
|
# List of packages to build
|
12
14
|
:packages:
|
@@ -24,7 +26,7 @@
|
|
24
26
|
- event # Event
|
25
27
|
- util_methods # UtilMethods
|
26
28
|
|
27
|
-
- locale_settings
|
29
|
+
- locale_settings # HLocaleSettings
|
28
30
|
|
29
31
|
# RSence.Foundation
|
30
32
|
- system # HSystem
|
@@ -64,6 +66,14 @@
|
|
64
66
|
- scrollview # HScrollView
|
65
67
|
- inlineview # HInlineView
|
66
68
|
|
69
|
+
mediaelement:
|
70
|
+
- mediaelement # MediaElement
|
71
|
+
- mediaelement_resources # MediaElement resources (swf and xap)
|
72
|
+
- mediaelement_defaults # default settings for MediaElement
|
73
|
+
|
74
|
+
# codemirror:
|
75
|
+
# - codemirror # CodeMirror
|
76
|
+
|
67
77
|
# The default collection of simple control widgets (components)
|
68
78
|
controls:
|
69
79
|
- button # HButton
|
@@ -152,6 +162,11 @@
|
|
152
162
|
- graphics
|
153
163
|
- chat
|
154
164
|
- servermessage
|
165
|
+
media:
|
166
|
+
- mejs_theme
|
167
|
+
- mediaelement
|
168
|
+
# code:
|
169
|
+
# - codemirror
|
155
170
|
std_widgets:
|
156
171
|
- default_theme
|
157
172
|
- controls
|
@@ -180,6 +195,7 @@
|
|
180
195
|
- .gif
|
181
196
|
- .png
|
182
197
|
- .swf
|
198
|
+
- .xap
|
183
199
|
- .svg
|
184
200
|
- .pdf
|
185
201
|
|
data/client/ext/Rakefile
CHANGED
@@ -1,18 +1,48 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
if File.exist?
|
7
|
-
`cd "#{
|
2
|
+
$ext_path = File.split(__FILE__).first
|
3
|
+
$js_path = File.expand_path( 'js', File.split( $ext_path ).first )
|
4
|
+
|
5
|
+
def git_pull(url,proj_path)
|
6
|
+
if File.exist? proj_path
|
7
|
+
`cd "#{proj_path}"; git pull`
|
8
8
|
else
|
9
|
-
`git clone #{
|
9
|
+
`git clone #{url} "#{proj_path}"`
|
10
10
|
end
|
11
|
-
client_path = File.split( path ).first
|
12
|
-
src_js = File.expand_path( 'moment.js', moment_path )
|
13
|
-
tgt_js = File.expand_path( 'js/datetime/momentjs/momentjs.js', client_path )
|
14
|
-
`cp #{src_js} #{tgt_js}`
|
15
11
|
end
|
16
12
|
|
17
|
-
|
13
|
+
def ext_path( dir_name )
|
14
|
+
File.expand_path( dir_name, $ext_path )
|
15
|
+
end
|
16
|
+
|
17
|
+
def cp_rsrc( proj_path, proj_file, target_path )
|
18
|
+
src = File.expand_path( proj_file, proj_path )
|
19
|
+
tgt = File.expand_path( target_path, $js_path )
|
20
|
+
cp( src, tgt )
|
21
|
+
end
|
22
|
+
|
23
|
+
task :momentjs do
|
24
|
+
moment_url = 'https://github.com/timrwood/moment.git'
|
25
|
+
moment_path = ext_path( 'moment' )
|
26
|
+
git_pull( moment_url, moment_path )
|
27
|
+
cp_rsrc( moment_path, 'moment.js', 'datetime/momentjs/momentjs.js' )
|
28
|
+
end
|
29
|
+
|
30
|
+
task :mediaelement do
|
31
|
+
mediaelement_url = 'https://github.com/jammi/mediaelement.git'
|
32
|
+
mediaelement_path = ext_path( 'mediaelement' )
|
33
|
+
git_pull( mediaelement_url, mediaelement_path )
|
34
|
+
cp_rsrc( mediaelement_path, 'build/mediaelement.js', 'media/mediaelement/mediaelement.js' )
|
35
|
+
cp_rsrc( mediaelement_path, 'build/flashmediaelement.swf', 'media/mediaelement_resources/themes/mejs/flashmediaelement.swf' )
|
36
|
+
cp_rsrc( mediaelement_path, 'build/silverlightmediaelement.xap', 'media/mediaelement_resources/themes/mejs/silverlightmediaelement.xap' )
|
37
|
+
end
|
38
|
+
|
39
|
+
task :codemirror do
|
40
|
+
codemirror_url = 'https://github.com/marijnh/CodeMirror.git'
|
41
|
+
codemirror_path = ext_path( 'codemirror' )
|
42
|
+
git_pull( codemirror_url, codemirror_path )
|
43
|
+
cp_rsrc( codemirror_path, 'lib/codemirror.js', 'code/codemirror/codemirror.js' )
|
44
|
+
cp_rsrc( codemirror_path, 'lib/codemirror.css', 'code/codemirror/themes/codemirror/codemirror.css' )
|
45
|
+
end
|
46
|
+
|
47
|
+
task :all => [ :momentjs, :mediaelement, :codemirror ]
|
18
48
|
task :default => :all
|
@@ -145,6 +145,7 @@ COMM.Transporter = HApplication.extend({
|
|
145
145
|
_values = _responseArray[1],
|
146
146
|
_session = COMM.Session,
|
147
147
|
_queue = COMM.Queue,
|
148
|
+
_outputScript,
|
148
149
|
_errorText;
|
149
150
|
if(_sesKey === ''){
|
150
151
|
console.log('Invalid session, error message should follow...');
|
@@ -35,7 +35,9 @@ HNumericTextControl = HTextControl.extend
|
|
35
35
|
else
|
36
36
|
_value = _value+@options.numberIncrement
|
37
37
|
_value = @validateNumber(_value)
|
38
|
-
@setValue(
|
38
|
+
@setValue(_value) if @_isValid
|
39
|
+
@setTextFieldValue( _value, true )
|
40
|
+
true
|
39
41
|
|
40
42
|
keyDown: (_key)->
|
41
43
|
if _key == Event.KEY_UP
|
@@ -48,6 +50,10 @@ HNumericTextControl = HTextControl.extend
|
|
48
50
|
|
49
51
|
_numbers: ['0','1','2','3','4','5','6','7','8','9']
|
50
52
|
validateNumber: (_value)->
|
53
|
+
if isNaN( _value )
|
54
|
+
_value = @value
|
55
|
+
console.log('isNaN')
|
56
|
+
@setValid(false)
|
51
57
|
if @options.decimalNumber
|
52
58
|
_value = parseFloat(_value)
|
53
59
|
if @options.decimalPlaces != null
|
@@ -55,9 +61,6 @@ HNumericTextControl = HTextControl.extend
|
|
55
61
|
_value = Math.round(_value*_decPlaces)/_decPlaces
|
56
62
|
else
|
57
63
|
_value = parseInt( _value, 10 )
|
58
|
-
if isNaN( _value )
|
59
|
-
_value = @value
|
60
|
-
@setValid(false)
|
61
64
|
if _value > @maxValue
|
62
65
|
_value = @maxValue
|
63
66
|
@setValid(false)
|
@@ -82,12 +85,8 @@ HNumericTextControl = HTextControl.extend
|
|
82
85
|
valueToField: (_value)->
|
83
86
|
_value = @validateNumber(_value)
|
84
87
|
if @options.decimalNumber and @options.decimalPlaces != null
|
85
|
-
|
86
|
-
|
87
|
-
for n in [0...@options.decimalPlaces]
|
88
|
-
_value += '0'
|
89
|
-
else
|
90
|
-
_value = _value.toString().replace('.',@options.decimalSeparator)
|
88
|
+
_value = _value.toFixed(@options.decimalPlaces)
|
89
|
+
_value = _value.replace('.',@options.decimalSeparator)
|
91
90
|
_value
|
92
91
|
|
93
92
|
refreshValue: ->
|
@@ -101,7 +100,7 @@ HNumericTextControl = HTextControl.extend
|
|
101
100
|
# validateText: (_value)-> _value
|
102
101
|
|
103
102
|
drawSubviews: ->
|
104
|
-
@setStyleOfPart('value','textAlign','right')
|
103
|
+
@setStyleOfPart('value','textAlign','right') unless @options.style? and @options.style.textAlign
|
105
104
|
if @options.withStepper
|
106
105
|
this._extraLabelRight += 14
|
107
106
|
@setStyleOfPart('label','right',this._extraLabelRight+'px')
|
@@ -1,107 +1,72 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
.default.searchfield {
|
2
|
+
overflow: visible;
|
3
|
+
}
|
4
|
+
.default.searchfield > .input_parent {
|
5
|
+
position: absolute; z-index: 2;
|
6
|
+
left: 1px; top: 1px; right: 1px; bottom: 1px;
|
7
|
+
}
|
8
|
+
.default.searchfield > .input_parent > .input {
|
9
|
+
position: absolute; display: block;
|
10
|
+
font-family: Helvetica, Arial, sans-serif; line-height: 18px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden;
|
11
|
+
font-size: 13px; color: #000;
|
8
12
|
background-color: transparent;
|
9
13
|
vertical-align: middle;
|
10
|
-
border:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
#{(
|
17
|
-
(BROWSER_TYPE.firefox||BROWSER_TYPE.ie7||BROWSER_TYPE.ie8||BROWSER_TYPE.ie9||BROWSER_TYPE.ie10||BROWSER_TYPE.opera)?
|
18
|
-
'padding-left:2px;width:85% !important;height:90% !important;':
|
19
|
-
'padding:2px;padding-top:4px;right:3px;height:22px;width:auto;'
|
20
|
-
)}
|
14
|
+
border: 0; left: 18px; top: 0;
|
15
|
+
right: 0; bottom: 0;
|
16
|
+
width: 100%; height: 100%;
|
17
|
+
-moz-box-sizing: border-box;
|
18
|
+
-webkit-box-sizing: border-box;
|
19
|
+
box-sizing: border-box;
|
21
20
|
}
|
22
|
-
|
23
|
-
|
24
|
-
outline-color: transparent;
|
25
|
-
outline-style: none;
|
21
|
+
.default.searchfield > .input_parent > .input::-ms-clear {
|
22
|
+
display: none;
|
26
23
|
}
|
27
|
-
|
28
|
-
.default .
|
29
|
-
color:
|
24
|
+
.default.searchfield.disabled > .input_parent > .input { color: #333; }
|
25
|
+
.default.searchfield > .input_parent > .input:focus {
|
26
|
+
outline-color: transparent; outline-style: none;
|
30
27
|
}
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
'left:0;padding-left:1px;top:0;right:4px;bottom:0;':
|
37
|
-
'left:-2px;top:-2px;right:-2px;height:24px;'
|
38
|
-
)}
|
28
|
+
.default.searchfield > .input_parent > .input_invalid {
|
29
|
+
position: absolute; white-space: nowrap; overflow: hidden;
|
30
|
+
vertical-align: bottom; visibility: hidden;
|
31
|
+
bottom: 1px; font-size: 10px; line-height: 6px;
|
32
|
+
color: #c00; z-index: 0; font-weight: bold;
|
39
33
|
}
|
40
34
|
|
41
|
-
|
42
|
-
.default .
|
43
|
-
.default .
|
44
|
-
.default .
|
45
|
-
|
46
|
-
height: 24px;
|
35
|
+
|
36
|
+
.default.searchfield > .fade,
|
37
|
+
.default.searchfield > .bg > .e,
|
38
|
+
.default.searchfield > .bg > .w,
|
39
|
+
.default.searchfield > .bg > .c {
|
40
|
+
position: absolute; height: 24px;
|
47
41
|
background-repeat: no-repeat;
|
48
42
|
background-image: #url(searchfield_parts1.png);
|
49
43
|
}
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
background-position: -48px 0px;
|
44
|
+
.default.searchfield > .fade {
|
45
|
+
right: 0; top: 0; width: 10px;
|
46
|
+
background-position: -48px 0;
|
54
47
|
}
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
background-position: -24px 0px;
|
48
|
+
.default.searchfield > .bg > .e {
|
49
|
+
right: 0; top: 0; width: 24px;
|
50
|
+
background-position: -24px 0;
|
59
51
|
}
|
60
|
-
|
61
|
-
|
62
|
-
left: 24px; right: 24px; top: 0px;
|
52
|
+
.default.searchfield > .bg > .c {
|
53
|
+
left: 24px; right: 24px; top: 0;
|
63
54
|
background-repeat: repeat-x;
|
64
|
-
background-position:
|
65
|
-
}
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
}
|
71
|
-
|
72
|
-
.default
|
73
|
-
|
74
|
-
}
|
75
|
-
|
76
|
-
.default .
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
.default .disabled > .searchfield_c {
|
81
|
-
background-position: 0px -120px;
|
82
|
-
}
|
83
|
-
|
84
|
-
.default .disabled > .searchfield_w {
|
85
|
-
background-position: 0px -96px;
|
86
|
-
}
|
87
|
-
|
88
|
-
.default .active > .searchfield_fade {
|
89
|
-
background-position: -48px -48px;
|
90
|
-
}
|
91
|
-
|
92
|
-
.default .active > .searchfield_e {
|
93
|
-
background-position: -24px -48px;
|
94
|
-
}
|
95
|
-
|
96
|
-
.default .active > .searchfield_c {
|
97
|
-
background-position: 0px -72px;
|
98
|
-
}
|
99
|
-
|
100
|
-
.default .active > .searchfield_w {
|
101
|
-
background-position: 0px -48px;
|
102
|
-
}
|
103
|
-
|
104
|
-
.default > .searchfield_help {
|
55
|
+
background-position: 0 -24px;
|
56
|
+
}
|
57
|
+
.default.searchfield > .bg > .w {
|
58
|
+
left: 0; top: 0; width: 24px;
|
59
|
+
background-position: 0 0;
|
60
|
+
}
|
61
|
+
.default.searchfield.disabled > .fade { background-position: -48px -96px; }
|
62
|
+
.default.searchfield.disabled > .bg > .e { background-position: -24px -96px; }
|
63
|
+
.default.searchfield.disabled > .bg > .c { background-position: 0 -120px; }
|
64
|
+
.default.searchfield.disabled > .bg > .w { background-position: 0 -96px; }
|
65
|
+
.default.searchfield.active > .fade { background-position: -48px -48px; }
|
66
|
+
.default.searchfield.active > .bg > .e { background-position: -24px -48px; }
|
67
|
+
.default.searchfield.active > .bg > .c { background-position: 0 -72px; }
|
68
|
+
.default.searchfield.active > .bg > .w { background-position: 0 -48px; }
|
69
|
+
.default.searchfield > .help {
|
105
70
|
position: absolute;
|
106
71
|
left: 24px; top: 5px; right: 8px; height: 18px;
|
107
72
|
color: #888;
|
@@ -1,11 +1,11 @@
|
|
1
|
-
<div class="
|
2
|
-
<div class="
|
3
|
-
<div class="
|
4
|
-
<div class="
|
5
|
-
<div id="label]I[" title="#{this.label}" class="searchfield_input_parent">
|
6
|
-
<input type="text" class="searchfield_input" #{this.enabled?'':'disabled'}
|
7
|
-
onfocus="HSystem.views[#{this.viewId}].textFocus();"
|
8
|
-
onblur="HSystem.views[#{this.viewId}].textBlur();"
|
9
|
-
id="value]I[" value="#{this.value}" />
|
1
|
+
<div class="bg" id="bg]I[">
|
2
|
+
<div class="w"></div>
|
3
|
+
<div class="c"></div>
|
4
|
+
<div class="e"></div>
|
10
5
|
</div>
|
11
|
-
<div class="
|
6
|
+
<div class="help" id="help]I[" >#{this.options.helpText}</div>
|
7
|
+
<div id="subview]I[" class="subview"></div>
|
8
|
+
<div id="label]I[" title="#{this.label}" class="input_parent">
|
9
|
+
<div class="input_invalid" id="invalid]I["></div>
|
10
|
+
</div>
|
11
|
+
<div class="fade"></div>
|
@@ -131,15 +131,38 @@ HTextControl = HControl.extend
|
|
131
131
|
else
|
132
132
|
@_setInvalidMarker()
|
133
133
|
|
134
|
+
resize: ->
|
135
|
+
@_ie8fix() if BROWSER_TYPE.ie8
|
136
|
+
|
137
|
+
_ie8fix: ->
|
138
|
+
h = @rect.height-4
|
139
|
+
@setStyleOfPart('value','paddingTop','2px')
|
140
|
+
@setStyleOfPart('value','lineHeight',h+'px')
|
141
|
+
|
142
|
+
_snatchField: (_parentId,_id)->
|
143
|
+
_idType = @typeChr(_id)
|
144
|
+
if _idType == 's'
|
145
|
+
_elemId = ELEM.bindId(_id)
|
146
|
+
else if _idType == 'n'
|
147
|
+
_elemId = ELEM.get(_id)
|
148
|
+
else
|
149
|
+
console.warn('Unknown id type for snatchField:',_id,' (type:'+_idType+'); assuming element...') if !@isProducton
|
150
|
+
_elemId = ELEM.bind(_id)
|
151
|
+
ELEM.moveToParent(_elemId,_parentId)
|
152
|
+
_elemId
|
153
|
+
|
134
154
|
fieldType: 'text'
|
135
155
|
drawMarkup: ->
|
136
156
|
@base()
|
137
157
|
@_invalidCharWidth = @stringWidth(@_invalidChar,null,@markupElemIds.invalid)
|
138
158
|
_parentId = @markupElemIds.label
|
139
|
-
if @
|
140
|
-
_elemId =
|
159
|
+
if @options.snatchField?
|
160
|
+
_elemId = @_snatchField(_parentId,@options.snatchField)
|
141
161
|
else
|
142
|
-
|
162
|
+
if @multiline
|
163
|
+
_elemId = ELEM.make(_parentId,'textarea')
|
164
|
+
else
|
165
|
+
_elemId = ELEM.make(_parentId,'input',{attr:{type:@fieldType,value:@value}})
|
143
166
|
@markupElemIds.value = _elemId
|
144
167
|
@setCSSClass('value','input')
|
145
168
|
Event.observe(_elemId,'focus',=>@textFocus())
|
@@ -147,6 +170,9 @@ HTextControl = HControl.extend
|
|
147
170
|
if @options.focusOnCreate
|
148
171
|
@getInputElement().focus()
|
149
172
|
@setSelectionRange( @value.length, @value.length ) if @typeChr(@value) == 's'
|
173
|
+
if BROWSER_TYPE.ie8
|
174
|
+
@setResize( true ) unless @events.resize
|
175
|
+
@_ie8fix()
|
150
176
|
|
151
177
|
lostActiveStatus: (_prevActive)->
|
152
178
|
@base(_prevActive)
|
@@ -261,20 +287,17 @@ HTextControl = HControl.extend
|
|
261
287
|
## = Parameters
|
262
288
|
## +_value+:: The value to set.
|
263
289
|
###
|
264
|
-
setTextFieldValue: (_value)->
|
290
|
+
setTextFieldValue: (_value, _override)->
|
265
291
|
_inputElement = @getInputElement()
|
266
292
|
return unless _inputElement?
|
267
293
|
[ _selectionStart, _selectionEnd ] = @getSelectionRange()
|
268
294
|
_value = @valueToField(_value)
|
269
295
|
@_lastFieldValue = _value
|
270
|
-
|
296
|
+
if not @hasTextFocus or _override
|
271
297
|
_inputElement.value = _value if _inputElement.value != _value.toString()
|
272
298
|
@setSelectionRange( _selectionStart, _selectionEnd )
|
273
299
|
@setValid(true) if _inputElement.value == _value
|
274
300
|
|
275
|
-
# returns a random number prefixed and suffixed with '---'
|
276
|
-
_randomMarker: -> '---'+Math.round((1+Math.random())*10000)+'---'
|
277
|
-
|
278
301
|
die: ->
|
279
302
|
@getInputElement().blur() if @hasTextFocus
|
280
303
|
clearTimeout(@_refreshTimer) if @_refreshTimer
|
@@ -289,68 +312,46 @@ HTextControl = HControl.extend
|
|
289
312
|
###
|
290
313
|
_getLeftAlignedSelectionRange: ->
|
291
314
|
_inputElement = @getInputElement()
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
315
|
+
_rangeArr = [ 0, 0 ]
|
316
|
+
# if _inputElement == null or @hasTextFocus == false
|
317
|
+
# _rangeArr = [ 0, 0 ]
|
318
|
+
## All except Internet Explorer
|
319
|
+
if _inputElement.selectionStart?
|
296
320
|
_rangeArr = [ _inputElement.selectionStart, _inputElement.selectionEnd ]
|
297
321
|
## Internet Explorer:
|
298
|
-
else if document.selection
|
299
|
-
# create a range object
|
322
|
+
else if document.selection and document.selection.createRange
|
300
323
|
_range = document.selection.createRange()
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
324
|
+
if _range and _range.parentElement() == _inputElement
|
325
|
+
_len = _inputElement.value.length
|
326
|
+
_normalizedValue = _inputElement.value.replace(/\r\n/g, "\n")
|
327
|
+
# Create a working TextRange that lives only in the input
|
328
|
+
_textInputRange = _inputElement.createTextRange()
|
329
|
+
_textInputRange.moveToBookmark( _range.getBookmark() )
|
330
|
+
|
331
|
+
# Check if the start and end of the selection are at the very end
|
332
|
+
# of the input, since moveStart/moveEnd doesn't return what we want
|
333
|
+
# in those cases
|
334
|
+
_endRange = _inputElement.createTextRange()
|
335
|
+
_endRange.collapse(false)
|
336
|
+
|
337
|
+
if ~_textInputRange.compareEndPoints("StartToEnd", _endRange)
|
338
|
+
_rangeArr = [ _len, _len ]
|
339
|
+
else
|
340
|
+
_rangeArr[0] = 0-_textInputRange.moveStart("character", 0-_len)
|
341
|
+
_rangeArr[0] += (_normalizedValue.slice(0, _rangeArr[0]).split("\n").length - 1)
|
342
|
+
if ~_textInputRange.compareEndPoints("EndToEnd", _endRange)
|
343
|
+
_rangeArr[1] = _len
|
344
|
+
else
|
345
|
+
_rangeArr[1] = 0-_textInputRange.moveEnd("character", 0-_len)
|
346
|
+
_rangeArr[1] += (_normalizedValue.slice(0, _rangeArr[1]).split("\n").length - 1)
|
320
347
|
return _rangeArr
|
321
348
|
_getRightAlignedSelectionRange: ->
|
322
349
|
_inputElement = @getInputElement()
|
323
350
|
_inputValue = _inputElement.value
|
324
351
|
_valueLength = _inputValue.length
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
else if _inputElement.selectionStart
|
329
|
-
_rangeArr = [ _valueLength-_inputElement.selectionStart, _valueLength-_inputElement.selectionEnd ]
|
330
|
-
## Internet Explorer:
|
331
|
-
else if document.selection
|
332
|
-
# create a range object
|
333
|
-
_range = document.selection.createRange()
|
334
|
-
# original range text
|
335
|
-
_rangeText = _range.text
|
336
|
-
_rangeLength = _rangeText.length
|
337
|
-
# make a copy of the text and replace \r\n with \n
|
338
|
-
_origValue = _inputElement.value.replace(/\r\n/g, "\n")
|
339
|
-
# create random marker to replace the text with
|
340
|
-
_marker = @_randomMarker()
|
341
|
-
# re-generate marker if it's found in the text.
|
342
|
-
_marker = @_randomMarker() while ~_origValue.indexOf( _marker )
|
343
|
-
_markerLength = _marker.length
|
344
|
-
# temporarily set the text of the selection to the unique marker
|
345
|
-
_range.text = _marker
|
346
|
-
_markerValue = _inputElement.value.replace(/\r\n/g, "\n")
|
347
|
-
_range.text = _rangeText
|
348
|
-
_markerIndex = _markerValue.indexOf( _marker )
|
349
|
-
_rangeArr = [ _valueLength-_markerIndex, _valueLength-_markerIndex + _rangeLength ]
|
350
|
-
## No support:
|
351
|
-
else
|
352
|
-
_rangeArr = [ 0, 0 ]
|
353
|
-
return _rangeArr
|
352
|
+
_range = @_getLeftAlignedSelectionRange()
|
353
|
+
_range = [ _valueLength-_range[0], _valueLength-_range[1] ]
|
354
|
+
_range
|
354
355
|
getSelectionRange: ->
|
355
356
|
return @_getRightAlignedSelectionRange() if @styleOfPart('value','textAlign') == 'right'
|
356
357
|
@_getLeftAlignedSelectionRange()
|
@@ -381,8 +382,7 @@ HTextControl = HControl.extend
|
|
381
382
|
###
|
382
383
|
setSelectionRange: ( _selectionStart, _selectionEnd )->
|
383
384
|
if @typeChr( _selectionStart ) == 'a'
|
384
|
-
_selectionEnd = _selectionStart
|
385
|
-
_selectionStart = _selectionStart[0];
|
385
|
+
[ _selectionStart, _selectionEnd ] = _selectionStart
|
386
386
|
unless _selectionEnd?
|
387
387
|
_selectionEnd = _selectionStart
|
388
388
|
_inputElement = @getInputElement()
|
@@ -394,7 +394,13 @@ HTextControl = HControl.extend
|
|
394
394
|
# Internet Explorer
|
395
395
|
if _inputElement.createTextRange
|
396
396
|
_range = _inputElement.createTextRange()
|
397
|
-
_range.
|
397
|
+
_range.collapse()
|
398
|
+
_selectionEnd = _selectionEnd - _selectionStart
|
399
|
+
if _selectionEnd == 0
|
400
|
+
_range.move( 'character', _selectionStart )
|
401
|
+
else
|
402
|
+
_range.moveStart( 'character', _selectionStart )
|
403
|
+
_range.moveEnd( 'character', _selectionEnd )
|
398
404
|
_range.select()
|
399
405
|
# Other browsers:
|
400
406
|
else if _inputElement.selectionStart
|
@@ -157,6 +157,11 @@ ELEM = HClass.extend
|
|
157
157
|
append: (_srcId, _tgtId)->
|
158
158
|
@_elements[_tgtId].appendChild @_elements[_srcId]
|
159
159
|
|
160
|
+
moveToParent: (_id,_parentId)->
|
161
|
+
_elem = @_elements[_id]
|
162
|
+
_elem.parentNode.removeChild( _elem )
|
163
|
+
@_elements[_parentId].appendChild( _elem )
|
164
|
+
|
160
165
|
###
|
161
166
|
Replaces all styles of an element with a block of css text
|
162
167
|
###
|
@@ -1249,19 +1249,27 @@
|
|
1249
1249
|
units = normalizeUnits(units);
|
1250
1250
|
|
1251
1251
|
if (units === 'year' || units === 'month') {
|
1252
|
+
// average number of days in the months in the given dates
|
1252
1253
|
diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
|
1254
|
+
// difference in months
|
1253
1255
|
output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
|
1254
|
-
|
1256
|
+
// adjust by taking difference in days, average number of days
|
1257
|
+
// and dst in the given months.
|
1258
|
+
output += ((this - moment(this).startOf('month')) -
|
1259
|
+
(that - moment(that).startOf('month'))) / diff;
|
1260
|
+
// same as above but with zones, to negate all dst
|
1261
|
+
output -= ((this.zone() - moment(this).startOf('month').zone()) -
|
1262
|
+
(that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
|
1255
1263
|
if (units === 'year') {
|
1256
1264
|
output = output / 12;
|
1257
1265
|
}
|
1258
1266
|
} else {
|
1259
|
-
diff = (this - that)
|
1267
|
+
diff = (this - that);
|
1260
1268
|
output = units === 'second' ? diff / 1e3 : // 1000
|
1261
1269
|
units === 'minute' ? diff / 6e4 : // 1000 * 60
|
1262
1270
|
units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
|
1263
|
-
units === 'day' ? diff / 864e5 : // 1000 * 60 * 60 * 24
|
1264
|
-
units === 'week' ? diff / 6048e5 : // 1000 * 60 * 60 * 24 * 7
|
1271
|
+
units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
|
1272
|
+
units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
|
1265
1273
|
diff;
|
1266
1274
|
}
|
1267
1275
|
return asFloat ? output : absRound(output);
|
@@ -439,6 +439,20 @@ HEventResponder = HClass.extend({
|
|
439
439
|
return this;
|
440
440
|
},
|
441
441
|
|
442
|
+
/** = Description
|
443
|
+
* Registers or releases event listening for resize events
|
444
|
+
* depending on the value of the flag argument.
|
445
|
+
*
|
446
|
+
* = Returns
|
447
|
+
* +self+
|
448
|
+
*
|
449
|
+
**/
|
450
|
+
setResize: function(_flag) {
|
451
|
+
this.events.resize = _flag;
|
452
|
+
this.setEvents();
|
453
|
+
return this;
|
454
|
+
},
|
455
|
+
|
442
456
|
/** Same as +setClickable+
|
443
457
|
**/
|
444
458
|
setClick: function(_flag) {
|