if (typeof(Progress_layer)=='undefined')
{
	var Progress_layer =
	{
		dlg: null,
		show: function (){},
		hide: function (){}
	}
}

(function ()
{
	var loc = {};
	JSLOC = function (arg)
	{
		if (typeof(arg) == 'string')
		{
			return loc[arg];
		}
		else for (var i in arg)
		{
			loc[i] = arg[i];
		}
	}
})();

if (!isset(ajax_common))
{
	var ajax_common = true;
	var handlers = {};

	document.write('<iframe id="null_frame" src="/@/fit/_0.gif" frameborder="no" name="null_frame" onload="processFrame();" style="position: absolute; visibility: hidden" width="0" height="0"> </iframe>');
}

function show_item(item, flag)
{
//	alert([item.id,flag]);
	if (/WebKit/.test(navigator.userAgent))
	{
		if (flag)
		{
			item.style.position = 'static';
			item.style.left = '0px';
			item.style.height = '100%';

		}
		else
		{
			item.style.position = 'absolute';
			item.style.left = '-1500px';
		}
			/*
		with (item.style)
		{
			if (!flag)
			{
				item._position = position;
				item._left = left;
				item._top = marginTop;
				item._width = width;
				item._height = height;
			}
			position = flag ? item._position || 'static' : 'absolute';
			visibility = flag ? 'visible' : 'hidden';
			left = flag ? item._left || '0px' : '-15000px';
			//width = flag ? item._width || '' : '1px';
			//height = flag ? item._height || '' : '1px';
		}			*/

	}
	else
	{
		item.style.display = flag ? '' : 'none';
	}
}

function toggle()
{
	for (var i = 0; i < arguments.length; i++)
		$(arguments[i]).style.display = $(arguments[i]).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) 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(!window.context_listeners)
		window.context_listeners={};
		
		if(arguments[3])
		{
			if(!context_listeners[arguments[3]])
			context_listeners[arguments[3]] = [];
			
			context_listeners[arguments[3]].push([object,signal,self]);
		}
		
		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.listeners_detach = function(context)
	{
		if(!window.context_listeners || !context_listeners[context]) return;
		
		var listen=context_listeners[context];
		for(var i=0; i<listen.length; i++)
		{
			listen[i][2].detach(listen[i][1],listen[i][0]);
			listen.splice(i,1);
		}
		
	}
	
	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;
			}
		}
		
		if (navigator.appVersion.indexOf("KHTML") > -1)
		{
			var esc = escape(incoming_text);
			if (esc.indexOf("%u") < 0 && esc.indexOf("%") > -1)
			{
				incoming_text = decodeURIComponent(esc);
			}
		}
			
		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 = arguments[i] || false;
		
		var show_layer2 = show_layer;
		show_layer = 	(typeof(show_layer) == 'string' || typeof(show_layer) == 'object') ? (function(){toggle(show_layer2)}) : 
						typeof(show_layer) == 'function' ? show_layer : 
						(show_layer ? (function (flag){Progress_layer[flag ? 'show' : 'hide']()}) : (function(){}));
						
		var async = handler ? true : false;
		
		show_layer(true);
		
		var on_complete = function (http)
		{
			var text = AC.except(http.responseText);
			if (text !== false && handler) handler(http.responseText);
			
			show_layer(false);
		}
		
		var on_failed = function (http) {show_layer(false, 1)};
		
		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) 
		{
			show_layer(false);
			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;
		}
	}
}

(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 + '"';
			}
		};
		
	window.json_encode = function (array)
	{
		return s[typeof(array)](array);
	}

	window.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 (typeof(tag) == 'object' && typeof(tag.length) != 'undefined')
	{
		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 (tag)
	{
		if (typeof(content) == 'object' && !content.nodeType && !(content instanceof Array))
		{var temp = attrs; attrs = content; content = temp;}
		
		if (content)
			(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
					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;
}

(function ()
{
	var s = [], g = /(\*|\w*)?(?:(#|\.)(\w*))?(?:\[(\w+)(?:(=|~=)([^\]]*))?\])?(?:\s*([ >+])\s*)?(.*)?/;
	if (g.compile) g.compile(g.source);
	
	var next = function (ref)
	{
		for (ref = ref.nextSibling; ref; ref = ref.nextSibling)
			if (ref.nodeType == 1) return ref
	}
	
	window.$f = function (p, e)
	{
		var k = g.exec(p), t;
		
		e = (!e || (typeof(e.length) == 'undefined') ? ((e && e.tagName ? e : document).getElementsByTagName(k[1]||'*')) : e);
		
		for (var i = e.length-1; i >= 0; i--)
		{
			if (
				(!k[1] || k[1] == '*' || (e[i].tagName && e[i].tagName.toUpperCase() == k[1].toUpperCase())) &&
				(!k[2] || e[i][((k[2] == '#') ? 'id' : 'className')] == k[3]) && 
				(!k[4] || ((e[i].getAttribute && (t = e[i].getAttribute(k[4]))) && (!k[6] || t == k[6])))
			)
			{
				if (k[7])
					$f(k[8], (k[7] == ' ' ? e[i] : (k[7] == '+' ? [next(e[i])]: e[i].childNodes)))
				else if (s.indexOf(e[i]) == -1) s.push(e[i]);
			}
		}
		
		if (arguments.callee.caller != arguments.callee)
		{
			var r = s.reverse(); s = [];
			return r;
		}
	}
})()

var Profile = {
	labels: [],
	result: {},
	start: function (label)
	{
		Profile.labels.push([label, (new Date).getTime()]);
	},
	stop: function ()
	{
		var data = Profile.labels.pop();
		old_result = Profile.result[data[0]];
		if (old_result)
			Profile.result[data[0]] += (new Date).getTime() - data[1];
		else
			Profile.result[data[0]] = (new Date).getTime() - data[1];
	}
}
