text: /*\
  title: $:/core/modules/utils/dom/http.js
  type: application/javascript
  module-type: utils
  
  Browser HTTP support
  
  \*/
  (function(){
  
  /*jslint node: true, browser: true */
  /*global $tw: false */
  "use strict";
  
  /*
  A quick and dirty HTTP function; to be refactored later. Options are:
  	url: URL to retrieve
  	headers: hashmap of headers to send
  	type: GET, PUT, POST etc
  	callback: function invoked with (err,data,xhr)
  	returnProp: string name of the property to return as first argument of callback
  */
  exports.httpRequest = function(options) {
  	var type = options.type || "GET",
  		url = options.url,
  		headers = options.headers || {accept: "application/json"},
  		returnProp = options.returnProp || "responseText",
  		request = new XMLHttpRequest(),
  		data = "",
  		f,results;
  	// Massage the data hashmap into a string
  	if(options.data) {
  		if(typeof options.data === "string") { // Already a string
  			data = options.data;
  		} else { // A hashmap of strings
  			results = [];
  			$tw.utils.each(options.data,function(dataItem,dataItemTitle) {
  				results.push(dataItemTitle + "=" + encodeURIComponent(dataItem));
  			});
  			if(type === "GET" || type === "HEAD") {
  				url += "?" + results.join("&");
  			} else {
  				data = results.join("&");
  			}
  		}
  	}
  	// Set up the state change handler
  	request.onreadystatechange = function() {
  		if(this.readyState === 4) {
  			if(this.status === 200 || this.status === 201 || this.status === 204) {
  				// Success!
  				options.callback(null,this[returnProp],this);
  				return;
  			}
  		// Something went wrong
  		options.callback($tw.language.getString("Error/XMLHttpRequest") + ": " + this.status,null,this);
  		}
  	};
  	// Make the request
  	request.open(type,url,true);
  	if(headers) {
  		$tw.utils.each(headers,function(header,headerTitle,object) {
  			request.setRequestHeader(headerTitle,header);
  		});
  	}
  	if(data && !$tw.utils.hop(headers,"Content-type")) {
  		request.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8");
  	}
  	if(!$tw.utils.hop(headers,"X-Requested-With")) {
  		request.setRequestHeader("X-Requested-With","TiddlyWiki");
  	}
  	try {
  		request.send(data);
  	} catch(e) {
  		options.callback(e,null,this);
  	}
  	return request;
  };
  
  })();
  