Note that Mark added Braintree payment module
[interchange.git] / code / UserTag / button.tag
1 # Copyright 2002-2008 Interchange Development Group and others
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.  See the LICENSE file for details.
7
8 UserTag button Order     name src text
9 UserTag button addAttr
10 UserTag button attrAlias value text
11 UserTag button hasEndTag
12 UserTag button Version   1.25
13 UserTag button Routine   <<EOR
14 sub {
15         my ($name, $src, $text, $opt, $action) = @_;
16
17         my $trigger_text;
18
19         if($opt->{wait_text}) {
20                 $trigger_text = $opt->{wait_text};
21         }
22         else {
23                 $trigger_text = $text;
24         }
25
26         my @js;
27         my $image;
28
29         my @from_html = qw/class id style/;
30
31         if($src) {
32                 if( $opt->{srcliteral} || $src =~ m{^https?://}i ) {
33                         $image = $src;
34                 }
35                 else {
36                         my $dr = $::Variable->{DOCROOT};
37                         my $id = $Tag->image( { dir_only => 1 } );
38                         $id =~ s:/+$::;
39                         $id =~ s:/~[^/]+::;
40
41                         if( $dr and $id and $src =~ m{^[^/]} and -f "$dr$id/$src" ) {
42                                 $image = $src;
43                         }
44                         elsif( $dr and $src =~ m{^/} and -f "$dr/$src" ) {
45                                 $image = "$id/$src";
46                         }
47                         else {
48                                 ::logError("No image file '$src' found or image file name is invalid.");
49                         }
50                 }
51         }
52         my $onclick = '';
53         my $onmouseover = '';
54         my $onmouseout = '';
55         while($action =~ s! \[
56                                                 (
57                                                         j (?:ava)? s (?:cript)?
58                                                 )
59                                                 \]
60                                                         (.*?)
61                                           \[ / \1 \]
62                                           !!xis
63                 )
64         {
65                 my $script = $2;
66                 $script =~ s/\s+$//;
67                 $script =~ s/^\s+//;
68                 if($script =~ s/\bonclick\s*=\s*"(.*?)"//is) {
69                         $onclick = $1;
70                         next;
71                 }
72                 if ($script =~ s/\bonmouse(\w+)\s*=\s*"(.*?)"//is) {
73                         if (lc($1) eq 'over') {
74                                 $onmouseover .= ($onmouseover ? ';' : '') . $2;
75                         }
76                         elsif (lc($1) eq 'out') {
77                                 $onmouseout .= ($onmouseout ? ';' : '') . $2;
78                         }
79                         else {
80                                 logError(q{Skipping 'onmouse%s', invalid JavaScript event}, $1);
81                         }
82                         next;
83                 }
84                 push @js, $script;
85         }
86
87         if(! $name or $name eq 'mv_click') {
88                 $action =~ s/^\s+//;
89                 $action =~ s/\s+$//;
90                 my $set_text = HTML::Entities::decode($trigger_text);
91                 $::Scratch->{$set_text} = $action;
92                 $name = 'mv_click' if ! $name;
93         }
94         
95         my $out = '';
96         my $confirm = '';
97         my $wait = '';
98         $opt->{extra} = $opt->{extra} ? " $opt->{extra}" : '';
99         if($opt->{confirm}) {
100                 $opt->{confirm} =~ s/'/\\'/g;
101                 $confirm = "confirm('$opt->{confirm}')";
102         }
103
104         if($onclick) {
105                 $confirm .= ' && ' if $confirm;
106                 $onclick = qq{ onClick="$confirm$onclick"};
107         }
108
109         # Constructing form button. Will be sent back in all cases,
110         # either as the primary button or as the <noscript> option
111         # for JavaScript-challenged browsers.
112         $text =~ s/"/&quot;/g;
113         $name =~ s/"/&quot;/g;
114         $out = qq{<input type="submit" name="$name" value="$text"$onclick$Vend::Xtrailer>};
115         if (@js) {
116                 $out =~ s/ /join "\n", '', @js, ''/e;
117         }
118
119         $opt->{extra} ||= '';
120         for(@from_html) {
121                 next unless $opt->{$_};
122                 $opt->{extra} .= qq{ $_="$opt->{$_}"};
123         }
124
125         # return submit button if not an image
126         if(! $image) {
127                 $text =~ s/"/&quot;/g;
128                 $name =~ s/"/&quot;/g;
129                 if(! $onclick and $confirm) {
130                         $onclick = qq{ onclick="return $confirm"};
131                 }
132                 elsif(! $onclick and $opt->{wait_text}) {
133                         $opt->{wait_text} = HTML::Entities::encode($trigger_text);
134                         $onclick  = qq{ onClick="};
135                         $onclick .= qq{var msg = 'Already submitted.';};
136                         $onclick .= qq{this.value = '$opt->{wait_text}';};
137                         $onclick .= qq{this.onclick = 'alert(msg)'; return true;};
138                         $onclick .= qq{"};
139                 }
140
141                 my $out = $opt->{bold} ? '<b>' : '';
142                 $out .= qq{<input$opt->{extra} type="submit" name="$name" value="$text"$onclick$Vend::Xtrailer>};
143                 $out .= '</b>' if $opt->{bold};
144                 if(@js) {
145                         $out =~ s/ /join "\n", '', @js, ''/e;
146                 }
147                 return $out;
148         }
149
150         # If we got here the button is an image
151         # Wrap form button code in <noscript>
152         my $no_script = qq{<noscript>$out</noscript>\n};
153         $out = '';
154
155         my $wstatus = $opt->{alt} || $text;
156         $wstatus =~ s/'/\\'/g;
157
158         my $clickname = $name;
159         my $clickvar = $name;
160         if($image and $name eq 'mv_click') {
161                 $clickvar = $text;
162                 $clickvar =~ s/\W/_/g;
163                 $clickname = "mv_click_$clickvar";
164                 $out = qq{<input type='hidden' name='mv_click_map' value='$clickvar'$Vend::Xtrailer>};
165         }
166         
167         $out .= qq{<input type='hidden' name='$clickname' value=''$Vend::Xtrailer>} if $image; 
168
169         my $formname;
170         $opt->{form} = 'forms[0]'
171                 if ! $opt->{form};
172
173         $confirm .= ' && ' if $confirm;
174         $opt->{border} = 0 if ! $opt->{border};
175
176         if($opt->{getsize}) {
177                 eval {
178                         require Image::Size;
179                         ($opt->{width}, $opt->{height}) = Image::Size::imgsize($image);
180                 };
181         }
182
183         $opt->{align} = 'top' if ! $opt->{align};
184
185         my $position = '';
186         for(qw/height width vspace hspace align/) {
187                 $position .= " $_='$opt->{$_}'" if $opt->{$_};
188         }
189
190         my $anchor = '';
191         unless( $opt->{hidetext}) {
192                 $anchor = $opt->{anchor} || $text;
193                 $anchor =~ s/ /&nbsp;/g;
194                 $anchor = "<b>$anchor</b>";
195         }
196
197         my $a_before = '</a>';
198         my $a_after  = '';
199         if($opt->{link_text_too}) {
200                 $a_before = '';
201                 $a_after = '</a>';
202         }
203
204         $opt->{link_href} ||= 'javascript: void 0';
205         if ($onclick =~ /^\s*onclick\s*=\s*"(.*?)"/i) {
206                 $onclick = $1 . ' && ';
207         }
208         # QUOTING (fix here too?)
209         $out .= <<EOF;
210 <a href="$opt->{link_href}"$opt->{extra} onMouseOver="window.status='$wstatus';$onmouseover"
211 EOF
212         $out .= <<EOF if $onmouseout;
213         onMouseOut="$onmouseout"
214 EOF
215         $out .= <<EOF;
216         onClick="$confirm $onclick mv_click_map_unique(document.$opt->{form}, '$clickname', '$text') && $opt->{form}.submit(); return(false);"
217         alt="$wstatus"><img alt="$wstatus" src="$src" border='$opt->{border}'$position>$a_before$anchor$a_after
218 EOF
219
220         my $function = '';
221         unless ($::Instance->{js_functions}{mv_do_click}++) {
222                 $function = "\n" . <<'EOJS';
223 function mv_click_map_unique(myform, clickname, clicktext) {
224         for (var i = 0; i < myform.length; i++) {
225                 var widget = myform.elements[i];
226                 if (
227                         (widget.type == 'hidden')
228                         && (widget.name != 'mv_click_map')
229                         && (widget.name.indexOf('mv_click_') == 0)
230                 )
231                         widget.value = (widget.name == clickname) ? clicktext : '';
232         }
233         return true;
234 }
235 EOJS
236         }
237
238         # Must escape backslashes and single quotes for JavaScript write function.
239         # Also must get rid of newlines and carriage returns.
240         $out =~ s/(['\\])/\\$1/g;
241         $out =~ s/[\n\r]+/ /g;
242         $out = <<EOV;
243 <script language="javascript1.2" type="text/javascript">
244 <!--$function
245 document.write('$out');
246 // -->
247 </script>
248 $no_script
249 EOV
250
251         return $out;
252 }
253
254 EOR