var VirtualHelper = new Class({
	Implements : [Events, Options],
	
	options : {
		maximum_width: 130,
		canvas: document.getElementById('field'),
		sid:'',
		url:'/cgi-bin/vha/vha.pl',
		domain:'',
		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':'Не корректно введен домен. Пожалуйста, проверьте правильность написания домена.'
		}
	},
	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;
		if(Browser.Engine.trident) {
			G_vmlCanvasManager.initElement(this.canvas);
		}
		this.check_domain = $('check_dmn_vh').getProperty('value').toLowerCase().replace(/^([a-z]+)(:\/\/)/, '');
		this.ctx = this.canvas.getContext('2d');
		var self = this;
		//this.levels = this.request.requests;
		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>'
		);

		$('form_vh').addEvent('submit', function(e) {
			new Event(e).stop();
			this.ctx.clearRect(0, 0, 10000, 1000);
			$('message_text').empty();
			$('schema').getElement('div').empty();
			$chk(this.snoska)?this.snoska.setStyle('top', 271):'';
			this.check_domain = $('check_dmn_vh').getProperty('value').toLowerCase().replace(/^([a-z]+)(:\/\/)/, '');
			this.disable_form();
			if(this.domain_validate(this.check_domain)) {
				this.drawLevel_1(0, 0);
				$('schema').getElement('div').getElement('.first_node').getElement('.inner').setStyles({
					'top':(($('schema').getElement('div').getElement('.first_node').getSize().y - $('schema').getElement('div').getElement('.first_node').getElement('.inner').getSize().y)>0)?($('schema').getElement('div').getElement('.first_node').getSize().y - $('schema').getElement('div').getElement('.first_node').getElement('.inner').getSize().y)/2:0,
					'left':($('schema').getElement('div').getElement('.first_node').getSize().x - $('schema').getElement('div').getElement('.first_node').getElement('.inner').getSize().x)/2
				});
				$('schema').getElement('div').getElement('.first_node').getElement('.inner').getElement('span').empty().appendText(this.check_domain);
				//this.inner_block($('schema').getElement('div').getElement('.first_node'));
			}else{
				this.dlg_handler(this.options.errors.domain_fail);
				$chk(this.snoska)?this.snoska.setStyle('top', 0):'';
			}
		}.bind(this));
		//this.submited_form();
		//$('form_vh').submit();
		//$('form_vh').fireEvent('submit');
	},
	
	disable_form:function() {
		//document.removeEvents('keydown');
		this.form.addEvent('keydown', function(e){
			if (e.key=='enter') {
				//form.removeEvents('keydown');
				new Event(e).stop();
			}
		}.bind(this))
		var inputs = this.form.getChildren('input');
		inputs.each(function(inp, i) {
			inp.disabled = 'disabled';
		});
		$('dmn_checker').addClass('uncheck');
	},

	enable_form:function() {
		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);
		//console.log($('schema_inner').getSize().y);
		$chk(this.snoska)?this.snoska.setStyles({
			'top':spacer
		}):''
	},

	submited_form:function() {
		$chk(this.snoska)?this.snoska.setStyle('top', 271):'';
		if(this.domain_validate(this.check_domain)) {
			this.drawLevel_1(0, 0);
			$('schema').getElement('div').getElement('.first_node').getElement('.inner').setStyles({
					'top':(($('schema').getElement('div').getElement('.first_node').getSize().y - $('schema').getElement('div').getElement('.first_node').getElement('.inner').getSize().y)>0)?($('schema').getElement('div').getElement('.first_node').getSize().y - $('schema').getElement('div').getElement('.first_node').getElement('.inner').getSize().y)/2:0,
					'left':($('schema').getElement('div').getElement('.first_node').getSize().x - $('schema').getElement('div').getElement('.first_node').getElement('.inner').getSize().x)/2
				});
			$('schema').getElement('div').getElement('.first_node').getElement('.inner').getElement('span').empty().appendText(this.check_domain);
			//this.inner_block($('schema').getElement('div').getElement('.first_node'));
		}else{
			this.disable_form();
			//$('check_dmn_vh').blur();
			this.dlg_handler(this.options.errors.domain_fail);
			$chk(this.snoska)?this.snoska.setStyle('top', 0):'';
		}
	},

	domain_validate:function(domain) {
		var domains_parts = domain.split('.');
		//var check_alphabet = domains_parts.slice(0, domains_parts.length-1);
		//var check_alphabet_str = check_alphabet.join('.');
		var check_alphabet_bool = true;
		var cyrillic = /[А-Яа-я]/;
		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]([-a-zа-я0-9]{0,61}[a-zа-я0-9])?\.)*([a-zа-я]{2,4})$/;
		var reg_exp2 = /^-/;
		var reg_exp3 = /--/;
		if(!reg_exp1.test(domain) || reg_exp2.test(domain) || reg_exp3.test(domain) || !check_alphabet_bool) {return false;}
		else {return true;}
		//if(domain_parts.getLast() == )
	},

	afterResponse : function() {
		this.dlg_handler(this.message_complete);
		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 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');
		//this.enable_form();
	},

	inner_block:function(node) {
		var nodeWidth = node.getSize().x;
		var nodeHeight = node.getSize().y;
		//var nodeLeft = node.getStyle('left').toInt();
		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 block_text = (node.getElement('.inner').get('text').replace(/\(((([0-9]+)?.)+)\)/, '')).split('\n');
		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 = 'images/resizable.gif';
		$(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) {
					//var pre_test = 
					pre_last_span[i]=(inner_text[i-1].get('html'));
					inner_text[i-1].set('text', '...');
					inner_text[i].setStyle('display', 'none');
				}
			}
			//console.log(pre_last_span);
			/*while((node.getElement('.inner').getSize().x > nodeWidth)) {
				inner_text.each(function(span, i) {
					var span_text = span.get('text');
					if((span.getSize().x) > nodeWidth) {
						step--;
						new_str = span_text.slice(0, step);
						span.set('text', new_str);
					}
				});
			}*/
			/*node.getElement('.inner').getElements('span').each(function(span, i) {
				arr_new_char[i] = span.get('text');
			});*/
			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();
					/*while(node.getElement('.inner').getSize().x < innerWidth) {
						node.getElement('.inner').getElements('span').each(function(span, i) {
							span.appendText(arr_char[i].replace(span.get('text'), ''));
						});
					}*/
					//new Event(e).stop();
					e.preventDefault();
					//nodeLeft = this.getStyle('left').toInt();
					node.getElement('.inner').getElements('span').each(function(span, i) {
						if(span.get('html') == '...') {
							//console.log(i);
							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;
					//var innerHeightOwn = this.getElement('.inner').getSize().y;
					//console.log(ownLeft);
					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();
					//console.log(nodeLeft);
					//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
						}
					});
					/*node.getElement('.inner').getElements('span').each(function(span, i) {
						span.set('text', arr_new_char[i]);
					});*/
					for(var i=inner_text.length; i--;) {
						if((this.getElement('.inner').getSize().y - nodeHeight) > 12) {
							//pre_last_span .push(inner_text[i-1].get('html'));
							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.filter(function(node, i){
			return (!node.hasClass('error'))?node:undefined;
		});
		array = array.clean();*/
		//alert(array.length)
		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]);
			}
		}
	//console.log(identify);
		for(var i in tmp_hash) {
			mass_new.push(tmp_hash[i]);
		}
		//console.log(mass_new);
			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();
						}
				}
			}
			/*o:for(var i=0; i<array.length; i++) {
				/*var sub_mass = mass_similar_actives[i];
				var first_active = sub_mass[0];
				for(var j=1; j<sub_mass.length; j++) {
					var name_node = sub_mass[j].getElement('.inner').get('html');
					var name_ip = $chk(sub_mass[j].getProperty('ip'))?sub_mass[j].getProperty('ip'):'';
					var first_col = sub_mass[0].getProperty('col');
					var first_active_ip = $chk(first_active.getProperty('ip'))?first_active.getProperty('ip'):'';
					if(name_node !== first_active.getElement('.inner').get('html')) {
						if(!first_active.getElement('.inner').get('html').contains(name_node)) {
							first_active.getElement('.inner').set('html', first_active.getElement('.inner').get('html')+ '<br />' + name_node);
						}
						var new_ip=first_active_ip;
						if(!first_active_ip.contains(name_ip)) {
							new_ip = first_active_ip + ' ' + name_ip;
						}
						first_active.setProperty('ip', new_ip);
						new_array.push(first_active);
						sub_mass[j].dispose();
					}
				}*/
				/*for(var j=0; j<array.length; j++) {
					if(array[j].getProperty('ip') != array[i].getProperty('ip')) continue o;
					sub_sub_arr.push(array[j]);
				}
				sub_arr.push(sub_sub_arr);
			}*/
			/*for(var i=0; i<sub_arr.length; i++) {
				var sub_sub = sub_arr[i];
				for(var j=0; j<sub_arr[i].length; j++) {
					//alert(sub_sub[j]);
					if(sub_sub[0].getElement('.inner').get('html') !== sub_sub[j].getElement('.inner').get('html')) {
						if(!sub_sub[0].getElement('.inner').get('html').contains(sub_sub[j].getElement('.inner').get('html'))) {
							sub_sub[0].getElement('.inner').set('html', sub_sub[0].getElement('.inner').get('html') + '<br />' + sub_sub[j].getElement('.inner').get('html'));
						}
						new_array.push(sub_sub[0]);
					}
					sub_sub[j].dispose();
				}
			}*/
		}else {
			new_array = array;
		}
		//console.log(new_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').getElement('div'), 'top');
		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 width_descr = $chk($('level_DNS').getElement('.description'))?$('level_DNS').getElement('.description').getSize().x:0;
		///var width_outside = $chk($('level_DNS').getElement('.outside'))?$('level_DNS').getElement('.outside').getSize().x:0;
		//var width_inside = $chk($('level_DNS').getElement('.inside'))?$('level_DNS').getElement('.inside').getSize().x:0;
		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;
		//console.log(nodes);
		var width_all = (this.get_max_left(nodes) + 162)/2;
		var first_node = $('schema').getElement('.first_node');
		//console.log(width_el);
		//console.log(width_all);
		//console.log(first_node);
		//first_node.removeEvent('mouseenter');
		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);}});
		//console.log(fxa);
		fx2.start({
			'left':width_all
		});
		//first_node.fireEvent('mouseenter');
	},

	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]);
					}
				}
			}
			//console.log(new_hash_ip);
			//console.log(new_hash_cont);
			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;	
		}
		//var newest_hash = new_hash.filter(function(value, ip) {return ip!=null;});
		//console.log(new_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').getElement('div').getElement('.first_node').getElement('.inner').getElement('span').empty().appendText(self.check_domain);
				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));
					if(i!=level)elem.setStyle('display', 'none');
				});
				var texts = [
					'Производится проверка Domain Name System (DNS-системы), связывающей домен и хостинг',
					'Производится проверка сервера, на котором располагается содержимое Вашего сайта',
					'Производится проверка программного обеспечения, которое отвечает за обработку запросов к Вашему сайту.',
					'Производится проверка доступности содержимого (файлов) сайта'
				];
				if($chk(levels_clone))
				var tooltips = new MagicTooltip(levels_clone, texts);
			},
			/*onFailure: function(text){
				self.esc_from_service(self.options.errors.the_request_fails);
				json_obj.onComplete = null;
			},
			onException: function(text){
				self.esc_from_service(self.options.errors.setting_the_request_header_fails);
			},
			onCancel: function(text){
				self.esc_from_service(self.options.errors.the_request_has_been_cancelled);
			},*/
			onComplete:function(obj) {
				if($defined(obj) && $chk(obj)) {
					var errors = new Image(); 
					var non_paid = new Image();
					errors.src = 'images/0.gif';
					errors.width = '35';
					errors.height = '31';
					non_paid.src = 'images/0.gif';
					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 && obj.ips!=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] = obj.ns[ns].ip;
							}
							ns_ip.push(obj.ns[ns].ip);
							if($defined(obj.ns[ns].error) || !$defined(obj.ns[ns].ip)) {
								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);
							ns_type.push(self.dec_to_bin(obj.ns[ns].type));
						}

						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;
								});
							}
						}
						//console.log(this.ips_types);
						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 kol_nodes_ips = self.unique_array(ns_ip.flatten()).length;
						var col=0, ac=0, ex=0, reg=0;
						for(var i=0; i<NS_array.length; i++) {
							var errors = new Image(); 
							errors.src = 'images/0.gif';
							errors.width = '35';
							errors.height = '31';
							var ns_ip_str = $defined(ns_ip[i])?(ns_ip[i].join(' ')):'';
							//alert(ns_ip_str);
							var node = new Element('div').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>'
							);
							node.addClass('node');
							node.inject($('schema').getElement('div'), 'bottom');
							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);
								(!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');
								//self.ns_registr1.push(node);
								node.setProperty('rel', 'active');
								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');
								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').getElement('div'), 'bottom');
								node.addClass('active');
								node.addClass('registr');
								node.addClass('not_from_first');
								node.setProperty('rel', 'active');
								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);
							}
						}
						//alert(ns_error_nodes[0].getProperty('ip'));
						self.mass_actives_registr_but = 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.our_ns.length + self.unreg_ips)*162 + 132;
							}else{
								canvas_width = (self.ns_reg + self.our_ns.length)*162 + 132;
							}
						}else{
							var canvas_width = (self.reg_ips + self.unreg_ips)*162 + 132;
						}
						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())) + 80;
						}
						self.reg_only = self.reg_only.clean();
						if(self.reg_only.length!=0) {
							self.set_node_pos_level1(self.reg_only, self.nodes_not_register_level1, 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);
						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.mass_actives.concat(mass_actives_err).length > 0 || self.exist_only.length > 1) {
							if(self.reg_only.length == 0) {
								self.set_node_exist_after_ac(ns_exist_assoc, $A(self.mass_actives.concat(mass_actives_err)).getLast());
							}
						}
						if(canvas_width > 755) {
							self.canvas.setProperty('width', canvas_width);
						}else {
							self.canvas.setProperty('width', 755);
						}
						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);
						$('level_DNS').setStyle('display', 'block');
						self.first_node_animate($$('.node'));
						//self.inner_block($('schema').getElement('div').getElement('.first_node'));
						(function() {
							self.connect_firstnode();
							//console.log($$('.node').filter(function(node, i) {return !(node.hasClass('first_node'))}));
							$$('.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')
								};
								self.massive_nodes1_coord[i] = coord;
							});
							$$('.node').each(function(node, i) {
								var error = new Image(); 
								error.src = 'images/0.gif';
								error.width = '35';
								error.height = '31';
								if(node.hasClass('error')) {
									$(error).addClass('error_img');
									error.setProperty('ip', ns_ip[i]);
									error.setProperty('col', node.getProperty('col'));
									error.setProperty('level', level);
									error.inject($('schema').getElement('div'), 'bottom');
								}
							});
							self.snoska_set_pos(level);
							if(!$chk(obj.message) && obj.deligated) {
								if($defined(obj.paid) && !obj.paid) {
									$(non_paid).addClass('non_paid');
									non_paid.inject($('schema').getElement('.first_node'), 'bottom');
								}
								self.drawLevel_2(1, 1);
							}else if(!$chk(obj.message) && !obj.deligated) {
								if($defined(obj.paid) && !obj.paid) {
									$(non_paid).addClass('non_paid');
									non_paid.inject($('schema').getElement('.first_node'), 'bottom');
								}
								self.drawLevel_2(1, 1);
								$(errors).addClass('error_img');
								errors.setProperty('level', 'first');
								errors.inject($('schema').getElement('div'), 'bottom');
							}else{
								//self.enable_form();
								self.set_error_position($$('.error_img'), $$('.node'), true);
								$$('.error_img').setStyle('visibility', 'visible');
								self.initErrors($$('.node'));
								self.dlg_handler(self.message_level1 || self.options.errors.server_fail);
							}
						}).delay(1000);
					}else if((!obj.deligated && $chk(obj.registred)) || (obj.ips == null) && $chk(obj.registred)) {
						self.destroy_preloader();
						self.dlg_handler(self.message_level1 || self.options.errors.server_fail);
						//self.enable_form();
						$(errors).addClass('error_img');
						errors.setProperty('level', '0');
						errors.inject($('schema').getElement('div'), 'bottom');
						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'), 'bottom');
						}
						$('schema').getElements('img').setStyle('visibility', 'visible');
					}else if((obj.ns == null || obj.error) || (obj.registred == null || !obj.registred)) {
						$('schema').getElement('.first_node').addClass('error');
						self.destroy_preloader();
						self.dlg_handler(self.message_level1 || self.options.errors.server_fail);
						//self.enable_form();
					}
				}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});
	},

	esc_from_service:function(message) {
		this.schema.getElement('div').empty();
		this.ctx.clearRect(0, 0, 10000, 1000);
		$chk(this.snoska)?this.snoska.setStyle('top', 0):'';
		this.dlg_handler(message);
		//this.enable_form();
	},

	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');
				});
			},
			/*onFailure: function(text){
				self.fails_handler(self.options.errors.the_request_fails)
			},
			onException: function(text){
				self.fails_handler(self.options.errors.setting_the_request_header_fails)
			},
			onCancel: function(text){
				self.fails_handler(self.options.errors.the_request_has_been_cancelled)
			},*/
			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 = [];
						//console.log(self.sort_hash_ips(obj.ips));
						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++) {
							//console.log(IP_array_1[i]);
							var error = new Image();
							error.src = 'images/0.gif';
							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').getElement('div'), 'bottom');
							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');
								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');
								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]);
								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);
								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');
								$(error).addClass('error_img');
								error.setProperty('ip', ips_1[i]);
								error.setProperty('col', node.getProperty('col'));
								error.setProperty('level', level);
								error.inject($('schema').getElement('div'), 'bottom');
							}
						}

						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')
							};
							self.massive_nodes2_coord[i] = coord;
						});
						//alert(self.nodes_not_register_level1.concat(self.nodes_not_register).length);
						$('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.enable_form();
							self.set_error_position($$('.error_img'), $$('.node'), true);
							$$('.error_img').setStyle('visibility', 'visible');
							self.initErrors($$('.node'));
							self.dlg_handler(obj.message);
						}
					}else if(obj.error) {
						$('schema').getElement('div').empty();
						self.destroy_preloader();
						self.dlg_handler(self.message_level2);
						//self.enable_form();
					}
				}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');
				});
			},
			/*onFailure: function(text){
				self.fails_handler(self.options.errors.the_request_fails)
			},
			onException: function(text){
				self.fails_handler(self.options.errors.setting_the_request_header_fails)
			},
			onCancel: function(text){
				self.fails_handler(self.options.errors.the_request_has_been_cancelled)
			},*/
			onComplete:function(obj) {
				//console.log(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 = 'images/0.gif';
							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').getElement('div'), 'bottom');
								node.addClass('registr');
								node.setProperty('ip', ips_2[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'active');
								node.setProperty('level', '2');
								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').getElement('div'), 'bottom');
								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.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').getElement('div'), 'bottom');
								node.addClass('exist');
								node.setProperty('rel', 'exist');
								node.setProperty('col', ex+ac);
								node.setProperty('ip', ips_2[i]);
								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').getElement('div'), 'bottom');
								node.setProperty('col', ac + ex);
								node.setProperty('rel', 'active');
								node.addClass('active');
								node.setProperty('ip', ips_2[i]);
								node.setProperty('level', '2');
								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').getElement('div'), 'bottom');
								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.enable_form();
							self.set_error_position($$('.error_img'), $$('.node'), true);
							$$('.error_img').setStyle('visibility', 'visible');
							self.initErrors($$('.node'));
							self.dlg_handler(self.message_level3);
						}
					}else if(obj.error) {
						$('schema').getElement('div').empty();
						self.destroy_preloader();
						self.dlg_handler(self.message_level3);
						//self.enable_form();
					}
				}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');
				});
			},
			/*onFailure: function(text){
				self.fails_handler(self.options.errors.the_request_fails)
			},
			onException: function(text){
				self.fails_handler(self.options.errors.setting_the_request_header_fails)
			},
			onCancel: function(text){
				self.fails_handler(self.options.errors.the_request_has_been_cancelled)
			},*/
			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 = 'images/0.gif';
							error.width = '35';
							error.height = '31';
							non_paid.src = 'images/0.gif';
							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').getElement('div'), 'bottom');
								node.addClass('registr');
								node.setProperty('ip', ips_3[i]);
								node.setProperty('col', reg);
								node.setProperty('rel', 'active');
								node.setProperty('level', '3');
								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').getElement('div'), 'bottom');
								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.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').getElement('div'), 'bottom');
								node.addClass('exist');
								node.setProperty('rel', 'exist');
								node.setProperty('col', ex+ac);
								node.setProperty('ip', ips_3[i]);
								node.setProperty('level', '3');
								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').getElement('div'), 'bottom');
								node.setProperty('col', ac + ex);
								node.setProperty('rel', 'active');
								node.addClass('active');
								node.setProperty('ip', ips_3[i]);
								node.setProperty('level', '3');
								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').getElement('div'), 'bottom');
								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, 'bottom');
							}
						}
						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();
					}else if(obj.error) {
						$('schema').getElement('div').empty();
						self.dlg_handler(self.message_complete);
						//self.enable_form();
					}
				}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});
	},

	fails_handler:function(message) {
		//this.enable_form();
		$('schema').getElement('div').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')
			};
			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 elemSize = elem.getSize();
			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 fp = (this.reg_ips!=0)?(this.reg_ips*(descr_size.x + 30)):0;
			var sp = (array_reg[i].getProperty('col')>0)?array_reg[i].getProperty('col').toInt()*(descr_size.x + 30):0;
			//var tp = (reg_ips==0)?lefter:0, fp = this.ns_reg*(descr_size.x + 30);
			//var mp = (tp > fp)?tp:fp;
			array_reg[i].setStyle('left', sp);
		}
		this.col_compact(array_exist);
	},

	set_node_exist_after_ac:function(exists, last_active) {
		var last_active_l = ($chk(last_active))?last_active.getStyle('left').toInt():0;
		var padding_left = (this.reg_only == 0 && this.reg_ips != 0)?30:0;
		var reg_ips = this.reg_ips || 0;
		exists.each(function(node, i) {
			node.setStyle('left', last_active_l + padding_left + 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;
		//alert(second_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) {
				return (node.hasClass('error'))?node:undefined;
			});
			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':'relative',
				'left':0,
				//'display':'block',
				'margin-bottom': '10',
				'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, 'bottom');
		outside.inject(container, 'bottom');
		inside.inject(container, 'bottom');
		container.inject($('schema').getElement('div'), 'bottom');
		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').getElement('div'), 'bottom');
		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':'relative',
				'left':0,
				'display':'block',
				'margin-bottom': '10',
				'height':'146',
				'width':'100%',
				'top':120
			}
		});

		var img = new Element('div', {
			'class':'img'
		});
		img.inject(container, 'bottom');
		container.inject($('schema').getElement('div'));
	},

	destroy_preloader:function() {
		$('preloader').dispose();
	},

	connect_firstnode:function() {
		var canvas = document.getElementById('field');
		var ctx = canvas.getContext('2d');
		var first_node = $('schema').getElement('div').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]);
			}
		}
		//console.log(tmp_hash);
		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'):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]);
		}
		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 = [];
		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--;) {/*&& array[k].getProperty('ip') == node.getProperty('ip') */
						if(array[k].getProperty('rel') == node.getProperty('rel') && (($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_errors.push(array[k]);
						}
					}
				}
			}
			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_errors.push(array_errors[k]);
						}else{continue;}
					}
				}
				//alert(array_errors[i].getProperty('class'));
			});
		}
		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++;
			}
		}
		//alert(this.array_of_array(array_img_errors));
		var new_img_array = this.array_of_array(array_img_errors);
		var new_array_errors = this.array_of_array(array_errors);
		//console.log(array_img_errors0);
		//console.log(array_errors);
		for(var i=0; i<new_array_errors.length; i++) {
			//alert(i);
			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 = "#00a83c";
				ctx.strokeStyle = "#00a83c";
			}else if(array[k].node_type == 'exist') {
				ctx.fillStyle = "#138CCB";
				ctx.strokeStyle = "#138CCB";
			}
			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();
				//alert('sdlkflsdf');
				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(message) {
		this.dlg_builder(message);
		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="images/loading4.gif" id="form_loading" />'+
				'	<img src="images/0.gif" 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();
		//this.enable_form();
	},

	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.removeEvents('keydown');
			document.addEvent('keydown', function(e){
				e.stopPropagation();
				if (e.key=='esc') {
					document.removeEvents('keydown');
					this.hide_dlg();
					this.enable_form();
					//new Event(e).stop();
				}
			}.bind(this))
		}
	}
});
