var p2cHint = 'Такая часть раздела должна быть изучена к ближайшей реперной точке.';
var treeCourseHighlightClass = 'tree_t_highlight';
var treeCourseNormalClass = 'tree_t_normal';
var EduCourseTypeId = 5;
var treeCourseAjaxUrl = '/RupCourseTree.asmx/GetLeftTree';
var leftCBMenuId;
var firstCourseId = -1;
var highlitedCourseId = -1;

var _NodeTypes;

try
{
	_NodeTypes = Node;
}
catch (err)
{
	_NodeTypes = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11};
}

// имена файлов с картинками обязательно должны отличаться
{var leftCBImages = {none: {src: '/images/leftCBNone.gif', title: 'Ничего не выбрано', alt: '[ ][ ]'},
					someChildren: {src: '/images/leftCBsomeChildren.gif', title: 'Некоторые потомки отмечены', alt: '[ ][p]'},
					children: {src: '/images/leftCBchildren.gif', title: 'Выбраны все подразделы', alt: '[ ][v]'},
					selfOnly: {src: '/images/leftCBself.gif', title: 'Выбран только текущий раздел', alt: '[V][ ]'},
					selfGray: {src: '/images/leftCBselfGray.gif', title: 'Выбраны текущий раздел и некоторые подразделы', alt: '[V][p]'}, 
					all: {src: '/images/leftCBall.gif', title: 'Выбрано всё вместе с подразделами', alt: '[V][v]'},
					stubUnchecked: {src: '/images/leftCBstubUnchecked.gif', title: 'Не выбран', alt: '[ ]'},
					stubChecked: {src: '/images/leftCBstubChecked.gif', title: 'Выбран', alt: '[V]'}};

var __leftcbTempImg = MyCreateElement('img');
__leftcbTempImg.src = leftCBImages.none.src; leftCBImages.none.src = __leftcbTempImg.src;
__leftcbTempImg.src = leftCBImages.someChildren.src; leftCBImages.someChildren.src = __leftcbTempImg.src;
__leftcbTempImg.src = leftCBImages.children.src; leftCBImages.children.src = __leftcbTempImg.src;
__leftcbTempImg.src = leftCBImages.selfOnly.src; leftCBImages.selfOnly.src = __leftcbTempImg.src;
__leftcbTempImg.src = leftCBImages.selfGray.src; leftCBImages.selfGray.src = __leftcbTempImg.src;
__leftcbTempImg.src = leftCBImages.all.src; leftCBImages.all.src = __leftcbTempImg.src;
__leftcbTempImg.src = leftCBImages.stubUnchecked.src; leftCBImages.stubUnchecked.src = __leftcbTempImg.src;
__leftcbTempImg.src = leftCBImages.stubChecked.src; leftCBImages.stubChecked.src = __leftcbTempImg.src;
__leftcbTempImg = null;
}

var leftCBStatus = {wrongNode: 0,
					noChildren: 1,
					allUnchecked: 2,
					partChecked: 3,
					allChecked: 4};


function initCourseTree(showRightContent)
{
	createLeftTreeNode = createLeftCourseNode;
	nodeTitleClick = eduCourseClick;
	leftTreeAjaxUrl = treeCourseAjaxUrl;
	var treeContainer = initTreeDiv();
	ProcessAjax({
				method: 'POST',
				data: 'parid=' + treeLeftRootId,
				url: leftTreeAjaxUrl,
				callback: function(respXML){
					buildTreeChilds(respXML, treeLeftRootId, treeContainer); showCurrentCoursePage(showRightContent);
				},
				errback: alertAjaxError
			});
}


function eduCourseClick(titlespan)
{
	var spanid = new String(titlespan.id);
	var courseid = spanid.substr(1);
	//showEduCourse(courseid);
	//alert('showEduCourse(' + courseid + ')');
	Rup.app.content.go({
		nodeId: courseid,
		typeId: EduCourseTypeId,
		mode: 'doc'
	});

}


