function highlightCode(force) {
	var $tarea = $("#newCode");
	if (!Text.hasText($tarea.val())) {
		$tarea.css('border', "1px solid red");
		alert("Расместите код!");
		$tarea.css('border', "1px solid #d0d0d0").focus();
		return false;
	}
	
	var btn = $("#previewBut")[0];
	if (mode == 1 && !force) {
		cleanCode();
		return true;
	}
	
	var lang = $("#newCodeLangSEL").val();
	var code = $("#newCode").val();
	var sizes = {x: $("#newCode").width(), y: $("#newCode").height()};
	
	var $ind = $("img.progressIcon").show();
	
	var saveBtn = $("#saveBtn")[0];
	
	btn.disabled = true;
	saveBtn.disabled = true;
	
	$.post('/ajax/highlight/', {'lang':lang, 'code':code}, function(ans, status) {
		$("#newCode").hide();
		$("#highlightedCode").html(ans).show();
	
		$ind.hide();
		
		btn.disabled = false;
		btn.value = "Редактировать";
		
		$("#langBut").show();
		saveBtn.disabled = false;
		mode = 1;
		$("#stretchIcon,#narrowIcon,#selectIcon").attr('disabled', "disabled");
		$("#dblWarn,#escWarn").toggle();
	}, "html");
	return true;
}

function cleanCode() {
	var btn = $("#previewBut")[0];
	var $hCode = $("#highlightedCode");
	$("#newCode").height( $hCode.height() );
	$hCode.hide();
	$("#newCode").show().focus();
	btn.value = "Предпросмотр";
	
	mode = 0;
	$("#stretchIcon,#narrowIcon,#selectIcon").removeAttr('disabled');
	$("#dblWarn,#escWarn").toggle();
	return true;
}

function handleLang(sel) {
	if ($(sel).val() == -1) {
		$("#altlangINP").show();
	} else {
		$("#altlangINP").hide();
	}
	return true;
}

var validateStatus = {uri: false, captcha: false}; 
//uriNameCheck = false, captchaCheck = false, allCheckPass = false;
function validateCodeForm(logged) {
	var f = $("form[name=newCodeForm]");
	var revID = $(":hidden[name='codeID']", f).val();
	var err = false, errText = "заполните необходимые поля!";
	$("#errMess").hide();
	
	var $inp = $("input[name=codename]", f);
	if (!Text.hasText($inp.val())) {
		$inp.css('border', "1px solid red");
		if (!err) $inp.focus();
		err = true;
	} else {
		$inp.css('border', "1px solid #d0d0d0");
	}
	
	var $inp = $uriname = $("input[name=uriname]", f);
	if (!Text.hasText($inp.val())) {
		$inp.css('border', "1px solid red");
		if (!err) $inp.focus();
		err = true;
	} else {
		$inp.css('border', "1px solid #d0d0d0");
	}
	
	var $tarea = $("textarea[name=code]", f);
	if (!err && !Text.hasText($tarea.val())) {
		$tarea.css('border', "1px solid red").focus();
		alert("Расместите код!");
		err = true;
	} else {
		$tarea.css('border', "1px solid #d0d0d0");
	}
	
	var $inp = $("input[name=altlang]", f);
	if ($("#newCodeLangSEL").val() == -1 && !Text.hasText($inp.val())) {
		$inp.css('border', "1px solid red");
		if (!err) $inp.focus();
		err = true;
	} else {
		$inp.css('border', "1px solid #d0d0d0");
	}
	
	var catchaAccess = $("#captchaTD").size() == 1 && $("#captchaTD").css('display') != "none";
	var $inp = $captchaInp = $("input[name=captcha_from_user]", f);
	if (!logged && catchaAccess && !Text.hasText($inp.val())) {
		$inp.css('border', "1px solid red");
		if (!err) $inp.focus();
		err = true;
	} else {
		$inp.css('border', "1px solid #d0d0d0");
	}
	
	function _show() {
		if (err) {
			$("#errMess").html(errText);
			$("#errMess").show();
		}
	};
	_show();
	
	/* Финальные асинхронные проверки */
	if (!err) {
		if (!validateStatus.uri) {
			var pLangID = $("#newCodeLangSEL").val();
			$.post('/ajax/checkuriname/', {'uriName':$uriname.val(), 'pLangID':pLangID, 'codeID':revID}, function(ans, status) {
				if (ans.errUsed) {
					err = true;
					errText = "данное uri-имя уже используется, выберите другое";
					$uriname.css('border', "1px solid red").focus();
					_show();
					return false;
				} else {
					validateStatus.uri = true;
					validateCodeForm(logged); /* запускаем проверку оставшихся полей */
				}
			}, "json");
		} else if (catchaAccess && !logged && !validateStatus.captcha) {
			var pLangID = $("#newCodeLangSEL").val();
			$.post('/ajax/check-captcha/', {'captcha_from_user':$captchaInp.val()}, function(ans, status) {
				if (ans.result) {
					validateStatus.captcha = true;
					validateCodeForm(logged); /* запускаем проверку оставшихся полей */
				} else {
					err = true;
					errText = "Неправильный код";
					$captchaInp.css('border', "1px solid red").focus();
					_show();
					return false;
				}
			}, "json");
		} else {
			validateStatus.captcha = true;
		}
	}
	
	if (validateStatus.uri && validateStatus.captcha) {
		var $inp = $("input[name=editpassw]", f);
		if (!logged && !err && !Text.hasText($inp.val())) {
			$inp.css('border', "1px solid red").focus();
			if (!window.confirm("Вы не сможете потом отредактировать данный код!\nПродолжать?")) {
				return false;
			}
		}
		f.submit();
		return true;
	}
	
	return false;
}

