| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
# This file is Copyright (c) 2000-2007 Eric Andreychek. All rights reserved. |
|
2
|
|
|
|
|
|
|
# For distribution terms, please see the included LICENSE file. |
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
package OpenThought; |
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
=head1 NAME |
|
7
|
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
OpenThought - An AJAX transport and helper library, making AJAX-based page updates trivial |
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
use OpenThought(); |
|
13
|
|
|
|
|
|
|
use CGI(); |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
my $OT = OpenThought->new(); |
|
16
|
|
|
|
|
|
|
my $q = CGI->new; |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
# First, put everything you wish to give to the browser into a hash |
|
19
|
|
|
|
|
|
|
my ($fields, $html, $image); |
|
20
|
|
|
|
|
|
|
$fields->{'myTextBox'} = "Text Box Data"; |
|
21
|
|
|
|
|
|
|
$fields->{'myCheckbox'} = "true"; |
|
22
|
|
|
|
|
|
|
$fields->{'myRadioBtn'} = "RadioBtn2Value"; |
|
23
|
|
|
|
|
|
|
$fields->{'mySelectList'} = [ |
|
24
|
|
|
|
|
|
|
[ "text1", "value1" ], |
|
25
|
|
|
|
|
|
|
[ "text2", "value2" ], |
|
26
|
|
|
|
|
|
|
[ "text3", "value3" ], |
|
27
|
|
|
|
|
|
|
]; |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
$html->{'id_tagname'} = "New HTML Code"; |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
$image->{'image_name'} = "http://example.com/my_image.gif"; |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
# You can also execute JavaScript, just put it into a scalar |
|
34
|
|
|
|
|
|
|
my $javascript_code = "alert('Howdy!')"; |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
# Then send it to the browser using: |
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
$OT->param( $fields ); |
|
39
|
|
|
|
|
|
|
$OT->param( $html ); |
|
40
|
|
|
|
|
|
|
$OT->param( $image ); |
|
41
|
|
|
|
|
|
|
$OT->focus( "myTextBox" ); |
|
42
|
|
|
|
|
|
|
$OT->javascript( $javascript_code ); |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
print $q->header: |
|
45
|
|
|
|
|
|
|
print $OT->response(); |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
# Or use the utility method: |
|
48
|
|
|
|
|
|
|
print $q->header; |
|
49
|
|
|
|
|
|
|
print $OT->response( param => $fields, |
|
50
|
|
|
|
|
|
|
param => $html, |
|
51
|
|
|
|
|
|
|
param => $image, |
|
52
|
|
|
|
|
|
|
focus => "myTextBox", |
|
53
|
|
|
|
|
|
|
javascript => $javascript_code, |
|
54
|
|
|
|
|
|
|
); |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
# In a seperate HTML file, you might have this (which is where you'd first |
|
58
|
|
|
|
|
|
|
# point the browser, the HTML then calls the Perl when you click the button or |
|
59
|
|
|
|
|
|
|
# select list) |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'http://example.com/my_openthought_app.pl', 'mySelectList')"> |
|
72
|
|
|
|
|
|
|
HTML Code will go here |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
// Sends the current value of the textbox 'myTextBox', as well as the |
|
75
|
|
|
|
|
|
|
// param 'this' with the value of 'that', to 'my_openthought_app.pl'. |
|
76
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
'http://example.com/my_openthought_app.pl', 'myTextBox', 'this=that')"> |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
OpenThought is a library which implements an API for AJAX communication and |
|
85
|
|
|
|
|
|
|
updates. You can perform updates to form fields, HTML, call JavaScript |
|
86
|
|
|
|
|
|
|
functions, and more with a trivial amount of code. OpenThought strives to |
|
87
|
|
|
|
|
|
|
provide a simple yet powerful and flexible means for creating AJAX |
|
88
|
|
|
|
|
|
|
applications. |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
The interface is simple -- you just build a hash. Hash keys are mapped to |
|
91
|
|
|
|
|
|
|
field names or id tags in the HTML. The value your hash keys contain is |
|
92
|
|
|
|
|
|
|
dynamically inserted into the corresponding field (without reloading the page). |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
==head1 COMPATABILITY |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
OpenThought is compatible with a wide range of browsers, including Internet |
|
97
|
|
|
|
|
|
|
Explorer 4+, Netscape 4+, Mozilla/Firefox, Safari, Opera, Konqeueror, and |
|
98
|
|
|
|
|
|
|
others. It detects the browsers capabilities; if the browser doesn't support |
|
99
|
|
|
|
|
|
|
new functions such as XMLHttpRequest or XMLHTTP, it falls back to using |
|
100
|
|
|
|
|
|
|
iframes. |
|
101
|
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=head1 METHODS |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=cut |
|
105
|
|
|
|
|
|
|
|
|
106
|
1
|
|
|
1
|
|
1371
|
use strict; |
|
|
1
|
|
|
|
|
4
|
|
|
|
1
|
|
|
|
|
46
|
|
|
107
|
1
|
|
|
1
|
|
7
|
use Carp; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
125
|
|
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
$OpenThought::VERSION="1.99.16"; |
|
110
|
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
$OpenThought::DEBUG ||= 0; |
|
112
|
|
|
|
|
|
|
|
|
113
|
1
|
|
|
1
|
|
17
|
use vars qw( $DEBUG ); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
2732
|
|
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
#/------------------------------------------------------------------------- |
|
117
|
|
|
|
|
|
|
# function: new |
|
118
|
|
|
|
|
|
|
# |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
=pod |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
=over 4 |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
=item new() |
|
125
|
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
$OT = OpenThought->new(); |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
Creates a new OpenThought object. |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
=item Return Value |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
=over 4 |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=item $OT |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
OpenThought object. |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
=back |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
=back |
|
141
|
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
=cut |
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
# The main OpenThought constructor |
|
145
|
|
|
|
|
|
|
sub new { |
|
146
|
0
|
|
|
0
|
1
|
|
my ( $pkg, $args ) = @_; |
|
147
|
|
|
|
|
|
|
|
|
148
|
0
|
|
0
|
|
|
|
$args ||= {}; |
|
149
|
|
|
|
|
|
|
|
|
150
|
0
|
|
0
|
|
|
|
my $class = ref $pkg || $pkg; |
|
151
|
|
|
|
|
|
|
|
|
152
|
0
|
|
|
|
|
|
my $self = { |
|
153
|
|
|
|
|
|
|
|
|
154
|
0
|
|
0
|
|
|
|
%{ $args }, |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
_persist => $args->{persist} || 0, |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
}; |
|
159
|
|
|
|
|
|
|
|
|
160
|
0
|
|
|
|
|
|
bless ($self, $class); |
|
161
|
|
|
|
|
|
|
|
|
162
|
0
|
|
|
|
|
|
$self->_init(); |
|
163
|
|
|
|
|
|
|
|
|
164
|
0
|
|
|
|
|
|
return $self; |
|
165
|
|
|
|
|
|
|
} |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
sub _init { |
|
168
|
0
|
|
|
0
|
|
|
my $self = shift; |
|
169
|
|
|
|
|
|
|
|
|
170
|
0
|
|
|
|
|
|
my @settings = qw( |
|
171
|
|
|
|
|
|
|
log_enabled |
|
172
|
|
|
|
|
|
|
log_level |
|
173
|
|
|
|
|
|
|
require |
|
174
|
|
|
|
|
|
|
channel_type |
|
175
|
|
|
|
|
|
|
channel_visible |
|
176
|
|
|
|
|
|
|
channel_url_replace |
|
177
|
|
|
|
|
|
|
selectbox_max_width |
|
178
|
|
|
|
|
|
|
selectbox_trim_string |
|
179
|
|
|
|
|
|
|
selectbox_single_row_mode |
|
180
|
|
|
|
|
|
|
selectbox_multi_row_mode |
|
181
|
|
|
|
|
|
|
checkbox_true_value |
|
182
|
|
|
|
|
|
|
checkbox_false_value |
|
183
|
|
|
|
|
|
|
radio_null_selection_value |
|
184
|
|
|
|
|
|
|
data_mode |
|
185
|
|
|
|
|
|
|
); |
|
186
|
|
|
|
|
|
|
|
|
187
|
0
|
0
|
|
|
|
|
delete $self->{_settings} if exists $self->{_settings}; |
|
188
|
|
|
|
|
|
|
|
|
189
|
0
|
|
|
|
|
|
foreach my $setting ( @settings ) { |
|
190
|
0
|
|
|
|
|
|
$self->{_settings}{$setting} = []; |
|
191
|
|
|
|
|
|
|
} |
|
192
|
|
|
|
|
|
|
|
|
193
|
0
|
|
|
|
|
|
$self->{_response} = []; |
|
194
|
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
} |
|
196
|
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
# Generate, in the proper order, the serialized params and settings |
|
199
|
|
|
|
|
|
|
sub output { |
|
200
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
201
|
|
|
|
|
|
|
|
|
202
|
0
|
|
|
|
|
|
my ( $save, $serialized_data, $restore ); |
|
203
|
0
|
|
|
|
|
|
$save = $serialized_data = $restore = ""; |
|
204
|
|
|
|
|
|
|
|
|
205
|
0
|
|
|
|
|
|
my @settings; |
|
206
|
0
|
|
|
|
|
|
foreach my $setting ( keys %{ $self->{_settings} } ) { |
|
|
0
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
# There needs to be at least one passed in |
|
208
|
0
|
0
|
|
|
|
|
next unless scalar @{ $self->{_settings}{$setting} } > 0; |
|
|
0
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
|
|
210
|
0
|
|
|
|
|
|
$serialized_data .= join '', @{ $self->{_settings}{$setting} }; |
|
|
0
|
|
|
|
|
|
|
|
211
|
0
|
|
|
|
|
|
push @settings, $setting; |
|
212
|
|
|
|
|
|
|
} |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
# Grab all the response data (params, focus, url, javascript, etc) |
|
215
|
0
|
|
|
|
|
|
$serialized_data .= join '', @{ $self->{_response} }; |
|
|
0
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
# Save/restore the current settings unless told to make them |
|
218
|
|
|
|
|
|
|
# persist |
|
219
|
0
|
0
|
|
|
|
|
unless( $self->{settings_persist} ) { |
|
220
|
0
|
0
|
|
|
|
|
if (@settings) { |
|
221
|
0
|
|
|
|
|
|
$save .= $self->_settings_save( @settings ); |
|
222
|
0
|
|
|
|
|
|
$restore .= $self->_settings_restore( @settings ); |
|
223
|
|
|
|
|
|
|
} |
|
224
|
|
|
|
|
|
|
} |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
# Hands JavaScript code to the browser. The browser processes the data |
|
227
|
|
|
|
|
|
|
# automatically as we hand it over -- as far as the browser is concerned, |
|
228
|
|
|
|
|
|
|
# it is simply loading a new page now (but in the hidden frame). |
|
229
|
0
|
|
|
|
|
|
my $code = $self->_add_tags( "${save}${serialized_data}${restore}"); |
|
230
|
|
|
|
|
|
|
|
|
231
|
0
|
0
|
|
|
|
|
$DEBUG && carp $code ; |
|
232
|
|
|
|
|
|
|
|
|
233
|
0
|
|
|
|
|
|
return $code; |
|
234
|
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
} |
|
236
|
|
|
|
|
|
|
|
|
237
|
|
|
|
|
|
|
*auto_param = \¶m; |
|
238
|
|
|
|
|
|
|
*fields = \¶m; |
|
239
|
|
|
|
|
|
|
*html = \¶m; |
|
240
|
|
|
|
|
|
|
*images = \¶m; |
|
241
|
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
# The user has html, input fields, or images they want displayed in the browser |
|
243
|
|
|
|
|
|
|
sub param { |
|
244
|
0
|
|
|
0
|
1
|
|
my ( $self, $data, $options ) = @_; |
|
245
|
|
|
|
|
|
|
|
|
246
|
0
|
0
|
|
|
|
|
if (ref $data eq "ARRAY") { |
|
247
|
0
|
|
0
|
|
|
|
$options = $data->[1] || {}; |
|
248
|
0
|
|
0
|
|
|
|
$data = $data->[0] || {}; |
|
249
|
|
|
|
|
|
|
} |
|
250
|
|
|
|
|
|
|
|
|
251
|
0
|
|
|
|
|
|
$data = $self->_as_javascript( $data ); |
|
252
|
|
|
|
|
|
|
|
|
253
|
0
|
|
|
|
|
|
my $save = ""; |
|
254
|
0
|
|
|
|
|
|
my $restore = ""; |
|
255
|
0
|
0
|
|
|
|
|
if ($options) { |
|
256
|
0
|
|
|
|
|
|
$save = $self->_settings_save( keys %{ $options } ) . |
|
|
0
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
$self->settings($options, 1); |
|
258
|
0
|
|
|
|
|
|
$restore = $self->_settings_restore( keys %{ $options } ); |
|
|
0
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
} |
|
260
|
|
|
|
|
|
|
|
|
261
|
0
|
|
|
|
|
|
$data = "${save}parent.OpenThought.ServerResponse(${data});${restore}"; |
|
262
|
|
|
|
|
|
|
|
|
263
|
0
|
|
|
|
|
|
push @{ $self->{_response} }, $data; |
|
|
0
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
|
|
265
|
0
|
|
|
|
|
|
return $self->_add_tags($data); |
|
266
|
|
|
|
|
|
|
} |
|
267
|
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
# Calls the Focus function within the browser, which in turn takes the |
|
269
|
|
|
|
|
|
|
# cursor and puts it into a particular field |
|
270
|
|
|
|
|
|
|
sub focus { |
|
271
|
0
|
|
|
0
|
1
|
|
my ( $self, $field ) = @_; |
|
272
|
|
|
|
|
|
|
|
|
273
|
0
|
|
|
|
|
|
my $data = " parent.OpenThought.Focus('$field');"; |
|
274
|
|
|
|
|
|
|
|
|
275
|
0
|
|
|
|
|
|
push @{ $self->{_response} }, $data; |
|
|
0
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
|
|
277
|
0
|
|
|
|
|
|
return $self->_add_tags($data); |
|
278
|
|
|
|
|
|
|
} |
|
279
|
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
# Send Javascript code to be interpreted by the browser. This would often be |
|
281
|
|
|
|
|
|
|
# used to call a user defined Javascript function.. an example application of |
|
282
|
|
|
|
|
|
|
# this would be to use the dynapi Dynamic HTML API Library to create and |
|
283
|
|
|
|
|
|
|
# manipulate DHTML objects from the server. |
|
284
|
|
|
|
|
|
|
sub javascript { |
|
285
|
0
|
|
|
0
|
1
|
|
my ( $self, $javascript_code ) = @_; |
|
286
|
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
# NOTE: it really doesn't work to escape the JS! The developer needs to do |
|
288
|
|
|
|
|
|
|
# it themselves... |
|
289
|
0
|
|
|
|
|
|
my $data = " with (parent.document) { $javascript_code }"; |
|
290
|
|
|
|
|
|
|
|
|
291
|
0
|
|
|
|
|
|
push @{ $self->{_response} }, $data; |
|
|
0
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
|
|
293
|
0
|
|
|
|
|
|
return $self->_add_tags($data); |
|
294
|
|
|
|
|
|
|
} |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
# Jump to a new page with this url |
|
297
|
|
|
|
|
|
|
sub url { |
|
298
|
0
|
|
|
0
|
1
|
|
my ( $self, $url ) = @_; |
|
299
|
|
|
|
|
|
|
|
|
300
|
0
|
0
|
|
|
|
|
unless ( $url ) { |
|
301
|
0
|
|
|
|
|
|
croak "You're missing the parameter to 'url'."; |
|
302
|
|
|
|
|
|
|
} |
|
303
|
|
|
|
|
|
|
|
|
304
|
0
|
|
|
|
|
|
my $javascript_code; |
|
305
|
|
|
|
|
|
|
|
|
306
|
0
|
0
|
|
|
|
|
if ( ref $url eq "ARRAY" ) { |
|
|
|
0
|
|
|
|
|
|
|
307
|
0
|
0
|
|
|
|
|
if ( $url->[0] ) { |
|
308
|
0
|
0
|
|
|
|
|
unless ( not ref $url->[0] ) { |
|
309
|
0
|
|
|
|
|
|
croak "The first element of the arrayref passed into 'url' should be a scalar containing the url."; |
|
310
|
|
|
|
|
|
|
} |
|
311
|
|
|
|
|
|
|
|
|
312
|
0
|
|
|
|
|
|
$javascript_code = "parent.OpenThought.FetchHtml('$url->[0]'"; |
|
313
|
|
|
|
|
|
|
} |
|
314
|
0
|
0
|
|
|
|
|
if ( $url->[1] ) { |
|
315
|
0
|
0
|
|
|
|
|
unless ( ref $url->[1] eq "HASH" ) { |
|
316
|
0
|
|
|
|
|
|
croak "The second element of the arrayref passed into 'url' is optional, but if supplied, must be a hashref."; |
|
317
|
|
|
|
|
|
|
} |
|
318
|
0
|
|
|
|
|
|
foreach my $param ( keys %{ $url->[1] } ) { |
|
|
0
|
|
|
|
|
|
|
|
319
|
0
|
0
|
|
|
|
|
if ( defined $url->[1]->{ $param } ) { |
|
320
|
0
|
|
|
|
|
|
$javascript_code .= ",'$param=$url->[1]{ $param }'"; |
|
321
|
|
|
|
|
|
|
} |
|
322
|
|
|
|
|
|
|
else { |
|
323
|
0
|
|
|
|
|
|
$javascript_code .= ",'$param'"; |
|
324
|
|
|
|
|
|
|
} |
|
325
|
|
|
|
|
|
|
} |
|
326
|
|
|
|
|
|
|
} |
|
327
|
|
|
|
|
|
|
} |
|
328
|
|
|
|
|
|
|
elsif ( not ref $url ) { |
|
329
|
0
|
|
|
|
|
|
$javascript_code = "parent.OpenThought.FetchHtml('$url'"; |
|
330
|
|
|
|
|
|
|
} |
|
331
|
|
|
|
|
|
|
else { |
|
332
|
0
|
|
|
|
|
|
croak "The 'url' method takes either a scalar containing the url, or an an arrayref containing both the url and a hashref with url parameters."; |
|
333
|
|
|
|
|
|
|
} |
|
334
|
|
|
|
|
|
|
|
|
335
|
0
|
|
|
|
|
|
$javascript_code .= ");"; |
|
336
|
|
|
|
|
|
|
|
|
337
|
0
|
|
|
|
|
|
push @{ $self->{_response} }, $javascript_code; |
|
|
0
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
|
|
339
|
0
|
|
|
|
|
|
return $self->_add_tags($javascript_code); |
|
340
|
|
|
|
|
|
|
} |
|
341
|
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
# Alter settings within the existing OpenThought Application |
|
343
|
|
|
|
|
|
|
sub settings { |
|
344
|
0
|
|
|
0
|
1
|
|
my ( $self, $settings, $return_only ) = @_; |
|
345
|
|
|
|
|
|
|
|
|
346
|
0
|
0
|
|
|
|
|
unless ( ref $settings eq "HASH" ){ |
|
347
|
0
|
|
|
|
|
|
croak "When you pass in settings, they need to be a hash " . |
|
348
|
|
|
|
|
|
|
'reference. Either $OT->settings( \%settings ) or ' . |
|
349
|
|
|
|
|
|
|
'$OT->response( settings => \%settings ).'; |
|
350
|
|
|
|
|
|
|
} |
|
351
|
|
|
|
|
|
|
|
|
352
|
0
|
|
|
|
|
|
my $data; |
|
353
|
0
|
|
|
|
|
|
foreach my $name ( keys %{ $settings } ) { |
|
|
0
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
# Persist is special as well. It defines whether the settings |
|
355
|
|
|
|
|
|
|
# being sent are to remain for the life of this page, or just for this |
|
356
|
|
|
|
|
|
|
# current request. |
|
357
|
0
|
0
|
|
|
|
|
if( $name eq "settings_persist" ) { |
|
|
|
0
|
|
|
|
|
|
|
358
|
0
|
|
|
|
|
|
$self->{settings_persist} = $settings->{$name}; |
|
359
|
|
|
|
|
|
|
} |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
# All other parameters are treated the same here |
|
362
|
|
|
|
|
|
|
elsif ( $self->{_settings}{$name} ) { |
|
363
|
0
|
|
|
|
|
|
my $setting = "parent.OpenThought.config.$name = \"" . |
|
364
|
|
|
|
|
|
|
# $self->_escape_javascript( $settings->{$name} ) . "\");"; |
|
365
|
|
|
|
|
|
|
$self->_escape_javascript( $settings->{$name} ) . "\";"; |
|
366
|
|
|
|
|
|
|
|
|
367
|
0
|
0
|
|
|
|
|
unless ($return_only) { |
|
368
|
0
|
|
|
|
|
|
push @{ $self->{_settings}{$name} }, $setting; |
|
|
0
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
} |
|
370
|
|
|
|
|
|
|
|
|
371
|
0
|
|
|
|
|
|
$data .= $setting; |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
} |
|
374
|
|
|
|
|
|
|
else { |
|
375
|
0
|
|
|
|
|
|
carp "No such setting [$name]."; |
|
376
|
|
|
|
|
|
|
} |
|
377
|
|
|
|
|
|
|
} |
|
378
|
|
|
|
|
|
|
|
|
379
|
0
|
0
|
|
|
|
|
if ($return_only) { |
|
380
|
0
|
|
|
|
|
|
return $data; |
|
381
|
|
|
|
|
|
|
} |
|
382
|
|
|
|
|
|
|
else { |
|
383
|
0
|
|
|
|
|
|
return $self->_add_tags($data); |
|
384
|
|
|
|
|
|
|
} |
|
385
|
|
|
|
|
|
|
} |
|
386
|
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
=pod |
|
389
|
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
=over 4 |
|
391
|
|
|
|
|
|
|
|
|
392
|
|
|
|
|
|
|
=item param() |
|
393
|
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
$OT->param( \%data, [ \%settings ] ); |
|
395
|
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
Update input-type form field elements (text boxes, radio buttons, checkboxes, |
|
397
|
|
|
|
|
|
|
select lists, text areas, etc), HTML elements, as well as images an image attributes. |
|
398
|
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
This method accepts a hash reference containing keys which map to field |
|
400
|
|
|
|
|
|
|
names, html id's, and image names. |
|
401
|
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
The form element, html id, or image will be dynamically updated to contain the value found within the |
|
403
|
|
|
|
|
|
|
hash key. |
|
404
|
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
B: These are very straight forward. The hash |
|
406
|
|
|
|
|
|
|
values are inserted directly into the input fields matching the hash keys. |
|
407
|
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
B: The value for the hash key should match the C |
|
409
|
|
|
|
|
|
|
attribute of the radio button element in your HTML code. When the hash key and |
|
410
|
|
|
|
|
|
|
value matches the radio button name and value, that radio button will become |
|
411
|
|
|
|
|
|
|
checked. |
|
412
|
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
B |
|
414
|
|
|
|
|
|
|
that data to be appended to the select list. In contrast, sending data as a |
|
415
|
|
|
|
|
|
|
reference to an array of arrays or an array of hashes will cause any values |
|
416
|
|
|
|
|
|
|
within the select list to be overwritten with the new data. |
|
417
|
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
You can modify this select list behaviour by using the |
|
419
|
|
|
|
|
|
|
C and C options. |
|
420
|
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
When sending data to a select list (which, as we said, is done as an array), |
|
422
|
|
|
|
|
|
|
the first element of the array is the text to be displayed, the second element |
|
423
|
|
|
|
|
|
|
is the underlying value associated with that text. |
|
424
|
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
Sending a single scalar value to a select list highlights the corresponding |
|
426
|
|
|
|
|
|
|
entry in the select list which contains that value. |
|
427
|
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
Sending undef, or a reference to an array with an empty string as it's only |
|
429
|
|
|
|
|
|
|
element will cause the select list to be cleared. |
|
430
|
|
|
|
|
|
|
|
|
431
|
|
|
|
|
|
|
B: It accepts a hash reference containing keys which map to HTML id attributes. |
|
432
|
|
|
|
|
|
|
You can add id tags for nearly any HTML attribute. The hash values are inserted |
|
433
|
|
|
|
|
|
|
within the html containing an id tag matching the hash key (using innerHtml). The data may contain HTML |
|
434
|
|
|
|
|
|
|
tags, which will be correctly displayed. |
|
435
|
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
$OT->param({ "html_id_tag" => "foo" }). |
|
437
|
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
B: To change an image or image property, the hash key should be the image name. If you just want |
|
439
|
|
|
|
|
|
|
to load a new image, the hash value should be a scalar containing the url of the new image. |
|
440
|
|
|
|
|
|
|
|
|
441
|
|
|
|
|
|
|
$OT->param({ foo => 'http://example.com/new_image.jpg' }); |
|
442
|
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
$OT->param({ foo => { width => 100, |
|
444
|
|
|
|
|
|
|
height => 150, }); |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
B: The second optional parameter is a hash reference of settings that will |
|
447
|
|
|
|
|
|
|
effect just the data passed into this call of C. See the C method for a list of |
|
448
|
|
|
|
|
|
|
available options. |
|
449
|
|
|
|
|
|
|
|
|
450
|
|
|
|
|
|
|
=item javascript() |
|
451
|
|
|
|
|
|
|
|
|
452
|
|
|
|
|
|
|
$OT->javascript( "alert('Howdy');" ); |
|
453
|
|
|
|
|
|
|
|
|
454
|
|
|
|
|
|
|
This allows you to run JavaScript code, along with accessing JavaScript |
|
455
|
|
|
|
|
|
|
functions and variables. |
|
456
|
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
It accepts a string containing the JavaScript code you wish to execute. There |
|
458
|
|
|
|
|
|
|
is no need to add script tags, they will be added for you. |
|
459
|
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
=item focus() |
|
461
|
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
$OT->focus( "field_name" ); |
|
463
|
|
|
|
|
|
|
|
|
464
|
|
|
|
|
|
|
This allows you to focus a given input field or anchor tag. |
|
465
|
|
|
|
|
|
|
|
|
466
|
|
|
|
|
|
|
It accepts a string containing the name of the field or anchor tag you wish to |
|
467
|
|
|
|
|
|
|
focus. If it's a field, it will be given the cursor. If it's an anchor tag, |
|
468
|
|
|
|
|
|
|
the browser will jump to it's position on the page. |
|
469
|
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
=item url() |
|
471
|
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
$OT->url( "http://example.com/my_openthought_app.pl" ); |
|
473
|
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
$OT->url([ "http://example.com/my_openthought_app.pl" => |
|
475
|
|
|
|
|
|
|
{ example_param => some_value, |
|
476
|
|
|
|
|
|
|
param2 => another_value } ]); |
|
477
|
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
The C method loads new page. |
|
479
|
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
This method can be used by passing in the url as a scalar, or by passing in the |
|
481
|
|
|
|
|
|
|
url and url parameters within an arrayref. If you pass in an arrayref, the |
|
482
|
|
|
|
|
|
|
first element of the array should be the url, the second element should be a |
|
483
|
|
|
|
|
|
|
hash reference whose keys and values will be passed on as parameters to the new |
|
484
|
|
|
|
|
|
|
url. |
|
485
|
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
=item settings |
|
487
|
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
$OT->settings({ |
|
489
|
|
|
|
|
|
|
settings_persist => boolean, |
|
490
|
|
|
|
|
|
|
log_start => string, |
|
491
|
|
|
|
|
|
|
log_level => string, |
|
492
|
|
|
|
|
|
|
require => { ... }, |
|
493
|
|
|
|
|
|
|
http_request_type => string, |
|
494
|
|
|
|
|
|
|
channel_type => string, |
|
495
|
|
|
|
|
|
|
channel_visible => boolean, |
|
496
|
|
|
|
|
|
|
channel_url_replace => boolean, |
|
497
|
|
|
|
|
|
|
selectbox_max_width => size, |
|
498
|
|
|
|
|
|
|
selectbox_trim_string => string, |
|
499
|
|
|
|
|
|
|
selectbox_single_row_mode => string, |
|
500
|
|
|
|
|
|
|
selectbox_multi_row_mode => string, |
|
501
|
|
|
|
|
|
|
checkbox_true_value => string, |
|
502
|
|
|
|
|
|
|
checkbox_false_value => string, |
|
503
|
|
|
|
|
|
|
radio_null_selection_value => string, |
|
504
|
|
|
|
|
|
|
data_mode => string, |
|
505
|
|
|
|
|
|
|
}); |
|
506
|
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
Alter settings in the OpenThought application running in the browser. Each |
|
508
|
|
|
|
|
|
|
parameter is optional. Only pass in the option(s) you wish to change. |
|
509
|
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
For additional information on configuration, and for how/where to set the |
|
511
|
|
|
|
|
|
|
defaults, please see the section labeled C. |
|
512
|
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
This method accepts a hash reference where the keys are names of OpenThought |
|
514
|
|
|
|
|
|
|
options, and the values are the new option values. |
|
515
|
|
|
|
|
|
|
|
|
516
|
|
|
|
|
|
|
By default, these options will only be good for one request. You can change |
|
517
|
|
|
|
|
|
|
that behaviour by either passing in the C option to this method. |
|
518
|
|
|
|
|
|
|
|
|
519
|
|
|
|
|
|
|
You can set the defaults for most of these settings at the top of the |
|
520
|
|
|
|
|
|
|
OpenThought.js file. |
|
521
|
|
|
|
|
|
|
|
|
522
|
|
|
|
|
|
|
=over 4 |
|
523
|
|
|
|
|
|
|
|
|
524
|
|
|
|
|
|
|
=item Parameters |
|
525
|
|
|
|
|
|
|
|
|
526
|
|
|
|
|
|
|
=over 4 |
|
527
|
|
|
|
|
|
|
|
|
528
|
|
|
|
|
|
|
=item settings_persist() |
|
529
|
|
|
|
|
|
|
|
|
530
|
|
|
|
|
|
|
$OT->settings({ settings_persist => "true" }); |
|
531
|
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
This specifies whether or not the settings being changed in the browser should |
|
533
|
|
|
|
|
|
|
be just for this request, or whether they should persist as long as the current |
|
534
|
|
|
|
|
|
|
page is loaded. |
|
535
|
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
The default is to not persist. |
|
537
|
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
If you use this parameter, only items you specify will be executed. That is, |
|
539
|
|
|
|
|
|
|
if you fail to mention where C should be in the order, then C |
|
540
|
|
|
|
|
|
|
will be completely ignored for that request. |
|
541
|
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
If C is not last, everything sent after it will be lost when the page |
|
543
|
|
|
|
|
|
|
changes. |
|
544
|
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
=item log_enabled |
|
546
|
|
|
|
|
|
|
|
|
547
|
|
|
|
|
|
|
$OT->settings({ log_enabled => "true" }); |
|
548
|
|
|
|
|
|
|
|
|
549
|
|
|
|
|
|
|
Enable a log window so you can see what's going on behind the scenes. If |
|
550
|
|
|
|
|
|
|
something in your app isn't working, try enabling this. This can be very |
|
551
|
|
|
|
|
|
|
useful for debugging, but you probably want it disabled while your app is in |
|
552
|
|
|
|
|
|
|
production. This, of course, won't work if your popup blocking software |
|
553
|
|
|
|
|
|
|
doesn't allow popups from the site you're running your application from. |
|
554
|
|
|
|
|
|
|
|
|
555
|
|
|
|
|
|
|
=item log_level |
|
556
|
|
|
|
|
|
|
|
|
557
|
|
|
|
|
|
|
$OT->settings({ log_level => "info" }); |
|
558
|
|
|
|
|
|
|
|
|
559
|
|
|
|
|
|
|
What log level to run at. You have the ability to enable lots of debugging |
|
560
|
|
|
|
|
|
|
output, only serious errors, and various levels in between. |
|
561
|
|
|
|
|
|
|
|
|
562
|
|
|
|
|
|
|
Options are C, C, C, C, C |
|
563
|
|
|
|
|
|
|
|
|
564
|
|
|
|
|
|
|
=item require |
|
565
|
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
$OT->settings({ require => |
|
567
|
|
|
|
|
|
|
{ "40dom" => "http://example.com/no_40dom", |
|
568
|
|
|
|
|
|
|
"xmlhttp" => "http://example.com/no_xmlhttp", |
|
569
|
|
|
|
|
|
|
} }) |
|
570
|
|
|
|
|
|
|
|
|
571
|
|
|
|
|
|
|
Define a set of browser requirements, and a page to go to if that requirement |
|
572
|
|
|
|
|
|
|
is not met. |
|
573
|
|
|
|
|
|
|
|
|
574
|
|
|
|
|
|
|
Available requirements are C<40dom>, C, C, C |
|
575
|
|
|
|
|
|
|
C. |
|
576
|
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
=item http_request_type (EXPERIMENTAL) |
|
578
|
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
$OT->settings({ http_request_type => "POST" }); |
|
580
|
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
The request type for communications with the server. This can be |
|
582
|
|
|
|
|
|
|
overridden at any time by passing in either GET or POST as the first |
|
583
|
|
|
|
|
|
|
parameter to CallUrl(). The default (and known to work) option is GET. |
|
584
|
|
|
|
|
|
|
|
|
585
|
|
|
|
|
|
|
Using POST has only been minimally tested. There have been problems noted when |
|
586
|
|
|
|
|
|
|
using Firefox and POST, if the C option was changed from C |
|
587
|
|
|
|
|
|
|
to C. This appears to be a Firefox bug. |
|
588
|
|
|
|
|
|
|
|
|
589
|
|
|
|
|
|
|
Options are C or C (case sensitive). |
|
590
|
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
=item channel_type |
|
592
|
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
$OT->settings({ channel_type => "iframe" }); |
|
594
|
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
The type of channel to use for communicating with the browser. |
|
596
|
|
|
|
|
|
|
|
|
597
|
|
|
|
|
|
|
By default, OpenThought will attempt to use the XMLHttpRequest or XMLHTTP |
|
598
|
|
|
|
|
|
|
functions available in recent browsers, then fall back to iframes if the |
|
599
|
|
|
|
|
|
|
browser doesn't support those newer options. |
|
600
|
|
|
|
|
|
|
|
|
601
|
|
|
|
|
|
|
However, XMLHttpRequest and XMLHTTP have one limitation -- for any given |
|
602
|
|
|
|
|
|
|
request, the server can only respond once, and the response is all at the same |
|
603
|
|
|
|
|
|
|
time. |
|
604
|
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
Iframes don't have that restriction, and the server can send a variety of |
|
606
|
|
|
|
|
|
|
responses throughout the duration of the request. |
|
607
|
|
|
|
|
|
|
|
|
608
|
|
|
|
|
|
|
XMLHttpRequest/XMLHTTP are fine for most uses, but some applications may |
|
609
|
|
|
|
|
|
|
benefit from being able to have the browser receive data a number of times |
|
610
|
|
|
|
|
|
|
throughtout a single request (ie, irc and other realtime chat applications). |
|
611
|
|
|
|
|
|
|
|
|
612
|
|
|
|
|
|
|
Options are C or C |
|
613
|
|
|
|
|
|
|
|
|
614
|
|
|
|
|
|
|
=item channel_visible |
|
615
|
|
|
|
|
|
|
|
|
616
|
|
|
|
|
|
|
$OT->settings({ channel_visible => "true" }); |
|
617
|
|
|
|
|
|
|
|
|
618
|
|
|
|
|
|
|
Normally, the channel used to communicate with the server is invisible. The |
|
619
|
|
|
|
|
|
|
curious may wish to see whats going on inside it (or perhaps need it for |
|
620
|
|
|
|
|
|
|
debugging). Enabling the following will make the channel visible. This only |
|
621
|
|
|
|
|
|
|
works if the channel is an iframe (which means it's either an older browser, or |
|
622
|
|
|
|
|
|
|
that you have C set to C |
|
623
|
|
|
|
|
|
|
|
|
624
|
|
|
|
|
|
|
=item url_replace |
|
625
|
|
|
|
|
|
|
|
|
626
|
|
|
|
|
|
|
$OT->settings({ url_replace => "true" }); |
|
627
|
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
When using iframes and layers, the typical way to submit ajax requests to the |
|
629
|
|
|
|
|
|
|
server involves using a 'document.location.replace()'. This means the requests |
|
630
|
|
|
|
|
|
|
aren't being stored in the browser history. So, the back button will take you |
|
631
|
|
|
|
|
|
|
to the previous *page*, not the previous AJAX request. This is often what |
|
632
|
|
|
|
|
|
|
people want. This sometimes isn't what people want :-) Set to 'true' to not |
|
633
|
|
|
|
|
|
|
add AJAX requests to the browser's history, set to 'false' to have them added |
|
634
|
|
|
|
|
|
|
to the history. |
|
635
|
|
|
|
|
|
|
|
|
636
|
|
|
|
|
|
|
This option has no effect when using XMLHttpRequest/XMLHTTP. |
|
637
|
|
|
|
|
|
|
|
|
638
|
|
|
|
|
|
|
Options are C or C. |
|
639
|
|
|
|
|
|
|
|
|
640
|
|
|
|
|
|
|
=item url_prefix |
|
641
|
|
|
|
|
|
|
|
|
642
|
|
|
|
|
|
|
$OT->settings({ url_prefix => "include/" }); |
|
643
|
|
|
|
|
|
|
|
|
644
|
|
|
|
|
|
|
During any call to the server (via CallUrl and FetchHtml), assume the script is |
|
645
|
|
|
|
|
|
|
located in this directory (ie, the file/dir you pass in is relative to this |
|
646
|
|
|
|
|
|
|
path). If there's no trailing slash, it will add one. This config option can |
|
647
|
|
|
|
|
|
|
be overridden by beginning the url with 'http' or '/'. |
|
648
|
|
|
|
|
|
|
|
|
649
|
|
|
|
|
|
|
=item selectbox_single_row_mode |
|
650
|
|
|
|
|
|
|
|
|
651
|
|
|
|
|
|
|
$OT->settings({ selectbox_single_row_mode => "append" }); |
|
652
|
|
|
|
|
|
|
|
|
653
|
|
|
|
|
|
|
This defines whether or not sending a new row (an arrayref) to the select list |
|
654
|
|
|
|
|
|
|
overwrites the existing values, or adds to it. It can be set to C or |
|
655
|
|
|
|
|
|
|
C. |
|
656
|
|
|
|
|
|
|
|
|
657
|
|
|
|
|
|
|
The default behaviour for adding a row to select lists is to append itself to |
|
658
|
|
|
|
|
|
|
the end of the selectlist. Setting C to C |
|
659
|
|
|
|
|
|
|
value is how you can alter that behavior. If C is |
|
660
|
|
|
|
|
|
|
C, the contents of a select list are overwritten by the new row. |
|
661
|
|
|
|
|
|
|
|
|
662
|
|
|
|
|
|
|
When C is set to C, you can still clear a |
|
663
|
|
|
|
|
|
|
select list by passing in an empty string as a parameter to the select list. |
|
664
|
|
|
|
|
|
|
|
|
665
|
|
|
|
|
|
|
=item selectbox_multi_row_mode |
|
666
|
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
$OT->settings({ selectbox_single_row_mode => "overwrite" }); |
|
668
|
|
|
|
|
|
|
|
|
669
|
|
|
|
|
|
|
This defines whether or not sending multiple rows (an array of arrays) to the |
|
670
|
|
|
|
|
|
|
select list overwrites the existing values, or adds to it. It can be set to |
|
671
|
|
|
|
|
|
|
C or C. |
|
672
|
|
|
|
|
|
|
|
|
673
|
|
|
|
|
|
|
The default behaviour for adding multiple rows to select lists is to overwrite |
|
674
|
|
|
|
|
|
|
the existing list. Setting C to C value |
|
675
|
|
|
|
|
|
|
is how you can alter that behavior. If C is |
|
676
|
|
|
|
|
|
|
C, the contents of a select list are preserved, and all new data is |
|
677
|
|
|
|
|
|
|
appended to the end of the select list. |
|
678
|
|
|
|
|
|
|
|
|
679
|
|
|
|
|
|
|
When C is set to C, you can still clear a |
|
680
|
|
|
|
|
|
|
select list by passing in an empty string as a parameter to the select list. |
|
681
|
|
|
|
|
|
|
|
|
682
|
|
|
|
|
|
|
=item selectbox_max_width |
|
683
|
|
|
|
|
|
|
|
|
684
|
|
|
|
|
|
|
$OT->settings({ selectbox_max_width => "50" }); |
|
685
|
|
|
|
|
|
|
|
|
686
|
|
|
|
|
|
|
Limit how many characters an entry in a select box can contain, 0 to not |
|
687
|
|
|
|
|
|
|
constrain the size. The default is 30. |
|
688
|
|
|
|
|
|
|
|
|
689
|
|
|
|
|
|
|
Upon dynamically receiving select box content, most browsers resize the select |
|
690
|
|
|
|
|
|
|
box to the width of the longest entry. This seems like a neat feature, but |
|
691
|
|
|
|
|
|
|
resizing the select box will often adversely affect other parts of your visual |
|
692
|
|
|
|
|
|
|
layout. This option allows you to modify the size of text going into a select |
|
693
|
|
|
|
|
|
|
box, so the browser doesn't make the select box too big. |
|
694
|
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
Netscape 4 is the only browser known not to perform dynamic resizing. Instead, |
|
696
|
|
|
|
|
|
|
it allows you to scroll side to side to view long text. |
|
697
|
|
|
|
|
|
|
|
|
698
|
|
|
|
|
|
|
See C to learn what the trimmed text is replaced with. |
|
699
|
|
|
|
|
|
|
|
|
700
|
|
|
|
|
|
|
=item selectbox_trim_string |
|
701
|
|
|
|
|
|
|
|
|
702
|
|
|
|
|
|
|
$OT->settings({ selectbox_trim_string => "+" }); |
|
703
|
|
|
|
|
|
|
|
|
704
|
|
|
|
|
|
|
Text to add to strings trimmed because of C. |
|
705
|
|
|
|
|
|
|
|
|
706
|
|
|
|
|
|
|
If the text being inserted into a selectbox needs to be resized to fit (due to |
|
707
|
|
|
|
|
|
|
C), replace the removed text with the following string to |
|
708
|
|
|
|
|
|
|
make it clear that the string was trimmed. |
|
709
|
|
|
|
|
|
|
|
|
710
|
|
|
|
|
|
|
The default is to use two periods: .. |
|
711
|
|
|
|
|
|
|
|
|
712
|
|
|
|
|
|
|
=item checkbox_true_value |
|
713
|
|
|
|
|
|
|
|
|
714
|
|
|
|
|
|
|
$OT->settings({ checkbox_true_value => "1" }); |
|
715
|
|
|
|
|
|
|
|
|
716
|
|
|
|
|
|
|
The value a checkbox will return if it is checked, and no value is assigned to |
|
717
|
|
|
|
|
|
|
the checkbox (via the value= attribute). The default is "1". |
|
718
|
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
=item checkbox_false_value |
|
720
|
|
|
|
|
|
|
|
|
721
|
|
|
|
|
|
|
$OT->settings({ checkbox_false_value => "0" }); |
|
722
|
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
The value a checkbox will return if it isn't checked. |
|
724
|
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
=item radio_null_selection_value |
|
726
|
|
|
|
|
|
|
|
|
727
|
|
|
|
|
|
|
$OT->settings({ radio_null_selection_value => "0" }); |
|
728
|
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
The value a group of radio buttons will return if none of them are selected. |
|
730
|
|
|
|
|
|
|
The default is "0". |
|
731
|
|
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
=item data_mode |
|
733
|
|
|
|
|
|
|
|
|
734
|
|
|
|
|
|
|
$OT->settings({ data_mode => "append" }); |
|
735
|
|
|
|
|
|
|
$OT->param( $fields => { data_mode => "append" } ); |
|
736
|
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
Define whether data should be overwritten or appended, for objects other than |
|
738
|
|
|
|
|
|
|
select lists. It can be set to C or C. |
|
739
|
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
By default, data sent from the server to the browser overwrites existing |
|
741
|
|
|
|
|
|
|
content. This allows you to change that behaviour, and have it append. |
|
742
|
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
=back |
|
744
|
|
|
|
|
|
|
|
|
745
|
|
|
|
|
|
|
=back |
|
746
|
|
|
|
|
|
|
|
|
747
|
|
|
|
|
|
|
=item response |
|
748
|
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
print $OT->response(); |
|
750
|
|
|
|
|
|
|
|
|
751
|
|
|
|
|
|
|
This returns the data gathered thus far, in a manner in which the browser will |
|
752
|
|
|
|
|
|
|
understand (ie, JavaScript). Typically, you would just send this directly to |
|
753
|
|
|
|
|
|
|
the browser, though you can modify it first if you desire. |
|
754
|
|
|
|
|
|
|
|
|
755
|
|
|
|
|
|
|
Calling C clears all the data gathered so far on the internal stack. |
|
756
|
|
|
|
|
|
|
|
|
757
|
|
|
|
|
|
|
=cut |
|
758
|
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
*parse_and_output = \&response; |
|
760
|
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
sub response() { |
|
762
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
|
763
|
|
|
|
|
|
|
|
|
764
|
0
|
0
|
0
|
|
|
|
if ( length(@_) and ref $_[0] eq "HASH" ) { |
|
765
|
0
|
|
|
|
|
|
my $params = $_[0]; |
|
766
|
|
|
|
|
|
|
|
|
767
|
0
|
|
|
|
|
|
foreach my $param ( keys %{ $params } ) { |
|
|
0
|
|
|
|
|
|
|
|
768
|
0
|
|
|
|
|
|
$self->$param( $params->{$param} ); |
|
769
|
|
|
|
|
|
|
} |
|
770
|
|
|
|
|
|
|
} |
|
771
|
|
|
|
|
|
|
else { |
|
772
|
0
|
|
|
|
|
|
my @params = @_; |
|
773
|
|
|
|
|
|
|
|
|
774
|
|
|
|
|
|
|
#for my $i ( 1 .. (length @params) / 2) { |
|
775
|
0
|
|
|
|
|
|
while ( scalar @params > 0 ) { |
|
776
|
|
|
|
|
|
|
|
|
777
|
0
|
|
|
|
|
|
my $method = shift @params; |
|
778
|
0
|
|
|
|
|
|
my $method_params = shift @params; |
|
779
|
|
|
|
|
|
|
|
|
780
|
0
|
0
|
|
|
|
|
$self->$method( $method_params ) if $method ne ""; |
|
781
|
|
|
|
|
|
|
} |
|
782
|
|
|
|
|
|
|
} |
|
783
|
|
|
|
|
|
|
|
|
784
|
0
|
|
|
|
|
|
return $self->output(); |
|
785
|
|
|
|
|
|
|
} |
|
786
|
|
|
|
|
|
|
|
|
787
|
|
|
|
|
|
|
# Save the current value of a setting |
|
788
|
|
|
|
|
|
|
sub _settings_save { |
|
789
|
0
|
|
|
0
|
|
|
my ( $self, @settings ) = @_; |
|
790
|
|
|
|
|
|
|
|
|
791
|
0
|
|
|
|
|
|
my $data; |
|
792
|
|
|
|
|
|
|
|
|
793
|
0
|
|
|
|
|
|
foreach my $setting ( @settings ) { |
|
794
|
0
|
|
|
|
|
|
$data .= " var __$setting=parent.OpenThought.config.$setting;"; |
|
795
|
|
|
|
|
|
|
} |
|
796
|
|
|
|
|
|
|
|
|
797
|
0
|
|
|
|
|
|
return $data; |
|
798
|
|
|
|
|
|
|
} |
|
799
|
|
|
|
|
|
|
|
|
800
|
|
|
|
|
|
|
# Restore the previous value of a setting |
|
801
|
|
|
|
|
|
|
sub _settings_restore { |
|
802
|
0
|
|
|
0
|
|
|
my ( $self, @settings ) = @_; |
|
803
|
|
|
|
|
|
|
|
|
804
|
0
|
|
|
|
|
|
my $data; |
|
805
|
|
|
|
|
|
|
|
|
806
|
0
|
|
|
|
|
|
foreach my $setting ( @settings ) { |
|
807
|
0
|
|
|
|
|
|
$data .= " parent.OpenThought.config.$setting = __$setting;"; |
|
808
|
|
|
|
|
|
|
} |
|
809
|
|
|
|
|
|
|
|
|
810
|
0
|
|
|
|
|
|
return $data; |
|
811
|
|
|
|
|
|
|
} |
|
812
|
|
|
|
|
|
|
|
|
813
|
|
|
|
|
|
|
# Convert a Perl hash into a JavaScript data structure. This has all been |
|
814
|
|
|
|
|
|
|
# recently (7/24/05) modified to use JSON notation: |
|
815
|
|
|
|
|
|
|
# http://www.crockford.com/JSON/index.html |
|
816
|
|
|
|
|
|
|
sub _as_javascript { |
|
817
|
0
|
|
|
0
|
|
|
my ($self, $data) = @_; |
|
818
|
0
|
|
|
|
|
|
my $packet; |
|
819
|
|
|
|
|
|
|
|
|
820
|
0
|
0
|
|
|
|
|
unless ( ref $data eq "HASH" ) { |
|
821
|
0
|
|
|
|
|
|
croak "Data sent to the serializer function must be a reference to a hash."; |
|
822
|
|
|
|
|
|
|
} |
|
823
|
|
|
|
|
|
|
|
|
824
|
0
|
|
|
|
|
|
$packet = "{"; |
|
825
|
|
|
|
|
|
|
|
|
826
|
|
|
|
|
|
|
# Loop through each element that needs filled |
|
827
|
0
|
|
|
|
|
|
while ( my( $key, $val ) = each %{ $data } ) { |
|
|
0
|
|
|
|
|
|
|
|
828
|
|
|
|
|
|
|
|
|
829
|
|
|
|
|
|
|
# In the case of a simple key=value assignment, do the following. This |
|
830
|
|
|
|
|
|
|
# is used for text, password, textbox, uniquely named checkboxes, and |
|
831
|
|
|
|
|
|
|
# radio buttons |
|
832
|
|
|
|
|
|
|
# Convert: $hash->{key} = "value" |
|
833
|
|
|
|
|
|
|
# To: key : value, |
|
834
|
0
|
0
|
0
|
|
|
|
if( not ref $val) { |
|
|
|
0
|
0
|
|
|
|
|
|
|
|
0
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
835
|
0
|
0
|
|
|
|
|
if ( defined $val ) { |
|
836
|
0
|
|
|
|
|
|
$val = $self->_escape_javascript( $val ); |
|
837
|
0
|
|
|
|
|
|
$packet .= qq("$key": "$val",); |
|
838
|
|
|
|
|
|
|
} |
|
839
|
|
|
|
|
|
|
else { |
|
840
|
0
|
|
|
|
|
|
$packet .= qq("$key": null,); |
|
841
|
|
|
|
|
|
|
} |
|
842
|
|
|
|
|
|
|
} |
|
843
|
|
|
|
|
|
|
|
|
844
|
|
|
|
|
|
|
# In the case of adding one item to a select box, or clearing a select box |
|
845
|
|
|
|
|
|
|
# Convert: $hash->{key} = [ $val1, $val2 ] |
|
846
|
|
|
|
|
|
|
# To: key: [ val1, val2 ], |
|
847
|
|
|
|
|
|
|
elsif ( ref $val eq "ARRAY" and not ref $val->[0] ) { |
|
848
|
|
|
|
|
|
|
|
|
849
|
|
|
|
|
|
|
# If we are sent something like: |
|
850
|
|
|
|
|
|
|
# $field->{'selectbox_name'} = [ "" ]; |
|
851
|
|
|
|
|
|
|
# That means we wish to clear the selectbox |
|
852
|
0
|
0
|
0
|
|
|
|
unless ( defined $val->[0] and $val->[0] ne "" ) { |
|
853
|
|
|
|
|
|
|
|
|
854
|
0
|
|
|
|
|
|
$packet .= qq("$key": [ "" ],); |
|
855
|
0
|
|
|
|
|
|
next; |
|
856
|
|
|
|
|
|
|
} |
|
857
|
|
|
|
|
|
|
|
|
858
|
0
|
|
|
|
|
|
$packet .= qq("$key": [ ); |
|
859
|
0
|
|
0
|
|
|
|
$packet .= join '', |
|
860
|
0
|
|
|
|
|
|
map { '"' . ($self->_escape_javascript($_) || "") . '",'} |
|
861
|
0
|
|
|
|
|
|
@{ $val }; |
|
862
|
|
|
|
|
|
|
|
|
863
|
0
|
|
|
|
|
|
chop $packet; |
|
864
|
0
|
|
|
|
|
|
$packet .= qq( ],); |
|
865
|
|
|
|
|
|
|
} |
|
866
|
|
|
|
|
|
|
|
|
867
|
|
|
|
|
|
|
# For updating select lists using an array of hashes |
|
868
|
|
|
|
|
|
|
# Convert: $hash->{key} = [ { val1 => val2 }, { val3 => val4 } ] |
|
869
|
|
|
|
|
|
|
# To: key: [ { val1: val2 }, { val3: val4 } ], |
|
870
|
|
|
|
|
|
|
elsif ( ref $val eq "ARRAY" and ref $val->[0] eq "HASH" ) { |
|
871
|
0
|
|
|
|
|
|
$packet .= qq("$key": [ ); |
|
872
|
|
|
|
|
|
|
|
|
873
|
0
|
|
|
|
|
|
foreach my $hash ( @{ $val } ) { |
|
|
0
|
|
|
|
|
|
|
|
874
|
0
|
|
|
|
|
|
while ( my ( $key1, $val1 ) = each %{ $hash } ) { |
|
|
0
|
|
|
|
|
|
|
|
875
|
0
|
|
|
|
|
|
$val1 = $self->_escape_javascript( $val1 ); |
|
876
|
0
|
|
|
|
|
|
$packet .= qq({"$key1": "$val1"},) |
|
877
|
|
|
|
|
|
|
} |
|
878
|
0
|
|
|
|
|
|
chop $packet; |
|
879
|
|
|
|
|
|
|
} |
|
880
|
0
|
|
|
|
|
|
$packet .= qq( ],); |
|
881
|
|
|
|
|
|
|
} |
|
882
|
|
|
|
|
|
|
|
|
883
|
|
|
|
|
|
|
# This is done for adding multiple items to select boxes |
|
884
|
|
|
|
|
|
|
# Convert: $hash->{key} = [ [ val1, val2 ], [ val3, val4 ] ] |
|
885
|
|
|
|
|
|
|
# To: key: [ [ val1, val2 ], [ val3, val4 ] ], |
|
886
|
|
|
|
|
|
|
elsif ( ref $val eq "ARRAY" and ref $val->[0] eq "ARRAY" ) { |
|
887
|
0
|
|
|
|
|
|
$packet .= qq("$key": [ ); |
|
888
|
0
|
|
|
|
|
|
my $i=0; |
|
889
|
0
|
|
|
|
|
|
foreach my $array ( @{ $val } ) { |
|
|
0
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
|
|
891
|
|
|
|
|
|
|
# If we are only sent text for the selectlist, and no value -- |
|
892
|
|
|
|
|
|
|
# define the value as empty. When it gets to the browser, the |
|
893
|
|
|
|
|
|
|
# value will be made the same as the text |
|
894
|
0
|
0
|
|
|
|
|
$array->[1] = "" unless defined($array->[1]); |
|
895
|
|
|
|
|
|
|
|
|
896
|
0
|
|
|
|
|
|
$array->[0] = $self->_escape_javascript( $array->[0] ); |
|
897
|
0
|
|
|
|
|
|
$array->[1] = $self->_escape_javascript( $array->[1] ); |
|
898
|
0
|
|
|
|
|
|
$packet .= qq(["$array->[0]","$array->[1]"],); |
|
899
|
0
|
|
|
|
|
|
$i++; |
|
900
|
|
|
|
|
|
|
} |
|
901
|
0
|
|
|
|
|
|
chop $packet; |
|
902
|
0
|
|
|
|
|
|
$packet .= qq( ],); |
|
903
|
|
|
|
|
|
|
} |
|
904
|
|
|
|
|
|
|
|
|
905
|
|
|
|
|
|
|
# This updates multiple checkboxes with the same name |
|
906
|
|
|
|
|
|
|
# Convert: $hash->{key} = { key1 => val1, key2 = val2 } |
|
907
|
|
|
|
|
|
|
# To: key : { key1 : val1, key2 : val2 }, |
|
908
|
|
|
|
|
|
|
elsif ( ref $val eq "HASH" ) { |
|
909
|
0
|
|
|
|
|
|
$packet .= qq("$key": { ); |
|
910
|
0
|
|
|
|
|
|
foreach my $key2 ( keys %{ $val } ) { |
|
|
0
|
|
|
|
|
|
|
|
911
|
0
|
0
|
|
|
|
|
$val->{$key2} = "" unless defined($val->{$key2}); |
|
912
|
0
|
|
|
|
|
|
$val->{$key2} = $self->_escape_javascript( $val->{$key2} ); |
|
913
|
0
|
|
|
|
|
|
$packet .= qq("$key2": "$val->{$key2}",); |
|
914
|
|
|
|
|
|
|
} |
|
915
|
0
|
|
|
|
|
|
chop $packet; |
|
916
|
0
|
|
|
|
|
|
$packet .= qq(},); |
|
917
|
|
|
|
|
|
|
} |
|
918
|
|
|
|
|
|
|
else { |
|
919
|
0
|
|
|
|
|
|
carp "I'm not sure what to do with the data structure you sent!"; |
|
920
|
|
|
|
|
|
|
} |
|
921
|
|
|
|
|
|
|
} |
|
922
|
0
|
|
|
|
|
|
chop $packet; |
|
923
|
0
|
|
|
|
|
|
$packet .= "}"; |
|
924
|
|
|
|
|
|
|
|
|
925
|
0
|
|
|
|
|
|
return $packet; |
|
926
|
|
|
|
|
|
|
} |
|
927
|
|
|
|
|
|
|
|
|
928
|
|
|
|
|
|
|
# Adds the appropriate script tags to JavaScript code |
|
929
|
|
|
|
|
|
|
sub _add_tags { |
|
930
|
0
|
|
|
0
|
|
|
my ( $self, $code ) = @_; |
|
931
|
|
|
|
|
|
|
|
|
932
|
|
|
|
|
|
|
# The tag is a bit of a unique ID... so that the JS can detect the |
|
933
|
|
|
|
|
|
|
# difference between OT adding the tags, and tags added by the developer. |
|
934
|
|
|
|
|
|
|
# The JS will strip all these tags -- everything but $code -- if the call |
|
935
|
|
|
|
|
|
|
# is done through XmlHttpRequest or similar, but they're required with |
|
936
|
|
|
|
|
|
|
# iframes. |
|
937
|
|
|
|
|
|
|
# |
|
938
|
|
|
|
|
|
|
# We're doing this instead of passing parameters from the browser to the |
|
939
|
|
|
|
|
|
|
# server and testing on them to see if the tags should be added at all. |
|
940
|
|
|
|
|
|
|
# Basically, this prevents the developer from having to pass params into OT |
|
941
|
|
|
|
|
|
|
# that they don't understand, which I think makes things more complicated |
|
942
|
|
|
|
|
|
|
# than they need to be. You have my email address, feel free to argue :-) |
|
943
|
0
|
|
|
|
|
|
return qq{\r \r}; |
|
944
|
|
|
|
|
|
|
} |
|
945
|
|
|
|
|
|
|
|
|
946
|
|
|
|
|
|
|
sub _escape_javascript { |
|
947
|
0
|
|
|
0
|
|
|
my ( $self, $code ) = @_; |
|
948
|
|
|
|
|
|
|
|
|
949
|
0
|
0
|
|
|
|
|
return unless defined $code; |
|
950
|
|
|
|
|
|
|
|
|
951
|
0
|
|
|
|
|
|
$code =~ s/\\/\\\\/g; |
|
952
|
0
|
|
|
|
|
|
$code =~ s/\n/\\n/g; |
|
953
|
0
|
|
|
|
|
|
$code =~ s/\r/\\r/g; |
|
954
|
0
|
|
|
|
|
|
$code =~ s/\t/\\t/g; |
|
955
|
0
|
|
|
|
|
|
$code =~ s/\"/\\"/g; |
|
956
|
0
|
|
|
|
|
|
$code =~ s/([\x00-\x1F])/sprintf("\\%03o", ord($1))/ge; |
|
|
0
|
|
|
|
|
|
|
|
957
|
|
|
|
|
|
|
|
|
958
|
0
|
|
|
|
|
|
return $code; |
|
959
|
|
|
|
|
|
|
} |
|
960
|
|
|
|
|
|
|
|
|
961
|
|
|
|
|
|
|
1; |
|
962
|
|
|
|
|
|
|
|
|
963
|
|
|
|
|
|
|
__END__ |