function createLeftCourseNode(elem, markCheckBox)
{
	var ndId = elem.getAttribute('id'); // id
	var ndName = elem.getAttribute('title'); // Название узла
	var ndMark = elem.getAttribute('m'); // Степень усвоения
	var ndIsCurrent = elem.getAttribute('curr'); // 1, если раздел является текущим (в соответствии с графиком), иначе 0.
	var ndIsStub = elem.getAttribute('stub'); // 1, если это "тупиковый" узел; 0, если у узла есть потомки.
	var ndPercentToComplete = elem.getAttribute('ct'); // Часть курса (в %), которая должна быть выполнена до ближайшей реперной точки.
	
	//alert('итерация ' + i + '\nid: ' + ndId + '; name: '+ ndName + ' (' + ndChildCnt + ')');
	
	if (firstCourseId == -1) firstCourseId = ndId;
	if (ndIsCurrent == 1 && highlitedCourseId == -1) highlitedCourseId = ndId;
	
	
	var spantitle = MyCreateElement('span');
	if (ndIsCurrent == '1')
	{
		spantitle.className = treeCourseHighlightClass;
	}
	else
	{
		spantitle.className = treeCourseNormalClass;
	}
	spantitle.innerHTML = ndName;
	spantitle.id = 't' + ndId;
	spantitle.onclick = function() {nodeTitleClick(this)};
	
	var spanmastery = MyCreateElement('span');
	spanmastery.className = (ndMark && ndMark != 0) ? StylesOfMastery.getWeightedStyleName(ndMark) : 'hidden';
	spanmastery.innerHTML = /*'(' +*/ (ndMark >= 0 ? ndMark : 0)/* + ')'*/;
	/*
	var spanPercentComplete;
	if (ndIsCurrent == '1' && ndPercentToComplete < 100)
	{
		spanPercentComplete = MyCreateElement('span');
		spanPercentComplete.className = treeCourseHighlightClass;
		spanPercentComplete.innerHTML = '&nbsp;' + ndPercentToComplete + '%';
		spanPercentComplete.title = p2cHint;
	}
	*/
	
	var newdv = MyCreateElement('div');
	var contdv;
	var toggleImage;
	var cbImg;
	
	if (ndIsStub != '1') // узел имеет потомков
	{
		contdv = MyCreateElement('div');
		contdv.style.display = 'none';
		contdv.id = 'c' + ndId;
		toggleImage = MyCreateElement('img');
		toggleImage.id = 'i' + ndId;
		toggleImage.src = PlusImgUrl;
		toggleImage.onclick = function() {ndCToggle(this)};
		newdv.id='e' + ndId;
		
		cbImg = markCheckBox ? leftCBImages.all : leftCBImages.none;
		
		//newdv.appendChild(contdv);
	}
	else // узел без потомков
	{
		toggleImage = MyCreateElement('img');
		toggleImage.src = EmptyNodeImgUrl;
		newdv.id='e' + ndId;
		
		cbImg = markCheckBox ? leftCBImages.stubChecked : leftCBImages.stubUnchecked;
	}
	
	var checkboxImage;
	checkboxImage = MyCreateElement('img');
	checkboxImage.id = 'b' + ndId;
	checkboxImage.src = cbImg.src;
	checkboxImage.alt = cbImg.alt;
	checkboxImage.title = cbImg.title;
	//checkboxImage.onclick = function(evn) {if (!evn) evn = window.event; showCourseCBMenu(this, evn);};
	checkboxImage.oncontextmenu = function(){return false;}
	checkboxImage.onmouseup = function(evn) {
									if (!evn) evn = window.event; 
									if(evn.button == 2) 
										showCourseCBMenu(this, evn); 
									else {leftCBMenuId = this.id.substring(1); leftCBMenuClicked(-1);} 
								};
	
	newdv.appendChild(toggleImage);
	newdv.appendChild(checkboxImage);
	newdv.appendChild(spantitle);
	newdv.appendChild(document.createTextNode(' '));
	newdv.appendChild(spanmastery);
	if (contdv) newdv.appendChild(contdv);
	
	newdv.className = 'leftTreeNode';
	
	return newdv;
}

