var VirtualHelper = new Class({
	Implements : [Events, Options],
	
	options : {
		onStart:$empty,
		onLevel0Complete:$empty,
		maximum_width: 130,
		canvas: document.getElementById('field'),
		sid:'b661720de7bedac73393e10701766734',
		url:'http://www.hc.ru/hi-tech/support/ti_pl_service.jsp',
		domain:'',
		screen_url:'http://to.hc.ru/cgi-bin/screen.pl',
		vote_url:'http://to.hc.ru/cgi-bin/ti/vote.pl',
		comment_url:'http://to.hc.ru/cgi-bin/ti/comment.pl',
		errors: {
			'the_request_has_been_cancelled': 'Request has been cancelled!',
			'setting_the_request_header_fails': 'Setting the request header fails!',
			'the_request_fails': 'Вы вышли из сервиса!',
			'server_fail':'Произошла внутренняя ошибка при работе помощника, пожалуйста повторите запрос',
			'domain_fail':'Не корректно введен домен. Пожалуйста, проверьте правильность написания домена.',
			'vote_fail':'Извените, произошла ошибка',
			'comment_fail':'Извените, произошла ошибка'
		},
		helpers: {
			images: {
				'alpha_img':'',
				'error_img':'',
				'resize_img':'',
				'non_paid_img':'',
				'loading_img':''
			}
		}
	},
	initialize:function(element, options) {
		this.setOptions(options);
		var coord_arr = [];
		this.iebutnot7ie = Browser.Engine.trident;
		this.first_node = $$('.first_node');
		this.schema = $('schema');
		this.form = $('form_vh');
		this.dmn_to_check = $('form_vh').getElement('input');
		this.dmn_to_check.focus();
		this.url = this.options.url;
		this.sid = this.options.sid;
		this.value_inp='';
		this.snoska = $('schema_container').getElement('.snoska');
		this.canvas = this.options.canvas || this.create_canvas();
		this.submitFormBound = this.onSubmitForm.bind(this);
		if(Browser.Engine.trident) {
			if (!document.getElementsByClassName) { G_vmlCanvasManager.initElement(this.canvas);}
//			G_vmlCanvasManager.initElement(this.canvas);
		}
		this.check_domain = $('check_dmn_vh').getProperty('value').toLowerCase().replace(/^([a-z]+)(:\/\/)/, '').replace(/\s+|(\/(\S+)?)/g, '');
		this.ctx = this.canvas.getContext('2d');
		var self = this;
		this.col_exist = 0;
		this.node = new Element('div').set('html', 
			'<div class="node_bg">'+
			'</div>'+
			'<div class="node_r">'+
			'</div>'+
			'<div class="inner">'+
				'dfkvdf'+
			'</div>'+
			'<div class="node_b">'+
			'</div>'+
			'<div class="node_b_r">'+
			'</div>'
		);

		this.form.addEvent('submit', this.submitFormBound);

		if(this.dmn_to_check.value) this.onSubmitForm();
	},
	
	onSubmitForm: function(e) {
		this.fireEvent('start');
		e ? new Event(e).stop() : '';
		if(this.form.retrieve('blocked')) return;
		$('message_text').empty();
		$('schema_inner').empty();
		delete this.canvas;
		$('check_dmn_vh').blur();
		if(!this.canvas) this.canvas = this.create_canvas();
		if(Browser.Engine.trident) {
			if (!document.getElementsByClassName) { G_vmlCanvasManager.initElement(this.canvas);}
		}
		this.ctx.clearRect(0, 0, 10000, 1000);
		($('schema').getSize().x > 400)?$('schema').setStyle('width', 400):'';
		($$('.prev_screen'))?$$('.prev_screen').dispose():'';
		($('modal'))?$('modal').dispose():'';
		$chk(this.snoska)?this.snoska.setStyle('top', 271):'';
		this.check_domain = $('check_dmn_vh').getProperty('value').toLowerCase().replace(/^([a-z]+)(:\/\/)/, '');
		this.garbageCollector($$('.modal'), $$('.vote_wrap'), $('whois_wrapper').getElements('div'), $('comment_wrapper').getElements('div'), $$('.info_wrap')[0].getElements('div'));
		this.disable_form();
		if(this.domain_validate(this.check_domain)) {
			this.drawLevel_1(0, 0);
			(function() {
				$('schema_inner').getElement('.first_node').getElement('.inner').setStyles({
					'top':(($('schema_inner').getElement('.first_node').getSize().y - $('schema_inner').getElement('.first_node').getElement('.inner').getSize().y)>0)?($('schema_inner').getElement('.first_node').getSize().y - $('schema_inner').getElement('.first_node').getElement('.inner').getSize().y)/2:0,
					'left':($('schema_inner').getElement('.first_node').getSize().x - $('schema_inner').getElement('.first_node').getElement('.inner').getSize().x)/2
				});
				$('schema_inner').getElement('.first_node').getElement('.inner').getElement('span').empty().appendText(this.check_domain);
			}).delay((Browser.Engine.trident ? 50 :0), this);
		}else{
			this.dlg_handler(this.options.errors.domain_fail);
			$chk(this.snoska)?this.snoska.setStyle('top', 0):'';
		}
	},

	create_canvas: function() {
		var canvas = new Element('canvas', {'id':'field', 'width':400, 'height':770}).inject($('schema_inner'));
		return canvas;
	},

	disable_form:function() {
		this.form.store('blocked', true);
		var inputs = this.form.getChildren('input');
		inputs.each(function(inp, i) {
			inp.disabled = 'disabled';
		});
		$('dmn_checker').addClass('uncheck');
	},

	enable_form:function() {
		this.form.eliminate('blocked');
		var inputs = this.form.getChildren('input');
		this.form.removeEvents('keydown');
		inputs.each(function(inp, i) {
			inp.removeProperty('disabled');
		});
		$('dmn_checker').removeClass('uncheck');
	},

	snoska_set_pos:function(level) {
		level = level || 0;
		var snoska_height = $chk(this.snoska)?this.snoska.getSize().y:0;
		var offset_last = $('schema').getSize().y;
		var spacer = (level!=3)?($('schema_inner').getSize().y + snoska_height + 200):(offset_last + 20);
		$chk(this.snoska)?this.snoska.setStyles({
			'top':spacer
		}):''
	},

	garbageCollector: function() {
		var arr = $A(arguments).flatten().clean();
		$A(arr).each(function(elem, i) {
			elem.dispose();
		});
	},

	submited_form:function(form) {
		form.fireEvent('submit', this);
	},

	domain_validate:function(domain) {
		var domains_parts = domain.split('.');
		var top_level_domains =  ["aero", "asia", "biz", "cat", "com", "coop", "edu", "gov", "info", "int", "jobs", "mil", "mobi", "museum", "name", "net", "org", "pro", "tel", "travel", "ac", "ad", "ae", "af", "arpa", "рф", "السعودية", "امارات", "ag", "ai", "al", "am", "an", "ao", "aq", "ar", "as", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "er", "es", "et", "eu", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps", "pt", "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "su", "sv", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to", "tp", "tr", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "ye", "yt", "za", "zm", "zw"];
		var check_alphabet_bool = true;
		var cyrillic = /[А-Яа-я\u0451]/,
			check = top_level_domains.contains(domain.split('.').getLast());
		var roman = /[A-Za-z]/;
		for(var i=0; i<domains_parts.length; i++) {
			if(cyrillic.test(domains_parts[i]) && roman.test(domains_parts[i])) {
				check_alphabet_bool = false;
			}
		}
		var reg_exp1 = /^(?:[a-zа-я0-9\u0451]([-a-zа-я0-9\u0451]{0,61}[a-zа-я0-9\u0451])?\.)*([a-zа-я]{2,})$/;
		var reg_exp2 = /^-/;
		if(!reg_exp1.test(domain) || reg_exp2.test(domain) || !check_alphabet_bool || !check) {return false;}
		else {return true;}
	},

	afterResponse : function(obj) {
		this.dlg_handler(this.message_complete, obj);
		var mass_actives = [];
		var mass_actives_registr = [];
		var coord_arr = [];

		$$('.node').each(function(node, i) {
			if(node.getProperty('rel') == 'active' && !node.hasClass('registr') && node.getProperty('level').toInt() == 0) {
				mass_actives.push(node);
			} else if(node.getProperty('rel') == 'active' && node.hasClass('registr') && node.getProperty('level').toInt() == 0) {
				mass_actives_registr.push(node);
			}
			
			if(node.getProperty('level').toInt() == 3) {
				node.getElement('.inner').set('html', '<span>Сайт по</span><span>'+this.check_domain+'</span>');
				this.inner_block(node);
			}
		}.bind(this));
		
		
		

		/* var last_nodes = $$('.node').filter(function(node) {return (node.getProperty('level').toInt() == 3 && !node.hasClass('error'))});
		last_nodes.each(function(node, i) {
			var screen_preview = new Element('div').set('html', 
				'<a href="#" title="Показать скриншот сайта">'+
					'<img src="'+this.options.helpers.images.alpha_img+'" width="25" height="25" alt="Показать скриншот сайта" />'+
				'</a>'
				).addClass('prev_screen')
				.inject(node);
		}.bind(this));

		var prevs = last_nodes.getElement('.prev_screen');

		var gal = this.get_gallery(prevs, 1);
		prevs.each(function(preview, i) {
			preview.getElement('a').addEvent('click', function(e) {
				this.screenshotHandler(e, gal, preview);
			}.bind(this));
		}.bind(this));*/
		
		if ($chk(obj.show_screen)) {
			var gal = this.get_gallery([], 1);
			
			var prev = new Element('div').set('html', 
				'<table cellpadding="0" cellspacing="0" border="0">'+
					'<tbody>'+
						'<tr>'+
							'<td class="info_img_container"><img src="'+this.options.helpers.images.alpha_img+'" width="25" height="25" alt="Показать скриншот сайта" /></td>'+
							'<td class="info_txt_container"><a class="active" href="#">Показать скриншот сайта</a></td>'+
						'</tr>'+
					'</tbody>'+
				'</table>'
				).addClass('prev_screen')
				.addEvent('click', function(e) {
					//this.screenshotHandler(e, gal, prev);
					new Event(e).stop();
					gal.fireEvent('previewClick', [e, gal, prev]);
				}.bind(this));
			
			var comments = $$('.comment_wrap');
			
			if (comments.length) {
				prev.inject(comments[0], 'before');
				$('comment_wrapper').set('styles', {'top': (26+$('comment_wrapper').getStyle('top').toInt())+'px'});
			} else {
				prev.inject($('schema_wrap').getElement('.info_wrap'));
			}
			
			/* new Element('div').set('html', 
				'<a href="#" class="active" title="Показать скриншот сайта">'+
					'<img src="'+this.options.helpers.images.alpha_img+'" width="25" height="25" alt="Показать скриншот сайта" />'+
				' <span>Показать скриншот сайта</span></a>'
				).addClass('prev_screen')
				.inject($('schema_wrap').getElement('.info_wrap'));
			
			/*var prevs = $$('.first_node').getElement('.prev_screen');
	
			var gal = this.get_gallery(prevs, 1);
			prevs.each(function(preview, i) {
				preview.getElement('a').addEvent('click', function(e) {
					this.screenshotHandler(e, gal, preview);
				}.bind(this));
				if ($('.edit_dns')) {
					preview.setStyle('right', '32px');
				};
			}.bind(this))*/;
		}
		
		var nodes_not_first = $$('.node').filter(function(node, i) {
			return (!node.hasClass('first_node'))?node:undefined;
		});
		nodes_not_first = nodes_not_first.clean();
		var error_first = $('schema').getElements('.error_img').filter(function(img, i) {return (img.getProperty('level') == 'first')});
		var error_not_first = $('schema').getElements('.error_img').filter(function(img, i) {return (img.getProperty('level') != 'first')});
		this.set_error_position(error_first, $$('.first_node'), false);
		if(error_first.length != 0) {this.drawError(this.get_coordinates($$('.first_node')), error_first)}
		this.set_error_position(error_not_first, $$('.node'), true);
		this.initErrors($$('.node'));
		$('schema').getElements('img').setStyle('visibility', 'visible');
	},
	
	inner_block:function(node) {
		var nodeWidth = node.getSize().x;
		var nodeHeight = node.getSize().y;
		var nodeLeft = node.getStyle('left').toInt();
		var nodeTop = node.getStyle('top').toInt();
		var flag1 = false, flag2 = false, flag3 = false;
		var innerWidth = node.getElement('.inner').getSize().x, innerHeight = node.getElement('.inner').getSize().y;
		var inner_text = node.getElement('.inner').getElements('span');
		var arr_char = [];
		var arr_new_char = [];
		var new_str = '';
		var part_str = '';
		var step=0;
		var resize = new Image();
		resize.src = this.options.helpers.images.resize_img;
		$(resize).addClass('resizable');
		(innerWidth > nodeWidth)?(flag1=true):(flag1=false);
		(innerHeight > nodeHeight)?(flag2=true):(flag2=false);
		(innerWidth > nodeWidth && innerHeight > nodeHeight)?(flag3=true):(flag3=false)
		if((innerWidth > nodeWidth) || (innerHeight > nodeHeight)) {
			node.appendChild(resize);
			inner_text.each(function(span, i) {
				arr_char[i] = span.get('text');
			});
			var pre_last_span = {};
			for(var i=inner_text.length; i--;) {
				if((node.getElement('.inner').getSize().y - nodeHeight) > 12) {
					pre_last_span[i]=(inner_text[i-1].get('html'));
					inner_text[i-1].set('text', '...');
					inner_text[i].setStyle('display', 'none');
				}
			}
			var fx = new Fx.Elements([node, node.getElement('.node_bg'), node.getElement('.node_b'), node.getElement('.inner'), node.getElement('.node_r')], {duration: 250, transition: Fx.Transitions.Sine.easeOut, wait:false});
			node.addEvent('mouseenter', function(e){
					new Event(e).stop();
					e.preventDefault();
					node.getElement('.inner').getElements('span').each(function(span, i) {
						if(span.get('html') == '...') {
							span.set('html', pre_last_span[i+1])
						}
						if(span.getStyle('display')=='none') {
							span.setStyle('display', 'block');
						}
					});
					var ownHeight = (innerHeight > nodeHeight)?this.getElement('.inner').getSize().y:nodeHeight;
					var ownTop = (innerHeight > nodeHeight)?(nodeTop - (this.getElement('.inner').getSize().y-nodeHeight)/2):node.getStyle('top').toInt();
					var ownWidth = (innerWidth > nodeWidth)?this.getElement('.inner').getSize().x:nodeWidth;
					var ownLeft = (innerWidth > nodeWidth)?(nodeLeft - (this.getElement('.inner').getSize().x-nodeWidth)/2):nodeLeft;
					fx.start({
						'0':{
							'width':ownWidth,
							'left':ownLeft,
							'height':ownHeight,
							'top':ownTop
						},
						'1':{
							'width':(flag1)?(innerWidth-8):(nodeWidth-8),
							'height':(this.getElement('.inner').getSize().y > nodeHeight)?(this.getElement('.inner').getSize().y-6):(nodeHeight-6)
						},
						'2':{
							'width':(flag1)?(innerWidth-8):(nodeWidth-8)
						},
						'3':{
							'left':(flag1)?0:innerLeft
						},
						'4':{
							'height':(this.getElement('.inner').getSize().y > nodeHeight)?(this.getElement('.inner').getSize().y-6):(nodeHeight-6)
						}
					});
					resize.setStyle('display', 'none');
				});
				node.addEvent('mouseleave', function(e){
					new Event(e).stop();
					fx.start({
						'0':{
							'width': nodeWidth,
							'left':nodeLeft,
							'height': nodeHeight,
							'top':nodeTop
						},
						'1':{
							'width':nodeWidth-8,
							'height':nodeHeight-6
						},
						'2':{
							'width': nodeWidth-8
						},
						'3':{
							'left':innerLeft
						},
						'4':{
							'height':nodeHeight-6
						}
					});
					for(var i=inner_text.length; i--;) {
						if((this.getElement('.inner').getSize().y - nodeHeight) > 12) {
							inner_text[i-1].set('text', '...');
							inner_text[i].setStyle('display', 'none');
						}
					}
					resize.setStyle('display', 'block');
				});
		}
			node.getElement('.inner').setStyles({
				'top':((node.getSize().y - innerHeight)>0)?(node.getSize().y - innerHeight)/2:0,
				'left':(nodeWidth - node.getElement('.inner').getSize().x)/2
			});
		var innerLeft = node.getElement('.inner').getStyle('left').toInt();
	},

	nodes_association_reg:function(array) {
		array = array.clean();
		var mass_new = [];
		var hash_actives = {};
		var sub_arr = [];
		var sub_sub_arr = [];
		var new_array=[];
		var tmp_hash = {};
		var array_new = [];
		var identify = false;
		if(array.length > 1) {
		for(var i=array.length; i--;) {
			var ip1 = $chk(array[i].getProperty('ip'))?array[i].getProperty('ip').split(' '):[];
			for(var j=array.length; j--;) {
				var ip2 = $chk(array[j].getProperty('ip'))?array[j].getProperty('ip').split(' '):[];
				if(ip1.length == ip2.length && (ip1.length!=0 || ip2.length!=0)) {
					ip1.each(function(ips, i) {
						if(ip2.contains(ips)) identify = true;
						else identify = false;
					});
				}
			}
			if(identify) {
				tmp_hash[0] || (tmp_hash[0] = []);
				tmp_hash[0].unshift(array[i]);
			}else {
				tmp_hash[$chk(array[i].getProperty('ip'))?array[i].getProperty('ip'):0] || (tmp_hash[$chk(array[i].getProperty('ip'))?array[i].getProperty('ip'):0] = []);
				tmp_hash[$chk(array[i].getProperty('ip'))?array[i].getProperty('ip'):0].unshift(array[i]);
			}
		}
		for(var i in tmp_hash) {
			mass_new.push(tmp_hash[i]);
		}
			for(var i=0; i<mass_new.length; i++) {
				var nodes = mass_new[i];
				var first_node = nodes[0];
				var first_ips = $chk(first_node.getProperty('ip'))?first_node.getProperty('ip').split(' '):[];
					for(var k=0; k<nodes.length; k++) {
						var name_node = nodes[k].getElement('.inner').get('html');
						var node_ips = $chk(nodes[k].getProperty('ip'))?nodes[k].getProperty('ip').split(' '):[];
						var flag=false;
						if(first_ips.length >= node_ips.length) {
							first_ips.each(function(ip, i) {
								if(node_ips.some(function(ip2, j) {return ip2 == ip;})) flag = true;
								else flag = false;
							});
						}else if(first_ips.length <= node_ips.length) {
							node_ips.each(function(ip, i) {
								if(first_ips.some(function(ip2, j) {return ip2 == ip;})) flag = true;
								else flag = false;
							});
						}
						if(name_node !== first_node.getElement('.inner').get('html') && flag) {
							first_node.getElement('.inner').set('html', first_node.getElement('.inner').get('html') + name_node)
							new_array.push(first_node);
							nodes[k].dispose();
						}else if(name_node !== first_node.getElement('.inner').get('html') && !flag && nodes[k].hasClass('error') && first_node.hasClass('error')) {
							first_node.getElement('.inner').set('html', first_node.getElement('.inner').get('html') + name_node)
							new_array.push(first_node);
							nodes[k].dispose();
						}
				}
			}
		}else {
			new_array = array;
		}
		return new_array;
	},

	dec_to_bin:function(num) {
		var pattern = '';
		pattern = num.toString(2);
		while(pattern.length!=3) {
			pattern='0'+pattern;
		}
		return pattern;
	},

	draw_first_node:function() {
		var first_node = new Element('div').set('html', 
			'<div class="node_bg">'+
			'</div>'+
			'<div class="node_r">'+
			'</div>'+
			'<div class="inner">'+
				'<span></span>'+
			'</div>'+
			'<div class="node_b">'+
			'</div>'+
			'<div class="node_b_r">'+
			'</div>'
		);
		first_node.addClass('first_node');
		first_node.addClass('node');
		first_node.setProperty('level', '0');
		first_node.addClass('active');
		first_node.inject($('schema_inner'));
		first_node.setStyle('left', ($('schema').getSize().x - first_node.getSize().x)/2);
	},

	set_levels_size:function(k, j, z) {
		j = j || 0;
		k = k || 0;
		z = z || 0;
		if(j == 0 && k!=0) {
			if(z!=0) {
				$$('.inside').setStyles({'width':(z*162), 'left':k+158});
			}else if(z==0){
				$$('.inside').dispose();
			}
			$$('.outside').setStyles({'width': (k + 18)});
		}

		if(k == 0 && j!=0) {
			$$('.outside').dispose();
			$$('.inside').setStyles({
				'width': j - k + 18,
				'left':132
			});
		}

		if(k!=0 && j!=0){
			$$('.inside').setStyles({
				'width': j+20,
				'left':k+162
			});
			$$('.outside').setStyles({'width': k+20});
		}
	},

	unique_array:function(array) {
		var unique = [];
		o:for(var i=0; i<array.length; i++) {
			for(var j=0; j<unique.length; j++) {
				if(unique[j]==array[i]) continue o;
			}
			unique[unique.length] = array[i];
		}
		return unique;
	},

	first_node_animate:function(elems) {
		var width_el = elems.getLast().getSize().x;
		var exists = elems.filter(function(node, i) {return node.hasClass('exist')});
		var actives = elems.filter(function(node, i) {return (node.hasClass('active') && !node.hasClass('first_node'))});
		var nodes = (actives.length!=0)?actives:exists;
		var width_all = (this.get_max_left(nodes) + 162)/2;
		var first_node = $('schema').getElement('.first_node');
		var self = this;
		var fx2 = new Fx.Morph(first_node, {duration:1000, transition: Fx.Transitions.Sine.easeOut, wait:false, onComplete:function() {self.inner_block(first_node);}});
		fx2.start({
			'left':width_all
		});
	},

	sort_hash_ips:function(enter_hash) {
		var new_array=[];
		var new_hash={};
		var new_hash_ip={};
		var new_hash_cont={};
		var types_array = [];
		var cont_array = [];
		var ips_array = [];
		if($chk(this.ips_types)) {
			for(var ip in this.ips_types) {
				types_array.push(this.ips_types[ip]);
				cont_array.push(enter_hash[ip]);
				ips_array.push(ip);
			}
			types_array = types_array.sort().reverse();
			for(var i=0; i<types_array.length; i++) {
				new_hash_ip[types_array[i]] = [];
				new_hash_cont[types_array[i]] = [];
				for(var j=0; j<cont_array.length; j++) {
					if(this.ips_types[ips_array[j]] == types_array[i]) {
						new_hash_ip[types_array[i]].push(ips_array[j]);
						new_hash_cont[types_array[i]].push(cont_array[j]);
					}
				}
			}
			for(var i in new_hash_ip) {
				for(var j=0; j<new_hash_ip[i].length; j++) {
					if($chk(new_hash_ip[i][j]) && $chk(new_hash_cont[i][j])) {
						new_hash[new_hash_ip[i][j]] = new_hash_cont[i][j];
					}
				}
			}
			return new_hash;
		}else {
			return enter_hash;	
		}	
	},

	drawLevel_1:function(step, level) {
		var self = this;
		this.massive_nodes1 = [];
		this.massive_nodes1_coord = [];
		this.nodes_register_level1 = [];
		this.nodes_not_register_level1 = [];
		this.ns_ips_reg = 0;
		this.ns_reg = 0;
		this.reg_ips = 0, this.unreg_ips = 0;
		this.exist_only = [];
		var json_obj = new Request.JSON({url:this.url,

			onRequest:function() {
				self.disable_form();
				self.add_preloader(level);
				self.draw_first_node();
				self.add_level_blocks('Уровень DNS', 0, 'level_DNS');
				self.add_level_blocks('Уровень сервера', 1, 'level_serverhost');
				self.add_level_blocks('Уровень веб-сервера', 2, 'level_webserver');
				self.add_level_blocks('Уровень сайта', 3, 'level_content');
				$('schema_inner').getElement('.first_node').getElement('.inner').getElement('span').empty().appendText(self.check_domain);
				var levels = $('schema_inner').getElements('div').filter(function(level, i) {return (level.hasClass('levels') && !level.hasClass('levels_clone'))});
				var levels_clone = $('schema_inner').getElements('div').filter(function(level, i) {return (level.hasClass('levels_clone') && !level.getProperty('id'));});
				self.clone_levels = levels_clone;
				levels_clone.each(function(elem, i) {
					elem.setStyle('top', 112 + (i*156));
					levels[i].setStyle('top', 112 + i*156);
					if(i!=level)elem.setStyle('display', 'none');
				});
				var texts = [
					'Производится проверка Domain Name System (DNS-системы), связывающей домен и хостинг',
					'Производится проверка сервера, на котором располагается содержимое Вашего сайта',
					'Производится проверка программного обеспечения, которое отвечает за обработку запросов к Вашему сайту.',
					'Производится проверка доступности содержимого (файлов) сайта'
				];
				if($chk(levels_clone))
				var tooltips = new MagicTooltip(levels_clone, texts);
			},
			onComplete:function(obj) {
				if($defined(obj) && $chk(obj)) {
					var errors = new Image(); 
					var non_paid = new Image();
					errors.src = self.options.helpers.images.alpha_img;
					errors.width = '35';
					errors.height = '31';
					non_paid.src = self.options.helpers.images.alpha_img;
					non_paid.width = '32';
					non_paid.height = '32';
					self.message_level1 = obj.message;
					var paid = $defined(obj.paid)?obj.paid:true;
					if(obj.ns != null && !obj.error && obj.registred != null) {
						self.destroy_preloader();
						self.NS_array = [];
						self.our_ns = [];
						var ns_name = [];
						self.ns_names_ips = {};
						self.ns_names_types = {};
						var ns_type = [];
						var ns_ip = [];
						var ns_ip_active = [];
						var ns_error = [];
						var ns_error_nodes = [];
						for(var ns in obj.ns) {
							if($defined(obj.ns[ns].ip)) {
								self.ns_names_ips[ns] = $A(obj.ns[ns].ip);
								if($defined(obj.ns[ns].impiric_ips)) self.ns_names_ips[ns].combine(obj.ns[ns].impiric_ips);
							}
							ns_ip.push(obj.ns[ns].ip);
							if($defined(obj.ns[ns].error) || !$defined(obj.ns[ns].ip) || !obj.ns[ns].ip.length) {
								ns_error.push(true)
							}else{
								ns_error.push(false)
							}
							self.NS_array.push(obj.ns[ns]);
							ns_name.push(ns);
							self.ns_names_types[ns] = self.dec_to_bin(obj.ns[ns].type || 3);
							ns_type.push(self.dec_to_bin(obj.ns[ns].type || 3));
						}
						
						self.ips_types = {};
						for(var ns in self.ns_names_types) {
							if($chk(self.ns_names_ips[ns])) {
								self.ns_names_ips[ns].each(function(ip, i) {
									self.ips_types[ip] = $chk(self.ns_names_types[ns])?self.ns_names_types[ns]:null;
								});
							}
						}
						if(obj.ips != null) {
							for(var ips in obj.ips) {
								if(!(obj.ips[ips].inner)){
									self.reg_ips++;
								}else if(obj.ips[ips].inner){
									self.unreg_ips++;
									continue;
								}
							}
						}
						
						var NS_array = self.NS_array;
						var mass_actives = [];
						self.mass_actives = [];
						self.ns_registr1 = [];
						var mass_actives_registr = [];
						var mass_actives_registr_but = [];
						var mass_actives_exists = [];
						var ns_errors_mass = [];
						var ns_errors_assoc = [];
						var ns_exist_assoc = [];
						var ns_active_assoc = [];
						var ns_registr_assoc = [];
						var mass_actives_err = [];
						var mass_actives_reg_err = [];
						var col=0, ac=0, ex=0, reg=0;
						for(var i=0; i<NS_array.length; i++) {
							var errors = new Image(); 
							errors.src = self.options.helpers.images.alpha_img;
							errors.width = '35';
							errors.height = '31';
							var ns_ip_str = $defined(ns_ip[i])?(ns_ip[i].join(' ')):'';
							var node = new Element('div', {'class':'node'}).set('html', 
									'<div class="node_bg">'+
									'</div>'+
									'<div class="node_r">'+
									'</div>'+
									'<div class="inner">'+
										'<span>'+ns_name[i]+'</span>'+
									'</div>'+
									'<div class="node_b">'+
									'</div>'+
									'<div class="node_b_r">'+
									'</div>'
							).inject($('schema_inner'));
							node.setStyle('visibility', 'hidden');
							node.setProperty('level', '0');
							(ns_error[i])?node.addClass('error'):'';
							(ns_error[i])?ns_errors_mass.push(node):'';
							if(ns_type[i].charAt(2)==1 && ns_type[i].charAt(1)==0 && ns_type[i].charAt(0)==0) {
								ex++;
								col++;
								node.addClass('exist');
								node.setProperty('rel', 'exist');
								node.setProperty('ip', ns_ip_str);
								($defined(NS_array[i].impiric_ips))?node.addClass('has_impiric'):'';
								(!node.hasClass('error'))?mass_actives_exists.push(node):mass_actives_exists.push(null);
								node.setProperty('col', ex + ac);
								self.set_node_pos(node, level, self.reg_ips);
							}else
							if(ns_type[i].charAt(1)==1 && ns_type[i].charAt(2)==0 && ns_type[i].charAt(0)==0) {
								reg++;
								self.ns_ips_reg = $defined(ns_ip[i])?ns_ip[i].length:0;
								node.addClass('registr');
								node.addClass('active');
								node.setProperty('rel', 'active');
								($defined(NS_array[i].impiric_ips))?node.addClass('has_impiric'):'';
								node.setProperty('col', reg);
								node.setProperty('ip', ns_ip_str);
								(!node.hasClass('error'))?mass_actives_registr.push(node):mass_actives_registr.push(null);
								self.set_node_pos(node, level);
							}else
							if(ns_type[i].charAt(2)==1 && ns_type[i].charAt(1)==1 && ns_type[i].charAt(0)==0) {
								ac++;
								col++;
								node.addClass('active');
								node.setProperty('rel', 'active');
								($defined(NS_array[i].impiric_ips))?node.addClass('has_impiric'):'';
								node.setProperty('ip', ns_ip_str);
								node.setProperty('col', ac);
								(!node.hasClass('error'))?mass_actives.push(node):mass_actives.push(null);
								self.set_node_pos(node, level, self.reg_ips);
							}else 
								if(ns_type[i].charAt(2)==0 && ns_type[i].charAt(1)==0 && ns_type[i].charAt(0)==1){
								reg++;
								node.inject($('schema_inner'));
								node.addClass('active');
								node.addClass('registr');
								node.addClass('not_from_first');
								node.setProperty('rel', 'active');
								($defined(NS_array[i].impiric_ips))?node.addClass('has_impiric'):'';
								node.setProperty('ip', ns_ip_str);
								node.setProperty('col', reg);
								node.setProperty('level', '0');
								(!node.hasClass('error'))?mass_actives_registr_but.push(node):mass_actives_registr_but.push(null);
								self.set_node_pos(node, level);
							}
							if(node.hasClass('error')) {
								ns_error_nodes.push(node);
							}
						}
						$A(ns_error_nodes).map(function(error) {return error.removeClass('not_from_first')});
						self.mass_actives_registr_but = self.nodes_association_reg(mass_actives_registr_but);
						ns_active_assoc = self.nodes_association_reg(mass_actives);
						ns_registr_assoc = self.nodes_association_reg(mass_actives_registr);
						ns_exist_assoc = self.nodes_association_reg(mass_actives_exists);
						ns_errors_assoc = self.nodes_association_reg(ns_error_nodes);
						mass_actives_err = ns_errors_assoc.filter(function(node, i) {return (node.hasClass('active') && !node.hasClass('registr'))});
						self.nodes_register_level1 = ns_registr_assoc;
						self.nodes_not_register_level1 = ns_active_assoc.concat(ns_exist_assoc);
						self.reg_only = $$('.node').filter(function(node, i){
							return (node.hasClass('registr'))?node:undefined;
						});
						self.exist_only = $$('.node').filter(function(node, i) {
							if(node.hasClass('exist')) return node;
						});
						self.ns_reg = self.reg_only.clean().length;
						self.our_ns = $$('.node').filter(function(node, i) {
							return (!node.hasClass('registr') && !node.hasClass('first_node'))?node:undefined;
						});
						self.our_ns = self.our_ns.clean();
						if((self.ns_reg + self.our_ns.length) > (self.reg_ips + self.unreg_ips)) {
							if(self.our_ns.length == 0 && self.unreg_ips!=0) {
								var canvas_width = (self.ns_reg + self.unreg_ips)*162 + 162;
							}else{
								canvas_width = (self.ns_reg + self.our_ns.length)*162 + 202;
							}
						}else{
							var param = ((self.ns_reg != 0 && self.reg_ips ==0) || (self.our_ns.length !=0 && self.unreg_ips == 0))?202:0;
							var canvas_width = (self.reg_ips + self.unreg_ips)*162 + 162 + param;
						}
						if(self.get_max_left(self.our_ns.concat(self.reg_only.clean())) > canvas_width) {
							canvas_width = self.get_max_left(self.our_ns.concat(self.reg_only.clean())) + 162;
						}
						self.reg_only = self.reg_only.clean();
						self.mass_actives = ns_active_assoc.filter(function(node, i) {
							return (!node.hasClass('registr'))?node:undefined
						});
						self.mass_actives = self.mass_actives.clean();
						if(self.reg_only.length!=0) {
							self.set_node_pos_level1(self.reg_only, self.mass_actives, self.exist_only);
						}
						self.massive_nodes1 = ns_active_assoc.concat(ns_registr_assoc, ns_errors_assoc, ns_exist_assoc, mass_actives_registr_but, ns_errors_mass);
						if(self.mass_actives.concat(mass_actives_err).length > 0 || self.exist_only.length > 0) {
								var depend = (self.reg_only.length && !self.mass_actives.length)?true:false;
								self.set_node_exist_after_ac(ns_exist_assoc, $A(self.mass_actives.concat(mass_actives_err)).getLast() || $A(self.reg_only).getLast(), depend);
						}
						self.canvas.setProperty('width', canvas_width);
						self.set_levels_size(((self.reg_ips >= self.ns_reg)?self.reg_ips:self.ns_reg)*(162), ((self.our_ns.length.toInt() >= self.unreg_ips)?self.our_ns.length:self.unreg_ips)*162);
						$('schema').setStyle('width', self.canvas.getProperty('width').toInt());
						$('level_DNS').setStyle('display', 'block');
						self.first_node_animate($$('.node'));
						(function() {
							self.connect_firstnode();
							self.whois_info(obj);
							$$('.node').filter(function(node, i) {return !(node.hasClass('first_node'))}).each(function(node, i) {
								node.setStyle('visibility', 'visible');
								self.inner_block(node);
								var coord = {
									x1: parseInt(node.getStyle('left')) + (node.getSize().x)/2,
									x2: parseInt(node.getStyle('left')) + (node.getSize().x)/2,
									y1: parseInt(node.getStyle('top')),
									y2: parseInt(node.getStyle('top')) + node.getSize().y,
									node_type: node.getProperty('rel'),
									node_level: node.getProperty('level'),
									node_col: node.getProperty('col'),
									node_ns: node.getProperty('ns'),
									node_ip: node.getProperty('ip'),
									is_error: node.hasClass('error'),
									has_impiric: node.hasClass('has_impiric')
								};
								self.massive_nodes1_coord[i] = coord;
							});
							$$('.node').each(function(node, i) {
								var error = new Image(); 
								error.src = self.options.helpers.images.alpha_img;
								error.width = '35';
								error.height = '31';
								if(node.hasClass('error') && !node.hasClass('not_from_first')) {
									$(error).addClass('error_img');
									error.setProperty('ip', ns_ip[i]);
									error.setProperty('col', node.getProperty('col'));
									error.setProperty('level', level);
									error.inject($('schema_inner'));
								}
							});
							self.snoska_set_pos(level);
							if(!$chk(obj.message) && obj.delegated) {
								if($defined(obj.paid) && !obj.paid) {
									$(non_paid).addClass('non_paid');
									non_paid.inject($('schema').getElement('.first_node'));
								}
								self.drawLevel_2(1, 1);
							}else if(!$chk(obj.message) && !obj.delegeted) {
								if($defined(obj.paid) && !obj.paid) {
									$(non_paid).addClass('non_paid');
									non_paid.inject($('schema').getElement('.first_node'));
								}
								self.drawLevel_2(1, 1);
								$(errors).addClass('error_img');
								errors.setProperty('level', 'first');
								errors.inject($('schema_inner'));
							}else{
								self.set_error_position($$('.error_img'), $$('.node'), true);
								$$('.error_img').setStyle('visibility', 'visible');
								self.initErrors($$('.node'));
								self.dlg_handler(self.message_level1, obj);
							}
						}).delay(1000);
					}else if((!obj.delegeted && $chk(obj.registred)) || (obj.ips == null) && $chk(obj.registred)) {
						self.destroy_preloader();
						self.dlg_handler(self.message_level1, obj);
						self.whois_info(obj);
						$(errors).addClass('error_img');
						errors.setProperty('level', '0');
						errors.inject($('schema_inner'));
						self.set_error_position($('schema').getElements('.error_img'), $$('.node'), false);
						self.drawError(self.get_coordinates($$('.node')), $$('.error_img'));
						if($defined(obj.paid) && !obj.paid) {
							$(non_paid).addClass('non_paid');
							non_paid.inject($('schema').getElement('.first_node'));
						}
						$('schema').getElements('img').setStyle('visibility', 'visible');
					}else if((obj.ns == null || obj.error) || (obj.registred == null || !obj.registred)) {
						self.whois_info(obj);
						$('schema').getElement('.first_node').addClass('error');
						self.destroy_preloader();
						self.dlg_handler(self.message_level1, obj);
					}
					self.fireEvent('level0Complete', obj);
				}else if(!$defined(obj) || !$chk(obj)) {
					self.esc_from_service(self.options.errors.server_fail);
				}
			}
		}).get({'domain':this.check_domain, 'step':step, 'sid':this.sid});
	},
	
	show_vote:function(obj) {
		var info = new Element('div').set('html', 
				'<table cellpadding="0" cellspacing="0" border="0">'+
					'<tbody>'+
						'<tr>'+
							'<td class="info_img_container"><img src="'+this.options.helpers.images.alpha_img+'" class="vote_img" alt="" /></td>'+
							'<td class="info_txt_container">'+
								'<form id="form_vote" action="#" method="get">'+
									'Помог ли Техосмотр? '+
									'<select id="vote_res" class="txt"><option value="1">Да</option><option value="0">Нет</option></select> '+
									'<input id="vote_sender" class="send" type="submit" value="" />'+
								'</form>'+
							'</td>'+
						'</tr>'+
					'</tbody>'+
				'</table>'
			).addClass('vote_wrap')
			.inject($('schema_wrap').getElement('.info_wrap'));;
		$('form_vote').addEvent('submit', function(e) {
			var text = info.getElement('.info_txt_container');
			new Request.JSON({url:this.options.vote_url,
				onComplete:function(obj) {
					if($defined(obj) && $chk(obj)) {
						text.set('html', obj.error ? this.options.comment_fail : obj.message);
					} else {
						text.set('html', this.options.comment_fail);
					}
				}}).get({'inspection_id':obj.task_id, result:$('vote_res').get('value')});
			text.set('html', 'Голос отправляется...');
			return false;
		}.bind(this));
	},
	
	show_comment:function(obj) {
		var info = new Element('div').set('html', 
				'<table cellpadding="0" cellspacing="0" border="0">'+
					'<tbody>'+
						'<tr>'+
							'<td class="info_img_container"><img src="'+this.options.helpers.images.alpha_img+'" class="comment_img" alt="" /></td>'+
							'<td class="info_txt_container"><a class="active" href="#">Оставить комментарий</a></td>'+
						'</tr>'+
					'</tbody>'+
				'</table>'
			).addClass('comment_wrap');
		
		$(info).inject($('schema_wrap').getElement('.info_wrap'));
		var wrapper = $('comment_wrapper')
			.set('styles', {'top': $defined($('whois_wrapper').getElement('.container_whois'))?'46px':'20px'});

		var container_comment = new Element('div').set('html',
			'<div><form id="comment_form" action="#" method="get">'+
				'<table>'+
					'<tr><td align="center"><textarea id="comment" cols="45" rows="6"></textarea></td></tr>'+
					'<tr><td align="center"><input id="comment_sender" class="send unsend" type="submit" disabled value="" /></td></tr>'+
				'</table>'+
			'<form></div>'
			).addClass('container_comment')
			.inject(wrapper);
		
		container_comment.getElement('textarea').addEvent('keyup', function (e) {
			var send = container_comment.getElement('input[type=submit]');
			if(this.value) {
				send.disabled = false;
				send.removeClass('unsend');
			}
			else {
				send.disabled = true;
				send.addClass('unsend');
			}
		});

		var whois_height = $(container_comment).getSize().y,
				text_toggle = function(el, default_txt, toggle_txt) {
					el.get('text') == default_txt ? el.set('text', toggle_txt) : el.set('text', default_txt)
				},
				default_txt = info.getElement('a').get('text');
		var fx = new Fx.Slide($(container_comment), {
			duration:700,
			wait:true,
			wrapper:'comment_wrapper',
			onComplete: function() {
				if ($defined(info.getElement('a'))) {
					info.getElement('a').toggleClass('clicked');
					text_toggle(info.getElement('a'), default_txt, 'Скрыть форму комментариев');
				}
			}
		});
		fx.hide();
		var event;
		info.addEvent('click', event = function(e) {
			new Event(e).stop();
			fx.toggle();
		});
		
		$('comment_form').addEvent('submit', function(e) {
			fx.toggle();
			var text = info.getElement('.info_txt_container');
			text.set('html', 'Комментарий отправляется...');
			info.removeEvent('click', event);
			new Request.JSON({url:this.options.comment_url,
				onComplete:function(obj) {
					if($defined(obj) && $chk(obj)) {
						text.set('html', obj.error ? this.options.comment_fail : obj.message);
					} else {
						text.set('html', this.options.comment_fail);
					}
				}}).get({'inspection_id':obj.task_id, comment:$('comment').get('value')});
			return false;
		}.bind(this));
	},

	whois_info:function(obj) {
		if($H(obj).has('whois') && $chk(obj.whois)) {
			var info = new Element('div').set('html', 
				'<table cellpadding="0" cellspacing="0" border="0">'+
					'<tbody>'+
						'<tr>'+
							'<td class="info_img_container"><img src="'+this.options.helpers.images.alpha_img+'" class="info_img" alt="" /></td>'+
							'<td class="info_txt_container"><a class="active" href="#">Показать информацию по домену</a></td>'+
						'</tr>'+
					'</tbody>'+
				'</table>'
			);
			var whois_text = obj.whois.replace(/\n/g, '<br />');
			$(info).inject($('schema_wrap').getElement('.info_wrap'), 'top');
			var wrapper = $('whois_wrapper');
			var container_whois = new Element('div').set('html', '<div><pre></pre></div>').addClass('container_whois').inject(wrapper);
			$(container_whois).getElement('pre').set('html', whois_text);
			var whois_height = $(container_whois).getSize().y,
				text_toggle = function(el, default_txt, toggle_txt) {
					el.get('text') == default_txt ? el.set('text', toggle_txt) : el.set('text', default_txt)
				},
				default_txt = info.getElement('a').get('text');
			var fx = new Fx.Slide($(container_whois), {
				duration:700,
				wait:true,
				wrapper:'whois_wrapper',
				onComplete: function() {
					info.getElement('a').toggleClass('clicked');
					text_toggle(info.getElement('a'), default_txt, 'Скрыть информацию по домену');
				}
			});
			fx.hide();
			info.addEvent('click', function(e) {
				new Event(e).stop();
				fx.toggle();
			});
		}
	},

	esc_from_service:function(message) {
		$('schema_inner').empty();
		this.ctx.clearRect(0, 0, 10000, 1000);
		$chk(this.snoska)?this.snoska.setStyle('top', 0):'';
		this.dlg_handler(message);
	},

	drawLevel_2:function(step, level) {
		var self = this;
		this.massive_nodes2 = [];
		this.massive_nodes2_actives = [];
		this.massive_nodes2_exists = [];
		this.massive_nodes2_exists_r = [];
		this.massive_nodes2_coord = [];
		this.nodes_register = [];
		this.nodes_not_register = [];
		var nodes_notfirst_reg = $$('.node').filter(function(node, i) {
			return (!node.hasClass('first_node') && node.hasClass('registr'))?node:undefined;
		});
		nodes_notfirst_reg = nodes_notfirst_reg.clean();
		var pos_left = this.get_max_left(nodes_notfirst_reg);
		var json_obj = new Request.JSON({url:this.url,

			onRequest:function() {
				self.add_preloader(level);
				self.clone_levels.each(function(elem, i) {
					if(i==level)elem.setStyle('display', 'block');
				});
			},
			onComplete:function(obj) {
				if($defined(obj) && $chk(obj)) {
					self.message_level2 = obj.message;
					if(!obj.error) {
						self.destroy_preloader();
						var IP_array_1 = [];
						var ips_1 = [];
						var ns_ip = [];
						for(var ip in self.sort_hash_ips(obj.ips)) {
							IP_array_1.push(obj.ips[ip]);
							ips_1.push(ip);
						}
						var col=0, ac=0, ex=0, reg=0;
						for(var i=0; i<IP_array_1.length; i++) {
							var error = new Image();
							error.src = self.options.helpers.images.alpha_img;
							error.width = '35';
							error.height = '31';
							var node = new Element('div').set('html', 
								'<div class="node_bg">'+
								'</div>'+
								'<div class="node_r">'+
								'</div>'+
								'<div class="inner">'+
									'<span>'+IP_array_1[i].name+'</span>'+'<span class="ip">('+ips_1[i]+')</span>'+
								'</div>'+
								'<div class="node_b">'+
								'</div>'+
								'<div class="node_b_r">'+
								'</div>'
							);
							node.addClass('node');
							var ns_name = [];
							var ns_name_all = [];
							var ns_name_str = '';
							for(var name in self.ns_names_ips) {
								ns_name_all.push(name);
								if(self.ns_names_ips[name].contains(ips_1[i])) {
									ns_name.push(name);
								}
							}
							for(var j=0; j<ns_name.length; j++) {
								if(self.ns_names_types[ns_name[j]].charAt(0) == 1 || self.ns_names_types[ns_name[j]].charAt(1) == 1) {
									node.setProperty('ns_primary', ns_name[j]);
								}
							}
							ns_name_str = ns_name.join(' ');
							node.setProperty('ns', ns_name_str);
							var flag=false;
							if(self.ns_names_types.hasOwnProperty(node.getProperty('ns_primary')) && (self.ns_names_types[node.getProperty('ns_primary')].charAt(0) == 1 || self.ns_names_types[node.getProperty('ns_primary')].charAt(1) == 1)) {
								flag=true;
							}
							node.inject($('schema_inner'));
							node.setProperty('col', i);
							node.setProperty('level', '1');
							if(!IP_array_1[i].inner && flag) {
								reg++;
								col++;
								node.addClass('registr');
								node.setProperty('ip', ips_1[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'active');
								(!IP_array_1[i].real)?node.addClass('impiric'):'';
								self.set_node_pos(node, level);
								self.nodes_register.push(node);
								self.massive_nodes2.push(node);
								self.massive_nodes2_actives.push(node);
							}else
							if(!IP_array_1[i].inner && !flag) {
								reg++;
								col++;
								node.addClass('registr');
								node.addClass('exist');
								node.removeClass('active');
								node.setProperty('ip', ips_1[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'exist');
								(!IP_array_1[i].real)?node.addClass('impiric'):'';
								self.set_node_pos(node, level);
								self.nodes_register.push(node);
								self.massive_nodes2.push(node);
								self.massive_nodes2_exists_r.push(node);
							}else
							if(!flag && IP_array_1[i].inner) {
								ex++;
								col++;
								node.addClass('exist');
								node.setProperty('rel', 'exist');
								node.setProperty('col', ex+ac);
								node.setProperty('ip', ips_1[i]);
								(!IP_array_1[i].real)?node.addClass('impiric'):'';
								self.set_node_pos(node, level, pos_left);
								self.nodes_not_register.push(node);
								self.massive_nodes2.push(node);
								self.massive_nodes2_exists.push(node);
							}else
							if(flag && IP_array_1[i].inner) {
								ac++;
								col++;
								node.setProperty('rel', 'active');
								node.addClass('active');
								node.setProperty('ip', ips_1[i]);
								node.setProperty('col', ac + ex);
								(!IP_array_1[i].real)?node.addClass('impiric'):'';
								self.set_node_pos(node, level, pos_left);
								self.nodes_not_register.push(node);
								self.massive_nodes2.push(node);
								self.massive_nodes2_actives.push(node);
							}
							if(!IP_array_1[i].ping) {
								node.addClass('error');
								if(!node.hasClass('impiric')) {
									$(error).addClass('error_img');
									error.setProperty('ip', ips_1[i]);
									error.setProperty('col', node.getProperty('col'));
									error.setProperty('level', level);
									error.inject($('schema_inner'));
								}
							}
						}
						self.massive_nodes2.each(function(node, i) {
							self.inner_block(node);
							var coord = {
								x1: parseInt(node.getStyle('left')) + (node.getSize().x)/2,
								x2: parseInt(node.getStyle('left')) + (node.getSize().x)/2,
								y1: parseInt(node.getStyle('top')),
								y2: parseInt(node.getStyle('top')) + node.getSize().y,
								node_type: node.getProperty('rel'),
								node_level: node.getProperty('level'),
								node_col: node.getProperty('col'),
								node_ns: node.getProperty('ns'),
								node_ip: node.getProperty('ip'),
								is_error: node.hasClass('error'),
								is_impiric: node.hasClass('impiric')
							};
							self.massive_nodes2_coord[i] = coord;
						});
						$('level_serverhost').setStyle('display', 'block');
						self.snoska_set_pos(level);
						self.connectNodes_level0(self.massive_nodes1_coord, self.massive_nodes2_coord);
						if(!$defined(obj.message)) {
							self.drawLevel_3(2, 2);
						}else{
							self.set_error_position($$('.error_img'), $$('.node'), true);
							$$('.error_img').setStyle('visibility', 'visible');
							self.initErrors($$('.node'));
							self.dlg_handler(obj.message, obj);
						}
					}else if(obj.error) {
						$('schema_inner').empty();
						self.destroy_preloader();
						self.dlg_handler(self.message_level2, obj);
					}
				}else if(!$defined(obj) || !$chk(obj)) {
					self.esc_from_service(self.options.errors.server_fail);
				}
			}
		}).get({'domain':this.check_domain, 'step':step, 'sid':this.sid});
	},

	drawLevel_3:function(step, level) {
		var self = this;
		this.massive_nodes3_actives = [];
		this.massive_nodes3_exists = [];
		this.massive_nodes3_exists_r = [];
		var nodes_notfirst_reg = $$('.node').filter(function(node, i) {
			return (!node.hasClass('first_node') && node.hasClass('registr'))?node:undefined;
		});
		nodes_notfirst_reg = nodes_notfirst_reg.clean();
		var pos_left = this.get_max_left(nodes_notfirst_reg);
		var json_obj = new Request.JSON({url:this.url,

			onRequest:function() {
				self.add_preloader(level);
				self.clone_levels.each(function(elem, i) {
					if(i==level)elem.setStyle('display', 'block');
				});
			},
			onComplete:function(obj) {
				if($defined(obj) && $chk(obj)) {
					self.message_level3 = obj.message;
					if(!obj.error) {
						self.destroy_preloader();
						var IP_array_2 = [];
						var ips_2 = [];
						var ns_ip = [];
						for(var ip in self.sort_hash_ips(obj.ips)) {
							IP_array_2.push(obj.ips[ip]);
							ips_2.push(ip);
						}
						var col=0, ac=0, ex=0, reg=0;
						for(var i=0; i<IP_array_2.length; i++) {
							var error = new Image();
							error.src = self.options.helpers.images.alpha_img;
							error.width = '35';
							error.height = '31';
							var node = new Element('div').set('html', 
								'<div class="node_bg">'+
								'</div>'+
								'<div class="node_r">'+
								'</div>'+
								'<div class="inner">'+
									'<span>'+IP_array_2[i].name+'</span>'+
								'</div>'+
								'<div class="node_b">'+
								'</div>'+
								'<div class="node_b_r">'+
								'</div>'
							);
							node.addClass('node');
							var ns_name = [];
							var ns_name_all = [];
							var ns_name_str = '';
							for(var name in self.ns_names_ips) {
								ns_name_all.push(name);
								if(self.ns_names_ips[name].contains(ips_2[i])) {
									ns_name.push(name);
								}
							}
							for(var j=0; j<ns_name.length; j++) {
								if(self.ns_names_types[ns_name[j]].charAt(0) == 1 || self.ns_names_types[ns_name[j]].charAt(1) == 1) {
									node.setProperty('ns_primary', ns_name[j]);
								}
							}
							ns_name_str = ns_name.join(' ');
							node.setProperty('ns', ns_name_str);
							var flag=false;
							if(self.ns_names_types.hasOwnProperty(node.getProperty('ns_primary')) && (self.ns_names_types[node.getProperty('ns_primary')].charAt(0) == 1 || self.ns_names_types[node.getProperty('ns_primary')].charAt(1) == 1)) {
								flag=true;
							}
							if(!IP_array_2[i].inner && flag) {
								reg++;
								col++;
								node.inject($('schema_inner'));
								node.addClass('registr');
								node.setProperty('ip', ips_2[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'active');
								node.setProperty('level', '2');
								(self.massive_nodes2_actives.filter(function(node){return node.getProperty('ip') == ips_2[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								self.set_node_pos(node, level);
								self.inner_block(node);
								self.massive_nodes3_actives.push(node);
							}else
							if(!IP_array_2[i].inner && !flag) {
								reg++;
								col++;
								node.inject($('schema_inner'));
								node.addClass('registr');
								node.addClass('exist');
								node.removeClass('active');
								node.setProperty('ip', ips_2[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'exist');
								node.setProperty('level', '2');
								(self.massive_nodes2_exists_r.filter(function(node){return node.getProperty('ip') == ips_2[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								self.set_node_pos(node, level);
								self.inner_block(node);
								self.massive_nodes3_exists_r.push(node);
							}else
							if(!flag && IP_array_2[i].inner) {
								ex++;
								col++;
								node.inject($('schema_inner'));
								node.addClass('exist');
								node.setProperty('rel', 'exist');
								node.setProperty('col', ex+ac);
								node.setProperty('ip', ips_2[i]);
								(self.massive_nodes2_exists.filter(function(node){return node.getProperty('ip') == ips_2[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								node.setProperty('level', '2');
								self.set_node_pos(node, level, pos_left);
								self.inner_block(node);
								self.massive_nodes3_exists.push(node);
							}
							if(flag && IP_array_2[i].inner) {
								ac++;
								col++;
								node.inject($('schema_inner'));
								node.setProperty('col', ac + ex);
								node.setProperty('rel', 'active');
								node.addClass('active');
								node.setProperty('ip', ips_2[i]);
								node.setProperty('level', '2');
								(self.massive_nodes2_actives.filter(function(node){return node.getProperty('ip') == ips_2[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								self.set_node_pos(node, level, pos_left);
								self.inner_block(node);
								self.massive_nodes3_actives.push(node);
							}
							if(!IP_array_2[i].server_available) {
								node.addClass('error');
								$(error).inject($('schema_inner'));
								error.addClass('error_img');
								error.setProperty('level', '2');
								error.setProperty('ip', ips_2[i]);
								error.setProperty('col', node.getProperty('col'));
							}
						}
						var mass3_actives_all = self.massive_nodes2_actives.concat(self.massive_nodes3_actives);
						var mass3_exists_all = self.massive_nodes2_exists.concat(self.massive_nodes3_exists);
						var mass3_actives = self.array_of_array(mass3_actives_all);
						var mass3_exists = self.array_of_array(mass3_exists_all);
						var mass3_exists_r_all = self.massive_nodes2_exists_r.concat(self.massive_nodes3_exists_r);
						var mass3_exists_r = self.array_of_array(mass3_exists_r_all);
						$('level_webserver').setStyle('display', 'block');
						self.snoska_set_pos(level);
						for(var i=0; i<mass3_actives.length; i++) {
							self.connectNodes(self.get_coordinates(mass3_actives[i]));
						}
						for(var i=0; i<mass3_exists.length; i++) {
							self.connectNodes(self.get_coordinates(mass3_exists[i]));
						}
						for(var i=0; i<mass3_exists_r.length; i++) {
							self.connectNodes(self.get_coordinates(mass3_exists_r[i]));
						}
						if(!$defined(obj.message)) {
							self.drawLevel_4(3, 3);
						}else{
							self.set_error_position($$('.error_img'), $$('.node'), true);
							$$('.error_img').setStyle('visibility', 'visible');
							self.initErrors($$('.node'));
							self.dlg_handler(self.message_level3, obj);
						}
					}else if(obj.error) {
						$('schema_inner').empty();
						self.destroy_preloader();
						self.dlg_handler(self.message_level3, obj);
					}
				}else if(!$defined(obj) || !$chk(obj)) {
					self.esc_from_service(self.options.errors.server_fail);
				}
			}
		}).get({'domain':this.check_domain, 'step':step, 'sid':this.sid});
	},

	drawLevel_4:function(step, level) {
		var self = this;
		this.massive_nodes4_actives = [];
		this.massive_nodes4_exists = [];
		this.massive_nodes4_exists_r = [];
		this.massive_nodes4_actives_coord = [];
		this.massive_nodes4_exists_coord = [];
		this.massive_nodes4_exists_r_coord = [];
		var nodes_notfirst_reg = $$('.node').filter(function(node, i) {
			return (!node.hasClass('first_node') && node.hasClass('registr'))?node:undefined;
		});
		nodes_notfirst_reg = nodes_notfirst_reg.clean();
		var pos_left = this.get_max_left(nodes_notfirst_reg);
		var json_obj = new Request.JSON({url:this.url,

			onRequest:function() {
				self.add_preloader(level);
				self.clone_levels.each(function(elem, i) {
					if(i==level)elem.setStyle('display', 'block');
				});
			},
			onComplete:function(obj) {
				if($defined(obj) && $chk(obj)) {
					self.message_complete = obj.message;
					if(!obj.error) {
						self.destroy_preloader();
						var IP_array_3 = [];
						var ips_3 = [];
						var ns_ip = [];
						for(var ip in self.sort_hash_ips(obj.ips)) {
							IP_array_3.push(obj.ips[ip]);
							ips_3.push(ip);
						}
						var col=0, ac=0, ex=0, reg=0;
						for(var i=0; i<IP_array_3.length; i++) {
							var error = new Image();
							var	non_paid = new Image();
							error.src = self.options.helpers.images.alpha_img;
							error.width = '35';
							error.height = '31';
							non_paid.src = self.options.helpers.images.alpha_img;
							non_paid.width = '32';
							non_paid.height = '32';
							var node = new Element('div').set('html', 
								'<div class="node_bg">'+
								'</div>'+
								'<div class="node_r">'+
								'</div>'+
								'<div class="inner">'+
								'</div>'+
								'<div class="node_b">'+
								'</div>'+
								'<div class="node_b_r">'+
								'</div>'
							);
							node.addClass('node');
							var ns_name = [];
							var ns_name_all = [];
							var ns_name_str = '';
							for(var name in self.ns_names_ips) {
								ns_name_all.push(name);
								if(self.ns_names_ips[name].contains(ips_3[i])) {
									ns_name.push(name);
								}
							}
							for(var j=0; j<ns_name.length; j++) {
								if(self.ns_names_types[ns_name[j]].charAt(0) == 1 || self.ns_names_types[ns_name[j]].charAt(1) == 1) {
									node.setProperty('ns_primary', ns_name[j]);
								}
							}
							ns_name_str = ns_name.join(' ');
							node.setProperty('ns', ns_name_str);
							var flag=false;
							if(self.ns_names_types.hasOwnProperty(node.getProperty('ns_primary')) && (self.ns_names_types[node.getProperty('ns_primary')].charAt(0) == 1 || self.ns_names_types[node.getProperty('ns_primary')].charAt(1) == 1)) {
								flag=true;
							}
							if(!IP_array_3[i].inner && flag) {
								reg++;
								col++;
								node.inject($('schema_inner'));
								node.addClass('registr');
								node.setProperty('ip', ips_3[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'active');
								node.setProperty('level', '3');
								(self.massive_nodes3_actives.filter(function(node){return node.getProperty('ip') == ips_3[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								self.set_node_pos(node, level);
								self.massive_nodes4_actives.push(node);
							}else
							if(!IP_array_3[i].inner && !flag) {
								reg++;
								col++;
								node.inject($('schema_inner'));
								node.addClass('registr');
								node.addClass('exist');
								node.removeClass('active');
								node.setProperty('ip', ips_3[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'exist');
								node.setProperty('level', '3');
								(self.massive_nodes3_exists_r.filter(function(node){return node.getProperty('ip') == ips_3[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								self.set_node_pos(node, level);
								self.massive_nodes4_exists_r.push(node);
							}else
							if(!flag && IP_array_3[i].inner) {
								ex++;
								col++;
								node.inject($('schema_inner'));
								node.addClass('exist');
								node.setProperty('rel', 'exist');
								node.setProperty('col', ex+ac);
								node.setProperty('ip', ips_3[i]);
								node.setProperty('level', '3');
								(self.massive_nodes3_exists.filter(function(node){return node.getProperty('ip') == ips_3[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								self.set_node_pos(node, level, pos_left);
								self.massive_nodes4_exists.push(node);
							}else
							if(flag && IP_array_3[i].inner) {
								ac++;
								col++;
								node.inject($('schema_inner'));
								node.setProperty('col', ac + ex);
								node.setProperty('rel', 'active');
								node.addClass('active');
								node.setProperty('ip', ips_3[i]);
								node.setProperty('level', '3');
								(self.massive_nodes3_actives.filter(function(node){return node.getProperty('ip') == ips_3[i].toString()})[0].hasClass('impiric'))?node.addClass('impiric'):'';
								self.set_node_pos(node, level, pos_left);
								self.massive_nodes4_actives.push(node);
							}
							if(!IP_array_3[i].site_available) {
								node.addClass('error');
								$(error).inject($('schema_inner'));
								error.addClass('error_img');
								error.setProperty('level', '3');
								error.setProperty('ip', ips_3[i]);
								error.setProperty('col', node.getProperty('col'));
							}
							if($defined(IP_array_3[i].paid) && !IP_array_3[i].paid) {
								$(non_paid).addClass('non_paid');
								non_paid.inject(node);
							}
						}
						var mass4_actives_all = self.massive_nodes3_actives.concat(self.massive_nodes4_actives);
						var mass4_exists_all = self.massive_nodes3_exists.concat(self.massive_nodes4_exists);
						var mass4_exists_r_all = self.massive_nodes3_exists_r.concat(self.massive_nodes4_exists_r);
						var mass4_actives = self.array_of_array(mass4_actives_all);
						var mass4_exists = self.array_of_array(mass4_exists_all);
						var mass4_exists_r = self.array_of_array(mass4_exists_r_all);
						$('level_content').setStyle('display', 'block');
						self.snoska_set_pos(level);
						for(var i=0; i<mass4_actives.length; i++) {
							self.connectNodes(self.get_coordinates(mass4_actives[i]));
						}
						for(var i=0; i<mass4_exists.length; i++) {
							self.connectNodes(self.get_coordinates(mass4_exists[i]));
						}
						for(var i=0; i<mass4_exists_r.length; i++) {
							self.connectNodes(self.get_coordinates(mass4_exists_r[i]));
						}
						self.afterResponse(obj);
					}else if(obj.error) {
						$('schema_inner').empty();
						self.dlg_handler(self.message_complete, obj);
					}
				}else if(!$defined(obj) || !$chk(obj)) {
					self.esc_from_service(self.options.errors.server_fail);
				}
			}
		}).get({'domain':this.check_domain, 'step':step, 'sid':this.sid});
	},

	screenshotHandler: function(e, gal, prev) {
		(e)?new Event(e).stop():'';
		var self = this;
		var ip = prev.getParent().getProperty('ip');
		if(!prev.retrieve('img_load')) {
			gal.showModal();
			gal.closeHandlers();
			if(gal.modal.retrieve('in_connect')) return;
			var x_domain_request = function(obj) {
				if(!obj) throw new Error('Problems');
				if(typeof obj == 'string') gal.closeBound();
				prev.setProperty('rel', obj.url);
				gal.previewClickHandler(prev, obj.url);
			}
			var dom = this.check_domain;
			if(!gal.modal.retrieve('in_connect')) {
				gal.destroyer();
				var x_domain = new Request.JSON({
					url:self.options.screen_url,
					onRequest: function() {gal.modal.store('in_connect', true);},
					onCancel: gal.errorHandle.bind(gal, [prev]),
					onException: gal.errorHandle.bind(gal, [prev]),
					onFailure: gal.errorHandle.bind(gal, [prev]),
					onSuccess: function(obj) {
						gal.modal.store('opened', true)
							     .eliminate('in_connect');
						prev.store('img_load', true);
						if(!obj.error || !obj) {
							x_domain_request(obj);
						}else{
							gal.errorHandle(prev);
						}
					},
					log: true
				}).post({domain: dom, ip: ip});
			}
		}else {
			gal.previewClickHandler(prev);
		}
	},

	get_gallery: function(els, i) {
			return new MiniGallery({container:$(document.body), modal_id:'modal'+i, previews: els,
					onPreviewClick: function(e, gal, prev) {
						this.screenshotHandler(e, gal, prev);
					}.bind(this)
			}, this.check_domain);
	},

	fails_handler:function(message) {
		$('schema_inner').empty();
		this.dlg_handler(message);
	},

	get_coordinates:function(nodes) {
		var coord_mass = [];
		nodes.each(function(node, i) {
			var coord = {
				x1: parseInt(node.getStyle('left')) + (node.getSize().x)/2,
				x2: parseInt(node.getStyle('left')) + (node.getSize().x)/2,
				y1: parseInt(node.getStyle('top')),
				y2: parseInt(node.getStyle('top')) + node.getSize().y,
				node_type: node.getProperty('rel'),
				node_level: node.getProperty('level'),
				node_col: node.getProperty('col'),
				node_ns: node.getProperty('ns'),
				node_ip: node.getProperty('ip'),
				is_error: node.hasClass('error'),
				is_impiric: node.hasClass('impiric')
			};
			coord_mass[i] = coord;
		});
		return coord_mass;
	},

	get_max_left:function(nodes) {
		var array_cont = [];
		nodes.each(function(node, i) {
			var left = node.getStyle('left').toInt();
			array_cont.push(left);
		});
		var n = array_cont[0];
		for(var i=0; i<array_cont.length; i++) {
			n = Math.max(n, array_cont[i])
		}
		return n;
	},

	col_compact:function(array) {
		var reg_ips = this.reg_ips;
		for(var i=1; i<array.length; i++) {
			var col = array[i].getProperty('col').toInt();
			while((array[i].getProperty('col').toInt() - array[i-1].getProperty('col').toInt())!=1) {
				col--;
				array[i].setProperty('col', col);
			}
			var descr_size = {x:132, y:146};
			var registr_size = {x:157, y:146};
			var spacer = (array[i].getProperty('col').toInt() == 1 && !this.ns_reg==0)?60:30;
			var first_part = (array[i].getProperty('col')>0)?array[i].getProperty('col').toInt()*(descr_size.x + spacer):0;
			var second_part = (reg_ips!=0)?reg_ips*(descr_size.x + 30):0;
			var big_spacer = (array[i].getProperty('col')>1)?30:0
			var fourth_part = (this.ns_reg!=0)?this.ns_reg*(descr_size.x + 30):0;
			var must_part = (second_part >= fourth_part)?second_part:fourth_part;
			array[i].setStyle('left', first_part + must_part + big_spacer);
		}
	},

	set_node_pos_level1:function(array_reg, array, array_exist) {
		var descr_size = {x:132, y:146};
		var lefter = (this.ns_ips_reg)?this.ns_ips_reg*(descr_size.x + 30):0;
		var reg_ips = this.reg_ips;
		array.each(function(node, i) {
			var first_part = (this.reg_ips!=0)?this.reg_ips*(descr_size.x + 30):0;
			var spacer = (node.getProperty('col').toInt() == 1 && !this.ns_reg==0)?60:30;
			var second_part = (node.getProperty('col')>0)?node.getProperty('col').toInt()*(descr_size.x + spacer):0;
			var third_part = (reg_ips==0)?lefter:0, fourth_part = (this.ns_reg!=0)?this.ns_reg*(descr_size.x + 30):0;
			var must_part = (third_part > fourth_part)?(third_part + fourth_part):fourth_part;
			if(this.ns_reg >= this.reg_ips) {
				node.setStyle('left', second_part + fourth_part)
			}else{
				node.setStyle('left', second_part + first_part)
			}
		}.bind(this));
		var first_col = array_reg[0].getProperty('col').toInt();
		for(var i=1; i<array_reg.length; i++) {
			var col = array_reg[i].getProperty('col').toInt();
			while((array_reg[i].getProperty('col').toInt() - array_reg[i-1].getProperty('col').toInt())!=1) {
				col--;
				array_reg[i].setProperty('col', col);
			}
			var sp = (array_reg[i].getProperty('col')>0)?array_reg[i].getProperty('col').toInt()*(descr_size.x + 30):0;
			array_reg[i].setStyle('left', sp);
		}
		this.col_compact(array_exist);
	},

	set_node_exist_after_ac:function(exists, last_active, depend) {
		var last_active_l = ($chk(last_active))?last_active.getStyle('left').toInt():0;
		var depend_padding = depend?30:0;
		var padding_left = (this.reg_only == 0 && this.reg_ips != 0)?30:0;
		var reg_ips = (this.reg_ips > this.ns_reg)?(this.reg_ips - this.ns_reg):0;
		exists.each(function(node, i) {
			node.setStyle('left', last_active_l + padding_left + depend_padding + 162*(i+1 + reg_ips))
		}.bind(this));
	},

	set_node_pos:function(elem, level, pos_left) {
		var reg_ips = this.reg_ips;
		var descr_size = {x:132, y:146};
		var lefter = (this.ns_ips_reg!=0)?this.ns_ips_reg*(descr_size.x + 30):0;
		var registr_size = {x:157, y:146};
		var elemSize = elem.getSize();
		var spacer = ((elem.getProperty('col').toInt() == 1 && this.ns_reg!=0) || (elem.getProperty('col').toInt() == 1 && this.reg_ips!=0))?60:30;
		var big_spacer = (elem.getProperty('col').toInt()>1 && (this.ns_reg!=0 || this.reg_ips!=0))?30:0
		var first_part = (elem.getProperty('col').toInt()>0)?elem.getProperty('col').toInt()*(descr_size.x + spacer):0;
		var second_part = (reg_ips!=0)?reg_ips*(descr_size.x + 30):0;
		var unreg_space = (this.unreg_ips!=0)?this.unreg_ips*(descr_size.x + 30):0;
		var fourth_part = (this.ns_reg!=0)?this.ns_reg*(descr_size.x + 30):0;
		var must_part = (second_part >= fourth_part)?second_part:fourth_part;
		if(elem.hasClass('active') && !elem.hasClass('registr')) {
			elem.setStyles({
				'left':first_part + must_part + big_spacer,
				'top':(descr_size.y+12)*level + 112 + ((descr_size.y - elemSize.y)/2),
				'position':'absolute',
				'z-index':'100'
			});
		}else if(elem.hasClass('registr')) {
			elem.setStyles({
				'left':((elem.getProperty('col').toInt()>0)?elem.getProperty('col').toInt()*(descr_size.x + 30):0),
				'top':(descr_size.y+12)*level+ 112 + ((descr_size.y - elemSize.y)/2),
				'position':'absolute',
				'z-index':'100'
			});
		}else if(elem.hasClass('exist') && !elem.hasClass('registr')) {
			elem.setStyles({
				'left':first_part + must_part + big_spacer,
				'top':(descr_size.y+12)*level+ 112 + ((descr_size.y - elemSize.y)/2),
				'position':'absolute',
				'z-index':'100'
			});	
		}
	},

	set_error_position:function(elems, nodes, only_error_nodes) {
		elems = elems.filter(function(img, i) {
			return (img.hasClass('error_img'))
		});
		elems = elems.clean();
		$chk(only_error_nodes)?only_error_nodes:true;
		var descr_size = {x:132, y:146};
		var registr_size = {x:157, y:146};
		var errors_hash = {};
		var errors = [];
		if(only_error_nodes) {
			errors = nodes.filter(function(node, i) {
				var flag = (node.getProperty('ip') && node.getProperty('level') != '0')?(elems.some(function(elem) {return (elem.getProperty('ip') == node.getProperty('ip'))})):true;
				return (node.hasClass('error') && !node.hasClass('not_from_first') && flag);
			});
			errors = errors.clean();
		}else if(!only_error_nodes){
			errors = nodes;
		}
		elems.each(function(elem, i) {
			var elemSize = elem.getSize();
			var level = elem.getProperty('level').toInt() || 0;
			elem.setStyles({
				'left':errors[i].getStyle('left').toInt() + (errors[i].getSize().x - elemSize.x)/2,
				'top':(descr_size.y+12)*level +112 - elemSize.y,
				'position':'absolute',
				'z-index':'100'
			});
		});
	},

	add_level_blocks:function(text, level, level_id) {
		var container = new Element('div', {
			'id':level_id,
			'class':'levels',
			'styles': {
				'position':'absolute',
				'left':0,
				'top':'112px',
				'height':'146'
			}
		});

		var descr = new Element('div').set('html', 
			'<div>'+text+'</div>'	
		);

		var outside = new Element('div', {
			'class':'outside'
		});

		var inside = new Element('div', {
			'class':'inside'
		});
		descr.addClass('description');
		descr.inject(container);
		outside.inject(container);
		inside.inject(container);
		container.inject($('schema_inner'));
		var need_width = '';
		if(Browser.Engine.trident) {
			need_width = '100%'
		}else{
			need_width = 'auto'
		}
		var new_container = container.clone(false).addClass('levels_clone').setStyles({'z-index': '99', 'opacity':'0', 'visibility':'visible', 'width':need_width, 'display':'block', 'position':'absolute', 'height':'146px', 'top':'112px'});
		new_container.inject($('schema_inner'));
		var inner_clone = new_container.getPrevious().get('html');
		new_container.set('html', inner_clone);
	},

	add_preloader:function(level) {
		var container = new Element('div', {
			'id':'preloader',
			'class':'preloader',
			'styles': {
				'position':'absolute',
				'left':0,
				'display':'block',
				'height':'146px',
				'width':'100%',
				'top':112 + 156*(level)
			}
		});

		var img = new Element('div', {
			'class':'img'
		});
		img.inject(container);
		container.inject($('schema_inner'));
	},

	destroy_preloader:function() {
		$('preloader').dispose();
	},

	connect_firstnode:function() {
		var canvas = document.getElementById('field');
		var ctx = canvas.getContext('2d');
		var first_node = $('schema_inner').getElement('.first_node');
		var next_nodes = [];
		$$('.node').each(function(node, i) {
			if(node.getProperty('level')=='0' && node.getProperty('rel')=='active' && !node.hasClass('not_from_first')) {
				next_nodes.push(node);
			}
		});
		for(var i=0; i<next_nodes.length; i++) {
			if(!next_nodes[i].hasClass('error')) {
				ctx.fillStyle = "#00a83c";
				ctx.strokeStyle = "#00a83c";
				ctx.save();
				ctx.beginPath();
				ctx.moveTo((first_node.getSize().x)/2 + parseInt(first_node.getStyle('left')), first_node.getSize().y);
				ctx.lineTo((next_nodes[i].getSize().x)/2 + parseInt(next_nodes[i].getStyle('left')), parseInt(next_nodes[i].getStyle('top')));
				ctx.stroke();
				ctx.closePath();
				ctx.translate((next_nodes[i].getSize().x)/2 + parseInt(next_nodes[i].getStyle('left')), parseInt(next_nodes[i].getStyle('top')));
				ctx.beginPath();
				if((parseInt(first_node.getStyle('left'))) != (parseInt(next_nodes[i].getStyle('left')))) {
					var a, b, tangens, alpha;
					a = parseInt(next_nodes[i].getStyle('top')) - first_node.getSize().y;
					b = (parseInt(next_nodes[i].getStyle('left'))) - (parseInt(first_node.getStyle('left')));
					alpha = Math.atan2(a, b);
					ctx.rotate(alpha + 3*Math.PI/2);
				}
				ctx.moveTo(0, 0);
				ctx.lineTo(-2, -6);
				ctx.lineTo(2, -6);
				ctx.lineTo(0, 0);
				ctx.stroke();
				ctx.fill();
				ctx.closePath();
				ctx.restore();
			}
		}
		ctx.stroke();
	},
	
	array_of_array:function(array) {
		var tmp_hash = {};
		var array_new = [];
		var counter = false;
		for(var i=array.length; i--;) {
			for(var j=array.length; j--;) {
				if(array[j].getProperty('ip')==array[i].getProperty('ip') && array[j].getProperty('level')=='0' && $chk(array[i].getProperty('ip'))) {
					counter = true;
				}else{counter = false;}
			}	
			if(!counter) {
				tmp_hash[$chk(array[i].getProperty('ip'))?array[i].getProperty('ip'):0] || (tmp_hash[$chk(array[i].getProperty('ip'))?array[i].getProperty('ip'):0] = []);
				tmp_hash[$chk(array[i].getProperty('ip'))?array[i].getProperty('ip'):0].unshift(array[i]);
			}else{
				tmp_hash[i] || (tmp_hash[i] = []);
				tmp_hash[i].unshift(array[i]);
			}
		}
		for(var i in tmp_hash) {
			array_new.push(tmp_hash[i]);
		}
		return array_new;
	},

	hash_of_array:function(array) {
		var tmp_hash = {};
		for(var i=array.length; i--;) {
			tmp_hash[$chk(array[i].getProperty('ip'))?(array[i].getProperty('ip').split(/\s/).length > 1?array[i].retrieve('ip'+i+':error'):array[i].getProperty('ip')):0] || (tmp_hash[$chk(array[i].getProperty('ip'))?(array[i].getProperty('ip').split(/\s/).length > 1?array[i].retrieve('ip'+i+':error'):array[i].getProperty('ip')):0] = []);
			tmp_hash[$chk(array[i].getProperty('ip'))?(array[i].getProperty('ip').split(/\s/).length > 1?array[i].retrieve('ip'+i+':error'):array[i].getProperty('ip')):0].unshift(array[i]);
		}
		return tmp_hash;
	},
	
	initErrors:function(array) {
		var array_errors=[], array_first = [];
		var	array_img_errors=[], array_img_errors0 = [];
		var has_node_error = false;
		var self_node_error = [],
			col = 0;
		array.each(function(node, i) {
			if(node.getProperty('level') != 'first') {
				if(node.hasClass('error')) {
					self_node_error.push(node);
					has_node_error = true;
					for(var k = i; k--;) {
						if(array[k].getProperty('rel') == node.getProperty('rel') && !array[k].hasClass('not_from_first') && (($chk(array[k].getProperty('ip'))!='') && ($chk(node.getProperty('ip'))!='')) && ((node.getProperty('level').toInt() - array[k].getProperty('level').toInt()) == 1) && array[k].getProperty('ip').contains(node.getProperty('ip'))) {
							array[k].store('ip'+col+':error', node.getProperty('ip'));
							array_errors.push(array[k]);
							col++;
						}
					}
				}
			}
			if(node.hasClass('first_node')){
				array_first.push(node);
			}
		});
		$('schema').getElements('img').each(function(img, i) {
			if(img.hasClass('error_img') && (img.getProperty('level') != '0') && (img.getProperty('level') != 'first')) {
				array_img_errors.push(img);
			}
			if(img.hasClass('error_img') && (img.getProperty('level') == '0')) {
				array_img_errors0.push(img);
			}
		});
		if(array_errors.length < array_img_errors.length) {
			array_img_errors.each(function(img, i) {
				if(!$defined(array_errors[i])) {
					for(var k=i; k--;) {
						if(array_errors[k].getProperty('ip').contains(img.getProperty('ip'))) {
							array_erros[k].store('ip'+i+':error', img.getProperty('ip'));
							array_errors.push(array_errors[k]);
						}else{continue;}
					}
				}
			});
		}
		if(array_img_errors0.length > array_first.length) {
			var i=0;
			while(array_img_errors0.length != array_first.length) {
				array_first.push(array_first[i]);
				i++;
			}
		}
		var new_img_array = this.hash_of_array(array_img_errors);
		var new_array_errors = this.hash_of_array(array_errors);
		for(var i in new_array_errors) {
			this.drawError(this.get_coordinates(new_array_errors[i]), new_img_array[i]);
		}
		if(array_img_errors0.length != 0 && has_node_error==true) {
			this.drawError(this.get_coordinates(array_first), array_img_errors0);
		}
	},
	
	connectNodes:function(array) {
		var canvas = document.getElementById('field');
		var ctx = canvas.getContext("2d");
		for(var k=0; k<array.length-1; k++) {
			var j = k+1;
			var elem_error, before_error;
			if(array[k].node_type == 'active') {
				ctx.fillStyle = (!array[k].is_impiric)?"#00a83c":"#138CCB";
				ctx.strokeStyle = (!array[k].is_impiric)?"#00a83c":"#138CCB";
			}else if(array[k].node_type == 'exist') {
				ctx.fillStyle = "#138CCB";
				ctx.strokeStyle = (!array[k].is_impiric)?"#138CCB":"#138CCB";
			}
			ctx.save();
			if(!array[k+1].is_error && !array[k].is_error) {
				ctx.beginPath();
				ctx.moveTo(array[k].x2, array[k].y2);
				ctx.lineTo(array[j].x1, array[j].y1);
				ctx.stroke();
				ctx.closePath();
				ctx.save();
				ctx.translate(array[j].x1, array[j].y1);
				ctx.beginPath();
				if(array[j].x1 != array[k].x1) {
					var a, b, sinus, cosinus, tangens, alpha;
					a = array[j].y1 - array[k].y2;
					b = array[j].x1 - array[k].x2;
					alpha = Math.atan2(a, b);
					ctx.rotate(alpha + 3*Math.PI/2);
				}
				ctx.moveTo(0, 0);
				ctx.lineTo(-2, -6);
				ctx.lineTo(2, -6);
				ctx.lineTo(0, 0);
				ctx.fill();
				ctx.stroke();
				ctx.closePath();
				ctx.restore();
			}else{
				elem_error = array[k];
				before_error = array[k-1];
			}
		}
	},
	
	connectNodes_level0:function(array0, array1) {
		var canvas = document.getElementById('field');
		var ctx = canvas.getContext("2d");
		var elem_error, before_error;
		ctx.lineWidth = 1;
		for(var i=0; i<array0.length; i++) {
			if(array0[i].node_type == 'active') {
				ctx.fillStyle = "#00a83c";
				ctx.strokeStyle = "#00a83c";
			}else if(array0[i].node_type != 'active') {
				ctx.fillStyle = "#138CCB";
				ctx.strokeStyle = "#138CCB";
			}
			ctx.save();
			for(var j=0; j<array1.length; j++) {
				ctx.save();
				if(!array0[i].is_error && !array1[j].is_error) {
					if(array0[i].node_ip.test(array1[j].node_ip)) {
						ctx.beginPath();
						ctx.moveTo(array0[i].x2, array0[i].y2);
						ctx.lineTo(array1[j].x1, array1[j].y1);
						ctx.stroke();
						ctx.closePath();
						ctx.translate(array1[j].x1, array1[j].y1);
						ctx.beginPath();
						if(array1[j].x1 != array0[i].x1) {
							var a, b, sinus, cosinus, tangens, alpha;
							a = array1[j].y1 - array0[i].y2;
							b = array1[j].x1 - array0[i].x2;
							alpha = Math.atan2(a, b);
							ctx.rotate(alpha + 3*Math.PI/2);
						}
					ctx.moveTo(0, 0);
					ctx.lineTo(-2, -6);
					ctx.lineTo(2, -6);
					ctx.lineTo(0, 0);
					ctx.closePath();
					ctx.restore();
					ctx.stroke();
					ctx.fill();
					}
				}else{
					elem_error = array0[i];
					before_error = array1[j];
				}
			}
			ctx.closePath();
			ctx.restore();
		}
	},

	drawError:function(array_errors, array_img) {
		var canvas = document.getElementById('field');
		array_img = array_img.clean();
		var ctx = canvas.getContext("2d");
		for(var k=0; k<array_errors.length; k++) {
			var j = k+1;
			var imgX = parseInt(array_img[k].getStyle('left')) + (array_img[k].getSize().x)/2;
			var imgY = parseInt(array_img[k].getStyle('top')) + 8;
				ctx.fillStyle = "red";
				ctx.strokeStyle = "red";
				ctx.beginPath();
				ctx.moveTo(array_errors[k].x2, array_errors[k].y2);
				ctx.lineTo(imgX, imgY);
				ctx.stroke();
				ctx.closePath();
				ctx.save();
				ctx.translate(imgX, imgY);
				ctx.beginPath();
				if(imgX != array_errors[k].x1) {
					var a, b, sinus, cosinus, tangens, alpha;
					a = imgY - array_errors[k].y2;
					b = imgX - array_errors[k].x2;
					alpha = Math.atan2(a, b);
					ctx.rotate(alpha + 3*Math.PI/2);
				}
				ctx.moveTo(0, 0);
				ctx.lineTo(-2, -6);
				ctx.lineTo(2, -6);
				ctx.lineTo(0, 0);
				ctx.fill();
				ctx.stroke();
				ctx.closePath();
				ctx.restore();
		}
	},
	
	dlg_handler: function(mes, obj) {
		this.fireEvent('messageResponse', [mes, obj]);
		this.dlg_builder(mes);
		this.show_dlg();
		this.dlg_add_event();
	},

	dlg_builder: function(message) {
		var mess_str = '';
		if(typeof message == 'string') {
			mess_str ='<li><span>'+message+'</span></li>';
		}else{
			for(var i=0; i<message.length; i++) {
				mess_str+='<li><span>'+message[i]+'</span></li>';
			}
		}
			var dlg_holder = new Element('div').set('html',
				'<div class="black_shadow" id="black_shadow"></div>'+
				'<div id="dlg">'+
				'	<div class="dlg_content">'+
				'        <div class="dlg_back"></div>'+
				'        <div class="dlg_middle">'+
				'			<ol class="mess_virt">'+
				'				'+mess_str+				
				'			</ol>'+
				'	    </div>'+
				'    </div>'+
				'    <div class="dlg_bottom">'+
				'    	<div></div>'+
				'    </div>'+
				'	<div></div>'+
				'	<img src="'+this.options.helpers.images.loading_img+'" id="form_loading" />'+
				'	<img src="'+this.options.helpers.images.alpha_img+'" class="go_back" title="" />'+
				'</div>'
			).injectBottom(document.body)
			dlg_holder.getElement('.dlg_middle')

			this.black_shadow = 		dlg_holder.getFirst();
			this.dlg = 					this.black_shadow.getNext();
			this.dlg_back = 			this.dlg.getFirst().getFirst();
			this.dlg_middle = 			this.dlg_back.getNext();
			this.delete_dlg = 			this.dlg_middle.getFirst();
			this.form_loading = 		this.dlg.getLast().getPrevious().set('morph', {duration: 1500, transition: 'expo:out'});
			this.set_shadow_size(this.black_shadow);
		},

	set_dlg_position: function(id) {
		this.dlg.setStyles({
			'left': (window.getCoordinates().width.toInt()-this.dlg.getStyle('width').toInt())/2 + (this.iebutnot7ie?window.getScroll().x:0),
			'top': (window.getCoordinates().height.toInt()-this.dlg.getStyle('height').toInt())/2 + (this.iebutnot7ie?window.getScroll().y:0)
		})
	},

	set_shadow_size: function(obj) {
		obj.setStyles({
			'width': (window.getSize().x.toInt()<960)?960:window.getSize().x.toInt(),
			'height': window.getScrollSize().y.toInt()
		})
	},

	show_dlg: function(action, a, skip_events) {
		this.form_loading.setStyle('visibility', 'hidden');
		this.black_shadow.setStyle('display', 'block');
		this.dlg.setStyle('display', 'block');
		this.iebutnot7ie?this.dlg_back.setStyle('height', this.dlg_middle.getCoordinates().height.toInt()):'';
		this.set_dlg_position();

		window.addEvent('resize', function(){
			this.set_dlg_position();
			if (this.iebutnot7ie) this.set_shadow_size(this.black_shadow)
		}.bind(this));
		window.addEvent('scroll', function(){
			if (this.iebutnot7ie) this.set_dlg_position();
		}.bind(this));
	},

	hide_dlg: function() {
		document.removeEvents('keydown');
		$('message_text').empty().set('html', this.dlg_middle.get('html'));
		this.dlg.getParent().dispose();
		this.black_shadow.dispose();
	},

	dlg_add_event: function(dname, return_to, reload_page) {
		this.dlg.getLast().removeEvents('click').addEvent('click', function(){
			this.hide_dlg();
			this.enable_form();
		}.bind(this));
		
		if($chk(this.dlg.getParent())) {
			document.addEvent('keydown', function(e){
				new Event(e).stop();
				if (e.key=='esc') {
					document.removeEvents('keydown');
					this.hide_dlg();
					this.enable_form();
				}
			}.bind(this))
		}
	}
});

Fx.Slide = new Class({

	Extends: Fx,

	options: {
		mode: 'vertical',
		wrapper: false,
		hideOverflow: true
	},

	initialize: function(element, options){
		this.addEvent('complete', function(){
			this.open = (this.wrapper['offset' + this.layout.capitalize()] != 0);
			if (this.open) this.wrapper.setStyle('height', '');
			if (this.open && Browser.Engine.webkit419) this.element.dispose().inject(this.wrapper);
		}, true);
		this.element = this.subject = $(element);
		this.parent(options);
		var wrapper = this.element.retrieve('wrapper');
		var styles = this.element.getStyles('margin', 'position', 'overflow');
		if (this.options.hideOverflow) styles = $extend(styles, {overflow: 'hidden'});
		if (this.options.wrapper) wrapper = $(this.options.wrapper).setStyles(styles);
		this.wrapper = wrapper || new Element('div', {
			styles: styles
		}).wraps(this.element);
		this.element.store('wrapper', this.wrapper).setStyle('margin', 0);
		this.now = [];
		this.open = true;
	},

	vertical: function(){
		this.margin = 'margin-top';
		this.layout = 'height';
		this.offset = this.element.offsetHeight;
	},

	horizontal: function(){
		this.margin = 'margin-left';
		this.layout = 'width';
		this.offset = this.element.offsetWidth;
	},

	set: function(now){
		this.element.setStyle(this.margin, now[0]);
		this.wrapper.setStyle(this.layout, now[1]);
		return this;
	},

	compute: function(from, to, delta){
		return [0, 1].map(function(i){
			return Fx.compute(from[i], to[i], delta);
		});
	},

	start: function(how, mode){
		if (!this.check(how, mode)) return this;
		this[mode || this.options.mode]();
		var margin = this.element.getStyle(this.margin).toInt();
		var layout = this.wrapper.getStyle(this.layout).toInt();
		var caseIn = [[margin, layout], [0, this.offset]];
		var caseOut = [[margin, layout], [-this.offset, 0]];
		var start;
		switch (how){
			case 'in': start = caseIn; break;
			case 'out': start = caseOut; break;
			case 'toggle': start = (layout == 0) ? caseIn : caseOut;
		}
		return this.parent(start[0], start[1]);
	},

	slideIn: function(mode){
		return this.start('in', mode);
	},

	slideOut: function(mode){
		return this.start('out', mode);
	},

	hide: function(mode){
		this[mode || this.options.mode]();
		this.open = false;
		return this.set([-this.offset, 0]);
	},

	show: function(mode){
		this[mode || this.options.mode]();
		this.open = true;
		return this.set([0, this.offset]);
	},

	toggle: function(mode){
		return this.start('toggle', mode);
	}
});
