function Rez(M){
	for (var j=0; j<n+mp+2*mm+1; j++){
		for (var i=0; i<mp+mm+d; i++){
			var amin=Math.floor(M[j][i]);
			var amax=Math.ceil(M[j][i]);
			if (M[j][i]-amin < 1e-7) M[j][i]=amin;
			else if (amax-M[j][i] < 1e-7) M[j][i]=amax;
		}
	} 
	return M;
}

function Write(A,B){
var s=" ";
s+="<table border=1 width=100 height=70><caption align='top'><h3>Линейная оптимизация. Симплекс-метод</h3></caption><tr>";
for (var j=1; j<=n+mp+2*mm; j++)
   s=s+"<th width=1 height=1 >x"+j+"</th>";
s+="<th width=1 height=1 >value</th>";
s+="<th width=1 height=1 >basis</th></tr>";
for (var i=1; i<=mp+mm+d; i++){
   s+='<tr>';
   for (var j=1; j<=n+mp+2*mm+1; j++)
              s=s+"<td width=1 height=1><input type='text' name=a"+i+'a'+j+" value="+Math.round(A[j-1][i-1]*10000)/10000+" size=10>";
if (i<mp+mm+1)
  s=s+"<td width=1 height=1 ><input type='text' name=x"+i+" value=x"+B[i-1]+" size=10></td></tr>"; 
 else if (i==mp+mm+1)
  s+="<th width=1 height=1 >Z</th></tr>"; 
 else if (i==mp+mm+2)
  s+="<th width=1 height=1 >W</th></tr>";
} 
s+="</table><br>";
return s;
}

function Read(){
   var a=[],b=[];
   for (var j=1; j<=n+mp+2*mm+1; j++){
	for (var i=1; i<=mp+mm+d; i++){
		var tester=parseFloat(evall(eval('document.st.a'+i+'a'+j+'.value')));
		if (isNaN(tester)){
			alert("Есть пустые или нечисловые клетки !");
			return [['a']];
		}
        	else b.push(tester);
	}
	a.push(b);
	b=[];
   }
   return a;
}

function read(){
	var b=[];
	for (var i=1; i<=mp+mm; i++)
		b.push(eval('document.st.x'+i+'.value'));
	return b;
}

function Paste(a,b){
	for (var j=1; j<=n+mp+2*mm+1; j++){
		for (var i=1; i<=mp+mm+d; i++)
			eval('document.st.a'+i+'a'+j+'.value='+a[j-1][i-1]);
	}				
	for (var i=1; i<=mp+mm; i++) eval('document.st.x'+i+'.value=b[i-1]');
}

function Mult(){
	var a = Read();
	var b = read();
	var k=parseInt(document.st.r3.value);
	var l=parseInt(document.st.r4.value);
	var x=parseFloat(eval(document.st.num.value));
	if (isNaN(k) || isNaN(l) || isNaN(x) || isNaN(a[0][0])) 	{ 
		alert("Сначала нужно указать номера строк и число\n\
		, а также правильно заполнить таблицу");
		return;
	}
	else {
		for (var j=0; j<n+mp+2*mm+1; j++) a[j][l-1]-=a[j][k-1]*x;
		ma.push(Read());
		mb.push(read());
		Paste(Rez(a),b);
		if (mm>0 && a[n+mp+2*mm][mp+mm+1]==0){
			for (var j=n+mp+mm+1;j<=n+mp+2*mm;j++)
			    for (var i=1;i<=mp+mm+d;i++)
			        eval('document.getElementById("b'+i+'b'+j+'").style.background = "red"');
			for (var j=1 ;j<=n+mp+mm;j++)
				eval('document.getElementById("b'+(mp+mm+d)+'b'+j+'").style.background = "red"');
		}
		for (var j=0; j<n+mp+mm; j++){
			if (a[j][mp+mm]>0) break;
			else {
				if (j==n+mp+mm-1) document.getElementById("auth").hidden=false;
				else continue;
			}
		}
	}	
}

function Stringer()
{
	var a = Read() ;
	var b = read() ;
	var k=parseInt(document.st.row.value),l=parseInt(document.st.col.value);		
	if (isNaN(k) || isNaN(l) || isNaN(a[0][0])){ 
		alert("Сначала нужно указать номер строки и столбца\n\
		 и правильно заполнить таблицу");
		return;
	}
	else {
		if (a[l-1][k-1]==0) {
			alert("Ведущий элемент не может равняться 0 !");
			return;
		}
		else {
			var pizdul=1/a[l-1][k-1];
			b[k-1]='x'+l;
			for (var j=0 ; j<n+mp+2*mm+1; j++) a[j][k-1]*=pizdul;
			ma.push(Read());
			mb.push(read());
			Paste(Rez(a),b);
	    }
	}
}

function Back(){
	if (ma.length>0) Paste(ma.pop(),mb.pop());	
	else {
		sikun=false;
		return;
	}
	if (mm>0 && eval('document.st.a'+(mp+mm+d)+'a'+(n+mp+2*mm+1)+'.value')!=0){
		for (var j=n+mp+mm+1;j<=n+mp+2*mm;j++)
			for (var i=1;i<=mp+mm+d;i++)
				eval('document.getElementById("b'+i+'b'+j+'").style.background = "white"');
		for (var j=1 ;j<=n+mp+mm;j++)
			eval('document.getElementById("b'+(mp+mm+d)+'b'+j+'").style.background = "white"');
	}

}

