function TestService(tests, user_id)
{
    this.user_id = user_id;
	this.list = new Array();
    this.complete_test = null;
	for(var i =0; i < tests.length; i++)
	{
		this.list[i] =  {'title': tests[i].title, 'path': tests[i].path}
	}
	this.currentTest = null;
	var _this = this;
	if (user_id != -1)
	{
    	this.getCompleteTest();
	}
	this.popup = jQuery.PopupCenter.createPopup('kita-test', {'close': function(){ _this.reset(); }});
	this.step = null;
	this.checked = {};
}

TestService.prototype.open = function()
{
	this.popup.html(this.getHtml());
	$.PopupCenter.open('kita-test');
}

TestService.prototype.getStep = function()
{
    return this.step;
}

TestService.prototype.setChecked = function(step, checked)
{
    this.checked[step] = checked;
}

TestService.prototype.goStep = function(step, is_valid)
{
	if ( step == null )
	{
		this.popup.html(this.getHtml());
		return false;
	}
	var checked_val = this.getChoise(is_valid);
	if ( !(checked_val == null && step > 0) )
	{
		this.step = step;
		this.setChecked(step, checked_val);
		this.popup.html(this.getHtml());
	}
	return false;
}

TestService.prototype.getChoise = function(is_valid)
{
	if(is_valid == undefined)
	{
		var checked = $('#'+this.popup.id+' input:checked').get(0);
		if ( checked )
		{
			return $(checked).val();
		}
		else
		{
			var error = $('.kita-test .kts-list .kts-error').get(0);
			if ( error )
			{
				$(error).remove();
			}
			$('.kita-test .kts-list').prepend('<li class="kts-error">Выбери один вариант ответа.</li>')
			return null;
		}
	}
	return 0;
}

TestService.prototype.getHtml = function()
{
	var _this = this;
	if ( this.currentTest == null )
	{
		var html = $('<div class="kts-kita-pic"></div><div class="kts-content-test"><ul class="kts-list" style="height:300px; margin-right:150px; overflow-y:auto; width:410px;"></ul></div>');
		jQuery.each(this.list, function(){
			var path = this.path;
			$('.kts-list', html).append($('<li><a href="#">'+this.title+'</a></li>').bind('click', function(){ _this.loadTest(path); return false; }));
		});

        if (this.user_id != -1 && this.complete_test != null)
        {
            $('.kts-list', html).append($('<li><h2>Пройденные тесты</h2></li>').bind('click', function(){$('.kts-list-li').toggle('fast'); return false;}));
            for (var key in _this.complete_test)
            {
                //var ul = '';
                var path = _this.complete_test[key].path;
                var sum = _this.complete_test[key].sum;
                $('.kts-list', html).append($('<li class="kts-list-li"><a href="#">'+_this.getTestTitleByPath(path)+'</a></li>').bind('click', {pth: path, sm: sum}, function(event){_this.getSaveResult(event.data.pth, event.data.sm); return false;}));
            }
        }
	}
	else
	{
		var step = this.getStep();
		if ( step == null )
		{
			var html = $('<h1>'+this.currentTest.title+'</h1><br /><p>'+this.currentTest.description+'</p><div><a href="#" class="kts-back"><< к списку</a><a href="#" class="kts-start kts-invite" style="width: 130px; right: 140px;">Пригласить</a><a href="#" class="kts-start">Начать тест</a></div>');
			$('.kts-start', html).click(function(){ return _this.goStep(0); });
			$('.kts-back', html).click(function(){ _this.reset(); return _this.goStep(null); });
			$('.kts-invite', html).unbind('click');
			$('.kts-invite', html).click(function(){ openGadalkaPopup('test'); });
		}
		else if ( step >= 0 && step < this.currentTest.questions.length )
		{
			var ul = '<form><ul class="kts-list">';
			for (index in this.currentTest.questions[step].ans)
			{
				ul += '<li><input type="radio" value="'+index+'" name="kt-ans" id="_'+step+'kp'+index+'" /><label for="_'+step+'kp'+index+'">'+this.currentTest.questions[step].ans[index]+'</label></li>';
			}
			var html = $('<h1>'+this.currentTest.title+' ('+(step*1+1)+' из '+this.currentTest.questions.length+')</h1><br /><p><b>'+this.currentTest.questions[step].ask+'</b></p>'+
			ul+'</ul></form><div><a href="#" class="kts-back"><< к списку</a><a href="#" class="kts-next">Далее >></a></div>');
			if(step > 0)
			{
				var html = $('<h1>'+this.currentTest.title+' ('+(step*1+1)+' из '+this.currentTest.questions.length+')</h1><br /><p><b>'+this.currentTest.questions[step].ask+'</b></p>'+
				ul+'</ul></form><div><a href="#" class="kts-back"><< к списку</a><a href="#" class="kts-pre"><< Назад</a><a href="#" class="kts-next">Далее >></a></div>');
				$('.kts-pre', html).click(function(){ return _this.goStep(step-1, true); });
			}
			$('.kts-next', html).click(function(){ return _this.goStep(step+1); });
			$('.kts-back', html).click(function(){ _this.reset(); return _this.goStep(null); });
		}
		else
		{
			var result = this.getResult();
			var html = $('<h1>'+this.currentTest.title+'</h1><h2>'+result.title+'</h2><p>'+result.description+'</p><div><a href="#" class="kts-back"><< к списку</a><a href="#" class="kts-start">&nbsp;&nbsp;&nbsp;Заново&nbsp;&nbsp;&nbsp;</a></div>');
			$('.kts-start', html).click(function(){ _this.resetTest(); return _this.goStep(0); });
			$('.kts-back', html).click(function(){ _this.reset(); return _this.goStep(null); });
		}
		$('img', html).each(function(){
			this.src = _this.currentTest.path+$(this).attr('rel');
		});
	}

	return html;
}

