var NET = {},
	AJAX = [],
	Timers = [],
    BlogCode = null,
    prValue = null,
    ticVlue = null,
    site = null;

NET.initAjaxRequest = function (service, suffix, updateLocation) {
	$('#form-' + suffix).submit(function (e) {
		e.preventDefault();
		var value = $.trim(this.who.value);
		
		if (!value) { return; }

		var submit = $('#submit-' + suffix);
		var spinner = $('#spinner-' + suffix);
		var result = $('#result-' + suffix);
		
		submit.attr('disabled', true);
		result.addClass('hidden');
		$('#site-info').addClass('invisible');
		spinner.show();			
		
		clearAJAX();
		
		
        if (service == 'ping' || service == 'traceroute')
		{							
			var onDataGet,
				getData,
				hop = 1,
				fail = 1,
				tries = 3,
				interval = 1000,
				response = '';
			
			if (service == 'traceroute') 
			{
				spinner.addClass('to-left');
				
				onDataGet = function (data) { 					
					if (IE6 || IE7) data.response = data.response.replace(/\n/g, '\n\r');
					
					if (data.response) {
						if (hop == 1)
							refreshResult();
						response += data.response;
						result.text(response);					
						hop++;
						fail = 1;
					} else {
						fail++;
					}
					
					if (hop <= 30 && parseInt(data.last) == 0 && fail <= tries) {
						Timers.push(
							setTimeout(getData, interval)
						)
					} else {
						spinner.hide();
						if (!(/[a-z0-9]+/i).test( result.text() )) {
							refreshResult();
							spinner.hide();
							result.text(s('server error'))
						}
					}								
				}
				
				getData = function () {
					AJAX.push(
						$.getJSON('/net/api/' + service + '/', {who: value, hop: hop}, onDataGet)
					)	
				} 
			}
			
			if (service == 'ping')
			{
				onDataGet = function (data) {
					if (IE6 || IE7) data.response = data.response.replace(/\n/g, '\n\r');
					
					if (data.response) {
						spinner.hide();
						refreshResult();
						result.text(data.response);						
					} else {
						if (fail < tries) {
							fail++;
							setTimeout(getData, interval);
						} else {
							refreshResult();
							spinner.hide();
							result.text(s('server error'));
						}
					}
				}
				
				getData = function () {
					$.getJSON('/net/api/' + service + '/', {who: value}, onDataGet)	
				} 
			}
												
			getData();
		} 
		else if (service == 'rank') 
		{
            result = $('#result');
            result.load('/net/api/' + service + '/', {who: value}, function(response, status, xhr) 
            {
                if (status == 'success') 
                {
                    prValue = $('#pr-value').html();
                    ticValue = $('#tic-value').html();
                    site = value;
                    if (typeof PrepareBlogCode != 'undefined') PrepareBlogCode();
                    if (BlogCode) BlogCode.style.display = 'block';
                    updateLinks();
                    result.removeClass('hidden invisible');
                    submit.attr('disabled', false);
                    spinner.hide();
                }
            });
        } else { 		
			$.getJSON('/net/api/' + service + '/', {who: value},
				function (data) {				    
					var response = (IE6 || IE7 || IE8) ? data.response.replace(/\n/g, '<br/>') : data.response;
					
					//var response = data.response;
					if (service == 'traceroute') {
						response = ' ' + response;
					}
					
					result.html(response);
					result.removeClass('hidden invisible');
					submit.attr('disabled', false);
					spinner.hide();
					updateLinks();
					
					if (service == 'whois')
					{
					    var domains = ['рф','ru','su','com','net','org','info','biz','tel','mobi','name',
					                   'ag','bz','cc','hn','lc','me','mn','sc','tv','vc','aero','travel'];
					    var domain = value.split('.').pop();
					    
					    if (!response)
					    {
					        for (i = 0; i < domains.length; i++)
					        {
					            if (domains[i] == domain)
					            {
					                result.html(s('domain is free'));
					                return;
					            }
					        }
					        if ((/[a-z]+/i).test(domain)) //sure it's not IP
					            result.html(s('domain is possibly free'));
					    }
					}
				}
			);
		}
		
		function refreshResult() {
			result.text('');
			$('#site-info').slideUp();
			result.removeClass('hidden invisible');
			submit.attr('disabled', false);
			updateLinks();
		}
		
		function updateLinks() {
			if (updateLocation) 
			{
				$('#result-link').val('http://'+window.BaseServer+'/net/'+service+'/'+value);

				var prefix = value.match(/^[a-z]+:\/\//);
				$('#link-to-site').text(value).attr('href', prefix ? value : 'http://' + value);

				if (service == 'whois') {
					$('#link-whois').parent().addClass('invisible');
				} else {
					$('#link-whois').text(/[^0-9]$/.test(value) ? s('domain help') : s('ip help'));
					$('#link-whois').attr('href', '/net/whois/' + value);
					$('#link-whois').parent().removeClass('invisible');
				}

				if (service == 'rank') {
					$('#link-rank').parent().addClass('invisible');
				} else {
					$('#link-rank').attr('href', '/net/rank/' + value);
					$('#link-rank').parent().removeClass('invisible');
				}

                if (service == 'nslookup') {
					$('#link-nslookup').parent().addClass('invisible');
				} else {
					$('#link-nslookup').attr('href', '/net/nslookup/' + value);
					$('#link-nslookup').parent().removeClass('invisible');
				}

				if (service == 'ping') {
					$('#link-ping').parent().addClass('invisible');
				} else {
					$('#link-ping').attr('href', '/net/ping/' + value);
					$('#link-ping').parent().removeClass('invisible');
				}

				if (service == 'traceroute') {
					$('#link-tracert').parent().addClass('invisible');
					$('#last_comma').hide();
				} else {
					$('#link-tracert').attr('href', '/net/traceroute/' + value);
					$('#link-tracert').parent().removeClass('invisible');
				}

				$('#site-info').removeClass('invisible');
			}
		}//function update links
	});

	$('#net span.dotted').click(function () {
		$('#form input[name = "who"]').val($(this).text());
	});
};

function clearAJAX() 
{
	while(Timers[0]) clearTimeout(Timers.pop());
	while(AJAX[0]) AJAX.pop().abort();
}