function showCurrentCoursePage(takeAction)
{
	if (!takeAction || firstCourseId == -1) return;
	Rup.app.content.go({
		nodeId: highlitedCourseId == -1 ? firstCourseId : highlitedCourseId,
		typeId: EduCourseTypeId,
		mode: 'doc'
	});
	firstCourseId = -1;
	highlitedCourseId = -1;
}

function leftTreeChildsSelected(imgNode) // проверяет, выделены ли потомки (с произвольной глубиной вложенности), но пробегает только по непосредственным потомкам, так что для корректной работы у непосредственных потомков должны быть корректно проставлены картинки; если потомков нет или они не подгружены - возвращает leftCBStatus.noChildren
{
	var hasUnchecked = false;
	var hasChecked = false;
	var ndId;
	var cbimage = null;
	var hasCont = false;
	var contnode;
	
	if (!imgNode || !imgNode.parentNode || !imgNode.id || ('b' + parseInt(imgNode.id.substring(1), 10)) != imgNode.id)
		return leftCBStatus.wrongNode;
	contnode = document.getElementById('c' + imgNode.id.substring(1));
	//alert('c' + imgNode.id.substring(1) + ' ' + contnode);
	if (!contnode)
		return leftCBStatus.noChildren;
	var elem;
	var elems = contnode.childNodes;
	for (var elnum = 0; elnum < elems.length; elnum++) //elem - div
	{
		elem = elems[elnum];
		//alert('elems[' + elnum + ']\nelem.tagName=' + elem.tagName + ' elem.id=' + elem.id);
		if (elem.tagName != 'DIV' || !elem.id || elem.id.substring(0,1) != 'e') continue; // это неправильный div, и в нем неправильный мёд
		ndId = elem.id.substring(1);
		//alert('ndId=' +ndId);
		hasCont = false;
		cbimage = null;
		var el2;
		var elems2 = elem.childNodes;
		for (var elnum2 = 0; elnum2 < elems2.length; elnum2++)
		{
			el2 = elems2[elnum2];
			//alert('ndId=' +ndId + '\nel2.id=' + el2.id);
			if (el2.tagName == 'IMG' && el2.id == 'b' + ndId) // нашли чекбокс
			{
				cbimage = el2;
			}
			else if (el2.tagName == 'DIV' && el2.id == 'c' + ndId)
			{
				hasCont = true;
			}
		}
		//alert ('cbimage = ' + cbimage + '\nhasCont = ' + hasCont);
		if (!cbimage) continue;
		
		 // проверяем статус чекбокса
		if (cbimage.src == leftCBImages.none.src || cbimage.src == leftCBImages.someChildren.src || cbimage.src == leftCBImages.children.src || cbimage.src == leftCBImages.selfGray.src || cbimage.src == leftCBImages.selfOnly.src || cbimage.src == leftCBImages.stubUnchecked.src)
		{
			hasUnchecked = true;
		}
		
		if (cbimage.src == leftCBImages.someChildren.src || cbimage.src == leftCBImages.children.src || cbimage.src == leftCBImages.selfOnly.src || cbimage.src == leftCBImages.selfGray.src || cbimage.src == leftCBImages.all.src || cbimage.src == leftCBImages.stubChecked.src)
		{
			hasChecked = true;
		}
	}
	if (hasChecked)
	{
		if (hasUnchecked) return leftCBStatus.partChecked;
		else return leftCBStatus.allChecked;
	}
	else
	{
		if (hasUnchecked) return leftCBStatus.allUnchecked;
		else return leftCBStatus.noChildren;
	}
	alert('Ну и ну! Так не бывает.'); // Ненавижу смайл "O_o" - то ли трактор, то ли чебурашка на колесах
}

