<?php

require ("../lib/genopar.lib.php");

if(!doAuth(LVLADM)) {
	$genopar->fechaPagina(); exit;
}

echo '
<script type="text/javascript" src="'.$URL_PADRAO.'/css/ddown.js"></script>

<script>
function abreLink(url){
	window.open(url, "", "toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=600,height=400");
}

function strToUpper(){
	document.orf.seq.value = document.orf.seq.value.toUpperCase();
}

function atualizaTamSeq(){
    tam = document.orf.orfSeq.value.length
    document.orf.tam.value = tam
}

function atualizaIndiceCursor(el) { 
  
  if (el.selectionStart || el.selectionEnd) { 
    if (el.selectionStart != el.selectionEnd){
	document.orf.selecaoInicio.value = el.selectionStart+1;
	document.orf.selecaoFim.value = el.selectionEnd;
	document.orf.base.value = "";
    }
    else{
	document.orf.base.value =  el.selectionStart;
    }
    return;
  } else if (document.selection) { 
    el.focus(); 

    var r = document.selection.createRange(); 
    if (r == null) { 
      document.orf.base.value = 0; 
      return;
    } 

    var re = el.createTextRange(), 
        rc = re.duplicate(); 
    re.moveToBookmark(r.getBookmark()); 
    rc.setEndPoint(\'EndToStart\', re); 

    document.orf.base.value =  rc.text.length; 
    return;
  }  
  document.orf.base.value =  0;
}

function posicionaCursor(n){
	el = document.orf.orfSeq;
	el.focus();
	el.selectionStart = n-1;
	el.selectionEnd = n;
}

function selecionarBases(i,j){
	el = document.orf.orfSeq;
	el.focus();
	el.selectionStart = i;
	el.selectionEnd = j;
}


</script>
<style>
body {
	background: #DDE;
}
</style>
</head>
<body>
 <div style="
	margin-top: 10px;
	margin-left: 10px;
	margin-right: 10px;

	width: auto;

	overflow: auto;
	background:#EEF;
	text-align:justify;

	border-top:3px dotted #666;
	border-left:3px dotted #666;
	border-right:3px dotted #666;
	border-bottom:3px dotted #666;

	padding-top: 3px;
	padding-left: 10px;
 "> ';

verGetPost(array('id', 'mtg', 'orfSeq', 'tam', 'start', 'end', 'tamInicial'));

$genopar= new Genopar(__FILE__);

if ($id == '')
	$genopar->error("Erro.");

$editor = $UserAuth_username;

$tipos = array('n', 'p');

$ntDir = "../Fasta/$mtg/ORFs/n/";
$aaDir = "../Fasta/$mtg/ORFs/p/";

$fileName = $ntDir."ORF".$id.".fas";
$aaFileName = $aaDir."ORF".$id.".fas";

$seq = '';
$col = 60;

if (!$start || !$end){
	$query = "SELECT start, end FROM orf WHERE idMontagem='$mtg' AND id='$id'";
	$genopar->abreBanco();
	$n = $genopar->queryBanco($query);

	if ($n != 1) exit;

	$row = $genopar->getArray();
	$start = $row['start'];
	$end = $row['end'];
	$genopar->fechaBanco();
}
$file = fopen($fileName, "r");
$tit = fgets($file, 1024);

if (!$orfSeq){
	echo "$tit";
	
	echo "<form name=orf method=POST>\n";
	echo "<input type=hidden name=start value=$start>";
	echo "<input type=hidden name=end value=$end>";
	echo "<textarea name=orfSeq cols=".($col+1)." rows=12 onKeyUp='atualizaTamSeq(); atualizaIndiceCursor(this);' onMouseUp='atualizaIndiceCursor(this)' strToUpper()' style=\"padding:2px\">\n";

	while (!feof($file))
		$seq .= trim(strtoupper(fgets($file, 4096)));

	echo $seq;

	echo '</textarea>';

	echo "<input type=hidden name=tamInicial value=".strlen($seq).">";

	echo '<p>';
	echo 'Tamanho da ORF: <input name=tam type=text size=3 value='.strlen($seq).' readonly>';

	echo 'Base: <input name=base type=text size=3>';
	echo '<input type=submit name=irPara value="Ir para" onClick="posicionaCursor(document.orf.base.value); return false;"><BR>';

	echo 'Seleção: <input name=selecaoInicio type=text size=3> - <input name=selecaoFim type=text size=3>';
	echo '<input type=submit name=selecao value="Selecionar" onClick="selecionarBases(document.orf.selecaoInicio.value -1 , document.orf.selecaoFim.value); return false;">';

	echo '</p>';
	echo "<p>";

	echo '<input type=submit name=submit value=Editar>';
	echo '</form>';
	echo "</p>";
}else{
	echo "Applying changes...";
	
	$query = "SELECT contigId FROM orf WHERE idMontagem='$mtg' AND id='$id'";
	$genopar->abreBanco();
	$n = $genopar->queryBanco($query);

	if ($n != 1) exit;

	$row = $genopar->getArray();
	$ctgId = $row['contigId'];
	$genopar->fechaBanco();

	$dif = $tamInicial - $tam;

	$ctgFileName = "../Fasta/$mtg/Contigs/n/Contig$ctgId.fas";
	$aaCtgFileName = "../Fasta/$mtg/Contigs/p/Contig$ctgId.fas";

/*
 * salvar no arquivo a subsequencia $orfSeq (na ordem em que veio da textarea. se for reversa, o script de update vai arrumar)
*/
	$outOrfFile = fopen($fileName, 'w');
	
	fprintf($outOrfFile, "%s%s", $tit, $orfSeq);
	
	if ($start < $end){ #fita normal
	    $newEnd = $end - $dif;
	    $newStart = $start;
	}else{
	    $newStart = $start - $dif;
	    $newEnd = $end;
	}
	

	system("cd ../bin && perl updateOrfStart.pl $mtg $ctgId $id $newStart $newEnd");

/*
 * bin/updateCtgSeq.pl $ctgFileName $fileName $start $end
*/
	system("cd ../bin && perl updateCtgSeq.pl $mtg $ctgFileName $fileName $start $end");

/* bin/nt2aa.pl $fileName $aaFileName
 * bin/nt2aa.pl $ctgFileName $aaCtgFileName
 */

	system("cd ../bin && perl nt2aa.pl $fileName $aaFileName");
	system("cd ../bin && perl nt2aa.pl $ctgFileName $aaCtgFileName");

/* atualizar no banco todas as orfs subsequentes
 * SELECT * FROM orf WHERE idMontagem='$mtg' AND contigId=$ctgId AND id > $id
 */

	$genopar->abreBanco();

	$query = "SELECT id, start, end, frame FROM orf WHERE idMontagem='$mtg' AND contigId=$ctgId AND start > $start";
	$genopar->queryBanco($query);
	$listaOrf = array();
	
	while($res = $genopar->getArray(MYSQL_ASSOC)){
		foreach($res as $key => $value)
			$listaOrf[$res['id']][$key] = $value;
	}


/* 	PARA CADA ORF
 * 	CALCULAR NOVO FRAME
 * 	UPDATE orf SET start = start - $dif, end = end - $dif, frame = $novoFrame WHERE idMontagem ='$mtg' AND contigId = $ctgId AND id = $currentOrfId
 */
	foreach($listaOrf as $orf){
		$newOrfStart = $orf['start'] - $dif;
		$newOrfEnd = $orf['end'] - $dif;
		$newOrfFrame = calculaFrame($newOrfStart, $newOrfEnd);
		
		$query = "
			UPDATE orf
			SET
				start=$newOrfStart,
				end = $newOrfEnd,
				frame ='$newOrfFrame'
			WHERE
				idMontagem ='$mtg' AND
				contigId = $ctgId AND
				id = '".$orf['id']."'
			";
		$genopar->queryBanco($query);
	}
	
	// ATUALIZA RBS
	$query = "
		UPDATE rbs
		SET
			start = start - $dif,
			stop = stop - $dif,
			position = position - $dif,
			old_position = old_position - $dif
		WHERE
			idMontagem='$mtg' AND
			start > $start	  AND
			position > 0";
	
	$genopar->queryBanco($query);
	
	
	$query = "
		UPDATE rbs
		SET
			position = position - $dif
		WHERE
			idMontagem='$mtg' AND
			id='$id' 	  AND
			position > 0";
	
	$genopar->queryBanco($query);
	
	// ATUALIZA START CODON
	$query = "
		UPDATE startCodons
		SET
			position = position - $dif,
			orfStart = orfStart - $dif
		WHERE
			idMontagem = '$mtg'				AND
			idOrf like '".sprintf("%04d", $ctgId)."%'	AND
			position > $start";

	$genopar->queryBanco($query);
	
	// ATUALIZA TRNA
	$query = "
		UPDATE tRNA
		SET
			begin = begin - $dif,
			end = end - $dif
		WHERE
			idMontagem = '$mtg'	AND
			contigId = $ctgId	AND
			begin > $start";
			
	$genopar->queryBanco($query);
	
	echo "[Done]<BR>";
	
	// Inserir informacao de BLAST desatualizado
	$query = "
		INSERT INTO edicaoORF
		VALUES ('$mtg', '$id', '$editor', CURRENT_DATE (), 0, '')";
	
	$genopar->queryBanco($query);
	
	$genopar->fechaBanco();
	
	system("rm tmp/*\.$mtg\.$contig\.*");
	
	echo "<h3>Refresh the ORF Page to see the modifications.</h3>";
}

function calculaFrame($start, $end){
	$frame = $start % 3;
	
	if ($start < $end){
		if ($frame == 0)
			$frame = 3;
		
		return "F".$frame;
	}else{
		if ($frame == 2)
			$frame = 3;
		elseif ($frame == 0)
			$frame = 2;
		
		return "R".$frame;
	}
}

?>
