function Task_Module_7( taskXml, panel, link )
{
	Task_Module_7.superclass.constructor.call(this, taskXml, panel, link);
	this._taskType = 7;
	
	this.mode = this.MODES.NORMAL;
	
	this.selectedClass = undefined;
	
	this.classes = [];
	
	this._enabled = true;
}

Rup.extend(Task_Module_7, Task_Module_Abstract);

/**
 * Режимы работы:
 * NORMAL - обычный режим.
 * SELECT_VARIANT - режим выбора варианта. Когда кликнули по кнопке класса.
 * SELECT_CLASS - режим выбора класса. Когда кликнули по варианту в тексте.
 */
Task_Module_7.prototype.MODES = {
	NORMAL: 0,
	SELECT_VARIANT: 1,
	SELECT_CLASS: 2
}

Task_Module_7.prototype.ANSWER_DELIMITER = ';';

Task_Module_7.prototype._createVariants = function( data )
{
    var oAnswersDiv = this._variantElement;
	oAnswersDiv.id = 'EduVariantDiv';
	
	var sContStr = data.getAttribute('content');
	
	sContStr = sContStr.replace(/[\r\n]/gi, '');

	var sClassifier = sContStr.replace(/.*<classifier>(.*?)<\/classifier>.*/gi, "$1");
	sContStr = sContStr.replace(/<Desk>(.*?)<\/Desk>.*/gi, "$1");
	//sContStr = sContStr.replace(/<classifier>(.*?)<\/classifier>/gi, "");
	
	sContStr = sContStr.replace(/<v>(.*?)<\/v>/gi, "<span class=\"variant_type_7\">$1</span>");
	sClassifier = sClassifier.replace(/<class\w?[^>]*>(.*?)<\/class>/gi, "<span class=\"variant_type_7\">$1</span>");
	//var oClassifier = Rup.createXML(sClassifier);
	
	var oTmpCls = Rup.create("div");
	oTmpCls.id = 'Cls';
	oTmpCls.style.display = 'none';
	oTmpCls.innerHTML = sClassifier;
	
	var oTmp = Rup.create("div");
	oTmp.id = 'Desk';
	oTmp.innerHTML = sContStr;
	
	var aSpans = oTmp.getElementsByTagName("span");
	
	for( var i = aSpans.length - 1; 0 <= i ; i-- )
	{
		var oCurSpan = aSpans[i];
		if( oCurSpan.className = "variant_type_7" )
		{
			var oVariant = new Task_Variant_7({
				text: oCurSpan.innerHTML,
				module: this
			});
			
			this._variants.unshift(oVariant);
			
			//oTmp.replaceChild(oVariant.dom(), oCurSpan);
			oCurSpan.parentNode.replaceChild(oVariant.dom(), oCurSpan);
		}
	}
	
	oAnswersDiv.innerHTML = "";
	oAnswersDiv.appendChild(oTmp);
	
	var oClassifierElement = new Task_Module_7_Classifier();
	
	//var aClasses = oClassifier.getElementsByTagName('Class');
	var aClasses = oTmpCls.getElementsByTagName('span');
	
	for( var i = 0; i < aClasses.length; i++ )
	{
		var oClass = aClasses[i];
		if( oClass.className = "variant_type_7" )
		{
			var oClassElement = new Task_Module_7_Class({
				text: oClass.innerHTML, 
				module: this
			});
			this.classes.push(oClassElement);
			oClassifierElement.appendChild(oClassElement);
		}
	}

	oAnswersDiv.appendChild(oClassifierElement.dom());
}

Task_Module_7.prototype.setAnswer = function(answerXml)
{
	var value = answerXml.getAttribute("rightanswer");
	
	var aValue = value.split(this.ANSWER_DELIMITER);
	
	for( var i = 0; i < this._variants.length; i++ )
	{
		this._variants[i].setValue(aValue[i]);
	}
}

Task_Module_7.prototype._getAnswerString = function()
{
	var aAnswer = [];
	for( var i = 0; i < this._variants.length; i++ )
	{
		aAnswer.push(this._variants[i].getValue());
	}
	
	return aAnswer.join(this.ANSWER_DELIMITER);
}

