You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.8 KiB
153 lines
4.8 KiB
/* |
|
DynAPI Distribution |
|
IOElement SYNChronous add-on |
|
|
|
The DynAPI Distribution is distributed under the terms of the GNU LGPL license. |
|
|
|
requires: dynapi.util.IOElement |
|
*/ |
|
|
|
IOElementSync={} |
|
IOElement.SYNC=true; |
|
|
|
var p=IOElement.prototype; |
|
|
|
p.activateSyncMode = function(fn,useJava){ |
|
this._SyncFn=fn; |
|
this._useJava=useJava; |
|
this._hasXMLHttp=(this._hasXMLHttp==null)? IOElement._hasXMLHttp():this._hasXMLHttp; |
|
if (!this.isSync && this._created) { |
|
window.setTimeout(this+'._initSync()',100); |
|
} |
|
}; |
|
p._syncRequest = function(url,data,method){ |
|
var dataBody; |
|
var i,mode,rq,rt={value:''},nv=[]; |
|
var id = this._getRandomID(); // create random load ID to ensure no caching |
|
if(!this.isSync) return; |
|
method=(method+'').toLowerCase(); |
|
mod=(method=='post'||method=='get')? method:'get'; |
|
url=IOElement.getAbsoluteUrl(url); |
|
url += ((url.indexOf('?')==-1)? '?' : '&')+'IORequestID='+id+'&IOMethod='+mod; |
|
for (i in data) { |
|
nv[nv.length]=i+'='+((mod!='get')? data[i]:IOElement.URLEncode(data[i])); |
|
}; |
|
dataBody = nv.join('&'); |
|
if(data && mod=='get') {url+='&'+dataBody;dataBody=null} |
|
// get HTTP Request Object |
|
if(!this._hReq) this._hReq=IOElement._getHttpReq(this._jApplet); |
|
rq=this._hReq; rq.open(mod,url,false); |
|
if (mod=='post') rq.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); |
|
if(dynapi.ua.ns4) { |
|
rq.send(dataBody); rt.value=rq.responseText; |
|
}else { |
|
eval('try {' |
|
+' rq.send(dataBody); rt.value=rq.responseText;' |
|
+'} catch(e) {}'); |
|
} |
|
if(rq.status!=200) rt.error={code:rq.status,text:'Connection Error : '+rq.statusText}; |
|
return rt; |
|
}; |
|
p._initApplet = function(){ |
|
var isJava,doc,scope=this.getScope(this._elmID+'Sync'); |
|
doc=scope.document; |
|
this._jApplet=doc.applets['loadApplet']; |
|
isJava = !(navigator.javaEnabled() && this._jApplet); |
|
if(isJava) alert('IOElement Error: Java Applet not loaded. Java is not enabled on this browser'); |
|
else{ |
|
this.isSync=true; |
|
if (typeof(this._SyncFn)=='function') this._SyncFn(); |
|
else eval(this._SyncFn); |
|
} |
|
}; |
|
p._initSync = function(){ |
|
var evl,ua=dynapi.ua; |
|
if (this._hasXMLHttp && !this._useJava ) { |
|
this.isSync=true; |
|
if (typeof(this._SyncFn)=='function') this._SyncFn(); |
|
else eval(this._SyncFn); |
|
}else { |
|
var t,url,doc; |
|
var scope=this.getScope(this._elmID+'Sync'); |
|
if(!scope) return; |
|
url=dynapi.library.path+'util/'; |
|
t='<html><body><applet name="loadApplet" id="loadApplet" codebase="'+url+'" code="url.class" width="1" height="1"></applet></body></html>'; |
|
doc=scope.document; |
|
doc.open();doc.write(t);doc.close(); |
|
window.setTimeout(this+'._initApplet()',1000); // Allow applet to initialize |
|
} |
|
}; |
|
IOElement._getHttpReq = function(jApplet){ |
|
var o,ua=dynapi.ua; |
|
if (jApplet) o = new JavaHttpRequest(jApplet); |
|
else if(IOElement._hasXMLHttp()){ |
|
if (ua.ns) o = new XMLHttpRequest(); |
|
else if (ua.ie) { |
|
var t='try {o = new ActiveXObject("Microsoft.XMLHTTP");}' |
|
+'catch(e){o = new ActiveXObject("MSXML2.XMLHTTP");}' |
|
eval(t); |
|
} |
|
|
|
} |
|
return o; |
|
}; |
|
IOElement._hasXMLHttp = function(){ |
|
var state,ua=dynapi.ua; |
|
// ie for mac,ie4, ns4, ns6.1,x, does not support xmlhttprequest |
|
// while ns 6.2.x (based on gecko 0.9.4) supports xmlhttprequest but |
|
// it does not support sending string via send() - only gecko 0.9.7+ can send string |
|
// netscape 6.x needs the Java-Plugin to support java applets :( |
|
if(ua.ns && navigator.vendor=='Netscape6') state=false; |
|
else if(ua.v>4 && (ua.ns||(ua.ie && ua.win32))) state=true; |
|
return state; |
|
}; |
|
|
|
// GetAbsoluteURL |
|
IOElement.getAbsoluteUrl=function(url, docUrl) { // inspired by afroAPI urlToAbs() |
|
if(url && url.indexOf('://')>0) return url; |
|
docUrl=(docUrl)? docUrl.substring(0,docUrl.lastIndexOf('/')+1):dynapi.documentPath; |
|
url=url.replace(/^(.\/)*/,''); |
|
docUrl=docUrl.replace(/(\?.*)$/,'').replace(/(#.*)*$/,'').replace(/[^\/]*$/,''); |
|
if (url.indexOf('/')==0) return docUrl.substring(0,docUrl.indexOf('/',docUrl.indexOf('//')+2))+url; |
|
else while(url.indexOf('../')==0){ |
|
url=url.replace(/^..\//,''); |
|
docUrl=docUrl.replace(/([^\/]+[\/][^\/]*)$/,''); |
|
}; |
|
return docUrl+url; |
|
}; |
|
|
|
// Java Base HttpRequest |
|
JavaHttpRequest = function(jApplet){ |
|
this.applet=jApplet; |
|
this.url = ""; |
|
this.responseText = ""; |
|
this.status=200;this.statusText=""; |
|
}; |
|
var jhr = JavaHttpRequest.prototype; |
|
jhr.setRequestHeader = function(){}; //dummy |
|
jhr.open = function(method,url){ |
|
this.url = url; |
|
this.method = (method||'get'); |
|
}; |
|
jhr.send = function(data){ |
|
var r,url=this.url; |
|
if (url=="") return false; |
|
|
|
this.responseText = ""; |
|
if (this.applet){ |
|
this.status=200;this.statusText=""; |
|
if(!url.indexOf('file:///') && url.indexOf('file://')) url='file:///'+url.substr(7); |
|
r=this.applet.readURL(url, true, data||"", dynapi.documentPath); |
|
if(r) { |
|
r=new String(r); |
|
r=r.replace(/\n$/,''); |
|
if(r.indexOf('Error: ')==0) { |
|
this.status='403'; |
|
this.statusText=r.substr(7); |
|
} |
|
this.responseText=r; |
|
} |
|
return true; |
|
} |
|
}; |
|
|
|
|