function leftTreeSetAllChilds(edivNode, newState, changeSelf)
{
	var cbimg;
	var childrenCont;
	var selfChecked;
	var oldSrc;
	var newImg;
	var nodeid = edivNode.id.substring(1);
	var elnum1, elnum2;
	var el1, el2;
	var elems1 = edivNode.childNodes;
	var elems2;
	for (elnum1 = 0; elnum1 < elems1.length; elnum1++)
	{
		el1 = elems1[elnum1];
		if (el1.tagName == 'IMG' && el1.id == 'b' + nodeid)
		{
			cbimg = el1;
		}
		else if (el1.tagName == 'DIV' && el1.id == 'c' + nodeid)
		{
			childrenCont = el1;
		}
	}
	if (!cbimg) return; // и что же нам такое скормили в качестве edivNode???
	if (childrenCont)
	{ // есть потомки
		if (changeSelf) // нужно изменить состояние текущего узла, а не только потомков
		{
			if (newState) // нужно выделить все
			{
				newImg = leftCBImages.all;
			}
			else // нужно снять выделение
			{
				newImg = leftCBImages.none;
			}
		}
		else // меняются только потомки, а состояние текущего узла остается неизменным
		{
			oldSrc = cbimg.src;
			if (oldSrc == leftCBImages.all.src || oldSrc == leftCBImages.selfOnly.src || oldSrc == leftCBImages.selfGray.src)
			{ // текущий узел уже отмечен
				newImg = newState ? leftCBImages.all : oldSrc == leftCBImages.selfOnly;
			}
			else // текущий узел не отмечен
			{
				newImg = newState ? leftCBImages.children : leftCBImages.none;
			}
		}
		elems2 = childrenCont.childNodes;
		for (elnum2 = 0; elnum2 < elems2.length; elnum2++) 
		{
			leftTreeSetAllChilds(elems2[elnum2], newState, true); // меняем состояния потомков
		}
	}
	else
	{
		if (changeSelf) // нужно менять состояние текущего узла
		{
			newImg = newState ? leftCBImages.stubChecked : leftCBImages.stubUnchecked;
		}
	}
	if (newImg) // меняем картинку чекбокса на новую
	{
		cbimg.src = newImg.src;
		cbimg.alt = newImg.alt;
		cbimg.title = newImg.title;
	}
}

function leftTreeSetParents(contNode) // принимает элемент - контейнер узла, от которого идем вверх
{
	//alert('leftTreeSetParents\ncontNode.id=' + contNode.id);
	var checkbox;
	var ndId;
	var nd;
	var selfChecked;
	var childrenStatus;
	var newImg;
	if (!contNode || !contNode.id || contNode.id == leftTreeDivId || !contNode.parentNode) return;
	ndId = parseInt(contNode.id.substring(1),10);
	if (contNode.id != 'c' + ndId) return;
	nd = contNode.parentNode.childNodes;
	for (var i=0; i< nd.length; i++ )
	{
		if ((nd[i].nodeType == (_NodeTypes.ELEMENT_NODE || 1)) && nd[i].nodeName == 'IMG' && nd[i].id && nd[i].id == 'b' + ndId)
		{
			checkbox = nd[i];
			break; // чекбокс нашли, больше нам искать здесь нечего
		}
	}
	if (checkbox)
	{
		childrenStatus = leftTreeChildsSelected(checkbox);
		selfChecked = (checkbox.src == leftCBImages.selfOnly.src || checkbox.src == leftCBImages.selfGray.src || checkbox.src == leftCBImages.all.src);
		if (childrenStatus == leftCBStatus.wrongNode || status == leftCBStatus.noChildren) return; // неизвестно, во что мы вляпались, но это явно неправильное дерево
		else if (childrenStatus == leftCBStatus.allUnchecked && !selfChecked) newImg = leftCBImages.none;
		else if (childrenStatus == leftCBStatus.partChecked && !selfChecked) newImg = leftCBImages.someChildren;
		else if (childrenStatus == leftCBStatus.allChecked && !selfChecked) newImg = leftCBImages.children;
		else if (childrenStatus == leftCBStatus.allUnchecked && selfChecked) newImg = leftCBImages.selfOnly;
		else if (childrenStatus == leftCBStatus.partChecked && selfChecked) newImg = leftCBImages.selfGray;
		else if (childrenStatus == leftCBStatus.allChecked && selfChecked) newImg = leftCBImages.all;
		
		checkbox.src = newImg.src;
		checkbox.alt = newImg.alt;
		checkbox.title = newImg.title;
		
		leftTreeSetParents(checkbox.parentNode.parentNode);
	}
}

