piwigo/tools/ws.htm
rvelices f9927090e0 - feature 832: Folders with no images sql optimization
- recent pics are sorted by date descending, and only then by conf['order_by']
- updated prototype.js to version 1.6

git-svn-id: http://piwigo.org/svn/trunk@2424 68402e56-0260-453c-a942-63ccdbb3a9ee
2008-07-05 22:13:28 +00:00

402 lines
9.3 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>PWG web service explorer</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="prototype.js" ></script>
<script type="text/javascript">
function setVisibility(id, vis)
{
$(id).style.visibility = vis;
}
function dumpError(err)
{
var s= 'Error ';
if ('string' === typeof err )
s += err;
else
{
s += err.name+'<br/>';
s += err.message;
if (err.stack!=null)
{//mozilla only
s += '<br/><small><pre>'+ err.stack + '</pre></small>';
}
}
$("error").update(s);
}
var gServiceUrl;
var gCachedMethods;
Ajax.Responders.register({
onException: function(req, err) {
try {
document.pwgError = err;
dumpError(err);
}
catch (e)
{
alert (err);
alert (err.message);
}
},
onComplete: function(req, transport) {
if (!req.responseIsSuccess())
{
var s = 'Completion failure\n' + transport.status + ' ' + transport.statusText;
if (transport.status>=300)
{
s += '\n';
s += transport.responseText.substr(0,1000);
}
dumpError(s);
}
}
}
);
function pwgGetJsonResult(transport)
{
var resp;
try {
eval('resp = ' + transport.responseText);
}
catch (e)
{
var s = e.message;
s += '\n' + transport.responseText.substr(0,1000).escapeHTML();
throw new Error( s );
}
if (resp==null || resp.result==null || resp.stat==null || resp.stat!='ok')
{
var s = 'JSON evaluation error';
if (resp)
{
if (resp.stat!=null) s+= '\n'+resp.stat;
if (resp.message!=null) s+= '\n'+ resp.message;
}
throw new Error(s);
}
return resp.result;
}
function pwgChangeUrl()
{
$("error").update("");
setVisibility("methodListWrapper", "hidden");
$("methodList").update("");
setVisibility("methodWrapper", "hidden");
setVisibility("methodDetailWrapper", "hidden");
gServiceUrl = $F('ws_url');
gCachedMethods = new Hash();
try {
var ajaxReq = new Ajax.Request(
gServiceUrl,
{method:'get', parameters:'format=json&method=reflection.getMethodList',
onSuccess: function (r) { onSuccess_getMethodList(r); }
}
)
}catch (e)
{
dumpError(e);
}
return false;
}
function onSuccess_getMethodList(transport)
{
var result = pwgGetJsonResult(transport);
var ml = '';
for (var i=0; i<result.methods.length; i++)
{
ml += '<li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">'+ result.methods[i]+'</a></li>';
}
$("methodList").update(ml);
setVisibility("methodListWrapper", "visible");
}
function pwgSelectMethod(methodName)
{
$("error").update("");
$("methodName").update(methodName);
setVisibility("methodDetailWrapper", "hidden");
setVisibility("methodWrapper", "visible");
if ( gCachedMethods[methodName] )
fillNewMethod( gCachedMethods[methodName] );
else
{
try {
var ajaxReq = new Ajax.Request(
gServiceUrl,
{method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+methodName,
onSuccess: function (r) { onSuccess_getMethodDetails(r); }
}
)
}catch (e)
{
dumpError( e );
}
}
return false;
}
function onSuccess_getMethodDetails(transport)
{
var result = pwgGetJsonResult(transport);
fillNewMethod( gCachedMethods[result.name] = result );
}
function fillNewMethod(method)
{
var methodParamsElt = $("methodParams");
while (methodParamsElt.tBodies[0].rows.length)
methodParamsElt.tBodies[0].deleteRow(methodParamsElt.tBodies[0].rows.length-1);
if (method.params && method.params.length>0)
{
for (var i=0; i<method.params.length; i++)
{
var row = methodParamsElt.tBodies[0].insertRow(-1);
var isOptional = method.params[i].optional;
var acceptArray = method.params[i].acceptArray;
var defaultValue = method.params[i].defaultValue == null ? '' : method.params[i].defaultValue;
row.insertCell(0).innerHTML = method.params[i].name;
row.insertCell(1).innerHTML = '<span title="parameter is '+(isOptional ? 'optional':'required') +'">'+(isOptional ? '?':'*')+'</span>'
+ (method.params[i].acceptArray ? ' <span title="parameter can be an array; use | (pipe) character to split values">[ ]</span>':'');
row.insertCell(2).innerHTML = '<input id="methodParameterSend_'+i+'" type="checkbox" '+(isOptional ? '':'checked="checked"')+'/>';
row.insertCell(3).innerHTML = '<input id="methodParameterValue_'+i+'"" value="'+defaultValue+'" style="width:99%" onchange="$(\'methodParameterSend_'+i+'\').checked=true;"/>';
}
}
$("methodDescription").update(method.description);
setVisibility("methodDetailWrapper", "visible");
}
function pwgInvokeMethod( newWindow )
{
var methodName = $('methodName').innerHTML;
var method = gCachedMethods[methodName];
var reqUrl = gServiceUrl;
reqUrl += "?format="+$F('responseFormat');
if ($('requestFormat').value == 'get')
{
reqUrl += "&method="+methodName;
for ( var i=0; i<method.params.length; i++)
{
if (! $('methodParameterSend_'+i).checked)
continue;
if ( method.params[i].acceptArray && $F('methodParameterValue_'+i).split('|').length > 1 )
{
$F('methodParameterValue_'+i).split('|').each(
function(v) {
reqUrl += '&'+method.params[i].name+'[]='+v;
}
);
}
else
reqUrl += '&'+method.params[i].name+'='+$F('methodParameterValue_'+i);
}
if ( !newWindow )
$("invokeFrame").src = reqUrl;
else
window.open(reqUrl);
}
else
{
var form = $("invokeForm");
form.action = reqUrl;
var t = '<input type="hidden" name="'+'method'+'" value="'+methodName+'"/>';
for ( var i=0; i<method.params.length; i++)
{
if (! $('methodParameterSend_'+i).checked)
continue;
if ( method.params[i].acceptArray && $F('methodParameterValue_'+i).split('|').length > 1 )
{
$F('methodParameterValue_'+i).split('|').each(
function(v) {
t += '<input type="hidden" name="'+method.params[i].name+'[]" value="'+v+'"/>';
}
);
}
else
t += '<input type="hidden" name="'+method.params[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>';
}
form.innerHTML = t;
form.target = newWindow ? "_blank" : "invokeFrame";
form.submit();
}
return false;
}
</script>
<style>
#methodListWrapper {
width: 13em;
float: left;
display: inline;
visibility: hidden;
}
#methodList {
padding-left: 10px;
margin-left: 15px;
}
#methodWrapper {
margin-left: 14em;
visibility: hidden;
}
#methodName {
margin-top: 0;
margin-bottom: 3px;
}
#error {
height: 90px;
overflow: scroll;
color: red;
}
#methodParams {
border-collapse: collapse;
font-size: small;
}
#methodParams input {
font-size: 90%;
border: 1px solid black;
text-indent: 2px;
}
a {
color: #02f;
background-color: white;
text-decoration: underline;
}
a:hover {
color: white;
background-color: #02f;
text-decoration: none;
cursor:pointer;
}
</style>
</head>
<body>
<div>
<label>PWG Web service url
<input name="ws_url" id="ws_url" size="64"/>
<script type="text/javascript">
var match = document.location.toString().match(/^(https?.*\/)tools\/ws\.html?$/);
if (match!=null) $('ws_url').value = match[1]+'ws.php';
</script>
</label>
<a href="#" onclick="return pwgChangeUrl();">Go!</a>
</div>
<div id="error">
</div>
<div>
<div id="methodListWrapper"><h2>Methods</h2>
<ul id="methodList">
<li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">getVersion</a></li>
</ul>
</div>
<div id="methodWrapper">
<h2 id="methodName"></h2>
<div id="methodDetailWrapper">
<table>
<tr style="vertical-align:top">
<td>
<div id="methodDescription"></div>
<table>
<tr>
<td>Request format:</td>
<td>
<select id="requestFormat">
<option value="get" selected="selected">GET</option>
<option value="post">POST</option>
</select>
</td>
</tr>
<tr>
<td>Response format:</td>
<td>
<select id="responseFormat">
<option value="rest" selected="selected">REST (xml)</option>
<option value="json">JSON</option>
<option value="php">PHP serial</option>
<option value="xmlrpc">XML RPC</option>
</select>
</td>
</tr>
</table>
<p>
<a href="#" onclick="return pwgInvokeMethod(false)">Invoke</a>
<a href="#" onclick="return pwgInvokeMethod(true)">Invoke (new Window)</a>
</p>
</td>
<td>
<table id="methodParams" border="1" cellspacing="0" cellpadding="2px">
<thead>
<tr>
<td style="width:150px">Parameter</td>
<td>Extra</td>
<td>Send</td>
<td style="width:160px">Value</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
</td>
</tr>
</table>
<div style="display:none;">
<!-- hiddenForm for POST -->
<form method="post" action="" target="invokeFrame" id="invokeForm">
<input type="submit" value="submit"/>
</form>
</div>
<iframe width="100%" height="400px" id="invokeFrame" name="invokeFrame" style="clear:both"></iframe>
</div> <!-- methodDetailWrapper -->
</div> <!-- methodWrapper -->
</div>
</body>
</html>