TestService.prototype.resetTest = function()
{
	this.step = null; this.checked = {};
}

TestService.prototype.reset = function()
{
	this.currentTest = null; this.step = null; this.checked = {};
}

TestService.prototype.getResult = function()
{
	var sum = 0;
	for( index in this.checked)
	{
		sum += this.checked[index]*1;
	}

	var result = null;
	for ( index in this.currentTest.results)
	{
		var range = index.split('-');
		var from = range[0]*1;
		var to = range[1]*1;
		if ( sum >= from && sum <= to )
		{
			result = this.currentTest.results[index];
			break;
		}
	}

    if (this.user_id != -1)
    {
        this.saveTestResult(sum);
    }

	return result;
}

TestService.prototype.loadTest = function(path)
{
	var _this = this;
	$.getJSON(path+'data.html', function(data){
		_this.currentTest = data;
		_this.currentTest.path = path;
		_this.goStep(null);
	});
}

TestService.prototype.getCompleteTest = function()
{
    var _this = this;
    var action = '/ajaxUser/ajaxGetCompleteTest';
    var data = {
        'user_id': _this.user_id
    };
    $.post(action, data, function(result){
        if (result == 0)
        {
            _this.complete_test = null;
        }
        else
        {
	        _this.complete_test = eval("("+result+")");//JSON.parse(result); don't work in IE!
        }
    });
}

TestService.prototype.saveTestResult = function(sum)
{
    var _this = this;
    var action = '/ajaxUser/ajaxSaveTestResult';
    var data = {
        'user_id': this.user_id,
        'sum': sum,
	      'test_path': _this.currentTest.path,
	      'title': _this.currentTest.title
        //'list': JSON.stringify(_this.list),
        //'cur_test': JSON.stringify(_this.currentTest)
    };
    $.post(action, data, function(result){
        if (result == 0)
            _this.complete_test = null;
        else
            _this.complete_test = eval("("+result+")");//JSON.parse(result);
    });
}

TestService.prototype.getSaveResult = function(path, sum)
{
    var _this = this;
    $.ajax({
        url: path+'data.html',
        dataType: 'json',
        success: function(data) {
            _this.currentTest = data;
            var result = _this.getReadyResult(sum);
            var html = $('<h1>'+_this.currentTest.title+'</h1><h2>'+result.title+'</h2><p>'+result.description+'</p><div><a href="#" class="kts-back"><< к списку</a></div>');
            $('.kts-back', html).click(function(){ _this.reset(); return _this.goStep(null); });

            $('img', html).each(function(){
                this.src = path+$(this).attr('rel');
            });
            _this.popup.html(html);
         }
    });
}

TestService.prototype.getReadyResult = function(sum, test)
{
    var _this = this;
		var result = null;
		for ( index in _this.currentTest.results)
		{
			var range = index.split('-');
			var from = range[0]*1;
			var to = range[1]*1;
			if ( sum >= from && sum <= to )
				return _this.currentTest.results[index];
		}
}

TestService.prototype.getTestTitleByPath = function(path)
{
	var _this = this;
	var title;
	jQuery.each(this.list, function(){
			if (this.path == path)
				title = this.title; 
	});
	return title;
}