function selectTAreaCode(tareaID) {
	$("#" + tareaID).focus().select();
	return true;
}

function toggleNewCodeForm(frmID, forceShow, lnk) {
	if (lnk) $lnk = $(lnk); else $lnk = $("#newCodeBottomLink");
	$frm = $("#" + frmID);
	show = ($frm.css('display') == 'none') || forceShow;
	if (show) {
		emptyRevForm();
		$frm.show();
	} else {
		$frm.hide();
	}
	var txt = (show ? "-" : "+") + $lnk.text().substring(1);
	$lnk.text(txt);
	return false;
}

function switchCodeView(revID, mode) {
	
	// default:
	var hltPrfx = "hltRev", plainPrfx = "plainCode", iconPrfx = "c";
	
	if (mode && mode == 'i') { // псевдокод или внутренний фрагмент
		hltPrfx = "hltIRev";
		plainPrfx = "plainICode";
		iconPrfx = "ic";
	}
	
	var $hRev = $("#" + hltPrfx + revID);
	var $plainCode = $("#" + plainPrfx + revID);
	$plainCode.height($hRev.height());
	$hRev.toggle();
	$plainCode.toggle();
	if ($plainCode.css('display') != 'none') $plainCode.focus();
	
	/* манипулируем кнопками */
	$("#plainTextIcon_" + iconPrfx + revID).toggle();
	$("#highlightIcon_" + iconPrfx + revID + ",#selectAllIcon_" + iconPrfx + revID).toggle();
	
	return true;
}

function editRevision(revID) {
	$("form[name='newCodeForm'] :hidden[name='codeID']").val(revID);
	$revPasswBlock = $("#revPasswBlock_c" + revID);
	$revPasswInp   = $("#revPassw_c" + revID);
	if ($revPasswBlock.size() == 1) {
		if ($revPasswBlock.css('display') == 'none') {
			// отображаем пароль и выход
			$revPasswBlock.show();
			$revPasswInp.focus();
			return false;
		}
	}
	
	// проверка пароля и запуск редактирования
	_manageErr(false);
	$.post('/ajax/authorize_codeinfo/', {'codeID':revID, 'passw':$("#revPassw_c" + revID).val()}, function(ans, status) {
		if (ans.access) {
			_runEdit(ans.privateInfo);
			return true;
		} else {
			_manageErr(true);
			//_runEdit();
			return false;
		}
	}, "json");
	
	function _runEdit(privateInfo) {
		toggleNewCodeForm('newForm', true);
		var $revForm = $("#newForm");
		
		$("input[name='codeID']", $revForm).val( revID );
		$("input[name='codename']", $revForm).val( privateInfo.name ).focus();
		$("input[name='wintitle']", $revForm).val( privateInfo.title );
		$("input[name='uriname']", $revForm).val( privateInfo.uriname );
		$("input[name='newtask']", $revForm).val( privateInfo.taskid );
		$("select[name='plang']", $revForm).val( privateInfo.plang );
		$("textarea[name='codedesc']", $revForm).val( privateInfo.desc );
		$("textarea[name='code']", $revForm).val( $("#plainCode" + revID).val() );
		
		$("input[name='nickname']", $revForm).val(privateInfo.nickname);
		$("input[name='email']", $revForm).val(privateInfo.email);
		$("input[name='editpassw'],input[name='authPassw']", $revForm).val(privateInfo.editpassw);
		$("#captchaTD").hide();
		$("#revisionBlock").hide();
	};
	
	function _manageErr(show) {
		$passwInp = $revPasswBlock.find("input");
		$errMsg = $("#errMsg_c" + revID); 
		if (show) {
			$passwInp.addClass('err').focus();
			$errMsg.html("неверный пароль!").show();
		} else {
			$passwInp.removeClass('err');
			$errMsg.html("").hide();
		}
		
	};
	
	return false;
}

function emptyRevForm() {
	var $revForm = $("#newForm");
	
	if ($("#highlightedCode").css('display') != 'none') {
		cleanCode();
		$("#newCode").css('height', 200);
	}
	
	$("input[name='codeID'],input[name='codename'],input[name='wintitle'],input[name='uriname'],input[name='altlang'],textarea[name='code'],textarea[name='codedesc'],input[name='nickname'],input[name='email'],input[name='editpassw'],input[name='authPassw']", $revForm).val("");
	//$("select[name='plang']", $revForm).val("java");
	$("input[name='altlang']", $revForm).hide();
	$("#captchaTD").show();
}

function fillTasks(sel, taskID) {
	var secID = $(sel).val();
	var options = [];
	if (secID > 1) {
		$.post('/ajax/gettasks2sec/', {'secID':secID}, function(ans, status) {
			if (status == 'success') {
				$(ans.result).each(function() {
					options.push({value:this['id'], name:this['name']});
				});
				if (options.length == 0) _empty();
				_fill();
				return false;
			}
		}, "json");
	} else {
		_empty();
		_fill();
	}
	
	function _empty() {
		options = [{id:0, value: "задача..."}];
	}
	
	function _fill() {
		Forms.addOptions($("#revFormTaskSEL")[0], options);
		$("#revFormTaskSEL").val(taskID);
	}
	
	return true;
}

function activateTaskChangeMode(btn, secID, taskID) {
	$('#changeElements,#revFormTaskLnk').add(btn).toggle();
	$('#revFormSecSEL').val(secID).change();
	$('#revFormTaskSEL').val(taskID);
	return true;
}
