var maxVertices = 20;
var maxEdges = 200;
var vertexLabel = "X";
var numEdge = 0;
var numVertices = 0;

var matrix = new Array(maxVertices);
for (var i=0; i < matrix.length; i++) {
    matrix[i] = new Array(maxVertices);
} // for
for (var i=0; i < matrix.length; i++) {
    for (var j=0; j < matrix.length; j++) {
         matrix[i][j] = 0;
    } // for
} // for

function addVertexWithDefaultName() {
    addVertex(++numVertices);
} 	

function addVertex(name) {
    var data = vertexLabel + name + ";  point;   vertex;  " + Math.random()*10 + "," + Math.random()*10 + ",graph;"; 
	//alert(data);
    document.Geometria.addObject(data);    
}

function createVertices() {
    numVertices = document.form.numVertices.value;
	createNumVertices(numVertices);
}



function createNumVertices(num) {
    //reset();
	//numVertices = num;
	var angle = (2*Math.PI)/numVertices;

	for (var i=1;i<=numVertices;i++) {
	    var x = eval(-Math.sin(angle*i)*8) + " ";
		if (x.indexOf(".")==-1) {
		    x += ".0";
	    } // if
	    var y = eval(Math.cos(angle*i)*(-8)) + " ";
		if (y.indexOf(".")==-1) {
		    y += ".0";
	    } // if
	    var data = vertexLabel + i + ";  point;   vertex;  " + x + "," + y + ",graph;"; 
		//alert(data);
        document.Geometria.addObject(data);
	} // for
}

function createEdge() {
    var v1 = eval(document.form.v1.value);
    var v2 = eval(document.form.v2.value);		
    var data = "edge" + numEdge + ";  line;   edge;  " + vertexLabel + v1 + "," + vertexLabel + v2 + "," + eval(matrix[v1][v2]+1) + ",graph;"; 
	//alert(data);
    document.Geometria.addObject(data);
	numEdge++;
	if (numEdge>=maxEdges) {
	    alert("Too many Edges!");
    } // if
	matrix[v1][v2]++;
}

function addEdge(p1, p2, k) {
    var v1 = eval(p1);
    var v2 = eval(p2);		
    var data = "edge" + numEdge + ";  line;   edge;  " + vertexLabel + v1 + "," + vertexLabel + v2 + "," + k + ",graph;"; 
    //var data = "edge" + numEdge + ";  line;   edge;  " + vertexLabel + v1 + "," + vertexLabel + v2 + "," + eval(matrix[v1][v2]+1) + ",graph;"; 
	//alert(data);
    document.Geometria.addObject(data);
	numEdge++;
	if (numEdge>=maxEdges) {
	    alert("Too many Edges!");
    } // if
	//matrix[v1][v2]++;
}


function createGraphFromTable() {
   var data = document.form.matrix.value;
   numVertices = 0;
   numEdges = 0;
   var numLineBreaks = 0;

   //
   // How many numVertices there are?
   //
   var line = 0;
   for (i=0; i<document.form.matrix.value.length;i++) {
       if (data.charAt(i) == "\n") {
	       line++;
	   } // if
       if ((line==0) & (data.charAt(i)!=" ") & (data.charAt(i)!="\r") & (data.charAt(i)!="\n") & (isNaN(data.charAt(i))==false)) {
	       //alert(i + " " + data.charAt(i) + " " + isNaN(data.charAt(i)));
	       numVertices++;
	   } // if
   } // for

   //
   // Construct matrix
   //
   line = 1;
   var vertexCounter = 1;
   numEdge = 0;
   
   for (i=0; i<document.form.matrix.value.length;i++) {
       if (data.charAt(i) == "\n") {
	       line++;
		   vertexCounter = 1;
	   } // if
       if ((data.charAt(i)!="\n") & (data.charAt(i)!="\r") & (data.charAt(i)!=" ") & (data.charAt(i)!="") & (isNaN(data.charAt(i))==false)) {
	       if (data.charAt(i)!="0") {
	           //alert("I add " + data.charAt(i) + " edge(s) between X" + line + " and X" + vertexCounter);
			   for (j=0; j<data.charAt(i); j++) {
				   //alert("addEdge(" + line + "," + vertexCounter + ");");
			       //addEdge(line,vertexCounter);
			       matrix[line][vertexCounter]++;
			   } // for
		   } // if
		   vertexCounter++;
	   } // if
   } // for   
   
   //
   // check matrix
   //
   if (!checkMatrix()) {
       return;
   } // if
   
   //
   // create Vertices
   //
   createNumVertices(numVertices);

   //
   // create Edges by matrix
   //
   for (var i=1; i <= numVertices; i++) {
       for (var j=1; j <= numVertices; j++) {
             if (i>=j) {
                 for (var k=1; k<=matrix[i][j]; k++) {
				     addEdge(i,j,k);					 
			     } // for
		     } // if
        } // for
    } // for
}

function getTableFromGeometria() {
    var data = document.Geometria.getPropertyString("graph","matrix");
	//alert(data);
	document.form.matrix_out.value = data;
}

function checkMatrix() {
    var str = "";
    for (var i=1; i <= numVertices; i++) {
        for (var j=1; j <= numVertices; j++) {
		     str += " " + matrix[i][j];
             if (matrix[i][j] != matrix[j][i]) {
			     alert(" Matrix is not symmetric! \n Please correct it and try again.");
				 reset();
				 return false;
		     } // if
        } // for
		str += " \n";
    } // for
	//alert(str);
    return true;
}

function reset() {
    numEdge = 0;
    numVertices = 0;

    matrix = new Array(maxVertices);
    for (var i=0; i < matrix.length; i++) {
        matrix[i] = new Array(maxVertices);
    } // for
    for (var i=0; i < matrix.length; i++) {
        for (var j=0; j < matrix.length; j++) {
             matrix[i][j] = 0;
        } // for
    } // for
}

function getGeoScriptCode() {
  myWin = open("", "displayWindow", "width=500,height=400,status=no,resizable=yes,toolbar=no,menubar=yes");
  myWin.document.open();
  myWin.document.writeln(document.Geometria.getPropertyString("GeoScriptCode"));
  myWin.document.close(); 
 }