function leftCBMenuClicked(num)
{
	//alert('id=' + leftCBMenuId + '\nnum=' + num);
	var newImg;
	var checkbox = document.getElementById('b' + leftCBMenuId);
	var childCont = document.getElementById('c' + leftCBMenuId);
	
	//if (!checkbox) return;
	
	if (num == 0) // Выделить только этот раздел
	{
		if (checkbox.src == leftCBImages.stubUnchecked.src) newImg = leftCBImages.stubChecked;
		else if (checkbox.src == leftCBImages.none.src) newImg = leftCBImages.selfOnly;
		else if (checkbox.src == leftCBImages.someChildren.src) newImg = leftCBImages.selfGray;
		else if (checkbox.src == leftCBImages.children.src) newImg = leftCBImages.all;
	}
	else if (num == 1) // Снять выделение с раздела
	{
		if (checkbox.src == leftCBImages.stubChecked.src) newImg = leftCBImages.stubUnchecked;
		else if (checkbox.src == leftCBImages.selfOnly.src) newImg = leftCBImages.none;
		else if (checkbox.src == leftCBImages.selfGray.src) newImg = leftCBImages.someChildren;
		else if (checkbox.src == leftCBImages.all.src) 
		{
			newImg = leftCBImages.children;
			leftTreeLoadCollapsed(leftCBMenuId, true);
		}
	}
	else if (num == 2) // Выделить всех потомков
	{
		//if (checkbox.src == leftCBImages.none.src || checkbox.src == leftCBImages.someChildren.src) newImg = leftCBImages.children;
		//else if (checkbox.src == leftCBImages.selfOnly.src || checkbox.src == leftCBImages.selfGray.src) newImg = leftCBImages.all;
		newImg = leftCBImages.all;
		leftTreeSetAllChilds(checkbox.parentNode, true, false)
	}
	else if (num == 3) // Снять выделение с потомков
	{
		//if (checkbox.src == leftCBImages.children.src || checkbox.src == leftCBImages.someChildren.src) newImg = leftCBImages.none;
		//else if (checkbox.src == leftCBImages.all.src || checkbox.src == leftCBImages.selfGray.src) newImg = leftCBImages.selfOnly;
		newImg = leftCBImages.none;
		leftTreeSetAllChilds(checkbox.parentNode, false, false)
	}
	else if (num == -1) // Циклическая смена состояния (по левому клику, без меню)
	{
		if (checkbox.src == leftCBImages.stubUnchecked.src) newImg = leftCBImages.stubChecked; // не выделен => выделен (тупиковый узел)
		else if (checkbox.src == leftCBImages.stubChecked.src) newImg = leftCBImages.stubUnchecked; // выделен => не выделен (тупиковый узел)
		else if (checkbox.src == leftCBImages.none.src || checkbox.src == leftCBImages.someChildren.src || checkbox.src==leftCBImages.children.src)
		{     // выделяем вместе с потомками
			newImg = leftCBImages.all;
			leftTreeSetAllChilds(checkbox.parentNode, true, false)
		}
		else if (checkbox.src == leftCBImages.all.src || checkbox.src == leftCBImages.selfOnly.src || checkbox.src == leftCBImages.selfGray.src)
		{     // снимаем выделение со всего
			newImg = leftCBImages.none;
			leftTreeSetAllChilds(checkbox.parentNode, false, false)
		}
		// < - - - - - - - ========================================= [ Реализовать циклическую смену состояния галочек ] ===========================================
	}
	
	if (newImg)
	{
		checkbox.src = newImg.src;
		checkbox.alt = newImg.alt;
		checkbox.title = newImg.title;
		leftTreeSetParents(checkbox.parentNode.parentNode);
	}
}

