Ajax handler built on XMLHttpRequest and implementation of utilities (design patterns, and other collection handling functions)
	
		
	
				
					
				
			
							parent
							
								
									c2a61d8d95
								
							
						
					
					
						commit
						c904128d48
					
				@ -0,0 +1,162 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					* (c) 2010 jxf - rpc module. 
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* The idea of behind this module is fetching data via an RPC-like call:
 | 
				
			||||||
 | 
					*	. RESTful web services
 | 
				
			||||||
 | 
					*	. XML/SOAP (not yet implemented)
 | 
				
			||||||
 | 
					*	. Remote document (HTML; XML; JSON) 
 | 
				
			||||||
 | 
					*	. Local documents (HTML; XML; JSON)
 | 
				
			||||||
 | 
					* The module will return the data to a callback function should a parser be specified, the module will parse the data and return the parsed data to the callback function
 | 
				
			||||||
 | 
					* This allows the client code to minimize parsing should returned data be in a standard format.
 | 
				
			||||||
 | 
					* TODO:
 | 
				
			||||||
 | 
					*	Improve on how returned data is handled (if necessary).
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					if(!jx){
 | 
				
			||||||
 | 
					  var jx = {}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//jx.ajax = {
 | 
				
			||||||
 | 
					//        /**
 | 
				
			||||||
 | 
					//         * In order to make the ajax requests domain specific we allow users to get an instance while making a global implementation available
 | 
				
			||||||
 | 
					//         * This is useful for oauth applications that require domain specific headers to be set upon issuing a request
 | 
				
			||||||
 | 
					//         */
 | 
				
			||||||
 | 
					//        getInstance:function(){
 | 
				
			||||||
 | 
					//            var obj = {} ;
 | 
				
			||||||
 | 
					//            obj.headers = [] ;
 | 
				
			||||||
 | 
					//            obj.setHeader = function(key,value){
 | 
				
			||||||
 | 
					//                this.headers.push({'key':key,'value':value}) ;
 | 
				
			||||||
 | 
					//            }
 | 
				
			||||||
 | 
					//	    obj.async = true;
 | 
				
			||||||
 | 
					//            obj.send = function(url,callback,method){
 | 
				
			||||||
 | 
					//                    var xmlhttp =  new XMLHttpRequest()  ;
 | 
				
			||||||
 | 
					//                    method = (method==null)?'GET':method ;
 | 
				
			||||||
 | 
					//                    xmlhttp.onreadystatechange = function(){
 | 
				
			||||||
 | 
					//                        if(xmlhttp.readyState == 4){
 | 
				
			||||||
 | 
					//                          callback(xmlhttp) ;
 | 
				
			||||||
 | 
					//                        }
 | 
				
			||||||
 | 
					//                    }//-- end of Inline function
 | 
				
			||||||
 | 
					//                    var key,value ;
 | 
				
			||||||
 | 
					//		    //
 | 
				
			||||||
 | 
					//		    // async=false has been deprecated (browsers complain a lot)
 | 
				
			||||||
 | 
					//                    xmlhttp.open(method,url,this.async) ;
 | 
				
			||||||
 | 
					//                    
 | 
				
			||||||
 | 
					//                    if(obj.headers.length > 0){
 | 
				
			||||||
 | 
					//                            for(var i=0; i < obj.headers.length; i++){
 | 
				
			||||||
 | 
					//                                    key = obj.headers[i]['key'] ;
 | 
				
			||||||
 | 
					//                                    value= obj.headers[i]['value'];
 | 
				
			||||||
 | 
					//                                    //air.trace(key+'='+value)
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//                                    if(key != null && value != null){
 | 
				
			||||||
 | 
					//                                            xmlhttp.setRequestHeader(key,value) ;
 | 
				
			||||||
 | 
					//                                    }
 | 
				
			||||||
 | 
					//                            }
 | 
				
			||||||
 | 
					//                    }
 | 
				
			||||||
 | 
					//                  xmlhttp.send(null) ;
 | 
				
			||||||
 | 
					//            }
 | 
				
			||||||
 | 
					//            return obj;
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//        },//-- end jx.ajax.getInstance	
 | 
				
			||||||
 | 
					//    parser:null
 | 
				
			||||||
 | 
					//  }//--end jx.ajax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 /**
 | 
				
			||||||
 | 
					 * These are a few parsers that can come in handy:
 | 
				
			||||||
 | 
					 * urlparser:	This parser is intended to break down a url parameter string in key,value pairs
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function urlparser(url){
 | 
				
			||||||
 | 
					        if(url.toString().match(/\x3F/) != null){
 | 
				
			||||||
 | 
					            url = url.split('\x3F')[1]
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
						var p = url.split('&') ;
 | 
				
			||||||
 | 
						var r = {} ;
 | 
				
			||||||
 | 
						r.meta = [] ;
 | 
				
			||||||
 | 
						r.data = {} ;
 | 
				
			||||||
 | 
						var entry;
 | 
				
			||||||
 | 
						for(var i=0; i < p.length; i++){
 | 
				
			||||||
 | 
							entry = p[i] ;
 | 
				
			||||||
 | 
							key 	= (entry.match('(.*)=')  !=null)? entry.match('(.*)=')[1]:null ;
 | 
				
			||||||
 | 
							value 	= (entry.match('=(.*)$') != null)? entry.match('=(.*)$')[1]:null
 | 
				
			||||||
 | 
							if(key != null){
 | 
				
			||||||
 | 
								key = key.replace('\x3F','')
 | 
				
			||||||
 | 
								r.meta.push(key) ;
 | 
				
			||||||
 | 
								r.data[key] = value  ;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return r.data;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* The following are corrections related to consistency in style & cohesion
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					jx.ajax = {}
 | 
				
			||||||
 | 
					jx.ajax.get = {} ;
 | 
				
			||||||
 | 
					jx.ajax.get.instance = jx.ajax.getInstance ;
 | 
				
			||||||
 | 
					jx.ajax.debug = null;
 | 
				
			||||||
 | 
					jx.ajax.get.instance = function(){
 | 
				
			||||||
 | 
					    var factory = function(){
 | 
				
			||||||
 | 
					        this.obj = {}
 | 
				
			||||||
 | 
					        this.obj.headers = {}
 | 
				
			||||||
 | 
					        this.obj.async  = true;
 | 
				
			||||||
 | 
					        this.setHeader = function(key,value){
 | 
				
			||||||
 | 
					            if(key.constructor != String && value == null){
 | 
				
			||||||
 | 
					                this.obj.headers = key ;
 | 
				
			||||||
 | 
					            }else{
 | 
				
			||||||
 | 
					                this.obj.headers[key] = value;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.setData = function(data){
 | 
				
			||||||
 | 
					            this.obj.data = data;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.setAsync = function(flag){
 | 
				
			||||||
 | 
					            this.obj.async = (flag == true) ;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.send = function(url,callback,method){
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if(method == null){
 | 
				
			||||||
 | 
					                method = 'GET'
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            p = jx.ajax.debug != null;
 | 
				
			||||||
 | 
					            q = false;
 | 
				
			||||||
 | 
					            if(p){
 | 
				
			||||||
 | 
					                q = jx.ajax.debug[url] != null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            is_debuggable = p && q
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if(is_debuggable){
 | 
				
			||||||
 | 
					                x = {} ;
 | 
				
			||||||
 | 
					                x.responseText = jx.ajax.debug [url] ;                
 | 
				
			||||||
 | 
					                callback(x)
 | 
				
			||||||
 | 
					            }else{
 | 
				
			||||||
 | 
					                    var http =  new XMLHttpRequest()  ;
 | 
				
			||||||
 | 
					                    http.onreadystatechange = function(){
 | 
				
			||||||
 | 
					                        if(http.readyState == 4){
 | 
				
			||||||
 | 
					                            
 | 
				
			||||||
 | 
					                            callback(http)
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    //
 | 
				
			||||||
 | 
					                    // In order to insure backward compatibility
 | 
				
			||||||
 | 
					                    // Previous versions allowed the user to set the variable on the wrapper (poor design)
 | 
				
			||||||
 | 
					                    if(this.async != null){
 | 
				
			||||||
 | 
					                        this.setAsync(this.async) ;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    http.open(method,url,this.obj.async) ;
 | 
				
			||||||
 | 
					                    for(key in this.obj.headers){
 | 
				
			||||||
 | 
					                        value = this.obj.headers[key] ;
 | 
				
			||||||
 | 
					                        
 | 
				
			||||||
 | 
					                        http.setRequestHeader(key,value)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    http.send(this.obj.data)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }//-- end of the factory method
 | 
				
			||||||
 | 
					    return new factory() ;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue