Skip to content
Snippets Groups Projects
Select Git revision
  • 721636af5e969550a8135609c2e330e7816218b3
  • develop default
  • master
  • issue609_stub_nolink
  • hotfix/v2.9.3
  • issue608_journal_tristate
  • hotfix/v2.9.2
  • issue606_global_woes
  • issue299_add_subgroups
  • issue592_student_movement
  • issue606_globaldiscipline_bind
  • issue595_discipline_info
  • issue574_dash_norates
  • issue591_warn_global1c
  • issue593_1cexport_semester
  • issue327_admin_auth
  • issue590_issue_subject
  • issue589_tab_numbers
  • issue583_logaccount_formexport
  • issue584_block_formexport
  • issue527_exam_detached
  • v2.1.5
  • v2.0.3
  • v2.0.2
  • v2.0.1
  • v2.0.0
  • v1.1.2
  • v1.1.1
  • v1.1.0
  • v0.9.3
  • v0.9.1
  • v0.9.2
  • v1.03
  • v1.02
  • v1.01
  • v1.0
36 results

edit.js

Blame
  • Forked from it-lab / grade
    Source project has a limited visibility.
    edit.js 31.34 KiB
    var $ = jQuery;
    $(function() {
    	var URL = (window.location.href).split('/');
    	var DisciplineID = URL[URL.length - 1]
    	
    	// Шаблон мероприятия
    	function GetSubModuleTmp(){
    		return '\
    		<div class="subModule">\
    			<div class="name">\
    				<input type="text" class="inputName SubmoduleName" value="" placeholder="Наименование мероприятия">\
    			</div>\
    			<div class="currentControl"><input type="text" class="inputCredit inputCurrentControl" value="0"></div>\
    			<div class="landmarkControl"><input type="text" class="inputCredit inputLandmarkControl" value="0"></div>\
    			<div class="actions">\
    				<div class="deleteSubModule icon delete"></div>\
    				<div class="downSubModule icon down"></div>\
    				<div class="upSubModule icon up"></div>\
    			</div>\
    		</div>\
    		';
    	}
    
    	// Шаблон модуля
    	function GetModuleTmp() {
    		return '\
    		<div class="moduleGroup">\
    			<div class="moduleHead">\
    				<div class="name">\
    					<input type="text" class="inputName ModuleName" value="" placeholder="Наименование модуля">\
    				</div>\
    				<div class="currentControl">0</div>\
    				<div class="landmarkControl">0</div>\
    				<div class="actions">\
    					<div class="deleteModule icon delete"></div>\
    					<div class="downModule icon down"></div>\
    					<div class="upModule icon up"></div>\
    					<div class="addSubModule icon add"></div>\
    				</div>\
    			</div>\
    			<div class="subModules">\
    			'+GetSubModuleTmp()+'\
    			</div>\
    		</div>'
    	};
    
    	// Подсчет текущего контроля
    	function CountCurrentControl(subModulesDiv){
    		var maxCredits = 0;
    		$('.inputCurrentControl', subModulesDiv).each(function(){
    			var credit = parseInt($(this).val());
    			maxCredits = maxCredits + ((isNum(credit)) ? credit : 0);
    		});
    		subModulesDiv.prev().children('.currentControl').text(maxCredits);
    	}
    	// Подсчет рубежного контроля
    	function CountLandmarkControl(subModulesDiv){
    		var maxCredits = 0;
    		$('.inputLandmarkControl', subModulesDiv).each(function(){
    			var credit = parseInt($(this).val());
    			maxCredits = maxCredits + ((isNum(credit)) ? credit : 0); 
    		});
    		subModulesDiv.prev().children('.landmarkControl').text(maxCredits);
    	}
    	
    	// Изменение типа подмодуля
    	function ChangeSubmoduleControlType(ID, ControlType){
    		$.post(
    			'/~dev_rating/handler/map/ChangeSubmoduleControlType',
    			{
    				'SubmoduleID': ID,
    				'ControlType': ControlType
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Форма контроля изменена', 'success');
    				else EventInspector_ShowMsg('Ошибка при изменение формы контроля', 'error');
    			}
    		);
    	}
    	
    	// Изменение макс. балла подмодуля
    	function ChangeSubmoduleMaxRate(ID, NewMaxRate) {
    		$.post(
    			'/~dev_rating/handler/map/ChangeSubmoduleMaxRate',
    			{
    				'SubmoduleID': ID,
    				'MaxRate': NewMaxRate
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Max балл мероприятия изменен', 'success');
    				else EventInspector_ShowMsg('Ошибка при изменение max балла', 'error');
    			}
    		);
    	}
    	
    	// Установить новый max балл
    	function SetNewRateAndControl(thisObj, OldMaxRate) {
    		// DIV с мероприятиями для данного модуля
    		var subModulesDiv = thisObj.parent().parent().parent();
    		// ID мероприятия
    		var ID = thisObj.parent('div').parent('div').attr('id');
    		var NewMaxRate = 0;
    		if (thisObj.val() != '')
    			NewMaxRate = parseInt(thisObj.val());
    		
    		/*
    		// Ограничение 100 баллов
    		var currentControl = 0;
    		$('.moduleHead .currentControl').each(function(){
    			currentControl += parseInt($(this).text());
    		});
    		var landmarkControl = 0;
    		$('.moduleHead .landmarkControl').each(function(){
    			landmarkControl += parseInt($(this).text());
    		});
    		var subtract = 0;
    		if (thisObj.parent().attr('class').indexOf('landmarkControl') + 1 > 0)
    			subtract = parseInt(thisObj.parent().siblings('.currentControl').children().val());
    		if (thisObj.parent().attr('class').indexOf('currentControl') + 1 > 0)
    			subtract = parseInt(thisObj.parent().siblings('.landmarkControl').children().val());
    		if (currentControl + landmarkControl + NewMaxRate - subtract - OldMaxRate > 100) {
    			EventInspector_ShowMsg('Сумма баллов превышает 100', 'error');
    			thisObj.val(OldMaxRate);
    			return 0;
    		}
    		*/
    		
    		// Меняем max балл
    		if (NewMaxRate != OldMaxRate) {
    			ChangeSubmoduleMaxRate(ID, NewMaxRate);
    			
    			// Меняем тип
    			ControlType = 'CurrentControl'; // По-умолчанию 
    			if ((thisObj.parent().attr('class')).indexOf('landmarkControl') + 1 > 0)
    				ControlType = 'LandmarkControl';	
    			if (NewMaxRate > 0)
    				ChangeSubmoduleControlType(ID, ControlType);
    			
    			if (ControlType == 'CurrentControl')
    				thisObj.parent().parent().find('.landmarkControl').children('.inputLandmarkControl').val('0');
    				
    			if (ControlType == 'LandmarkControl')
    				thisObj.parent().parent().find('.currentControl').children('.inputCurrentControl').val('0');
    		}
    		
    		// Подсчет текущего и рубежного контроля после изменений
    		CountCurrentControl(subModulesDiv);
    		CountLandmarkControl(subModulesDiv);	
    	}
    	
    	// Поменять местами два модуля
    	function SwapModuleOrder(ModuleID1, ModuleID2) {
    		$.post(
    			'/~dev_rating/handler/map/SwapModuleOrder',
    			{
    				'ModuleID1': ModuleID1,
    				'ModuleID2': ModuleID2
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Модули поменяли порядок', 'success');
    				else EventInspector_ShowMsg('Ошибка при изменение порядка модулей', 'error');
    			}
    		);
    	}
    	
    	// Поменять местами два мероприятия
    	function SwapSubmoduleOrder(SubmoduleID1, SubmoduleID2) {
    		$.post(
    			'/~dev_rating/handler/map/SwapSubmoduleOrder',
    			{
    				'SubmoduleID1': SubmoduleID1,
    				'SubmoduleID2': SubmoduleID2
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Мероприятия поменяли порядок', 'success');
    				else EventInspector_ShowMsg('Ошибка при изменение порядка мероприятий', 'error');
    			}
    		);
    	}
    	
    //-------------------------------------------------------------------------------------------------------------------------------------------------
    	
    // ---- Изменения базовых параметров дисциплины ---
    	
    	// Изменение предмета
    	$('.SelectSubject').change(function(){
    		$.post(
    			'/~dev_rating/handler/map/ChangeDisciplineSubject',
    			{
    				'DisciplineID': DisciplineID,
    				'SubjectID': $('.SelectSubject').val()
    			},
    			function(data) {
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Предмет изменен', 'success');
    				else EventInspector_ShowMsg('Ошибка: Изменение предмета', 'error');
    			}
    		);
    	});
    	
    	// Изменение курса
    	$('.SelectDisGrade').change(function(){ // SelectGrade совпадает с другим, поэтому SelectDisGrade
     		$.post(
    			'/~dev_rating/handler/map/ChangeDisciplineGrade',
    			{
    				'DisciplineID': DisciplineID,
    				'GradeID': $('.SelectDisGrade').val()
    			},
    			function(data) {
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Курс изменен', 'success');
    				else EventInspector_ShowMsg('Ошибка: Изменение курса', 'error');
    			}
    		);
    	});
    	
    	// Изменение контроля
    	$('.ExamType').change(function(){
    		$.post(
    			'/~dev_rating/handler/map/ChangeDisciplineControl',
    			{
    				'DisciplineID': DisciplineID,
    				'Control': $('input:radio[name=ExamType]:checked').val()
    			},
    			function(data) {
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Форма контроля изменена', 'success');
    				else EventInspector_ShowMsg('Ошибка: Изменение формы контроля', 'error');
    			}
    		);
    	});
    	
    	// Изменение лекционных часов
    	$('.InputLectionCount').focusout(function(){
    		$.post(
    			'/~dev_rating/handler/map/ChangeDisciplineHours',
    			{
    				'DisciplineID': DisciplineID,
    				'Hours': $('.InputLectionCount').val(),
    				'Type': '1'
    			},
    			function(data) {
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Лекционные часы изменен', 'success');
    				else EventInspector_ShowMsg('Ошибка: Изменение лекционных часов', 'error');
    			}
    		);
    	});
    	
    	// Изменение практических часов
    	$('.InputPracticeCount').focusout(function(){
    		$.post(
    			'/~dev_rating/handler/map/ChangeDisciplineHours',
    			{
    				'DisciplineID': DisciplineID,
    				'Hours': $('.InputPracticeCount').val(),
    				'Type': '0'
    			},
    			function(data) {
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Практические часы изменен', 'success');
    				else EventInspector_ShowMsg('Ошибка: Изменение практических часов', 'error');
    			}
    		);
    	});
    	
    	/*
        $(".ChangeDiscipline").click(function(){
    		$.post(
    			'/~dev_rating/handler/map/ChangeDiscipline',
    			{
    				'DisciplineID': DisciplineID,
    				'Grade': $('.SelectGrade').val(),
    				'SubjectID': $('.SelectSubject').val(),
    				'ExamType': $('input:radio[name=ExamType]:checked').val(),
    				'LectionCount': $('.InputLectionCount').val(),
    				'PracticeCount': $('.InputPracticeCount').val(),
    				'FacultyID': $('.SelectFaculty').val()
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Базовые настройки УКД изменены', 'success');
    				else EventInspector_ShowMsg('Ошибка: Базовые настройки УКД', 'error');
    			}
    		);
            return false
        });
    	*/
    	
    	// Переместить вверх МОДУЛЬ
        $(".moduleList").on('click', '.upModule', function(){
            var parentDIV = $(this).parent('div').parent('div').parent('div');
            parentDIV.insertBefore(parentDIV.prev('.moduleGroup'));
    		
    		var ModuleID = parentDIV.attr('id');
    		// Для того, который СТАЛ находится ниже
    		var nextModuleID = parentDIV.next('div').attr('id');
    		SwapModuleOrder(ModuleID, nextModuleID);
    		
            return false
        });
    	
    	// Переместить вниз МОДУЛЬ
        $(".moduleList").on('click', '.downModule', function(){
            var parentDIV = $(this).parent('div').parent('div').parent('div');
    		if ($('div').is(parentDIV.next('.moduleGroup'))) {
    			parentDIV.insertAfter(parentDIV.next('.moduleGroup'));
    			
    			var ModuleID = parentDIV.attr('id');
    			// Для того, который СТАЛ находится выше
    			var prevModuleID = parentDIV.prev('div').attr('id');
    			SwapModuleOrder(ModuleID, prevModuleID);
    		}
    		
            return false
        });
    	
    	// Переместить вверх мероприятие
        $(".moduleList").on('click', '.upSubModule', function(){
            var parentDIV = $(this).parent('div').parent('div');
            parentDIV.insertBefore(parentDIV.prev());
    		
    		var SubmoduleID = parentDIV.attr('id');
    		var nextSubmoduleID = parentDIV.next('div').attr('id');
    		SwapSubmoduleOrder(SubmoduleID, nextSubmoduleID);
    		
            return false
        });
    	
    	// Переместить вниз мероприятие
        $(".moduleList").on('click', '.downSubModule', function(){
            var parentDIV = $(this).parent('div').parent('div');
            parentDIV.insertAfter(parentDIV.next());
    		
    		var SubmoduleID = parentDIV.attr('id');
    		var prevSubmoduleID = parentDIV.prev('div').attr('id');
    		SwapSubmoduleOrder(SubmoduleID, prevSubmoduleID);
    		
            return false
        });
    	
    	// Добавить модуль
    	$('.addModule').click(function(){
    		$('.moduleList').append(GetModuleTmp());
    		var OrderNum = $('.moduleGroup', '.moduleList').last().index('.moduleGroup') + 1;
    		$.post(
    			'/~dev_rating/handler/map/AddModule',
    			{
    				'DisciplineID': DisciplineID,
    				'OrderNum': OrderNum
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true) {
    					// К добавленному модулю добавляем ID
    					var thisModuleDIV = $('.moduleGroup').eq(OrderNum - 1);
    					thisModuleDIV.attr('id', data.ModuleID);
    					// К добавленному в модуль мероприятию добавляем ID
    					thisModuleDIV.children('.subModules').children('.subModule').eq(0).attr('id', data.SubmoduleID);
    					EventInspector_ShowMsg('Модуль добавлен', 'success');
    				} else EventInspector_ShowMsg('Ошибка при добавление модуля', 'error');
    			}
    		);
    		
    		if ($('.empty').css('display') == 'block')
    			$('.empty').css('display', 'none');
    		
    	});
    	
    	// Добавить мероприятие
    	$('.moduleList').on('click', '.addSubModule', function(){
    		$(this).parent().parent().next().append(GetSubModuleTmp());
    		var ModuleID = $(this).parent('div').parent('div').parent('div').attr('id');
    		var SubmodulesDIV = $(this).parent().parent().next('.subModules');
    		var OrderNum = SubmodulesDIV.children('.subModule').last().index() + 1;
    		$.post(
    			'/~dev_rating/handler/map/AddSubmodule',
    			{
    				'ModuleID': ModuleID,
    				'OrderNum': OrderNum
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true) {
    					// К добавленному мероприятию добавляем ID
    					SubmodulesDIV.children('.subModule').eq(OrderNum - 1).attr('id', data.SubmoduleID);
    					EventInspector_ShowMsg('Мероприятие добавлено', 'success');
    				} else EventInspector_ShowMsg('Ошибка при добавление мероприятия', 'error');
    			}
    		);
    	});
    	
    	// Удалить модуль
    	$('.moduleList').on('click', '.deleteModule', function(){
    		$(this).parent().css('display', 'none');
    		$(this).parent().parent().append('<div class="confirmDeleteDiv">Уверены? <span class="confirmDeleteModule">Да</span> <span class="cancel">Нет</span></div>');
    	});
    	
    	// Подтверждение при удаление модуля
    	$('.moduleList').on('click', '.confirmDeleteModule', function(){
    		var subModulesDIV = $(this).parent('div').parent('div').next('.subModules');
    		var CurrentModuleOrder = $(this).parent().parent().parent().index() + 1;
    		// Собираем в JSON строку ID мероприятий
    		var JSONSubmodules = '[';
    		$('.subModule', subModulesDIV).each(function(){
    			JSONSubmodules += $(this).attr('id') + ',';
    		});
    		JSONSubmodules = JSONSubmodules.substr(0, JSONSubmodules.length - 1);
    		JSONSubmodules += ']';
    		//
    		// Собираем ID модулей, которые ниже для того, чтоб сменить их порадок на +1
    		var AttrID = $(this).parent().parent().parent().nextAll().map(function(indx, element){
    			return $(element).attr("id");
    		});
    		var ChangeOrderModulesID = '[' + AttrID.get() + ']';
    		//
    		$.post(
    			'/~dev_rating/handler/map/DeleteModule',
    			{
    				'ModuleID': $(this).parent('div').parent('div').parent('div').attr('id'),
    				'SubmodulesID': JSONSubmodules,
    				'CurrentModuleOrder': CurrentModuleOrder,
    				'ChangeOrderModulesID': ChangeOrderModulesID
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Модуль удален', 'success');
    				else EventInspector_ShowMsg('Ошибка при удаление модуля', 'error');
    			}
    		);
    		$(this).parent('div').parent('div').parent('div').remove();
    	});
    	
    	// Удалить мероприятие
    	$('.moduleList').on('click', '.deleteSubModule ', function(){
    		$(this).parent().css('display', 'none');
    		$(this).parent().parent().append('<div class="confirmDeleteDiv">Уверены? <span class="confirmDeleteSubModule">Да</span> <span class="cancel">Нет</span></div>');
    	});
    	
    	// Подтверждение при удаление мероприятия
    	$('.moduleList').on('click', '.confirmDeleteSubModule ', function(){
    		var subModulesDiv = $(this).parent().parent().parent();
    		var CurrentSubmoduleOrder = $(this).parent().parent().index() + 1;
    		CountCurrentControl(subModulesDiv);
    		CountLandmarkControl(subModulesDiv);
    		// Собираем ID мероприятий, которые ниже для того, чтоб сменить их порадок на +1
    		var AttrID = $(this).parent().parent().nextAll().map(function(indx, element){
    			return $(element).attr("id");
    		});
    		var ChangeOrderSubmodulesID = '[' + AttrID.get() + ']';
    		//
    		$.post(
    			'/~dev_rating/handler/map/DeleteSubmodule',
    			{
    				'SubmoduleID': $(this).parent('div').parent('div').attr('id'),
    				'CurrentSubmoduleOrder': CurrentSubmoduleOrder,
    				'ChangeOrderSubmodulesID': ChangeOrderSubmodulesID
    			},
    			function(data){
    				data = $.parseJSON(data);
    				if(data.success === true)
    					EventInspector_ShowMsg('Мероприятие удалено', 'success');
    				else EventInspector_ShowMsg('Ошибка при удаление мероприятия', 'error');
    			}
    		);
    		$(this).parent('div').parent('div').remove();
    	});
    	
    	// Отмена удаления модулей/мероприятий
    	$('.moduleList').on('click', '.cancel ', function(){
    		$(this).parent().parent().children('.actions').css('display', 'block');
    		$(this).parent().remove();
    	});
    	
    	// Поменять название модуля
    	var ModuleName;
    	$('.moduleList').on('focusin', '.ModuleName', function(){
    		ModuleName = $(this).val();
    	});
    	$('.moduleList').on('focusout', '.ModuleName', function(){
    		var NewModuleName = $(this).val();
    		if (NewModuleName != '' && ModuleName != NewModuleName) {
    			var ID = $(this).parent('div').parent('div').parent('div').attr('id');
    			$.post(
    				'/~dev_rating/handler/map/ChangeModuleName',
    				{
    					'ModuleID': ID,
    					'ModuleName': NewModuleName
    				},
    				function(data){
    					data = $.parseJSON(data);
    					if(data.success === true)
    						EventInspector_ShowMsg('Имя модуля изменено', 'success');
    					else EventInspector_ShowMsg('Ошибка при изменение имени модуля', 'error');
    				}
    			);
    		}
    	});
    	
    	// Поменять название мероприятие
    	var SubmoduleName;
    	$('.moduleList').on('focusin', '.SubmoduleName', function(){
    		SubmoduleName = $(this).val();
    	});
    	$('.moduleList').on('focusout', '.SubmoduleName', function(){
    		var NewSubmoduleName = $(this).val();
    		if (NewSubmoduleName != '' && SubmoduleName != NewSubmoduleName) {
    			var ID = $(this).parent('div').parent('div').attr('id');
    			$.post(
    				'/~dev_rating/handler/map/ChangeSubmoduleName',
    				{
    					'SubmoduleID': ID,
    					'SubmoduleName': NewSubmoduleName
    				},
    				function(data){
    					data = $.parseJSON(data);
    					if(data.success === true)
    						EventInspector_ShowMsg('Имя мероприятия изменено', 'success');
    					else EventInspector_ShowMsg('Ошибка при изменение имени мероприятия', 'error');
    				}
    			);
    		}
    	});
    	
    	// При записи в input текущий контроль
    	// При фокусе
    	var OldMaxRate = 0;
    	$('.moduleList').on('focusin', '.inputCurrentControl', function(){
    		OldMaxRate = $(this).val();
    	});
    	// При потери фокуса
    	$('.moduleList').on('focusout', '.inputCurrentControl', function(){
    		SetNewRateAndControl($(this), OldMaxRate);
    	});
    	
    	// При записи в input рубежный контроль
    	// При фокусе
    	var OldMaxRate = 0;
    	$('.moduleList').on('focusin', '.inputLandmarkControl', function(){
    		OldMaxRate = $(this).val();
    	});
    	// При потери фокуса
    	$('.moduleList').on('focusout', '.inputLandmarkControl', function(){
    		SetNewRateAndControl($(this), OldMaxRate);
    	});
    	
    	// В inputCredit (где баллы вводить) разрешаем вводить только цифры
    	$(".moduleList").on('keydown', '.inputCredit', function(event) {
            KeyDownOnlyNumber(event);
        });
    	
    // ------ Прикрипление студентов/групп/преподавателей --
    
    var FacultyID = $('.HiddenInputFacultyID').val(); // Факультет, к которой привязана дисциплина
    $('.HiddenInputFacultyID').remove(); // Тут даже Шерлок Холмс бессилен
    
    function BindGroup(id, StudyGroupName){
    	return '\
    	<div class="AttachedGroup" id="'+ id +'">\
    		<div class="StudyGroupInfo">'+ StudyGroupName +'</div>\
    		<div class="UnbindGroup">Отсоединить группу</div>\
    	</div>';
    }
    
    // Прикрепить группу
    $('.AttachGroupButton').click(function(){
    	var StudyGroupID = $('.SelectStudyGroup').val();
    	var StudyGroupName = $(".SelectStudyGroup option:selected").text();
    	$.post(
    		'/~dev_rating/handler/map/BindGroup',
    		{
    			'StudyGroupID': StudyGroupID,
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if(data.success === true) {
    				$('.AttachedGroupsList').append(BindGroup(StudyGroupID, StudyGroupName));
    				EventInspector_ShowMsg('Группа добавлена', 'success');
    			}
    			else EventInspector_ShowMsg('Ошибка при добавление группы', 'error');
    		}
    	);
    });
    
    // Отсоединить группу
    $('.AttachedGroupsList').on('click', '.UnbindGroup', function(){
    	var StudyGroupID = $(this).parent().attr('id');
    	var GroupDIV = $(this).parent();
    	$.post(
    		'/~dev_rating/handler/map/UnbindGroup',
    		{
    			'StudyGroupID': StudyGroupID,
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if(data.success === true) {
    				GroupDIV.remove();
    				EventInspector_ShowMsg('Группа отсоединена', 'success');
    			}
    			else EventInspector_ShowMsg('Ошибка при отсоединение группы', 'error');
    		}
    	);
    });
    
    // Поиск студентов
    function AddStudent(ID, Name, From, GroupID, Bind){ 
    	if (Bind == true)
    		var Status = 'StatusBind';
    	else 
    		var Status = 'StatusUnbind';
    	var r = '\
    		<div id="'+ ID +'" class="Student '+ Status +' '+ GroupID +'">\
    			<span class="Name">'+ Name +'</span> \
    			<span class="From">'+ From +'</span>';
    	if (Bind == true)
    		r +='<span class="action Action_UnbindStudent">Отсоединить студента</span>';
    	else
    		r +='<span class="action Action_BindStudent">Прикрепить студента</span>';
    	r +=
    		'</div>';
    	return r;
    }
    
    // Поиск студентов
    function CallSearchStudents() {
    	var Name = [];
    	if ($('.InputStudentName ').val() > 0)
    		Name = ($('.InputStudentName ').val()).split(' ');
    	$.post(
    		'/~dev_rating/handler/map/SearchStudents',
    		{
    			'GradeID': $('.SelectGrade').val(),
    			'GroupN': $('.SelectStudyGroup').val(),
    			'FacultyID': FacultyID,
    			'Last': Name[0],
    			'First': Name[1],
    			'Second': Name[2],
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			SearchResult = $.parseJSON(data);
    			$('.SearchResult').html('');
    			if (parseInt(SearchResult.Count) > 0)
    				for(var i = 1; i <= parseInt(SearchResult.Count); i++) {
    				var ID = SearchResult[i].StudentID;
    				var Name = SearchResult[i].StudentLast +' '+  SearchResult[i].StudentFirst +' '+ SearchResult[i].StudentSecond;
    				var From = 'Курс ' + SearchResult[i].GroupGrade + ', Группа ' + SearchResult[i].GroupNum;
    				var GroupID = 'GroupID_'+SearchResult[i].GroupID
    				$('.SearchResult').append(AddStudent(ID, Name, From, GroupID, false));
    				}
    			else
    				$('.SearchResult').html('<p class="notification">Нет результатов... Возможно, студенты, соответствующие критериям поиска, уже прикреплены.</p>');
    		}
    	);	
    }
    
    $('.SelectGrade').change(function(){
    	$.post(
    		'/~dev_rating/handler/map/GetStudyGroups',
    		{
    			'FacultyID': FacultyID,
    			'GradeID': $('.SelectGrade').val()
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if (data != null && data != undefined) {
    				$('.SelectStudyGroup').html('<option value="0">Выберите группу:</option>');
    				for (i = 1; i <= data.count; i++) {
    					$('.SelectStudyGroup').append('<option value="'+ data[i].GroupID +'">Группа '+ data[i].GroupNum +' - '+ data[i].SpecName +'</option>');
    				}
    				
    				if (data.count <= 0)
    					$('.SelectStudyGroup').append('<option value="0">Нет групп</option>');		
    			}
    			CallSearchStudents();
    		}
    	);
    });
    $('.SelectStudyGroup').change(function(){
    	CallSearchStudents();
    });
    $('.InputStudentName').focusout(function(){
    	CallSearchStudents();
    });
    $('.InputStudentName').keydown(function(e){
    	if(e.keyCode==13){
    		$('.InputStudentName').focusout('focusout');
    		$(this).blur();
    	}
    });
    
    $('.SelectGrade').focusout(function(){
    	$('.SelectGrade').trigger('change');
    });
    $('.SelectStudyGroup').focusout(function(){
    	$('.SelectStudyGroup').trigger('change');
    });
    
    // Прикрепить студента 
    $('.StudentsList').on('click', '.Action_BindStudent', function(){
    	var thisObj = $(this);
    	$(this)
    		.removeClass('Action_BindStudent')
    		.addClass('Action_UnbindStudent')
    		.text('Отсоединить студента');
    	$(this)
    		.parent()
    		.removeClass('StatusUnbind')
    		.addClass('StatusBind');
    	var ID = $(this).parent().attr('id');
    	$.post(
    		'/~dev_rating/handler/map/BindStudent',
    		{
    			'StudentID': ID,
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if(data.success === true) {
    				var reg = /GroupID_\d+/;
    				var GroupID = ''+reg.exec(thisObj.parent().attr('class'));
    				var ID = thisObj.parent().attr('id');
    				var Name = thisObj.siblings('.Name').text();
    				var From = thisObj.siblings('.From').text();
    				if ($('div').is('.GroupContainer.'+GroupID) === false) {
    					$('.AttachedStudentsList').append('\
    						<div class="GradeAndGroupTitle ActionShowHideGroupContainer">\
    						<span class="info">'+From+'</span>\
    						<span class="Action">Открыть список ▼</span>\
    					</div>');
    					$('.AttachedStudentsList').append('<div class="GroupContainer '+GroupID+'" style="display: block"> </div>');
    				}
    				$('.GroupContainer.'+GroupID).append(AddStudent(ID, Name, From, GroupID, true));
    				thisObj.parent().remove();
    				EventInspector_ShowMsg('Студент добавлен', 'success');
    			}
    			else EventInspector_ShowMsg('Ошибка при добавление студента', 'error');
    		}
    	);
    });
    
    // Отсоединить студента 
    $('.StudentsList').on('click', '.Action_UnbindStudent', function(){
    	$(this)
    		.removeClass('Action_UnbindStudent')
    		.addClass('Action_BindStudent')
    		.text('Прикрепить студента');
    	$(this)
    		.parent()
    		.removeClass('StatusBind')
    		.addClass('StatusUnbind');
    	var ID = $(this).parent().attr('id');
    	$.post(
    		'/~dev_rating/handler/map/UnbindStudent',
    		{
    			'StudentID': ID,
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if(data.success === true)
    				EventInspector_ShowMsg('Студент отсоединен', 'success');
    			else EventInspector_ShowMsg('Ошибка при отсоединение студента', 'error');
    		}
    	);
    });
    
    $('.StudentsList').on('click', '.ActionShowHideGroupContainer', function(){
    	if ($(this).next('.GroupContainer').css('display') == 'none') {
    		$(this).children('.Action').text('Скрыть список ▲');
    		$(this).next('.GroupContainer').show();
    	}
    	else {
    		$(this).children('.Action').text('Открыть список ▼');
    		$(this).next('.GroupContainer').hide();
    	}
    });
    
    // Добавить преподавателя
    function AddTeacher(ID, Name, Action){
    	$r = '\
    		<div class="Teacher" id="'+ ID +'">\
    			<div class="Name">'+ Name +'</div>';
    	if (Action == 'Unbind')
    		$r += '<div class="Action_UnbindTeacher Action">Отсоединить</div>';
    	if (Action == 'Bind')
    		$r += '<div class="Action_BindTeacher Action">Присоединить</div>';
    	$r += '\
    		</div>';
    	return $r;
    }
    
    
    // Поиск преподавателей
    function CallSearchTeachers(){
    	var Name = [];
    	Name = ($('.InputTeacherName ').val()).split(' ');
    	$.post(
    		'/~dev_rating/handler/map/SearchTeachers',
    		{
    			'FacultyID': $('.SelectFaculty').val(),
    			'DepartmentID': $('.SelectDepartment').val(),
    			'Last': Name[0],
    			'First': Name[1],
    			'Second': Name[2],
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			SearchResult = $.parseJSON(data);
    			if (SearchResult != null && SearchResult != undefined) {
    				$('.SearchResult').html('');
    				if (parseInt(SearchResult.Count) > 0)
    					for(var i = 1; i <= parseInt(SearchResult.Count); i++) {
    						var Name = SearchResult[i].TeacherLast + ' ' + SearchResult[i].TeacherFirst + ' ' + SearchResult[i].TeacherSecond;
    						$('.SearchResult').append(AddTeacher(SearchResult[i].TeacherID, Name, 'Bind'));
    					}
    				else
    					$('.SearchResult').html('<p class="notification">Нет результатов... Возможно, преподаватели, соответствующие критериям поиска, уже прикреплены.</p>');
    			}
    		}
    	);
    }
    
    // Выборка кафедр
    $('.SelectFaculty').change(function(){
    	$.post(
    		'/~dev_rating/handler/map/GetDepartments',
    		{
    			'FacultyID': $('.SelectFaculty').val()
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if (data != null && data != undefined) {
    				$('.SelectDepartment').html('<option value="0">Выберите кафедру (не обязательно)</option>');
    				for (i = 1; i <= data.count; i++) {
    					$('.SelectDepartment').append('<option value="'+ data[i].DepID +'">'+ data[i].DepName +'</option>');
    				}
    				
    				if (data.count <= 0)
    					$('.SelectDepartment').append('<option value="0">Нет кафедр</option>');		
    			}
    			CallSearchTeachers();
    		}
    	);
    });
    
    $('.SelectDepartment ').change(function(){
    	CallSearchTeachers();
    });
    $('.InputTeacherName').focusout(function(){
    	CallSearchTeachers();
    });
    $('.InputTeacherName').keydown(function(e){
    	if(e.keyCode==13){
    		$('.InputTeacherName').focusout('focusout');
    		$(this).blur();
    	}
    });
    
    $('.SelectFaculty').focusout(function(){
    	$('.SelectFaculty').trigger('change');
    });
    $('.SelectDepartment').focusout(function(){
    	$('.SelectDepartment').trigger('change');
    });
    
    // Конец поиска преподавателей
    
    // Отсоединить преподавателя
    $('.TeachersList').on('click', '.Action_UnbindTeacher', function(){
    	$(this)
    		.parent()
    		.remove();
    	var ID = $(this).parent().attr('id');
    	$.post(
    		'/~dev_rating/handler/map/UnbindTeacher',
    		{
    			'BindingTeacher': ID,
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if(data.success === true)
    				EventInspector_ShowMsg('Преподаватель отсоединен', 'success');
    			else EventInspector_ShowMsg('Ошибка при отсоединение преподавателя', 'error');
    		}
    	);
    });
    
    // Присоединить преподавателя
    $('.TeachersList').on('click', '.Action_BindTeacher', function(){
    	$(this)
    		.parent()
    		.remove();
    	var ID = $(this).parent().attr('id');
    	var Name = $(this).siblings('.Name').text();
    	$.post(
    		'/~dev_rating/handler/map/BindTeacher',
    		{
    			'BindingTeacher': ID,
    			'DisciplineID': DisciplineID
    		},
    		function(data){
    			data = $.parseJSON(data);
    			if(data.success === true) {
    				$('.BindTeachersList').append(AddTeacher(ID, Name, 'Unbind'));
    				EventInspector_ShowMsg('Преподаватель прикреплен', 'success');
    			}
    			else EventInspector_ShowMsg('Ошибка при прикрепление преподавателя', 'error');
    		}
    	);
    });
    
    });