var Tools = {};
var userAgent = navigator.userAgent.toLowerCase();
Tools.browser = {
	version: (userAgent.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
	safari: /webkit/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
	chrome:(/chrome/i).test(userAgent),
	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};


Tools.$ = function(id)
{
	if(typeof id == 'string')
		return document.getElementById(id);
	else
		return id;
};


Tools.extend = function(obj1,obj2)
{
	if(obj2)
		for(var i in obj2)
		{
			if(typeof obj2[i] == 'object' && obj1[i])
				Tools.extend(obj1[i],obj2[i]);
			else
				obj1[i] = obj2[i];
		}
	return obj1;
};

Tools.blockScreen = function(el)
{
	if(!Tools.fon)
	{
		el.style.position = 'relative';
		Tools.fon = document.createElement('div');
		Tools.fon.innerHTML = '&nbsp;';
		Tools.fon.style.background = 'url(/img/ajax-loader.gif) 50% 50% no-repeat';
		Tools.fon.style.position = 'absolute';
		Tools.fon.style.left = '0';
		Tools.fon.style.top = '0';
		Tools.fon.style.width = '100%';
		Tools.fon.style.height = '100%';
		
		el.appendChild(Tools.fon);
	}
}
Tools.unBlockScreen = function()
{
	if(Tools.fon.parentNode)
	{
		Tools.fon.parentNode.removeChild(Tools.fon);
		Tools.fon = null;
	}
}


function object()
{
};
Function.prototype.inherit = function(parentClassOrObject,proto)
{ 
	if (parentClassOrObject.constructor == Function)
	{ 
		this.prototype = new parentClassOrObject(null, null, false);
		this.prototype.constructor = this;
		this.prototype.parent = parentClassOrObject.prototype;
	}
	else 
	{ 
		this.prototype = parentClassOrObject;
		this.prototype.constructor = this;
		this.prototype.parent = parentClassOrObject;
	} 
	if(proto)
	{
		Tools.extend(this.prototype,proto);
	}
	return this;
};

/*------------------------------------------------------------------------------------*/
// Синхронно асинхронные запросы
Tools.ajax = {};
Tools.ajax.send = function(url,o) // param,callback,method,type
{
	if(!o.method)
	o.method = "POST";
	var req = null;
	if (window.XMLHttpRequest) 
	{
		try {
			req = new XMLHttpRequest();
		} catch (e){}
	} 
	else if (window.ActiveXObject) 
	{
		try {
			req = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e){
			try {
				req = new ActiveXObject('Microsoft.XMLHTTP');
			} catch (e){}
		}
	}
	if (req) 
	{
		if(o.callback || o.success || o.failure)
			req.onreadystatechange = function()
			{
				if (req && (req.readyState == 4) ) 
				{
					var success;
					var data;
					try {
						if(o.type=="json")
							data = eval("("+req.responseText+")");
						else if(o.type=="xml")
							data = req.responseXML;
						else
							data = req.responseText;
						success="success";
						if(o.success)
							o.success(data);
					} catch(e) {
						success="parsererror";
						if(o.failure)
							o.failure(data);
					}
					if(o.callback)
						o.callback(data,success,req.status);
				}
			};
			if(typeof o.param != "string")
				o.param = Tools.ajax.param(o.param);
			else
				o.param = encodeURIComponent(o.param).replace(/%3D/g,'=').replace(/%26/g,'&').replace(/\+/g,'%2B').replace(/ /g,'+');
			if(o.method == "GET" && o.param)
			{
				url += ((/\?/).test(url) ? "&" : "?") + o.param;
				o.param=null;
			}
			req.open(o.method, url, true);
			if(o.param)
				req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			req.send(o.param);
	}
};


Tools.ajax.serialize = function(hash)
{
	switch(typeof hash)
	{
		case 'number': return hash;
		case 'string': return '"'+hash+'"';
		case 'object':
			if(hash instanceof Array) return '['+hash.map(arguments.callee).join(',')+']';
			if(hash instanceof Date) return hash.toString();
			var t=[];
			for(var i in hash)
			{
				t.push(i+':'+arguments.callee(hash[i]));
			}
			return '{'+t.join(',')+'}';
		default:
			return hash.toString();
	}
}
Tools.ajax.param = function(hash) 
{
	if(typeof hash == 'string') return hash.replace(/%20/g, "+");
	var res = [];
	for(var i in hash)
	{
		res.push(i+'='+Tools.ajax.serialize(hash[i]));
	}
	return res.join('&').replace(/%20/g, "+");
};

Array.prototype.map=function(iterator,s)
{
	var res = [];
	for(var i=0,len=this.length;i<len;i++)	res.push(iterator.call(s,this[i],i,this));
	return res;
}

Tools.load = function (funct)
{
	(function(){
		if (Tools.browser.msie && window == top )
		{
			try {
				document.documentElement.doScroll("left");
			} catch(e){
				setTimeout( arguments.callee, 0 );return;
			}
			funct();
		}
		if (document.addEventListener)
			document.addEventListener("DOMContentLoaded",funct, false );
	})();
}

Tools.delegat = function(i, m, p){
    return function()
    {
        if(m)
        {
            var arg = [this];
            for(var j=0,l = arguments.length;j<l;j++) arg.push(arguments[j]);
            if(!('1' in arg)) arg[1] = window.event;
            return m.apply(i,arg.concat(p||[]));
        }
        return false;
    }
};

Tools.serialazeForm = function(form)
{
	var form = form || this.form;
	var res = {};
	var elements = form.elements;
	function add(name,value)
	{
		if(!name) return;
		if(res[name])
		{
			if(!(res[name] instanceof Array)) res[name] = [res[name]];
			res[name].push(value);
		}
		else
			res[name] = value;
	}
	for(var i=0,len=elements.length;i<len;i++)
	{
		var el = elements[i];
		switch(el.type)
		{
			case 'checkbox':
			case 'radio':
				if(!el.checked) continue;
			default:
				if(el.name)
					add('"'+el.name+'"',el.value);
		}
	}
	return res;
}


Tools.addClass = function(element,cName)
{
	if(element && !((new RegExp("\\b"+cName+"\\b","i")).test(element.className))) element.className += ' '+cName;
	return element;
}
Tools.removeClass = function(element,cName)
{
	if(element) element.className = element.className.replace((new RegExp("\\b"+cName.split('|').join('\\b|\\b')+"\\b","i")),'');
	return element;
}
