function getUrl(url1,url2){
url1=url1.split('?')[0];
return url2.length?
(/^http(s?):\/\//i.test(url2)?url2:
(url2[0]=='/'?url1.split('/').slice(0,3).join('/')+url2:url1.split('/').slice(0,-1).join('/')+'/'+url2)
):url1;
}
function getVars(form,tag){
vars='';
fields=form.getElementsByTagName(tag);
for(i=0;i<fields.length;i++)
vars=vars+(i?'&':'')+fields[i].name+'='+fields[i].value;
return vars;
}
function submit(xhr,request,form){
request.url=getUrl(request.url,form.action);
request.method=form.method;
vars1=getVars(form,'input');
vars2=getVars(form,'textarea');
request.vars=vars1||vars2?(vars1?vars1:'')+(vars1&&vars2?'&':'')+(vars2?vars2:''):null;
getPage(request,processPage,xhr);
}
function processPage(xhr,request){
redir=xhr.getResponseHeader('Location');
if(redir){
if(redir==request.url) finalize(': ');
else{
log('\n\n');
getPage({'url':redir},processPage,xhr);
}
} else {
forms=local('forms').split(',');
id=null;
for(i=0;i<forms.length;i++)
if(xhr.response.getElementById(forms[i])) id=forms[i];
if(id)submit(xhr,request,xhr.response.getElementById(id));
else if(Number(local('debug'))){
log(' :\n');
forms=xhr.response.getElementsByTagName('form');
if(forms.length)
for(i=0;i<forms.length;i++)
log((i?', "':'"')+forms[i].id+'"');
else log('');
finalize();
} else finalize(' ');
}
}
function checkConn(xhr,request){
redir=xhr.getResponseHeader('Location');
if(redir){
log('\n\n');
getPage({'url':redir},processPage,xhr);
} else {
log(' ');
finalize();
}
}
function log(txt){
logs=logs+(txt?txt:'');
}
function requestToText(request){
return 'URL: '+request.url+'\nMethod: '+request.method+', Vars: '+request.vars+'\n\n';
}
function finalize(txt){
log(txt);
if(Number(local('debug'))) alert(logs);
else if(txt) flashLong(txt);
exit();
}
function getPage(request,func,xhr){
if(!request.method) request.method='GET';
if(!request.vars) request.vars=null;
if(!xhr){
xhr=new XMLHttpRequest();
xhr.responseType="document";
xhr.timeout=20*1000;
}
xhr.open(request.method,request.url,true);
xhr.onload=function(){
if(xhr.status==200 || xhr.status==401){
log (requestToText(request)+'HTTP status: '+xhr.status+' '+xhr.statusText+'\n');
func(xhr,request);
} else {
log(requestToText(request));
finalize(' HTTP: '+xhr.status+' '+xhr.statusText);
}
}
xhr.onerror=function(){
log(requestToText(request));
finalize(': ');
}
xhr.ontimeout=function(){
log(requestToText(request));
finalize(': ');
}
xhr.send(request.vars);
}
logs='';
getPage({'url':local('url')},checkConn);