
/*
JQuery load plugin v. 0.5
GPL (GPL-LICENSE.txt) license
Author: Alexey Kuznetsov (Ragneta.com)
Date: 2010-03-06
*/

var func = function($)
{
	$.fn.myload = function(options) 
	{

		var defaults = 
		{
			method: "POST",
			url: null,
			datasource: null,		
			params: null,					
			escape_params: true,
			timeout: 10000,
			callback: null,			
			error_callback: null,		
			loading_start_callback: null,	
			loading_end_callback: null
		};

		var options = $.extend(defaults,options);

		this.each(function()
		{
			var req_fn = function(obj)
			{                       
				$(obj).each(function()
				{
					if (this.name && this.value)
					{
						if ((this.type == "checkbox" || this.type == "radio") && this.checked == false) { }
						else query += (query?"&":"") + this.name + "=" + (options.escape_params>0?escape(this.value):this.value);
					}

					$(this).children().each(function() { req_fn(this); });
				});
			}

			var createRequestObject = function()
			{
				if (window.XMLHttpRequest) { try { return new XMLHttpRequest(); } catch (e) { } }
				else if (window.ActiveXObject) { try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) 
				{     
					try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) { } }
				}
				return null;
			}

			var return_error = function(error_message)
			{
				if (options.loading_end_callback != null)
					options.loading_end_callback(self);
				if (options.error_callback != null)
					options.error_callback(self,error_message);
				return false;
			}

			var req_abort = function()
			{
				req.abort();
				return return_error("Can't receive answer, timeout");
			}
	

			var self = this;
			var query = "";

			if (options.datasource != null)
				req_fn(options.datasource);
			if (options.params != null)
				for (var i in options.params)
					if (options.params.hasOwnProperty(i))
						query += (query?"&":"") + i + "=" + (options.escape_params>0?escape(options.params[i]):options.params[i]);
						
			var req = createRequestObject();
			if (req == null)
				return return_error("Can't define XMLHttpRequest");

			if (options.timeout > 0) var timeout = setTimeout(req_abort,options.timeout);i

			if (options.loading_start_callback != null)
				options.loading_start_callback(self);

			req.onreadystatechange = function()
			{
				var tmp = null;
				var error = null;
				var success = null;
				var response = null;
			
				if (req.readyState == 4)
				{
					clearTimeout(timeout);

					var res = null;
					if (req.status == 200) res = $.parseJSON(req.responseText.replace(/^[^{]+/,""));

					if (res == null)
						return return_error("Can't receive data");

					if (options.loading_end_callback != null)
						options.loading_end_callback(self);

					if (options.callback != null)
						options.callback(res);
				}
			}

			if (options.method == "GET")
			{
				req.open(options.method,options.url + "?" + query,true);
				req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
				req.send(null);
			}
			if (options.method == "POST")
			{
				req.open(options.method,options.url,true);
				req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
				req.send(query);
			}
		});
	}
}

func(jQuery);