Task_Module_7.prototype.setDisabled = function()
{
	this._enabled = false;
}

Task_Module_7.prototype.clickVariant = function(variantElement)
{
	/**
	 * Продолжаем только если модуль активен
	 */
	if( !this._enabled )
	{
		return;
	}
	
	/**
	 * Продолжнаем только если вариант неактивен еще (не выбран нигде)
	 */
	if( !variantElement.active )
	{
		return;
	}
	/**
	 * обычный режим? - выделяем вариант
	 */
	if( this.mode == this.MODES.NORMAL )
	{
		this.mode = this.MODES.SELECT_CLASS;
		variantElement.select();
	}
	/**
	 * режим выбора варианта? - добавляем, если надо, выбранный вариант в класс
	 */
	else if( this.mode == this.MODES.SELECT_VARIANT )
	{
		variantElement.linkToClass(this.selectedClass);
	}
	/**
	 * режим выбра класса? - выделяем вариант, если он не выделен и снимаем выделение в противном случае
	 */
	else if( this.mode == this.MODES.SELECT_CLASS )
	{
		if( variantElement.selected )
		{
			variantElement.unSelect();
		}
		else
		{
			variantElement.select();
		}
		/**
		 * Если не осталось больше выделенных вариантов - переходим в нормальный режим
		 */
		this.mode = this.MODES.NORMAL;
		for( var i = 0; i < this._variants.length; i++ )
		{
			if( this._variants[i].selected )
			{
				this.mode = this.MODES.SELECT_CLASS;
			}
		}
	}
}

Task_Module_7.prototype.mouseOverVariant = function(variantElement)
{
	variantElement._shadowVariant.indicate();
}

Task_Module_7.prototype.mouseOutVariant = function(variantElement)
{
	variantElement._shadowVariant.unIndicate();
}

/**
 * Обработчик клика на кнопке класса
 */
Task_Module_7.prototype.clickClass = function(classElement)
{
	/**
	 * Продолжаем только если модуль активен
	 */
	if( !this._enabled )
	{
		return;
	}
	
	/**
	 * обычный режим?
	 */
	if( this.mode == this.MODES.NORMAL )
	{
		classElement.select();
		this.selectedClass = classElement;
		this.mode = this.MODES.SELECT_VARIANT;
	}
	/**
	 * режим выбора варианта?
	 */
	else if( this.mode == this.MODES.SELECT_VARIANT )
	{
		/**
		 * Кликнули по уже выбранному классу?
		 * да - делаем его невыбранным и переходим в нормальный режим.
		 * нет - выбираем его и делаем невыбранными остальные.
		 */
		if( this.selectedClass == classElement )
		{
			this.mode = this.MODES.NORMAL;
			classElement.unSelect();
		}
		else
		{
			for(var i = 0; i < this.classes.length; i++)
			{
				this.classes[i].unSelect();
				classElement.select();
				this.selectedClass = classElement;
			}
		}
	}
	/**
	 * режим выбора класса?
	 */
	else if( this.mode == this.MODES.SELECT_CLASS )
	{
		for( var i = 0; i < this._variants.length; i++ )
		{
			if( this._variants[i].selected )
			{
				this._variants[i].linkToClass(classElement);
				this._variants[i].unSelect();
			}
		}
		this.mode = this.MODES.SELECT_VARIANT;
		classElement.select();
		this.selectedClass = classElement;
	}
}

Task_Module_7.prototype.clickDelClass = function(classElement)
{
	/**
	 * Продолжаем только если модуль активен
	 */
	if( !this._enabled )
	{
		return;
	}
	
	for( var i = 0; i < this._variants.length; i++ )
	{
		if( this._variants[i].linkedClass == classElement )
		{
			this._variants[i].unLinkClass();
		}
	}
}

Task_Module_7.prototype.mouseOverClass = function(classElement)
{
	for( var i = 0; i < classElement._childs.length; i++ )
	{
		classElement._childs[i].variant.indicate();
	}
}

Task_Module_7.prototype.mouseOutClass = function(classElement)
{
	for( var i = 0; i < classElement._childs.length; i++ )
	{
		classElement._childs[i].variant.unIndicate();
	}
}

