/** =============================================================== HTTP AJAX SERVICES Copyright (c) 2008,2009 Jason Fries, Iowa Electronic health Markets, University of Iowa Ajax Services Cross browser compliant ajax object tested: IE6,IE7, Safari 3.0+, Firefox 3.0+ revisions: 2009.7.21 Implemented generic Request object 2009.7.14 first release =============================================================== **/ function HttpService( url ) { this.resultFormat = "xml"; //text, xml this.url = url; this.method = "POST"; this.request = null; //IE will create ActiveX object istead of XMLHttpRequest this.XMLHttpRequest = false; //parsed response this.response = null; //Event Handling this.eventListeners = new Object(); } HttpService.RESULT = "result"; HttpService.FAULT = "fault"; /** * XML Decode (Default) * */ HttpService.prototype.xmlDecode = function(text) { var xml; // code for IE if(window.ActiveXObject) { try{ xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async="false"; xml.loadXML(text); }catch(e) { alert("ActiveX HttpService xmlDecode ERROR (XML Poorly formed?) " + e); } // code for Mozilla, Firefox, Opera, etc. }else{ try{ var parser = new DOMParser(); xml = parser.parseFromString(text,"text/xml"); }catch(e) { alert("HttpService xmlDecode ERROR (XML Poorly formed?) " + e); } } return xml; } /** * Add Event Listener * @description */ HttpService.prototype.addEventListener = function( type, callback ) { this.eventListeners[type] = callback; } /** * Create XMLHttpRequest Object * @description Native XMLHttpRequest objects are *not* * supported by */ HttpService.createXMLHttpRequest = function() { var req; // branch for native XMLHttpRequest object if(window.XMLHttpRequest && !window.ActiveXObject ){ try{ req = new XMLHttpRequest(); }catch(e){ alert("ERROR creating XMLHttpRequest Object " + e ); req = false; } // branch for IE/Windows ActiveX version }else if(window.ActiveXObject) { try{ req = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ req = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e) { req = false; } } } return req; } /** * Load XML Document * @description * @param URL * @param method 'POST', 'GET' * @param response parser (xml parser) * @return */ HttpService.prototype.send = function( parameters ) { this.XMLHttpRequest = HttpService.createXMLHttpRequest(); if(this.XMLHttpRequest) { //IE6 ActiveX fix var parent = this; var req = this.XMLHttpRequest; // wrapper pass in parent and request object (IE6 ajax/active x fix) this.XMLHttpRequest.onreadystatechange = function() { handleEvent(parent, req); }; this.XMLHttpRequest.open(this.method, this.url, true); this.XMLHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); this.XMLHttpRequest.setRequestHeader("Content-length", 0); this.XMLHttpRequest.setRequestHeader("Connection", "close"); //encode request parameters (if they exist) if(this.request) this.XMLHttpRequest.send( encodeRequest(this.request) ); else this.XMLHttpRequest.send(parameters); } } HttpService.prototype.toString = function() { return "HttpService"; } /** * IE6 Ajax Response Wrapper * * ActiveX components don't comply fully to javascript; they don't * allow the dynamic addtion of properties. This is a problem when we must * use activeX for XMLHttpRequest functionaliy (e.g. IE6). By wrapping the response * handler we grant them access the sender parent object and can properly handle custom * xml response parsing, etc. * */ function handleEvent(parent, request) { //only if request returns as "loaded" if(request.readyState == 4) { // request status is sucessful - "OK" if(request.status == 200) { //result type if(parent.resultFormat == "xml"){ parent.response = parent.xmlDecode( request.responseText ); //dispatch event if(parent.eventListeners[HttpService.RESULT]) parent.eventListeners[HttpService.RESULT]( parent.response ); }else{ parent.response = request.responseText; //dispatch event if(parent.eventListeners[HttpService.RESULT]) parent.eventListeners[HttpService.RESULT]( request.responseText ); } //FAILURE response }else{ //dispatch error event if(parent.eventListeners[HttpService.FAULT]) parent.eventListeners[HttpService.FAULT]( request.statusText ); } } } // XML Utilities /** * Encode Request Object * @description URLEncode Request object into parameter string for XMLHttpRequest */ function encodeRequest( object ) { var params = ""; // i == member variable name and object[i] is the value of that object for(var i in object ) { if(params.length == 0) params += (i + "=" + encodeURI(object[i])); else params += ("&" + i + "=" + encodeURI(object[i])); } return params; } /** * XML to String */ function xmlToString( xmldoc ) { var xml = ""; try { // Gecko-based browsers, Safari, Opera. xml = (new XMLSerializer()).serializeToString(xmldoc); }catch (e){ try { // Internet Explorer. xml = xmldoc.xml; }catch (e) { //Strange Browser ?? alert('Xmlserializer not supported'); } } return xml; }