if (typeof(Progress_layer)=='undefined')
{
	var Progress_layer =
	{
		dlg: null,
		show: function (){},
		hide: function (){}
	}
}

if (!isset(ajax_common))
{
	var ajax_common = true;
	var handlers = {};

	document.write('<iframe id="null_frame" src="/@/fit/_0.gif" name="null_frame" onload="processFrame();" style="position: absolute; visibility: hidden" width="0" height="0"> </iframe>');
}

function toggle(elem)
{
	elem.style.display = elem.style.display == 'none' ? '' : 'none';
}

function hash2array(hash)
{
	var result = [];
	for (var key=0; key < hash.length; key++)
	{
		result[key] = hash[key];
	}
	return result;
}

Array.prototype.indexOf = function (item)
{
	for (var i = 0; i < this.length; i++)
	{
		if (this[i] == item) return i;
	}
	return -1;
}

var Cookie = 
{
	get: function (name)
	{
		var coo = document.cookie;
		coo = coo.split(';');
		for (var i = 0; i < coo.length; i++)
		{
			var nv = coo[i].split('=', 2);
			if (nv[0].replace(/(^ *)|( *$)/g, '') == name) return unescape(nv[1])
		}
		
		return false;
	},
	set: function (name, value, expires, path, domain, secure)
	{
		if (typeof(expires) == 'number') expires = new Date((new Date).getTime+expires);
		
		document.cookie = name + "=" + escape(value) +
		((expires)  ? "; expires=" + expires.toUTCString() : "") +
		((path)     ? "; path=" + path       : "") +
		((domain)   ? "; domain=" + domain   : "") +
		((secure)   ? "; secure"             : "");
	}
}

function addLoadEvent(func)
{
	var oldonload = window.onload;
	if (typeof window.onload != 'function'){
		window.onload = func;
	} else {
		window.onload = function(){
		oldonload();
		func();
		}
	}
}

(function ()
{
	var dom_events = '|load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll|click|mousedown|mouseup|mouseover|mouseout|mousemove|keyup|keydown|keypress|dblclick|contextmenu|';
	
	var leaks = [];

	if (window.attachEvent)
	{
		window.attachEvent
		(
			'onunload', 
			function ()
			{
				for (var i = 0; i < leaks.length; i++)
					leaks[i][0][leaks[i][1]] = null;
			}
		);
	}
	
	Function.prototype.attach = function(signal)
	{
		var object = arguments[1] || window;
		var self = this;
		
		if (dom_events.indexOf('|'+signal+'|') != -1)
		{
			if (object.addEventListener)
				object.addEventListener(signal, self, false);
			else
			{
				(function (ev)
				{
					ev = ev ? ev : window.event;
					
					if (event)
					{
						ev.preventDefault = function () {	ev.returnValue = false; };
						ev.stopPropagation = function () { ev.cancelBubble = true; };
						ev.target = ev.srcElement;
					}
					
					self.call(object, ev);
				}).attach('on'+signal, object);
				
				leaks.push([object, 'on'+signal]);
			}
		}
		else
		{
			if (!object.elistners) object.elistners = {};
			try {
				if (!object.elistners[signal])
				{
					object.elistners[signal] = [];
					if (typeof(object[signal]) == 'function')
						object.elistners[signal].push(object[signal]);
				}
				object.elistners[signal].push(self);
				
				object[signal] = function ()
				{
					if (object.elistners && object.elistners[signal])
					for (var key in object.elistners[signal])
					{
						try {
						if (typeof object.elistners[signal][key] == 'function')
						object.elistners[signal][key].apply(this, arguments);
						}
						catch(e){}
					}
				}
			}catch(e){}
		}
		return this;
	}

	Function.prototype.detach = function(signal)
	{
		var object = arguments[1] || window;
		
		if (dom_events.indexOf('|'+signal+'|') != -1)
		{
			if (object.removeEventListener)
				object.removeEventListener(signal, this, false);
			else
				this.detach('on'+signal, object);
		}
		else
		{
			if (object.elistners && object.elistners[signal] && typeof(object.elistners[signal]) == 'object')
			{
				var elistners = object.elistners[signal];
				for (var i = 0; i < elistners.length; i++)
					if (elistners[i] == this) elistners.splice(i, 1);
			}
		}
		return this;
	}
	
	window.reset_signal = function (signal)
	{
		if (dom_events.indexOf('|'+signal+'|') != -1)	return false;
		
		var object = arguments[1] || window;
		if (!object.elistners[signal]) return;
		// if (confirm('удалить сигнал?'))
		delete object.elistners[signal];
		object[signal] = function () {};
	}
})()