function showCourseCBMenu(checkbox, evn)
{
	//if (!evn) evn = window.event;
	if (!checkbox || !evn) return;
	
	var stubNode = (checkbox.src == leftCBImages.stubChecked.src || checkbox.src == leftCBImages.stubUnchecked.src);
	var params = {x: evn.clientX, y: evn.clientY, title: 'Доступные действия:', items: new Array(), resultfunc: leftCBMenuClicked};
	
	params.items.push('Выделить только этот раздел');
	params.items.push('Снять выделение с этого раздела');
	
	if (!stubNode)
	{
		params.items.push('Выделить со всеми подразделами');
		params.items.push('Снять выделение с раздела и подразделов');
	}
	leftCBMenuId = checkbox.id.substring(1);
	//alert('leftCBMenuId =' + checkbox.id.substring(1));
	showPopupMenu(params);
}

function leftTreeLoadCollapsed(ndId, checkChildren)
{
	var nblock = document.getElementById('c' + ndId);
	var nimg = document.getElementById('i' + ndId);
	var econt = document.getElementById('e' + ndId);
	var fnc;
	if (nblock.className == '') // потомки не подгружены
	{
		if (checkChildren)
			fnc = function(respXML){
						buildTreeChilds(respXML, ndId);
						nimg.src = PlusImgUrl;
						leftTreeSetAllChilds(econt, true, false);}
		else
			fnc = function(respXML){
						buildTreeChilds(respXML, ndId);
						nimg.src = PlusImgUrl;}
		
		nblock.className = treeContLoadingStyle;
		nblock.style.display = 'none';
		nimg.src = treeLoadingImgUrl;
		nblock.innerHTML = treeLoadingTxt;
		ProcessAjax({
			method: 'POST',
			data: 'parid=' + ndId,
			url: leftTreeAjaxUrl,
			callback: fnc,
			errback: alertAjaxError
		});
	}
}

function leftTreeGetCheckboxes(cont)
{
	var outstr = '';
	var elems1, elnum1,el1;
	var ndId;
	var checkbox;
	var childrenCont;
	if (!cont)
		cont = document.getElementById(leftTreeDivId);
	if (!cont) return '';
	elems1 = cont.childNodes;
	for (elnum1 = 0; elnum1 < elems1.length; elnum1++)
	{
		el1 = elems1[elnum1];
		if (el1.nodeType == _NodeTypes.ELEMENT_NODE && el1.id)
		{
			ndId = parseInt(el1.id.substring(1), 10);
			if (el1.childNodes.length == 5) // нет потомков
			{
				if (el1.childNodes[1].src == leftCBImages.stubChecked.src) outstr +='s' + ndId + ';';
			}
			else if (el1.childNodes.length == 6) // есть потомки
			{
				var cbsrc = el1.childNodes[1].src;
				if (cbsrc == leftCBImages.selfOnly.src || cbsrc == leftCBImages.selfGray.src) outstr +='s' + ndId + ';';
				else if (cbsrc == leftCBImages.all.src) outstr +='m' + ndId + ';';
				
				if (cbsrc == leftCBImages.someChildren.src || cbsrc == leftCBImages.children.src || cbsrc == leftCBImages.selfGray.src)
					outstr += leftTreeGetCheckboxes(el1.childNodes[5]);
			}
			// если не 5 и не 6, то узел неправильный и мы его игнорируем
		}
	}
	return outstr;
}


