1 /**
  2  * Ajax
  3  *
  4  * Module for making ajax requests
  5  */
  6 (function (){
  7 
  8 	"use strict";
  9 
 10 	// Don't bother even defining the object if the XMLHttpRequest isn't available
 11 	if(typeof window.XMLHttpRequest === "undefined")
 12 	{
 13 		return;
 14 	}
 15 
 16 	var ajax = {
 17 		_do: function (url, data, success_callback, error_callback, isPost)
 18 		{
 19 			var type,
 20 				request = new XMLHttpRequest();
 21 
 22 			if (typeof success_callback === "undefined")
 23 			{
 24 				/**
 25 				 * @private
 26 				 */
 27 				success_callback = function (){};
 28 			}
 29 
 30 			type = (isPost) ? "POST" : "GET";
 31 			
 32 			if (type === "GET")
 33 			{
 34 				url += ( ! url.match('?')) 
 35 					? "?" + this._serialize(data) 
 36 					: this._serialize(data);
 37 			}
 38 
 39 			request.open(type, url);
 40 
 41 			request.onreadystatechange = function ()
 42 			{
 43 				if (request.readyState === 4)
 44 				{
 45 					if (request.status === 200)
 46 					{
 47 						success_callback.call(request.responseText, request.responseText);
 48 					}
 49 					else
 50 					{
 51 						if (typeof error_callback !== 'undefined')
 52 						{
 53 							error_callback.call(request.status, request.status);
 54 						}
 55 					}
 56 
 57 				}
 58 			};
 59 
 60 			if (type === "POST")
 61 			{
 62 				request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 63 				request.send(this._serialize(data));
 64 			}
 65 			else
 66 			{
 67 				request.send(null);
 68 			}
 69 		},
 70 		_serialize: function (data)
 71 		{
 72 			var name,
 73 				value,
 74 				pairs = [];
 75 
 76 			for (name in data)
 77 			{
 78 				if (!data.hasOwnProperty(name))
 79 				{
 80 					continue;
 81 				}
 82 				if (typeof data[name] === "function")
 83 				{
 84 					continue;
 85 				}
 86 
 87 				value = data[name].toString();
 88 
 89 				name = encodeURIComponent(name);
 90 				value = encodeURIComponent(value);
 91 
 92 				pairs.push(name + "=" + value);
 93 			}
 94 
 95 			return pairs.join("&");
 96 		}
 97 	};
 98 
 99 	/**
100 	 * Sends a GET type ajax request
101 	 *
102 	 * @name get
103 	 * @function
104 	 * @memberOf $_
105 	 * @param string url
106 	 * @param object data
107 	 * @param function success_callback
108 	 * @param function error_callback
109 	 */
110 	$_.ext('get', function (url, data, success_callback, error_callback){
111 		ajax._do(url, data, success_callback, error_callback, false);
112 	});
113 
114 	/**
115 	 * Sends a POST type ajax request
116 	 *
117 	 * @name post
118 	 * @function
119 	 * @memberOf $_
120 	 * @param string url
121 	 * @param object data
122 	 * @param function success_callback
123 	 * @param function error_callback
124 	 */
125 	$_.ext('post', function (url, data, success_callback, error_callback){
126 		ajax._do(url, data, success_callback, error_callback, true);
127 	});
128 
129 	/**
130 	 * Watches for server-sent events and applies a callback on message
131 	 *
132 	 * @name sse
133 	 * @function
134 	 * @memberOf $_
135 	 * @param string url
136 	 * @param function callback
137 	 */
138 	$_.ext('sse', function(url, callback){
139 
140 		var source;
141 
142 		// Check for server-sent event support
143 		if (typeof EventSource !== 'undefined')
144 		{
145 			source = new EventSource(url);
146 
147 			// Apply the callback
148 			source.onmessage = function(event){
149 				callback.call(event.data, event.data);
150 			};
151 		}
152 	});
153 
154 }());