function $()
{
	var elements = new Array();

	for (var i = 0; i < arguments.length; i++)
	{
		var element = arguments[i];
		if (typeof element == 'string')
		element = document.getElementById(element);
		if (arguments.length == 1)
		return element;
		elements.push(element);
	}
	return elements;
}

function isset(arg)
{
	return !(typeof(arg)=='undefined' || arg==null);
}

var AC =
{
	except: function (incoming_text)
	{
		if (incoming_text)
			incoming_text = incoming_text.replace(/^<!DOCTYPE.*?>/, '');
		
		if (/^(.+?)\|/.test(incoming_text))
		{
			var param = /^(.+?)\|/.exec(incoming_text);
			var text = incoming_text.replace(/.+?\|/, "");
			
			param[1] = param[1].replace(/(^[^a-z_]*)|([^a-z_]*$)/gi, ''); // удаляем мусор
			
			if (typeof handlers[param[1]] == "function")
			{
				handlers[param[1]](text);
				return false;
			}
		}
		return incoming_text;
	},
	request: function ()
	{
		var url = arguments[0];
		var args = arguments[1];
		
		var method = args['method'] || 'GET';
		var async = typeof(args['async']) == 'undefined' ? false : args['async'];
		var is_cashed = arguments[2] == null ? true : arguments[2];
		
		var http = window.XMLHttpRequest ?
			new XMLHttpRequest() :
			new ActiveXObject("Microsoft.XMLHTTP");
		
		/*
		* 0 (uninitialized)
		* 1 (loading)
		* 2 (loaded)
		* 3 (interactive)
		* 4 (complete)
		*/
		
		var events = ['uninitialized', 'loading', 'loaded', 'interactive', 'complete', 'failed'];
		
		var state_change = function ()
		{
			var state = (http.readyState == 4 && http.status != 200) ? 5 : http.readyState;
			
			var handler = args.handlers['on_'+events[state]];
			if (typeof(handler) == 'function') handler(http);
		}
		
		http.onreadystatechange = state_change;
		
		param2url = function(param)
		{
			var result = '';
			
			if (isset(args[param]))
			{
				var loop_flag = false;
				
				for (var key in args[param])
				{
					if (typeof args[param][key] == 'object')
					result += obj2param(encodeURIComponent(key), args[param][key], loop_flag);
					else
					result += (loop_flag ? "&" : "") + key + "=" + encodeURIComponent(args[param][key]);
					
					loop_flag = true;
				}
			}
			return result;
		}
		
		obj2param = function(keys, obj, loop_flag)
		{
			var result = '';
				
			for (var key in obj)
			{
				if (typeof obj[key] == 'object')
				result += obj2param(keys+'['+encodeURIComponent(key)+']', obj[key], loop_flag);
				else
				result += (loop_flag ? "&" : "") + keys + "[" +encodeURIComponent(key) + "]=" + encodeURIComponent(obj[key]);
				
				loop_flag = true;
			}
			
			return result;
		}
		
		var get_params  = param2url('get_params');
		
		if (get_params != '') get_params = '?'+get_params;
		
		if (!is_cashed) get_params = ACCS(get_params, url);
		
		var send = null;
		
		http.open(method, url+get_params, async);
		if (method == 'POST')
		{
			http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			send = param2url('post_params');
		}
		
		http.send(send);
		return http;
	},
	
	// 1. AC.simple('http://lixil.ru', 'POST'[?], {param1: '123'}[?], function(){}[?], true[?]);
	simple: function()
	{
		var url = arguments[0];
		
		// двигаемся по параметрам
		var i = 1;
		
		var method  = typeof(arguments[i]) == 'string' ? arguments[i++] : 'GET';
		var params1  = typeof(arguments[i]) == 'object' ? arguments[i++] : null;
		var params2  = typeof(arguments[i]) == 'object' ? arguments[i++] : null;
		var handler = typeof(arguments[i]) == 'function' ? arguments[i++] : false;
		var show_layer = typeof(arguments[i]) == 'boolean' ? arguments[i++] : true;
		var show_layer2 = typeof(arguments[i]) == 'boolean' ? arguments[i++] : false;
		
		var async = handler ? true : false;
		
		if (show_layer) Progress_layer.show();
		
		var on_complete = function (http)
		{
			var text = AC.except(http.responseText);
			if (text !== false && handler) handler(http.responseText);
			
			if (show_layer)
			Progress_layer.hide();
		}
		
		var on_failed = function (http) {Progress_layer.hide()};
		
		var get_params = params1;
		var post_params = params2;
		
		if (isset(params2))
			method = 'POST';
		else if (method == 'POST')
		{
			post_params = params1;
			get_params = null;
		}
		
		var http = AC.request(url, {method: method, get_params: get_params, post_params: post_params, handlers: {on_complete: on_complete, on_failed: on_failed}, async:async}, false);
		if (!async) 
		{
			Progress_layer.hide();
			var text = AC.except(http.responseText);
			return text;
		}
	}
}