Task_Module_7.prototype.clickShadow = function(shadowElement)
{
	/**
	 * Продолжаем только если модуль активен
	 */
	if( !this._enabled )
	{
		return;
	}
	
	shadowElement.variant.unLinkClass();
}

Task_Module_7.prototype.mouseOverShadow = function(shadowElement)
{
	shadowElement.variant.indicate();
}

Task_Module_7.prototype.mouseOutShadow = function(shadowElement)
{
	shadowElement.variant.unIndicate();
}

Task_Module_7.prototype.compareAnswers = function()
{ 
	rightanswer = this._params.ranswer.split(this.ANSWER_DELIMITER);
	var anspwr = 0;
	var correct = 0;
	for( var i = 0; i < this._variants.length; i++ )
	{
		if (rightanswer[i] == '')
			rightanswer[i] = 0;
		else
			anspwr++;
		
		var ans = this._variants[i].getValue();
		if ( ans != rightanswer[i]) 
		{
			if (rightanswer[i] > 0)
			{
				this._variants[i].linkCorrectedToClass(this.classes[rightanswer[i]-1]);
				this._variants[i].markAsCorrected();
			}
			this._variants[i].markAsMistake();
			if (ans > 0) correct--;
		}
		else
		{
			this._variants[i].markAsCorrect();
			if (rightanswer[i] > 0) correct++;
		}
	}
	return (anspwr > 0) ? Math.round(100*Math.max(0, correct)/anspwr) : 100;
}
// ====================================================================

function Task_Module_7_Classifier(module)
{
	Task_Module_7_Classifier.superclass.constructor.call(this);
	var oDiv = Rup.create('div');
	oDiv.id = 'Classifier';
	Rup.css.set(oDiv, 'fgClassTable');
	var oTable = Rup.create('table');
	oTable.id = 'clsTable';
	oTable.border = 0;
	oTable.cellSpacing = 1;
	oTable.cellPadding = 0;
	
	oDiv.appendChild(oTable);
	
	var oTBody = Rup.create('tbody');
	oTable.appendChild(oTBody);
	
	this._setBaseElement(oDiv);
	this._setContainerElement(oTBody);
}

Rup.extend(Task_Module_7_Classifier, Container_Element_Abstract);

// =====================================================================

function Task_Module_7_Class(config)
{
	Task_Module_7_Class.superclass.constructor.call(this);
	
	var oBaseElement = Rup.create('tr');
	Rup.css.add(oBaseElement, 'fgClassified');
	this._setBaseElement(oBaseElement);
	
	this.selected = false;
	
	var td1 = Rup.create('td');
	var td2 = Rup.create('td');
	var td3 = Rup.create('td');
	
	this._selectElement = td2;
	
	this._baseElement.appendChild(td1);
	this._baseElement.appendChild(td2);
	this._baseElement.appendChild(td3);
	
	this._setContainerElement(td3);

	td1.innerHTML = '<img src="../../Icons/test/Del.png"/>';
	///td1.align = 'center';
	//Rup.css.add(td1, 'Active');
	Rup.css.add(td1, 'col1');
	td1.title = 'Очистить группу';
	//td1.width = '2%';
	
	
	td2.innerHTML = config.text;
	//td2.width = '25%';
	//Rup.css.add(td2, 'Active');
	Rup.css.add(td2, 'col2');
	td2.title = 'Группа';
	
	td3.innerHTML = "&nbsp;";
	Rup.css.add(td3, 'col3');
	
	this._module = config.module;
	
	var instance = this;
	
	td2.onmouseout = function(){
		instance._module.mouseOutClass(instance);
	}
	
	td2.onmouseover = function(){
		instance._module.mouseOverClass(instance);
	}
	
	td2.onclick = function(){
		instance._module.clickClass(instance);
	}
	
	td1.onclick = function(){
		instance._module.clickDelClass(instance);
	}
}

Rup.extend(Task_Module_7_Class, Container_Element_Abstract);

Task_Module_7_Class.prototype.select = function()
{
	Rup.css.add(this._selectElement, 'Selected');
	this.selected = true;
}

Task_Module_7_Class.prototype.unSelect = function()
{
	Rup.css.del(this._selectElement, 'Selected');
	this.selected = false;
}

