textext-rails 0.1.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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +31 -0
- data/Rakefile +21 -0
- data/latest.tar.gz +0 -0
- data/lib/textext-rails.rb +2 -0
- data/lib/textext/rails.rb +6 -0
- data/lib/textext/rails/engine.rb +6 -0
- data/lib/textext/rails/version.rb +5 -0
- data/textext-rails.gemspec +24 -0
- data/vendor/assets/javascripts/textext.core.js +1613 -0
- data/vendor/assets/javascripts/textext.plugin.ajax.js +354 -0
- data/vendor/assets/javascripts/textext.plugin.arrow.js +106 -0
- data/vendor/assets/javascripts/textext.plugin.autocomplete.js +1057 -0
- data/vendor/assets/javascripts/textext.plugin.filter.js +242 -0
- data/vendor/assets/javascripts/textext.plugin.focus.js +174 -0
- data/vendor/assets/javascripts/textext.plugin.prompt.js +292 -0
- data/vendor/assets/javascripts/textext.plugin.suggestions.js +175 -0
- data/vendor/assets/javascripts/textext.plugin.tags.js +638 -0
- data/vendor/assets/stylesheets/arrow.png +0 -0
- data/vendor/assets/stylesheets/close.png +0 -0
- data/vendor/assets/stylesheets/textext.core.css +29 -0
- data/vendor/assets/stylesheets/textext.plugin.arrow.css +13 -0
- data/vendor/assets/stylesheets/textext.plugin.autocomplete.css +35 -0
- data/vendor/assets/stylesheets/textext.plugin.focus.css +12 -0
- data/vendor/assets/stylesheets/textext.plugin.prompt.css +16 -0
- data/vendor/assets/stylesheets/textext.plugin.tags.css +49 -0
- metadata +73 -0
@@ -0,0 +1,242 @@
|
|
1
|
+
/**
|
2
|
+
* jQuery TextExt Plugin
|
3
|
+
* http://alexgorbatchev.com/textext
|
4
|
+
*
|
5
|
+
* @version 1.2.0
|
6
|
+
* @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved.
|
7
|
+
* @license MIT License
|
8
|
+
*/
|
9
|
+
(function($)
|
10
|
+
{
|
11
|
+
/**
|
12
|
+
* The Filter plugin introduces ability to limit input that the text field
|
13
|
+
* will accept. If the Tags plugin is used, Filter plugin will limit which
|
14
|
+
* tags it's possible to add.
|
15
|
+
*
|
16
|
+
* The list of allowed items can be either specified through the
|
17
|
+
* options, can come from the Suggestions plugin or be loaded by the Ajax
|
18
|
+
* plugin. All these plugins have one thing in common -- they
|
19
|
+
* trigger `setSuggestions` event which the Filter plugin is expecting.
|
20
|
+
*
|
21
|
+
* @author agorbatchev
|
22
|
+
* @date 2011/08/18
|
23
|
+
* @id TextExtFilter
|
24
|
+
*/
|
25
|
+
function TextExtFilter() {};
|
26
|
+
|
27
|
+
$.fn.textext.TextExtFilter = TextExtFilter;
|
28
|
+
$.fn.textext.addPlugin('filter', TextExtFilter);
|
29
|
+
|
30
|
+
var p = TextExtFilter.prototype,
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Filter plugin options are grouped under `filter` when passed to the
|
34
|
+
* `$().textext()` function. For example:
|
35
|
+
*
|
36
|
+
* $('textarea').textext({
|
37
|
+
* plugins: 'filter',
|
38
|
+
* filter: {
|
39
|
+
* items: [ "item1", "item2" ]
|
40
|
+
* }
|
41
|
+
* })
|
42
|
+
*
|
43
|
+
* @author agorbatchev
|
44
|
+
* @date 2011/08/18
|
45
|
+
* @id TextExtFilter.options
|
46
|
+
*/
|
47
|
+
|
48
|
+
/**
|
49
|
+
* This is a toggle switch to enable or disable the Filter plugin. The value is checked
|
50
|
+
* each time at the top level which allows you to toggle this setting on the fly.
|
51
|
+
*
|
52
|
+
* @name filter.enabled
|
53
|
+
* @default true
|
54
|
+
* @author agorbatchev
|
55
|
+
* @date 2011/08/18
|
56
|
+
* @id TextExtFilter.options.enabled
|
57
|
+
*/
|
58
|
+
OPT_ENABLED = 'filter.enabled',
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Arra of items that the Filter plugin will allow the Tag plugin to add to the list of
|
62
|
+
* its resut tags. Each item by default is expected to be a string which default `ItemManager`
|
63
|
+
* can work with. You can change the item type by supplying custom `ItemManager`.
|
64
|
+
*
|
65
|
+
* @name filter.items
|
66
|
+
* @default null
|
67
|
+
* @author agorbatchev
|
68
|
+
* @date 2011/08/18
|
69
|
+
* @id TextExtFilter.options.items
|
70
|
+
*/
|
71
|
+
OPT_ITEMS = 'filter.items',
|
72
|
+
|
73
|
+
/**
|
74
|
+
* Filter plugin dispatches and reacts to the following events.
|
75
|
+
*
|
76
|
+
* @author agorbatchev
|
77
|
+
* @date 2011/08/18
|
78
|
+
* @id TextExtFilter.events
|
79
|
+
*/
|
80
|
+
|
81
|
+
/**
|
82
|
+
* Filter plugin reacts to the `isTagAllowed` event triggered by the Tags plugin before
|
83
|
+
* adding a new tag to the list. If the new tag is among the `items` specified in options,
|
84
|
+
* then the new tag will be allowed.
|
85
|
+
*
|
86
|
+
* @name isTagAllowed
|
87
|
+
* @author agorbatchev
|
88
|
+
* @date 2011/08/18
|
89
|
+
* @id TextExtFilter.events.isTagAllowed
|
90
|
+
*/
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Filter plugin reacts to the `setSuggestions` event triggered by other plugins like
|
94
|
+
* Suggestions and Ajax.
|
95
|
+
*
|
96
|
+
* However, event if this event is handled and items are passed with it and stored, if `items`
|
97
|
+
* option was supplied, it will always take precedense.
|
98
|
+
*
|
99
|
+
* @name setSuggestions
|
100
|
+
* @author agorbatchev
|
101
|
+
* @date 2011/08/18
|
102
|
+
* @id TextExtFilter.events.setSuggestions
|
103
|
+
*/
|
104
|
+
|
105
|
+
DEFAULT_OPTS = {
|
106
|
+
filter : {
|
107
|
+
enabled : true,
|
108
|
+
items : null
|
109
|
+
}
|
110
|
+
}
|
111
|
+
;
|
112
|
+
|
113
|
+
/**
|
114
|
+
* Initialization method called by the core during plugin instantiation.
|
115
|
+
*
|
116
|
+
* @signature TextExtFilter.init(core)
|
117
|
+
*
|
118
|
+
* @param core {TextExt} Instance of the TextExt core class.
|
119
|
+
*
|
120
|
+
* @author agorbatchev
|
121
|
+
* @date 2011/08/18
|
122
|
+
* @id TextExtFilter.init
|
123
|
+
*/
|
124
|
+
p.init = function(core)
|
125
|
+
{
|
126
|
+
var self = this;
|
127
|
+
self.baseInit(core, DEFAULT_OPTS);
|
128
|
+
|
129
|
+
self.on({
|
130
|
+
getFormData : self.onGetFormData,
|
131
|
+
isTagAllowed : self.onIsTagAllowed,
|
132
|
+
setSuggestions : self.onSetSuggestions
|
133
|
+
});
|
134
|
+
|
135
|
+
self._suggestions = null;
|
136
|
+
};
|
137
|
+
|
138
|
+
//--------------------------------------------------------------------------------
|
139
|
+
// Core functionality
|
140
|
+
|
141
|
+
/**
|
142
|
+
* Reacts to the [`getFormData`][1] event triggered by the core. Returns data with the
|
143
|
+
* weight of 200 to be *greater than the Autocomplete plugins* data weights.
|
144
|
+
* The weights system is covered in greater detail in the [`getFormData`][1] event
|
145
|
+
* documentation.
|
146
|
+
*
|
147
|
+
* This method does nothing if Tags tag is also present.
|
148
|
+
*
|
149
|
+
* [1]: /manual/textext.html#getformdata
|
150
|
+
*
|
151
|
+
* @signature TextExtFilter.onGetFormData(e, data, keyCode)
|
152
|
+
*
|
153
|
+
* @param e {Object} jQuery event.
|
154
|
+
* @param data {Object} Data object to be populated.
|
155
|
+
* @param keyCode {Number} Key code that triggered the original update request.
|
156
|
+
*
|
157
|
+
* @author agorbatchev
|
158
|
+
* @date 2011/12/28
|
159
|
+
* @id TextExtFilter.onGetFormData
|
160
|
+
* @version 1.1
|
161
|
+
*/
|
162
|
+
p.onGetFormData = function(e, data, keyCode)
|
163
|
+
{
|
164
|
+
var self = this,
|
165
|
+
val = self.val(),
|
166
|
+
inputValue = val,
|
167
|
+
formValue = ''
|
168
|
+
;
|
169
|
+
|
170
|
+
if(!self.core().hasPlugin('tags'))
|
171
|
+
{
|
172
|
+
if(self.isValueAllowed(inputValue))
|
173
|
+
formValue = val;
|
174
|
+
|
175
|
+
data[300] = self.formDataObject(inputValue, formValue);
|
176
|
+
}
|
177
|
+
};
|
178
|
+
|
179
|
+
/**
|
180
|
+
* Checks given value if it's present in `filterItems` or was loaded for the Autocomplete
|
181
|
+
* or by the Suggestions plugins. `value` is compared to each item using `ItemManager.compareItems`
|
182
|
+
* method which is currently attached to the core. Returns `true` if value is known or
|
183
|
+
* Filter plugin is disabled.
|
184
|
+
*
|
185
|
+
* @signature TextExtFilter.isValueAllowed(value)
|
186
|
+
*
|
187
|
+
* @param value {Object} Value to check.
|
188
|
+
*
|
189
|
+
* @author agorbatchev
|
190
|
+
* @date 2011/12/28
|
191
|
+
* @id TextExtFilter.isValueAllowed
|
192
|
+
* @version 1.1
|
193
|
+
*/
|
194
|
+
p.isValueAllowed = function(value)
|
195
|
+
{
|
196
|
+
var self = this,
|
197
|
+
list = self.opts('filterItems') || self._suggestions || [],
|
198
|
+
itemManager = self.itemManager(),
|
199
|
+
result = !self.opts(OPT_ENABLED), // if disabled, should just return true
|
200
|
+
i
|
201
|
+
;
|
202
|
+
|
203
|
+
for(i = 0; i < list.length && !result; i++)
|
204
|
+
if(itemManager.compareItems(value, list[i]))
|
205
|
+
result = true;
|
206
|
+
|
207
|
+
return result;
|
208
|
+
};
|
209
|
+
|
210
|
+
/**
|
211
|
+
* Handles `isTagAllowed` event dispatched by the Tags plugin. If supplied tag is not
|
212
|
+
* in the `items` list, method sets `result` on the `data` argument to `false`.
|
213
|
+
*
|
214
|
+
* @signature TextExtFilter.onIsTagAllowed(e, data)
|
215
|
+
*
|
216
|
+
* @param e {Object} jQuery event.
|
217
|
+
* @param data {Object} Payload in the following format : `{ tag : {Object}, result : {Boolean} }`.
|
218
|
+
* @author agorbatchev
|
219
|
+
* @date 2011/08/04
|
220
|
+
* @id TextExtFilter.onIsTagAllowed
|
221
|
+
*/
|
222
|
+
p.onIsTagAllowed = function(e, data)
|
223
|
+
{
|
224
|
+
data.result = this.isValueAllowed(data.tag);
|
225
|
+
};
|
226
|
+
|
227
|
+
/**
|
228
|
+
* Reacts to the `setSuggestions` events and stores supplied suggestions for future use.
|
229
|
+
*
|
230
|
+
* @signature TextExtFilter.onSetSuggestions(e, data)
|
231
|
+
*
|
232
|
+
* @param e {Object} jQuery event.
|
233
|
+
* @param data {Object} Payload in the following format : `{ result : {Array} } }`.
|
234
|
+
* @author agorbatchev
|
235
|
+
* @date 2011/08/18
|
236
|
+
* @id TextExtFilter.onSetSuggestions
|
237
|
+
*/
|
238
|
+
p.onSetSuggestions = function(e, data)
|
239
|
+
{
|
240
|
+
this._suggestions = data.result;
|
241
|
+
};
|
242
|
+
})(jQuery);
|
@@ -0,0 +1,174 @@
|
|
1
|
+
/**
|
2
|
+
* jQuery TextExt Plugin
|
3
|
+
* http://alexgorbatchev.com/textext
|
4
|
+
*
|
5
|
+
* @version 1.2.0
|
6
|
+
* @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved.
|
7
|
+
* @license MIT License
|
8
|
+
*/
|
9
|
+
(function($)
|
10
|
+
{
|
11
|
+
/**
|
12
|
+
* Focus plugin displays a visual effect whenever user sets focus
|
13
|
+
* into the text area.
|
14
|
+
*
|
15
|
+
* @author agorbatchev
|
16
|
+
* @date 2011/08/18
|
17
|
+
* @id TextExtFocus
|
18
|
+
*/
|
19
|
+
function TextExtFocus() {};
|
20
|
+
|
21
|
+
$.fn.textext.TextExtFocus = TextExtFocus;
|
22
|
+
$.fn.textext.addPlugin('focus', TextExtFocus);
|
23
|
+
|
24
|
+
var p = TextExtFocus.prototype,
|
25
|
+
/**
|
26
|
+
* Focus plugin only has one option and that is its HTML template. It could be
|
27
|
+
* changed when passed to the `$().textext()` function. For example:
|
28
|
+
*
|
29
|
+
* $('textarea').textext({
|
30
|
+
* plugins: 'focus',
|
31
|
+
* html: {
|
32
|
+
* focus: "<span/>"
|
33
|
+
* }
|
34
|
+
* })
|
35
|
+
*
|
36
|
+
* @author agorbatchev
|
37
|
+
* @date 2011/08/18
|
38
|
+
* @id TextExtFocus.options
|
39
|
+
*/
|
40
|
+
|
41
|
+
/**
|
42
|
+
* HTML source that is used to generate markup required for the focus effect.
|
43
|
+
*
|
44
|
+
* @name html.focus
|
45
|
+
* @default '<div class="text-focus"/>'
|
46
|
+
* @author agorbatchev
|
47
|
+
* @date 2011/08/18
|
48
|
+
* @id TextExtFocus.options.html.focus
|
49
|
+
*/
|
50
|
+
OPT_HTML_FOCUS = 'html.focus',
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Focus plugin dispatches or reacts to the following events.
|
54
|
+
*
|
55
|
+
* @author agorbatchev
|
56
|
+
* @date 2011/08/17
|
57
|
+
* @id TextExtFocus.events
|
58
|
+
*/
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Focus plugin reacts to the `focus` event and shows the markup generated from
|
62
|
+
* the `html.focus` option.
|
63
|
+
*
|
64
|
+
* @name focus
|
65
|
+
* @author agorbatchev
|
66
|
+
* @date 2011/08/18
|
67
|
+
* @id TextExtFocus.events.focus
|
68
|
+
*/
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Focus plugin reacts to the `blur` event and hides the effect.
|
72
|
+
*
|
73
|
+
* @name blur
|
74
|
+
* @author agorbatchev
|
75
|
+
* @date 2011/08/18
|
76
|
+
* @id TextExtFocus.events.blur
|
77
|
+
*/
|
78
|
+
|
79
|
+
DEFAULT_OPTS = {
|
80
|
+
html : {
|
81
|
+
focus : '<div class="text-focus"/>'
|
82
|
+
}
|
83
|
+
}
|
84
|
+
;
|
85
|
+
|
86
|
+
/**
|
87
|
+
* Initialization method called by the core during plugin instantiation.
|
88
|
+
*
|
89
|
+
* @signature TextExtFocus.init(core)
|
90
|
+
*
|
91
|
+
* @param core {TextExt} Instance of the TextExt core class.
|
92
|
+
*
|
93
|
+
* @author agorbatchev
|
94
|
+
* @date 2011/08/18
|
95
|
+
* @id TextExtFocus.init
|
96
|
+
*/
|
97
|
+
p.init = function(core)
|
98
|
+
{
|
99
|
+
var self = this;
|
100
|
+
|
101
|
+
self.baseInit(core, DEFAULT_OPTS);
|
102
|
+
self.core().wrapElement().append(self.opts(OPT_HTML_FOCUS));
|
103
|
+
self.on({
|
104
|
+
blur : self.onBlur,
|
105
|
+
focus : self.onFocus
|
106
|
+
});
|
107
|
+
|
108
|
+
self._timeoutId = 0;
|
109
|
+
};
|
110
|
+
|
111
|
+
//--------------------------------------------------------------------------------
|
112
|
+
// Event handlers
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Reacts to the `blur` event and hides the focus effect with a slight delay which
|
116
|
+
* allows quick refocusing without effect blinking in and out.
|
117
|
+
*
|
118
|
+
* @signature TextExtFocus.onBlur(e)
|
119
|
+
*
|
120
|
+
* @param e {Object} jQuery event.
|
121
|
+
*
|
122
|
+
* @author agorbatchev
|
123
|
+
* @date 2011/08/08
|
124
|
+
* @id TextExtFocus.onBlur
|
125
|
+
*/
|
126
|
+
p.onBlur = function(e)
|
127
|
+
{
|
128
|
+
var self = this;
|
129
|
+
|
130
|
+
clearTimeout(self._timeoutId);
|
131
|
+
|
132
|
+
self._timeoutId = setTimeout(function()
|
133
|
+
{
|
134
|
+
self.getFocus().hide();
|
135
|
+
},
|
136
|
+
100);
|
137
|
+
};
|
138
|
+
|
139
|
+
/**
|
140
|
+
* Reacts to the `focus` event and shows the focus effect.
|
141
|
+
*
|
142
|
+
* @signature TextExtFocus.onFocus
|
143
|
+
*
|
144
|
+
* @param e {Object} jQuery event.
|
145
|
+
* @author agorbatchev
|
146
|
+
* @date 2011/08/08
|
147
|
+
* @id TextExtFocus.onFocus
|
148
|
+
*/
|
149
|
+
p.onFocus = function(e)
|
150
|
+
{
|
151
|
+
var self = this;
|
152
|
+
|
153
|
+
clearTimeout(self._timeoutId);
|
154
|
+
|
155
|
+
self.getFocus().show();
|
156
|
+
};
|
157
|
+
|
158
|
+
//--------------------------------------------------------------------------------
|
159
|
+
// Core functionality
|
160
|
+
|
161
|
+
/**
|
162
|
+
* Returns focus effect HTML element.
|
163
|
+
*
|
164
|
+
* @signature TextExtFocus.getFocus()
|
165
|
+
*
|
166
|
+
* @author agorbatchev
|
167
|
+
* @date 2011/08/08
|
168
|
+
* @id TextExtFocus.getFocus
|
169
|
+
*/
|
170
|
+
p.getFocus = function()
|
171
|
+
{
|
172
|
+
return this.core().wrapElement().find('.text-focus');
|
173
|
+
};
|
174
|
+
})(jQuery);
|
@@ -0,0 +1,292 @@
|
|
1
|
+
/**
|
2
|
+
* jQuery TextExt Plugin
|
3
|
+
* http://alexgorbatchev.com/textext
|
4
|
+
*
|
5
|
+
* @version 1.2.0
|
6
|
+
* @copyright Copyright (C) 2011 Alex Gorbatchev. All rights reserved.
|
7
|
+
* @license MIT License
|
8
|
+
*/
|
9
|
+
(function($)
|
10
|
+
{
|
11
|
+
/**
|
12
|
+
* Prompt plugin displays a visual user propmpt in the text input area. If user focuses
|
13
|
+
* on the input, the propt is hidden and only shown again when user focuses on another
|
14
|
+
* element and text input doesn't have a value.
|
15
|
+
*
|
16
|
+
* @author agorbatchev
|
17
|
+
* @date 2011/08/18
|
18
|
+
* @id TextExtPrompt
|
19
|
+
*/
|
20
|
+
function TextExtPrompt() {};
|
21
|
+
|
22
|
+
$.fn.textext.TextExtPrompt = TextExtPrompt;
|
23
|
+
$.fn.textext.addPlugin('prompt', TextExtPrompt);
|
24
|
+
|
25
|
+
var p = TextExtPrompt.prototype,
|
26
|
+
|
27
|
+
CSS_HIDE_PROMPT = 'text-hide-prompt',
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Prompt plugin has options to change the prompt label and its HTML template. The options
|
31
|
+
* could be changed when passed to the `$().textext()` function. For example:
|
32
|
+
*
|
33
|
+
* $('textarea').textext({
|
34
|
+
* plugins: 'prompt',
|
35
|
+
* prompt: 'Your email address'
|
36
|
+
* })
|
37
|
+
*
|
38
|
+
* @author agorbatchev
|
39
|
+
* @date 2011/08/18
|
40
|
+
* @id TextExtPrompt.options
|
41
|
+
*/
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Prompt message that is displayed to the user whenever there's no value in the input.
|
45
|
+
*
|
46
|
+
* @name prompt
|
47
|
+
* @default 'Awaiting input...'
|
48
|
+
* @author agorbatchev
|
49
|
+
* @date 2011/08/18
|
50
|
+
* @id TextExtPrompt.options.prompt
|
51
|
+
*/
|
52
|
+
OPT_PROMPT = 'prompt',
|
53
|
+
|
54
|
+
/**
|
55
|
+
* HTML source that is used to generate markup required for the prompt effect.
|
56
|
+
*
|
57
|
+
* @name html.prompt
|
58
|
+
* @default '<div class="text-prompt"/>'
|
59
|
+
* @author agorbatchev
|
60
|
+
* @date 2011/08/18
|
61
|
+
* @id TextExtPrompt.options.html.prompt
|
62
|
+
*/
|
63
|
+
OPT_HTML_PROMPT = 'html.prompt',
|
64
|
+
|
65
|
+
/**
|
66
|
+
* Prompt plugin dispatches or reacts to the following events.
|
67
|
+
* @id TextExtPrompt.events
|
68
|
+
*/
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Prompt plugin reacts to the `focus` event and hides the markup generated from
|
72
|
+
* the `html.prompt` option.
|
73
|
+
*
|
74
|
+
* @name focus
|
75
|
+
* @author agorbatchev
|
76
|
+
* @date 2011/08/18
|
77
|
+
* @id TextExtPrompt.events.focus
|
78
|
+
*/
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Prompt plugin reacts to the `blur` event and shows the prompt back if user
|
82
|
+
* hasn't entered any value.
|
83
|
+
*
|
84
|
+
* @name blur
|
85
|
+
* @author agorbatchev
|
86
|
+
* @date 2011/08/18
|
87
|
+
* @id TextExtPrompt.events.blur
|
88
|
+
*/
|
89
|
+
|
90
|
+
DEFAULT_OPTS = {
|
91
|
+
prompt : 'Awaiting input...',
|
92
|
+
|
93
|
+
html : {
|
94
|
+
prompt : '<div class="text-prompt"/>'
|
95
|
+
}
|
96
|
+
}
|
97
|
+
;
|
98
|
+
|
99
|
+
/**
|
100
|
+
* Initialization method called by the core during plugin instantiation.
|
101
|
+
*
|
102
|
+
* @signature TextExtPrompt.init(core)
|
103
|
+
*
|
104
|
+
* @param core {TextExt} Instance of the TextExt core class.
|
105
|
+
*
|
106
|
+
* @author agorbatchev
|
107
|
+
* @date 2011/08/18
|
108
|
+
* @id TextExtPrompt.init
|
109
|
+
*/
|
110
|
+
p.init = function(core)
|
111
|
+
{
|
112
|
+
var self = this,
|
113
|
+
container
|
114
|
+
;
|
115
|
+
|
116
|
+
self.baseInit(core, DEFAULT_OPTS);
|
117
|
+
|
118
|
+
container = $(self.opts(OPT_HTML_PROMPT));
|
119
|
+
$(self).data('container', container);
|
120
|
+
|
121
|
+
self.core().wrapElement().append(container);
|
122
|
+
self.setPrompt(self.opts(OPT_PROMPT));
|
123
|
+
|
124
|
+
if(self.val().length > 0)
|
125
|
+
self.hidePrompt();
|
126
|
+
|
127
|
+
self.on({
|
128
|
+
blur : self.onBlur,
|
129
|
+
focus : self.onFocus,
|
130
|
+
postInvalidate : self.onPostInvalidate,
|
131
|
+
postInit : self.onPostInit
|
132
|
+
});
|
133
|
+
};
|
134
|
+
|
135
|
+
//--------------------------------------------------------------------------------
|
136
|
+
// Event handlers
|
137
|
+
|
138
|
+
/**
|
139
|
+
* Reacts to the `postInit` and configures the plugin for initial display.
|
140
|
+
*
|
141
|
+
* @signature TextExtPrompt.onPostInit(e)
|
142
|
+
*
|
143
|
+
* @param e {Object} jQuery event.
|
144
|
+
*
|
145
|
+
* @author agorbatchev
|
146
|
+
* @date 2011/08/24
|
147
|
+
* @id TextExtPrompt.onPostInit
|
148
|
+
*/
|
149
|
+
p.onPostInit = function(e)
|
150
|
+
{
|
151
|
+
this.invalidateBounds();
|
152
|
+
};
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Reacts to the `postInvalidate` and insures that prompt display remains correct.
|
156
|
+
*
|
157
|
+
* @signature TextExtPrompt.onPostInvalidate(e)
|
158
|
+
*
|
159
|
+
* @param e {Object} jQuery event.
|
160
|
+
*
|
161
|
+
* @author agorbatchev
|
162
|
+
* @date 2011/08/24
|
163
|
+
* @id TextExtPrompt.onPostInvalidate
|
164
|
+
*/
|
165
|
+
p.onPostInvalidate = function(e)
|
166
|
+
{
|
167
|
+
this.invalidateBounds();
|
168
|
+
};
|
169
|
+
|
170
|
+
/**
|
171
|
+
* Repositions the prompt to make sure it's always at the same place as in the text input carret.
|
172
|
+
*
|
173
|
+
* @signature TextExtPrompt.invalidateBounds()
|
174
|
+
*
|
175
|
+
* @author agorbatchev
|
176
|
+
* @date 2011/08/24
|
177
|
+
* @id TextExtPrompt.invalidateBounds
|
178
|
+
*/
|
179
|
+
p.invalidateBounds = function()
|
180
|
+
{
|
181
|
+
var self = this,
|
182
|
+
input = self.input()
|
183
|
+
;
|
184
|
+
|
185
|
+
self.containerElement().css({
|
186
|
+
paddingLeft : input.css('paddingLeft'),
|
187
|
+
paddingTop : input.css('paddingTop')
|
188
|
+
});
|
189
|
+
};
|
190
|
+
|
191
|
+
/**
|
192
|
+
* Reacts to the `blur` event and shows the prompt effect with a slight delay which
|
193
|
+
* allows quick refocusing without effect blinking in and out.
|
194
|
+
*
|
195
|
+
* The prompt is restored if the text box has no value.
|
196
|
+
*
|
197
|
+
* @signature TextExtPrompt.onBlur(e)
|
198
|
+
*
|
199
|
+
* @param e {Object} jQuery event.
|
200
|
+
*
|
201
|
+
* @author agorbatchev
|
202
|
+
* @date 2011/08/08
|
203
|
+
* @id TextExtPrompt.onBlur
|
204
|
+
*/
|
205
|
+
p.onBlur = function(e)
|
206
|
+
{
|
207
|
+
var self = this;
|
208
|
+
|
209
|
+
self.startTimer('prompt', 0.1, function()
|
210
|
+
{
|
211
|
+
if(self.val().length === 0)
|
212
|
+
self.showPrompt();
|
213
|
+
});
|
214
|
+
};
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Shows prompt HTML element.
|
218
|
+
*
|
219
|
+
* @signature TextExtPrompt.showPrompt()
|
220
|
+
*
|
221
|
+
* @author agorbatchev
|
222
|
+
* @date 2011/08/22
|
223
|
+
* @id TextExtPrompt.showPrompt
|
224
|
+
*/
|
225
|
+
p.showPrompt = function()
|
226
|
+
{
|
227
|
+
this.containerElement().removeClass(CSS_HIDE_PROMPT);
|
228
|
+
};
|
229
|
+
|
230
|
+
/**
|
231
|
+
* Hides prompt HTML element.
|
232
|
+
*
|
233
|
+
* @signature TextExtPrompt.hidePrompt()
|
234
|
+
*
|
235
|
+
* @author agorbatchev
|
236
|
+
* @date 2011/08/22
|
237
|
+
* @id TextExtPrompt.hidePrompt
|
238
|
+
*/
|
239
|
+
p.hidePrompt = function()
|
240
|
+
{
|
241
|
+
this.stopTimer('prompt');
|
242
|
+
this.containerElement().addClass(CSS_HIDE_PROMPT);
|
243
|
+
};
|
244
|
+
|
245
|
+
/**
|
246
|
+
* Reacts to the `focus` event and hides the prompt effect.
|
247
|
+
*
|
248
|
+
* @signature TextExtPrompt.onFocus
|
249
|
+
*
|
250
|
+
* @param e {Object} jQuery event.
|
251
|
+
* @author agorbatchev
|
252
|
+
* @date 2011/08/08
|
253
|
+
* @id TextExtPrompt.onFocus
|
254
|
+
*/
|
255
|
+
p.onFocus = function(e)
|
256
|
+
{
|
257
|
+
this.hidePrompt();
|
258
|
+
};
|
259
|
+
|
260
|
+
//--------------------------------------------------------------------------------
|
261
|
+
// Core functionality
|
262
|
+
|
263
|
+
/**
|
264
|
+
* Sets the prompt display to the specified string.
|
265
|
+
*
|
266
|
+
* @signature TextExtPrompt.setPrompt(str)
|
267
|
+
*
|
268
|
+
* @oaram str {String} String that will be displayed in the prompt.
|
269
|
+
*
|
270
|
+
* @author agorbatchev
|
271
|
+
* @date 2011/08/18
|
272
|
+
* @id TextExtPrompt.setPrompt
|
273
|
+
*/
|
274
|
+
p.setPrompt = function(str)
|
275
|
+
{
|
276
|
+
this.containerElement().text(str);
|
277
|
+
};
|
278
|
+
|
279
|
+
/**
|
280
|
+
* Returns prompt effect HTML element.
|
281
|
+
*
|
282
|
+
* @signature TextExtPrompt.containerElement()
|
283
|
+
*
|
284
|
+
* @author agorbatchev
|
285
|
+
* @date 2011/08/08
|
286
|
+
* @id TextExtPrompt.containerElement
|
287
|
+
*/
|
288
|
+
p.containerElement = function()
|
289
|
+
{
|
290
|
+
return $(this).data('container');
|
291
|
+
};
|
292
|
+
})(jQuery);
|