function ACCS(get_params, url)
{
	var uni_num = 'ACCS='+Math.round(Math.random()*10000000000);
	get_params += (/\?/.test(url) ? '&' : '?')+uni_num;
	return get_params;
}

function processFrame()
{
	try
	{
		var nf_innerHTML = $('null_frame').contentWindow.document.body.innerHTML;
		// alert(nf_innerHTML);
		if (nf_innerHTML != '') 
		processAnswer(nf_innerHTML);
	}
	catch(e){}
}

function processAnswer(incoming_text)
{
    incoming_text = incoming_text.replace(/^<!DOCTYPE.*?>/, '');
	if (/^(.+?)\|/.test(incoming_text))
	{
		var param = /^(.+?)\|/.exec(incoming_text);
		var text = incoming_text.replace(/.+?\|/, "");
		param[1] = param[1].replace(/(^[^a-z_]*)|([^a-z_]*$)/gi, ''); // удаляем мусор
		if (typeof handlers[param[1]] == "function")
		{
			handlers[param[1]](text);
			return;
		}
	}
}

var json_encode, json_decode;

(function () {
	var m = {
			'\b': '\\b',
			'\t': '\\t',
			'\n': '\\n',
			'\f': '\\f',
			'\r': '\\r',
			'"' : '\\"',
			'\\': '\\\\'
		},
		s = {
			array: function (x) {
				var a = ['['], b, f, i, l = x.length, v;
				for (i = 0; i < l; i += 1) {
					v = x[i];
					f = s[typeof v];
					if (f) {
						v = f(v);
						if (typeof v == 'string') {
							if (b) {
								a[a.length] = ',';
							}
							a[a.length] = v;
							b = true;
						}
					}
				}
				a[a.length] = ']';
				return a.join('');
			},
			'boolean': function (x) {
				return String(x);
			},
			'null': function (x) {
				return "null";
			},
			number: function (x) {
				return isFinite(x) ? String(x) : 'null';
			},
			object: function (x) {
				if (x) {
					if (x instanceof Array) {
						return s.array(x);
					}
					var a = ['{'], b, f, i, v;
					for (i in x) {
						v = x[i];
						f = s[typeof v];
						if (f) {
							v = f(v);
							if (typeof v == 'string') {
								if (b) {
									a[a.length] = ',';
								}
								a.push(s.string(i), ':', v);
								b = true;
							}
						}
					}
					a[a.length] = '}';
					return a.join('');
				}
				return 'null';
			},
			string: function (x) {
				if (/["\\\x00-\x1f]/.test(x)) {
					x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
						var c = m[b];
						if (c) {
							return c;
						}
						c = b.charCodeAt();
						return '\\u00' +
							Math.floor(c / 16).toString(16) +
							(c % 16).toString(16);
					});
				}
				return '"' + x + '"';
			}
		};
		
	json_encode = function (array)
	{
		return s[typeof(array)](array);
	}

	json_decode = function (string)
	{
		try 
		{
			return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(string.replace(/"(\\.|[^"\\])*"/g, ''))) &&
					eval('(' + string + ')');
		} 
		catch (e) 
		{
			return false;
		}
	}
})();

function $e(tag, content, attrs)
{
	if (tag instanceof Array)
	{
		var result = [];
		for (var i = 0; i < tag.length; i++)
			result.push($e(tag[i], content, attrs));
		return result;
	}
	
	var doc = this.document;
	var el = typeof(tag) == 'object' ? tag : (tag == '' ? doc.createTextNode(content) : doc.createElement(tag));
	
	if (content)
	{
		if (typeof(content) == 'object' && !content.nodeType && !(content instanceof Array))
			attrs = content;
		else
			(function(el, child)
			{
				if (typeof(child) == 'string')
					el.appendChild(doc.createTextNode(child));
				else if (child instanceof Array)
					for (var i = 0; i < child.length; i++)
						arguments.callee(el, child[i]);
				else if (typeof(child) == 'object')
					el.appendChild(child);
			})(el, content);
			
		if (attrs)
			(function (el, attrs, str)
			{
				str = str || 'el.'; 
				for (var i in attrs)
					if (typeof(attrs[i]) == 'object') 
						arguments.callee(el, attrs[i], str+i+'.');
					else
						(new Function('el, value', str+i+'=value'))(el, attrs[i]);
			})(el, attrs)
	}
	return el;
}