if (typeof UTILS == "undefined" || !UTILS) 
{
	var UTILS = {
		ParseQueryString: function (qs)
		{
			var params = {};
			if (qs == null) qs = location.search.substring(1, location.search.length);
			if (qs.length == 0) return;
		
			qs = qs.replace(/\+/g, ' ');
			var args = qs.split('&');
			
			for (var i = 0; i < args.length; i++) 
			{
				var pair = args[i].split('=');
				var name = decodeURIComponent(pair[0]);
				
				var value = (pair.length == 2) ? decodeURIComponent(pair[1]) : name;
				params[name] = value;
			}
			
			return params;
		},
		
		Defined: function(el)
		{
			return (el && typeof el != 'undefined');
		},
		
		SetCookie: function (name, value, expires)
		{
			document.cookie = name + "=" + escape(value) + "; path=/; expires=" + expires.toGMTString();
		},
		
		GetCookie: function(name)
		{
			var arg = name + '=';
		
			for (var pos = 0; pos < document.cookie.length;)
			{
				if (document.cookie.substr(pos, arg.length) == arg)
				{
					var end_pos = document.cookie.indexOf(";", pos);
					if (end_pos == -1) end_pos = document.cookie.length;
		
					return unescape(document.cookie.substring(pos, end_pos));
				}
		
				pos = document.cookie.indexOf(' ', pos) + 1;
				if (pos == 0) break;
			}
		
			return null;
		},
		
		RemoveCookie: function(name)
		{
			var cookie_date = new Date();
			cookie_date.setTime (cookie_date.getTime() - 1000 * 60 * 60 * 24 * 365);
			document.cookie = name += "=; expires=" + cookie_date.toGMTString();
		}
	}
}

UTILS.DOM = typeof UTILS.DOM != 'undefined' && UTILS.DOM ? UTILS.DOM : {
	get: function (el) 
	{
		return (el && el.nodeType) ? el : document.getElementById(el);
	},

	addListener: function (el, type, fn) 
	{
		if (typeof el == 'string') 
		{ 
			el = this.get(el); 
		}

		if (el.addEventListener) 
		{
			el.addEventListener(type, fn, false);
		} 
		else if (el.attachEvent) 
		{
			el.attachEvent('on' + type, fn);
		} 
		else 
		{
			el['on' + type] = fn;
		}
	},

	removeListener: function (el, type, fn) 
	{
		if (typeof el == 'string') 
		{ 
			el = this.get(el); 
		}

		if (el.removeEventListener)
		{
			el.removeEventListener(type, fn, false);
		} 
		else if (el.detachEvent) 
		{
			el.detachEvent('on' + type, fn);
		} 
		else 
		{
			el['on' + type] = function () { return true;}
		}
	},
	
	parseEvent: function(evt)
	{
		var evt = (evt) ? evt : ((window.event) ? event : null);
		if (evt)
		{
			return (evt.target) ? evt.target : evt.srcElement;
		}
		
		return null;
	}
};

UTILS.Ajax = typeof UTILS.Ajax != 'undefined' && UTILS.Ajax ? UTILS.Ajax : {
	
	send_queue:  [],
	begin_request: null,
	end_request: null,
	
	request: function(url, data, callback_func, use_text, try_num)
	{
		if (typeof(callback_func) == 'function' && UTILS.Ajax.send_queue.length != 0)
		{
			UTILS.Ajax.send_queue.push({url:url, data:data, callback_func:callback_func});
			return;
		}
	
		var req = null;
		if (typeof(try_num) == 'undefined') try_num = 1;
	
		if (window.XMLHttpRequest)
		{
			req = new XMLHttpRequest();
		}
		else if (window.ActiveXObject)
		{
			var msxmls = ['Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'];
	
			for (var i = 0; i < msxmls.length; i++)
			{
				try
				{
					req = new ActiveXObject(msxmls[i]);
					break;
				}
				catch (ex) {}
			}
		}
	
		if (req === null || req === false)
		{
			alert('Unable find XMLHttpRequest or it ActiveX alalog.');
			return null;
		}
	
		if (typeof(callback_func) == 'function')
		{
			req.onreadystatechange = function()
			{
				if (req.readyState == 4)
				{
					if (req.status==200 || req.status==304) callback_func(useText ? req.responseText : req.responseXML);
					else callback_func(null);
	
					if (UTILS.Ajax.send_queue.length != 0)
					{
						var msg = UTILS.Ajax.send_queue.shift();
						UTILS.Ajax.request(msg.url, msg.data, msg.callback_func);
					}
					else {
						if (UTILS.Ajax.end_request != null) UTILS.Ajax.end_request();
					}
				}
			};
	
			if (UTILS.Ajax.begin_request != null) UTILS.Ajax.begin_request();
		}
	
		req.open((data === false ? 'GET' : 'POST'), url, (typeof(callback_func) == 'function' ? true : false));
	
		if (data === false)
		{
			try 
			{
				req.send(null);
			} 
			catch (e) 
			{
				alert(e);
				var i = 0;
			}
		}
		else
		{
			try
			{
				req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
				req.setRequestHeader('Content-length', data.length);
				req.setRequestHeader('Connection', 'close');
				req.send(data);
			}
			catch (e) {}
		}
	
		if (typeof(callback_func) == 'function') return null;
	
		try
		{
			status = req.status;
	
			if (req.status!=200 && req.status!=304) 
			{
				if (try_num < 20) $send(url, data, callback_func, try_num + 1);
				else alert('Error sending request to "' + url + '": ' + req.status + '\n' + req.responseText);
			} 
			else 
			{
				return useText ?  req.responseText : req.responseXML;
			}
		}
		catch (e) { alert('Internal error while sending request to "' + url + '".'); }
	
		return null;
	},
	
	Query: function (method, url, data, use_resp_text)
	{
		try 
		{
			xmlhttp = new XMLHttpRequest();
		} 
		catch (e) 
		{
			xmlhttp = null;
		}
	
		if (xmlhttp == null)
		{
			try 
			{
			 	xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} 
			catch (e) 
			{
				xmlhttp = null;
			}
		}
	
		if (xmlhttp == null)
		{
			try 
			{
		 		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (e) 
			{
				xmlhttp = null;
			}
		}
	
		if (xmlhttp == null) 
		{
			alert('Your browser not support AJAX');
			return;
		}
		
		xmlhttp.open(method, url, false);
		
		if (method.toLowerCase() == 'post')
		{
			xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
		}
		xmlhttp.send(data);
	
		if (typeof(use_resp_text) != 'undefined' && use_resp_text) return xmlhttp.responseText;
		else return xmlhttp.responseXML;
	}
};


