Subversion Repositories wimsdev

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.         DynAPI Distribution
  3.         IOElement SYNChronous add-on
  4.  
  5.         The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
  6.  
  7.         requires: dynapi.util.IOElement
  8. */
  9.  
  10. IOElementSync={}
  11. IOElement.SYNC=true;
  12.  
  13. var p=IOElement.prototype;
  14.  
  15. p.activateSyncMode = function(fn,useJava){
  16.         this._SyncFn=fn;
  17.         this._useJava=useJava;
  18.         this._hasXMLHttp=(this._hasXMLHttp==null)? IOElement._hasXMLHttp():this._hasXMLHttp;   
  19.         if (!this.isSync && this._created) {
  20.                 window.setTimeout(this+'._initSync()',100);
  21.         }
  22. };
  23. p._syncRequest = function(url,data,method){
  24.         var dataBody;
  25.         var i,mode,rq,rt={value:''},nv=[];
  26.         var id = this._getRandomID(); // create random load ID to ensure no caching            
  27.         if(!this.isSync) return;
  28.         method=(method+'').toLowerCase();      
  29.         mod=(method=='post'||method=='get')? method:'get';
  30.         url=IOElement.getAbsoluteUrl(url);
  31.         url += ((url.indexOf('?')==-1)? '?' : '&')+'IORequestID='+id+'&IOMethod='+mod; 
  32.         for (i in data) {
  33.                 nv[nv.length]=i+'='+((mod!='get')? data[i]:IOElement.URLEncode(data[i]));
  34.         };
  35.         dataBody = nv.join('&');
  36.         if(data && mod=='get') {url+='&'+dataBody;dataBody=null}       
  37.         // get HTTP Request Object
  38.         if(!this._hReq) this._hReq=IOElement._getHttpReq(this._jApplet);
  39.         rq=this._hReq; rq.open(mod,url,false);
  40.         if (mod=='post') rq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  41.         if(dynapi.ua.ns4) {
  42.                 rq.send(dataBody); rt.value=rq.responseText;
  43.         }else {
  44.                 eval('try {'
  45.                 +' rq.send(dataBody); rt.value=rq.responseText;'
  46.                 +'} catch(e) {}');
  47.         }
  48.         if(rq.status!=200) rt.error={code:rq.status,text:'Connection Error : '+rq.statusText};
  49.         return rt;
  50. };
  51. p._initApplet = function(){
  52.         var isJava,doc,scope=this.getScope(this._elmID+'Sync');
  53.         doc=scope.document;
  54.         this._jApplet=doc.applets['loadApplet'];       
  55.         isJava = !(navigator.javaEnabled() && this._jApplet);
  56.         if(isJava) alert('IOElement Error: Java Applet not loaded. Java is not enabled on this browser');
  57.         else{
  58.                 this.isSync=true;
  59.                 if (typeof(this._SyncFn)=='function') this._SyncFn();
  60.                 else eval(this._SyncFn);       
  61.         }
  62. };
  63. p._initSync = function(){
  64.         var evl,ua=dynapi.ua;
  65.         if (this._hasXMLHttp && !this._useJava ) {
  66.                 this.isSync=true;
  67.                 if (typeof(this._SyncFn)=='function') this._SyncFn();
  68.                 else eval(this._SyncFn);       
  69.         }else {
  70.                 var t,url,doc;
  71.                 var scope=this.getScope(this._elmID+'Sync');
  72.                 if(!scope) return;
  73.                 url=dynapi.library.path+'util/';
  74.                 t='<html><body><applet name="loadApplet" id="loadApplet" codebase="'+url+'" code="url.class" width="1" height="1"></applet></body></html>';
  75.                 doc=scope.document;
  76.                 doc.open();doc.write(t);doc.close();
  77.                 window.setTimeout(this+'._initApplet()',1000); // Allow applet to initialize
  78.         }
  79. };
  80. IOElement._getHttpReq = function(jApplet){
  81.         var o,ua=dynapi.ua;
  82.         if (jApplet) o = new JavaHttpRequest(jApplet);
  83.         else if(IOElement._hasXMLHttp()){
  84.                 if (ua.ns) o = new XMLHttpRequest();
  85.                 else if (ua.ie) {
  86.                         var t='try {o = new ActiveXObject("Microsoft.XMLHTTP");}'
  87.                         +'catch(e){o = new ActiveXObject("MSXML2.XMLHTTP");}'
  88.                         eval(t);
  89.                 }
  90.                
  91.         }      
  92.         return o;
  93. };
  94. IOElement._hasXMLHttp = function(){
  95.         var state,ua=dynapi.ua;
  96.         // ie for mac,ie4, ns4, ns6.1,x, does not support xmlhttprequest
  97.         // while ns 6.2.x (based on gecko 0.9.4) supports xmlhttprequest but
  98.         // it does not support sending string via send() - only gecko 0.9.7+ can send string
  99.         // netscape 6.x needs the Java-Plugin to support java applets :(
  100.         if(ua.ns && navigator.vendor=='Netscape6') state=false;
  101.         else if(ua.v>4 && (ua.ns||(ua.ie && ua.win32))) state=true;
  102.         return state;
  103. };
  104.  
  105. // GetAbsoluteURL
  106. IOElement.getAbsoluteUrl=function(url, docUrl) { // inspired by afroAPI urlToAbs()
  107.         if(url && url.indexOf('://')>0) return url;
  108.         docUrl=(docUrl)? docUrl.substring(0,docUrl.lastIndexOf('/')+1):dynapi.documentPath;
  109.         url=url.replace(/^(.\/)*/,'');
  110.         docUrl=docUrl.replace(/(\?.*)$/,'').replace(/(#.*)*$/,'').replace(/[^\/]*$/,'');
  111.         if (url.indexOf('/')==0) return docUrl.substring(0,docUrl.indexOf('/',docUrl.indexOf('//')+2))+url;
  112.         else while(url.indexOf('../')==0){
  113.                 url=url.replace(/^..\//,'');
  114.                 docUrl=docUrl.replace(/([^\/]+[\/][^\/]*)$/,'');
  115.         };
  116.         return docUrl+url;
  117. };
  118.  
  119. // Java Base HttpRequest
  120. JavaHttpRequest = function(jApplet){
  121.         this.applet=jApplet;
  122.         this.url = "";
  123.         this.responseText = "";  
  124.         this.status=200;this.statusText="";
  125. };
  126. var jhr = JavaHttpRequest.prototype;
  127. jhr.setRequestHeader = function(){}; //dummy
  128. jhr.open = function(method,url){
  129.   this.url = url;
  130.   this.method = (method||'get');
  131. };
  132. jhr.send = function(data){
  133.         var r,url=this.url;
  134.         if (url=="") return false;
  135.        
  136.         this.responseText = "";
  137.         if (this.applet){
  138.                 this.status=200;this.statusText="";
  139.                 if(!url.indexOf('file:///') && url.indexOf('file://')) url='file:///'+url.substr(7);
  140.                 r=this.applet.readURL(url, true, data||"", dynapi.documentPath);
  141.                 if(r) {
  142.                         r=new String(r);
  143.                         r=r.replace(/\n$/,'');
  144.                         if(r.indexOf('Error: ')==0) {
  145.                                 this.status='403';
  146.                                 this.statusText=r.substr(7);
  147.                         }
  148.                         this.responseText=r;
  149.                 }
  150.                 return true;
  151.         }
  152. };
  153.  
  154.