Merge branch 'patch-4' of https://github.com/gjones2/Freeside (#13854 as this bug...
[freeside.git] / httemplate / elements / xmlhttp.html
1 <%doc>
2
3 Example:
4
5   include( '/elements/xmlhttp.html',
6     # required
7     'url'  => $p.'misc/something.html',
8     'subs' => [ 'subroutine' ],
9
10     # optional
11     'method' => 'GET', #defaults to GET, could specify POST
12     'key'    => 'unique', #unique key
13
14   );
15
16 </%doc>
17 <& /elements/rs_init_object.html &>
18 <& /elements/init_overlib.html &>
19 <SCRIPT TYPE="text/javascript">
20
21 % foreach my $func ( @{$opt{'subs'}} ) { 
22 %
23 %       my $furl = $url;
24 %       $furl =~ s/\"/\\\\\"/; #javascript escape
25 %#"
26 %  
27
28
29     function <%$key%><%$func%>() {
30         // count args; build URL
31         var url = "<%$furl%>";
32         var a = <%$key%><%$func%>.arguments;
33
34         var args;
35         var len;
36         var content = 'sub=<% uri_escape($func) %>';
37         if ( a && typeof a  == 'object'  && a[0].constructor == Array ) {
38             args = a[0];
39             len = args.length
40         } else {
41             args = a;
42             len = args.length - 1;
43         }
44         for (var i = 0; i < len; i++) 
45             content = content + "&arg=" + escape(args[i]);
46         content = content.replace( /[+]/g, '%2B'); // fix unescaped plus signs 
47
48         if ( '<%$method%>' == 'GET' ) {
49           url = url + content;
50         }
51
52         //alert('<%$method%> ' + url);
53
54         var xmlhttp = rs_init_object();
55         xmlhttp.open("<%$method%>", url, true);
56
57         xmlhttp.onreadystatechange = function() {
58             if (xmlhttp.readyState != 4) 
59                 return;
60
61             if (xmlhttp.status != 200) {
62               if ( xmlhttp.status != 0 ) {
63                 //not warning on the 0 errors, they pop up when navagating away
64                 // from the page
65                 alert(xmlhttp.status + " status connecting to " + url);
66               }
67             } else {
68               var data = xmlhttp.responseText;
69               //alert('received response: ' + data);
70               if ( data.indexOf("<b>System error</b>") > -1 ) {
71                 // trim this a little
72                 var end = data.indexOf('<a href="#raw">') - 1;
73                 data = data.substring(0, end);
74
75                 overlib(data,
76                   WIDTH, 480, MIDX, 0, MIDY, 0,
77                   CAPTION, 'Error', STICKY, AUTOSTATUSCAP, DRAGGABLE,
78                   CLOSECLICK, BGCOLOR, '#f00', CGCOLOR, '#f00'
79                 );
80                 //var w;
81                 //if ( w = window.open("about:blank") ) {
82                 //  w.document.write(data);
83                 //} else {
84                 //  // popup blocking?  should use an overlib popup instead 
85                 //  alert("Error popup disabled; try disabling popup blocking to see");
86                 //}
87               } else {
88                 // invoke the callback
89                 a[a.length-1](data);
90               }
91             }
92         }
93
94         if ( '<%$method%>' == 'POST' ) {
95
96           xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
97           xmlhttp.send(content);
98
99         } else {
100
101           xmlhttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
102           xmlhttp.send(null);
103
104         }
105
106         //rs_debug("x_$func_name url = " + url);
107         //rs_debug("x_$func_name waiting..");
108     }
109 % } 
110
111
112 </SCRIPT>
113 <%init>
114 my ( %opt ) = @_;
115
116 my $url = $opt{'url'};
117 my $method = exists($opt{'method'}) ? $opt{'method'} : 'GET';
118 #my @subs = @{ $opt{'subs'};
119 my $key = exists($opt{'key'}) ? $opt{'key'} : '';
120
121 $url .= ( ($url =~ /\?/) ? '&' : '?' )
122   if $method eq 'GET';
123
124 </%init>