﻿function $(e)
{
	if (typeof e == 'string')
		return document.getElementById(e);
	return e;
}

function $select(e)
{
	if (typeof e == 'string')
		e = $(e);
	try
	{
		e.focus();
		e.select();
	}
	catch (ex) { }
}

function $attach(el, evname, func)
{
	el = $(el);
	if (el.attachEvent)
		el.attachEvent('on' + evname, func);
	else if (el.addEventListener)
		el.addEventListener(evname, func, true);
	else
		el['on' + evname] = func;
}

/**
 * Runs the callback.
 * @param data Array of data in following JSON format: [{name:value},{name2:value2},...]
 */
function $callback(oncallback,context,data,url)
{	
	var x = null;
	var M = [
		'Msxml2.XMLHTTP.5.0',
		'Msxml2.XMLHTTP.4.0',
		'Msxml2.XMLHTTP.3.0',
		'Msxml2.XMLHTTP',
		'Microsoft.XMLHTTP'
	];
	
	for (var i = 0; i < M.length; i++) {
		try { x = new ActiveXObject(M[i]); }
		catch (e) { x = null; }
		if (x != null) break;
	}

	if (!x && typeof XMLHttpRequest != 'undefined') x = new XMLHttpRequest();
	if (!x) return false;
	
	var _escape = function(s)
	{
		if (typeof(encodeURIComponent) == 'function')
			return encodeURIComponent(s);
		else
			return escape(s);
	};
	
	if (data == null) data = '';	
	var s = '';
	if (typeof(data) == 'string') s += data;
	else if (typeof(data) == 'object')
	{
		for(var item in data)
		{
			var value = data[item];
			if(typeof(value) != 'object')
			{
				if(s!='')s+='&';
				s += item+"="+_escape(value);
			}
			else
			{
				for(var prop in value)
				{
					var prop_value = value[prop];
					if(s!='')s+='&';
					s += prop+"="+_escape(prop_value);
				}
			}
		}
	}
	data = s;

	x.onreadystatechange = function()
	{
		if (x.readyState != 4)
			return;
		var txt = x.responseText.replace(/^\s+|\s+$/g, '');
		x.onreadystatechange = function() { };
		oncallback(txt, context);
		try { delete x; }
		catch (e) { }
	};
	
	if (url==null) url = ''+location;
	   
	x.open('POST', url.replace(/&amp;/g, '&'), true);
	x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	x.send(data);	
	
	return true;
}