[1849] | 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
---|
[1698] | 2 | <html> |
---|
| 3 | <head> |
---|
| 4 | <title>PWG web service explorer</title> |
---|
[2134] | 5 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
---|
[1698] | 6 | <script type="text/javascript" src="prototype.js" ></script> |
---|
| 7 | |
---|
| 8 | <script type="text/javascript"> |
---|
| 9 | |
---|
| 10 | function setVisibility(id, vis) |
---|
| 11 | { |
---|
[1852] | 12 | $(id).style.visibility = vis; |
---|
[1698] | 13 | } |
---|
| 14 | |
---|
| 15 | function dumpError(err) |
---|
| 16 | { |
---|
| 17 | var s= 'Error '; |
---|
| 18 | if ('string' === typeof err ) |
---|
| 19 | s += err; |
---|
| 20 | else |
---|
| 21 | { |
---|
| 22 | s += err.name+'<br/>'; |
---|
| 23 | s += err.message; |
---|
| 24 | if (err.stack!=null) |
---|
| 25 | {//mozilla only |
---|
| 26 | s += '<br/><small><pre>'+ err.stack + '</pre></small>'; |
---|
| 27 | } |
---|
| 28 | } |
---|
[1852] | 29 | $("error").update(s); |
---|
[1698] | 30 | } |
---|
| 31 | |
---|
| 32 | var gServiceUrl; |
---|
[1852] | 33 | var gCachedMethods; |
---|
[1698] | 34 | |
---|
| 35 | Ajax.Responders.register({ |
---|
| 36 | |
---|
| 37 | onException: function(req, err) { |
---|
| 38 | try { |
---|
| 39 | document.pwgError = err; |
---|
| 40 | dumpError(err); |
---|
| 41 | } |
---|
| 42 | catch (e) |
---|
| 43 | { |
---|
| 44 | alert (err); |
---|
| 45 | alert (err.message); |
---|
| 46 | } |
---|
| 47 | }, |
---|
| 48 | |
---|
| 49 | onComplete: function(req, transport) { |
---|
| 50 | if (!req.responseIsSuccess()) |
---|
| 51 | { |
---|
| 52 | var s = 'Completion failure\n' + transport.status + ' ' + transport.statusText; |
---|
| 53 | if (transport.status>=300) |
---|
| 54 | { |
---|
| 55 | s += '\n'; |
---|
| 56 | s += transport.responseText.substr(0,1000); |
---|
| 57 | } |
---|
| 58 | dumpError(s); |
---|
| 59 | } |
---|
| 60 | } |
---|
| 61 | } |
---|
| 62 | ); |
---|
| 63 | |
---|
| 64 | |
---|
| 65 | function pwgGetJsonResult(transport) |
---|
| 66 | { |
---|
| 67 | var resp; |
---|
| 68 | try { |
---|
| 69 | eval('resp = ' + transport.responseText); |
---|
| 70 | } |
---|
| 71 | catch (e) |
---|
| 72 | { |
---|
| 73 | var s = e.message; |
---|
| 74 | s += '\n' + transport.responseText.substr(0,1000).escapeHTML(); |
---|
| 75 | throw new Error( s ); |
---|
| 76 | } |
---|
| 77 | if (resp==null || resp.result==null || resp.stat==null || resp.stat!='ok') |
---|
| 78 | { |
---|
| 79 | var s = 'JSON evaluation error'; |
---|
| 80 | if (resp) |
---|
| 81 | { |
---|
| 82 | if (resp.stat!=null) s+= '\n'+resp.stat; |
---|
| 83 | if (resp.message!=null) s+= '\n'+ resp.message; |
---|
| 84 | } |
---|
| 85 | throw new Error(s); |
---|
| 86 | } |
---|
| 87 | return resp.result; |
---|
| 88 | } |
---|
| 89 | |
---|
| 90 | function pwgChangeUrl() |
---|
| 91 | { |
---|
[1852] | 92 | $("error").update(""); |
---|
[1698] | 93 | setVisibility("methodListWrapper", "hidden"); |
---|
[1852] | 94 | $("methodList").update(""); |
---|
[1698] | 95 | setVisibility("methodWrapper", "hidden"); |
---|
[1852] | 96 | setVisibility("methodDetailWrapper", "hidden"); |
---|
[1698] | 97 | |
---|
| 98 | gServiceUrl = $F('ws_url'); |
---|
[1852] | 99 | gCachedMethods = new Hash(); |
---|
[1698] | 100 | |
---|
| 101 | try { |
---|
| 102 | var ajaxReq = new Ajax.Request( |
---|
| 103 | gServiceUrl, |
---|
| 104 | {method:'get', parameters:'format=json&method=reflection.getMethodList', |
---|
| 105 | onSuccess: function (r) { onSuccess_getMethodList(r); } |
---|
| 106 | } |
---|
| 107 | ) |
---|
| 108 | }catch (e) |
---|
| 109 | { |
---|
| 110 | dumpError(e); |
---|
| 111 | } |
---|
| 112 | return false; |
---|
| 113 | } |
---|
| 114 | |
---|
| 115 | function onSuccess_getMethodList(transport) |
---|
| 116 | { |
---|
| 117 | var result = pwgGetJsonResult(transport); |
---|
| 118 | var ml = ''; |
---|
| 119 | for (var i=0; i<result.methods.length; i++) |
---|
| 120 | { |
---|
| 121 | ml += '<li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">'+ result.methods[i]+'</a></li>'; |
---|
| 122 | } |
---|
[1852] | 123 | $("methodList").update(ml); |
---|
[1698] | 124 | setVisibility("methodListWrapper", "visible"); |
---|
| 125 | } |
---|
| 126 | |
---|
[1852] | 127 | function pwgSelectMethod(methodName) |
---|
[1698] | 128 | { |
---|
[1852] | 129 | $("error").update(""); |
---|
| 130 | $("methodName").update(methodName); |
---|
[1698] | 131 | setVisibility("methodDetailWrapper", "hidden"); |
---|
| 132 | setVisibility("methodWrapper", "visible"); |
---|
| 133 | |
---|
[1852] | 134 | if ( gCachedMethods[methodName] ) |
---|
| 135 | fillNewMethod( gCachedMethods[methodName] ); |
---|
| 136 | else |
---|
[1698] | 137 | { |
---|
[1852] | 138 | try { |
---|
| 139 | var ajaxReq = new Ajax.Request( |
---|
| 140 | gServiceUrl, |
---|
| 141 | {method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+methodName, |
---|
| 142 | onSuccess: function (r) { onSuccess_getMethodDetails(r); } |
---|
| 143 | } |
---|
| 144 | ) |
---|
| 145 | }catch (e) |
---|
| 146 | { |
---|
| 147 | dumpError( e ); |
---|
| 148 | } |
---|
[1698] | 149 | } |
---|
| 150 | return false; |
---|
| 151 | } |
---|
| 152 | |
---|
| 153 | function onSuccess_getMethodDetails(transport) |
---|
| 154 | { |
---|
| 155 | var result = pwgGetJsonResult(transport); |
---|
[2424] | 156 | fillNewMethod( gCachedMethods[result.name] = result ); |
---|
[1852] | 157 | } |
---|
| 158 | |
---|
| 159 | function fillNewMethod(method) |
---|
| 160 | { |
---|
[1698] | 161 | var methodParamsElt = $("methodParams"); |
---|
| 162 | while (methodParamsElt.tBodies[0].rows.length) |
---|
| 163 | methodParamsElt.tBodies[0].deleteRow(methodParamsElt.tBodies[0].rows.length-1); |
---|
| 164 | |
---|
[1852] | 165 | if (method.params && method.params.length>0) |
---|
| 166 | { |
---|
| 167 | for (var i=0; i<method.params.length; i++) |
---|
[1849] | 168 | { |
---|
| 169 | var row = methodParamsElt.tBodies[0].insertRow(-1); |
---|
[1852] | 170 | var isOptional = method.params[i].optional; |
---|
| 171 | var acceptArray = method.params[i].acceptArray; |
---|
| 172 | var defaultValue = method.params[i].defaultValue == null ? '' : method.params[i].defaultValue; |
---|
[2134] | 173 | |
---|
[1852] | 174 | row.insertCell(0).innerHTML = method.params[i].name; |
---|
| 175 | row.insertCell(1).innerHTML = '<span title="parameter is '+(isOptional ? 'optional':'required') +'">'+(isOptional ? '?':'*')+'</span>' |
---|
| 176 | + (method.params[i].acceptArray ? ' <span title="parameter can be an array; use | (pipe) character to split values">[ ]</span>':''); |
---|
[1849] | 177 | row.insertCell(2).innerHTML = '<input id="methodParameterSend_'+i+'" type="checkbox" '+(isOptional ? '':'checked="checked"')+'/>'; |
---|
| 178 | row.insertCell(3).innerHTML = '<input id="methodParameterValue_'+i+'"" value="'+defaultValue+'" style="width:99%" onchange="$(\'methodParameterSend_'+i+'\').checked=true;"/>'; |
---|
| 179 | } |
---|
[1852] | 180 | } |
---|
| 181 | $("methodDescription").update(method.description); |
---|
[1698] | 182 | setVisibility("methodDetailWrapper", "visible"); |
---|
| 183 | } |
---|
| 184 | |
---|
[1849] | 185 | function pwgInvokeMethod( newWindow ) |
---|
[1698] | 186 | { |
---|
[1852] | 187 | var methodName = $('methodName').innerHTML; |
---|
| 188 | var method = gCachedMethods[methodName]; |
---|
[1698] | 189 | |
---|
| 190 | var reqUrl = gServiceUrl; |
---|
| 191 | reqUrl += "?format="+$F('responseFormat'); |
---|
| 192 | |
---|
[1852] | 193 | if ($('requestFormat').value == 'get') |
---|
[1698] | 194 | { |
---|
[1852] | 195 | reqUrl += "&method="+methodName; |
---|
| 196 | for ( var i=0; i<method.params.length; i++) |
---|
[1698] | 197 | { |
---|
[1852] | 198 | if (! $('methodParameterSend_'+i).checked) |
---|
| 199 | continue; |
---|
| 200 | |
---|
| 201 | if ( method.params[i].acceptArray && $F('methodParameterValue_'+i).split('|').length > 1 ) |
---|
| 202 | { |
---|
| 203 | $F('methodParameterValue_'+i).split('|').each( |
---|
| 204 | function(v) { |
---|
| 205 | reqUrl += '&'+method.params[i].name+'[]='+v; |
---|
| 206 | } |
---|
| 207 | ); |
---|
| 208 | } |
---|
| 209 | else |
---|
| 210 | reqUrl += '&'+method.params[i].name+'='+$F('methodParameterValue_'+i); |
---|
[1698] | 211 | } |
---|
[1849] | 212 | if ( !newWindow ) |
---|
[1852] | 213 | $("invokeFrame").src = reqUrl; |
---|
[1849] | 214 | else |
---|
| 215 | window.open(reqUrl); |
---|
[1698] | 216 | } |
---|
| 217 | else |
---|
| 218 | { |
---|
[1852] | 219 | var form = $("invokeForm"); |
---|
[1698] | 220 | form.action = reqUrl; |
---|
[1852] | 221 | var t = '<input type="hidden" name="'+'method'+'" value="'+methodName+'"/>'; |
---|
| 222 | for ( var i=0; i<method.params.length; i++) |
---|
[1698] | 223 | { |
---|
[1852] | 224 | if (! $('methodParameterSend_'+i).checked) |
---|
| 225 | continue; |
---|
| 226 | |
---|
| 227 | if ( method.params[i].acceptArray && $F('methodParameterValue_'+i).split('|').length > 1 ) |
---|
| 228 | { |
---|
| 229 | $F('methodParameterValue_'+i).split('|').each( |
---|
| 230 | function(v) { |
---|
| 231 | t += '<input type="hidden" name="'+method.params[i].name+'[]" value="'+v+'"/>'; |
---|
| 232 | } |
---|
| 233 | ); |
---|
| 234 | } |
---|
| 235 | else |
---|
| 236 | t += '<input type="hidden" name="'+method.params[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>'; |
---|
[1698] | 237 | } |
---|
| 238 | form.innerHTML = t; |
---|
[1852] | 239 | form.target = newWindow ? "_blank" : "invokeFrame"; |
---|
[1698] | 240 | form.submit(); |
---|
| 241 | } |
---|
| 242 | return false; |
---|
| 243 | } |
---|
| 244 | </script> |
---|
| 245 | |
---|
| 246 | |
---|
| 247 | <style> |
---|
| 248 | #methodListWrapper { |
---|
[1849] | 249 | width: 13em; |
---|
[1698] | 250 | float: left; |
---|
| 251 | display: inline; |
---|
| 252 | visibility: hidden; |
---|
| 253 | } |
---|
| 254 | |
---|
| 255 | #methodList { |
---|
[1849] | 256 | padding-left: 10px; |
---|
| 257 | margin-left: 15px; |
---|
[1698] | 258 | } |
---|
| 259 | |
---|
| 260 | #methodWrapper { |
---|
[1849] | 261 | margin-left: 14em; |
---|
[1698] | 262 | visibility: hidden; |
---|
| 263 | } |
---|
| 264 | |
---|
| 265 | #methodName { |
---|
| 266 | margin-top: 0; |
---|
| 267 | margin-bottom: 3px; |
---|
| 268 | } |
---|
| 269 | |
---|
| 270 | |
---|
| 271 | #error { |
---|
| 272 | height: 90px; |
---|
| 273 | overflow: scroll; |
---|
| 274 | color: red; |
---|
| 275 | } |
---|
| 276 | |
---|
| 277 | #methodParams { |
---|
| 278 | border-collapse: collapse; |
---|
[1849] | 279 | font-size: small; |
---|
[1698] | 280 | } |
---|
[1849] | 281 | |
---|
| 282 | #methodParams input { |
---|
| 283 | font-size: 90%; |
---|
| 284 | border: 1px solid black; |
---|
| 285 | text-indent: 2px; |
---|
| 286 | } |
---|
| 287 | |
---|
| 288 | |
---|
| 289 | a { |
---|
| 290 | color: #02f; |
---|
| 291 | background-color: white; |
---|
| 292 | text-decoration: underline; |
---|
| 293 | } |
---|
| 294 | |
---|
| 295 | a:hover { |
---|
| 296 | color: white; |
---|
| 297 | background-color: #02f; |
---|
| 298 | text-decoration: none; |
---|
| 299 | cursor:pointer; |
---|
| 300 | } |
---|
| 301 | |
---|
[1698] | 302 | </style> |
---|
| 303 | |
---|
| 304 | </head> |
---|
| 305 | |
---|
| 306 | |
---|
| 307 | <body> |
---|
| 308 | |
---|
| 309 | <div> |
---|
| 310 | <label>PWG Web service url |
---|
| 311 | <input name="ws_url" id="ws_url" size="64"/> |
---|
| 312 | <script type="text/javascript"> |
---|
| 313 | var match = document.location.toString().match(/^(https?.*\/)tools\/ws\.html?$/); |
---|
| 314 | if (match!=null) $('ws_url').value = match[1]+'ws.php'; |
---|
| 315 | </script> |
---|
| 316 | </label> |
---|
| 317 | <a href="#" onclick="return pwgChangeUrl();">Go!</a> |
---|
| 318 | </div> |
---|
| 319 | |
---|
| 320 | <div id="error"> |
---|
| 321 | </div> |
---|
| 322 | |
---|
| 323 | <div> |
---|
| 324 | |
---|
[1849] | 325 | <div id="methodListWrapper"><h2>Methods</h2> |
---|
[1698] | 326 | <ul id="methodList"> |
---|
| 327 | <li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">getVersion</a></li> |
---|
| 328 | </ul> |
---|
| 329 | </div> |
---|
| 330 | |
---|
| 331 | <div id="methodWrapper"> |
---|
| 332 | <h2 id="methodName"></h2> |
---|
| 333 | <div id="methodDetailWrapper"> |
---|
[1849] | 334 | |
---|
[1698] | 335 | <table> |
---|
[1849] | 336 | <tr style="vertical-align:top"> |
---|
[2134] | 337 | |
---|
[1849] | 338 | <td> |
---|
| 339 | <div id="methodDescription"></div> |
---|
| 340 | <table> |
---|
[1698] | 341 | <tr> |
---|
[1849] | 342 | <td>Request format:</td> |
---|
| 343 | <td> |
---|
| 344 | <select id="requestFormat"> |
---|
| 345 | <option value="get" selected="selected">GET</option> |
---|
| 346 | <option value="post">POST</option> |
---|
| 347 | </select> |
---|
| 348 | </td> |
---|
[1698] | 349 | </tr> |
---|
[2134] | 350 | |
---|
[1849] | 351 | <tr> |
---|
| 352 | <td>Response format:</td> |
---|
| 353 | <td> |
---|
| 354 | <select id="responseFormat"> |
---|
| 355 | <option value="rest" selected="selected">REST (xml)</option> |
---|
| 356 | <option value="json">JSON</option> |
---|
| 357 | <option value="php">PHP serial</option> |
---|
| 358 | <option value="xmlrpc">XML RPC</option> |
---|
| 359 | </select> |
---|
| 360 | </td> |
---|
| 361 | </tr> |
---|
| 362 | </table> |
---|
| 363 | <p> |
---|
| 364 | <a href="#" onclick="return pwgInvokeMethod(false)">Invoke</a> |
---|
| 365 | <a href="#" onclick="return pwgInvokeMethod(true)">Invoke (new Window)</a> |
---|
| 366 | </p> |
---|
| 367 | </td> |
---|
| 368 | |
---|
[2134] | 369 | |
---|
[1849] | 370 | <td> |
---|
| 371 | <table id="methodParams" border="1" cellspacing="0" cellpadding="2px"> |
---|
| 372 | <thead> |
---|
| 373 | <tr> |
---|
| 374 | <td style="width:150px">Parameter</td> |
---|
[1852] | 375 | <td>Extra</td> |
---|
[1849] | 376 | <td>Send</td> |
---|
| 377 | <td style="width:160px">Value</td> |
---|
| 378 | </tr> |
---|
| 379 | </thead> |
---|
| 380 | <tbody> |
---|
| 381 | </tbody> |
---|
| 382 | </table> |
---|
| 383 | </td> |
---|
[2134] | 384 | |
---|
[1849] | 385 | </tr> |
---|
[1698] | 386 | </table> |
---|
[2134] | 387 | |
---|
[1849] | 388 | <div style="display:none;"> |
---|
[1698] | 389 | <!-- hiddenForm for POST --> |
---|
| 390 | <form method="post" action="" target="invokeFrame" id="invokeForm"> |
---|
| 391 | <input type="submit" value="submit"/> |
---|
| 392 | </form> |
---|
| 393 | </div> |
---|
| 394 | |
---|
[1849] | 395 | <iframe width="100%" height="400px" id="invokeFrame" name="invokeFrame" style="clear:both"></iframe> |
---|
[1698] | 396 | </div> <!-- methodDetailWrapper --> |
---|
| 397 | </div> <!-- methodWrapper --> |
---|
| 398 | |
---|
| 399 | </div> |
---|
| 400 | |
---|
| 401 | </body> |
---|
| 402 | </html> |
---|