/*
	WWW SQL Designer, (C) 2005 Ondra Zara, o.z.fw@seznam.cz

    This file is part of WWW SQL Designer.

    WWW SQL Designer is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    WWW SQL Designer is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with WWW SQL Designer; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA	
*/

var reposition = 0;

function import_xml_relation(relation) {
	var table_1 = relation.match(/<table_1>([^<]*)<\/table_1>/);
	var table_2 = relation.match(/<table_2>([^<]*)<\/table_2>/);
	var row_1 = relation.match(/<row_1>([^<]*)<\/row_1>/);
	var row_2 = relation.match(/<row_2>([^<]*)<\/row_2>/);
	add_relation(table_1[1],row_1[1],table_2[1],row_2[1]);
}

function import_xml_row(table, row) {
	var r;
	var head = row.match(/<row[^>]*>/);
	var id = head[0].match(/id="([^"]*)"/);

	var title = row.match(/<title>([^<]*)<\/title>/);
	var stype = row.match(/<type>([^<]*)<\/type>/);
	//var sinput = row.match(/<input*>([^<]*)<\/input>/);
	var type=13; /* default -> UNKNOWN */
	for (var i=0;i<SQL_TYPES_DEFAULT.length;i++) {
		if (stype[1].toLowerCase() == SQL_TYPES_DEFAULT[i].toLowerCase()) {
			type = i;
		}
	}
	var forminput = 11; //no input specified or unknown
	/*for (var i=0;i<INPUT_TYPES_DEFAULT.length;i++) {
		if (sinput[1].toLowerCase() == INPUT_TYPES_DEFAULT[i].toLowerCase()) {
			forminput = i;
		}
	}*/
	if (id) {
		r=table.addRow(title[1],type,id[1],forminput);
	} else {
		r=table.addRow(title[1],type,null,forminput);
	}

	var def = row.match(/<default>([^<]*)<\/default>/);
	r.setDef(def[1]);
	var index = head[0].match(/index="[^"]*"/);
	if (index) r.setIndex();
	var pk = head[0].match(/pk="[^"]*"/);
	if (pk) r.setPK();
	var fk = head[0].match(/fk="[^"]*"/);
	if (fk) r.setFK();
	var nn = head[0].match(/nn="[^"]*"/);
	if (nn) r.setNN();
	var spec = head[0].match(/special="([^"]*)"/);
	if (spec) r.setSpec(spec[1]);
	
	/*var finame = head[0].match(/finame="([^"]*)"/);
	if (finame) r.setFI_name(finame[1]);
	var fidbfield = head[0].match(/fidbfield="([^"]*)"/);
	if (fidbfield) r.setFI_dbfield(dbfield[1]);
	var fititle = head[0].match(/fititle="([^"]*)"/);
	if (fititle) r.setFI_title(fititle[1]);
	var fidefault = head[0].match(/fidefault="([^"]*)"/);
	if (fidefault) r.setFI_default(fidefault[1]);
	var fisize = head[0].match(/fisize="([^"]*)"/);
	if (fisize) r.setFI_size(fisize[1]);
	var fimaxlength = head[0].match(/fimaxlength="([^"]*)"/);
	if (fimaxlength) r.setFI_maxlength(fimaxlength[1]);
	var fimandatory = head[0].match(/fimandatory="([^"]*)"/);
	if (fimandatory) r.setFI_mandatory(fimandatory[1]);
	var fititle2 = head[0].match(/fititle2="([^"]*)"/);
	if (fititle2) r.setFI_title2(fititle2[1]);
	var fiattribute = head[0].match(/fiattribute="([^"]*)"/);
	if (fiattribute) r.setFI_attribute(fiattribute[1]);*/
}


function import_xml_table(table) {
	var t;
	var pos_x=0;
	var pos_y=0;
	var head = table.match(/<table[^>]*>/);
	var id = head[0].match(/id="([^"]*)"/);
	var title = head[0].match(/title="([^"]*)"/);
	var x = head[0].match(/x="([^"]*)"/);
	var y = head[0].match(/y="([^"]*)"/);
	if (x) { pos_x = x[1]; } else { reposition = 1;}
	if (y) { pos_y = y[1]; } else { reposition = 1;}
	if (id) {
		t = add_table(pos_x,pos_y,title[1],id[1]);
	} else {
		t = add_table(pos_x,pos_y,title[1]);
	}
	var rows = table.match(/<row[^>]*>.*?<\/row>/g);
	for (var i=0;i<rows.length;i++) {
		import_xml_row(t,rows[i]);
	}
}

function import_xml(data) {
	/* nacte data z drive ulozeneho souboru */
	

	/* zadne newliny, delaji bordel */
	data = data.replace(/[\n\r]/g,'');
	
	/* jen vnitrek globalniho tagu <sql> */
	var clear = data.match(/<sql>(.*)<\/sql>/); 
	if (!clear) {
		alert('No data!');
		return;
	}

	/* vsechno vycistime */
	clear_tables();

	/* a jedeme - tabulky */
	var tables = clear[1].match(/<table[^>]*>.*?<\/table>/g);
	for (var i=0;i<tables.length;i++) {
		import_xml_table(tables[i]);
	}
	
	/* vposled relace */
	var relations = clear[1].match(/<relation[^>]*>.*?<\/relation>/g);
	if (relations) {
		for (var i=0;i<relations.length;i++) {
			import_xml_relation(relations[i]);
		}
	}
	
	if (reposition) {
		animation_queue_add(reposition_tables);
		reposition = 0;
	}
}
/*20070201 tka : import XML by using browser XML functionalities */
function import_xml_relation2(relation) {
	var table_1 = relation.getElementsByTagName("table1").firstChild.nodeValue;
	var table_2 = relation.getElementsByTagName("table2").firstChild.nodeValue;
	var row_1 = relation.getElementsByTagName("row_1").firstChild.nodeValue;
	var row_2 = relation.getElementsByTagName("row_2").firstChild.nodeValue;
	add_relation(table_1,row_1,table_2,row_2);
}

function import_xml_row2(table, row) {
	var r;
	var id = row.getAttribute("id");
	var title = row.getElementsByTagName("title")[0].firstChild.nodeValue;
	var stype = row.getElementsByTagName("type")[0].firstChild.nodeValue;
	var sinput = row.getElementsByTagName("input")[0];
	var type=13; /* default -> UNKNOWN */
	for (var i=0;i<SQL_TYPES_DEFAULT.length;i++) {
		if (stype.toLowerCase() == SQL_TYPES_DEFAULT[i].toLowerCase()) {
			type = i;
		}
	}
	
	var forminput = 11; //no input specified or unknown
	if(row.getElementsByTagName("input").length>0)
	{
		var sforminput = row.getElementsByTagName("input")[0].getAttribute("input");
		if(!sforminput)
			alert("missing input attribute on row id = "+id);
		for (var i=0;i<INPUT_TYPES_DEFAULT.length;i++) {
			if (sforminput.toLowerCase() == INPUT_TYPES_DEFAULT[i].toLowerCase()) {
				forminput = i;
			}
		}
	}
	if (id) {
		r=table.addRow(title,type,id,forminput);
	} else {
		r=table.addRow(title,type,null,forminput);
	}
	if(row.getElementsByTagName("default")[0].hasChildNodes())
		r.setDef(row.getElementsByTagName("default")[0].firstChild.nodeValue);
	var index = row.getAttribute("index");
	if (index) r.setIndex();
	var pk = row.getAttribute("pk");
	if (pk) r.setPK();
	var fk = row.getAttribute("fk");
	if (fk) r.setFK();
	var nn = row.getAttribute("nn");
	if (nn) r.setNN();
	var spec = row.getAttribute("special");
	if (spec) r.setSpec(spec);
	
	//todo: make forminput object like Table, Row and a construtor here
	if(row.getElementsByTagName("input").length>0)
	{
		var fipath = sinput.getAttribute("path");
		if (fipath) r.setFI_path(fipath);
		var fitype = sinput.getAttribute("type");
		if (fitype) r.setFI_type(fitype);
		var finame = sinput.getAttribute("name");
		if (finame) r.setFI_name(finame);
		var fidbfield = sinput.getAttribute("dbfield");
		if (fidbfield) r.setFI_dbfield(fidbfield);
		var fititle = sinput.getAttribute("title");
		if (fititle) r.setFI_title(fititle);
		var fivalue = sinput.getAttribute("value");
		if (fivalue) r.setFI_value(fivalue);
		var finolayout = sinput.getAttribute("nolayout");
		if (finolayout) r.setFI_nolayout(finolayout);
		var fisize = sinput.getAttribute("size");
		if (fisize) r.setFI_size(fisize[1]);
		var fimaxlength = sinput.getAttribute("maxlength");
		if (fimaxlength) r.setFI_maxlength(fimaxlength);
		var fimandatory = sinput.getAttribute("mandatory");
		if (fimandatory) r.setFI_mandatory(fimandatory);
		var fibubble = sinput.getAttribute("bubble");
		if (fibubble) r.setFI_bubble(fibubble);
		var fixplaintxt = sinput.getAttribute("xplaintxt");
		if (fixplaintxt) r.setFI_xplaintxt(fixplaintxt);
		var fiattribute = sinput.getAttribute("attribute");
		if (fiattribute) r.setFI_attribute(fiattribute);
		var fioptionVal = sinput.getAttribute("optionVal");
		if (fioptionVal) r.setFI_optionVal(fioptionVal);
		var fioptionLbl = sinput.getAttribute("optionLbl");
		if (fioptionLbl) r.setFI_optionLbl(fioptionLbl);
		var fioptionSel = sinput.getAttribute("optionSel");
		if (fioptionSel) r.setFI_optionSel(fioptionSel);
	}
}

function import_xml_table2(table) {
	var t;
	var pos_x=0;
	var pos_y=0;
	
	var id = table.getAttribute("id");
	var title = table.getAttribute("title");
	var x = table.getAttribute("x");
	var y = table.getAttribute("y");
	if (x) { pos_x = x; } else { reposition = 1;}
	if (y) { pos_y = y; } else { reposition = 1;}
	if (id) {
		t = add_table(pos_x,pos_y,title,id);
	} else {
		t = add_table(pos_x,pos_y,title);
	}
	var rows = table.getElementsByTagName("row");
	for (var ri=0 ; ri<rows.length ; ri++) {
		import_xml_row2(t,rows[ri]);
	}
}

function import_xml2(data) {
	var root = data.getElementsByTagName("sql")[0];
	Clean_Up(root);
	var tables = data.getElementsByTagName("table");
	var relations = data.getElementsByTagName("relation");
	alert("your import contains : "+tables.length+" table(s) interconnected by : "+relations.length+" relation(s)");
	if(tables.length > 0)
	{
	  clear_tables();
	  for (var ti = 0; ti < tables.length; ti++) 
	  {
	  	  var active_table = tables[ti];
	  	  if(active_table.hasChildNodes())
	  	  	import_xml_table2(active_table);
	  }
	  for (var ri = 0; ri < relations.length; ri++) 
	  {
	  	  var active_relation = relations[ri];
	  	  if(active_relation.hasChildNodes())
	  	  	import_xml_relation2(active_relation);
	  }
    } 
    else {
	  	alert('No data!');
		return
	}
	
	if (reposition) {
		animation_queue_add(reposition_tables);
		reposition = 0;
	}
}

function export_xml() {
	/* 
		vyexportuje data do xml souboru. priklad:
	
	<?xml version="1.0" ?>
	<!-- WWWSQLEditor XML export -->
	<sql>
		<table id="3" title="tabulka" x="30" y="50">
			<row id="0" pk="pk">
				<default>0</default>
				<title>id</title>
				<type>Integer</type>
			</row>
			<row id="1" index="index" fk="fk">
				<type>Integer</type>
				<default>0</default>
				<title>id_neco</title>
			</row>
			<row id="2" nn="nn" special="64">
				<type>String</type>
				<title>hodnota</title>
			</row>
		<table>
		<relation>
			<table_1>3</table_1>
			<table_2>4</table_2>
			<row_1>0</row_1>
			<row_2>0</row_2>
		</relation>
	</sql>	
	*/
	
	/* hlavicka */
	var x,y;
	var str, row;
	var data = '<sql>\n';
	
	/* tabulky a radky */
	for (var i=0;i<table_array.length;i++) {
		if (table_array[i]) {
			x = parseInt(table_array[i]._div.style.left);
			y = parseInt(table_array[i]._div.style.top);
			data += '\t<table id="'+i+'" title="'+table_array[i]._title.innerHTML+'" x="'+x+'" y="'+y+'" >\n';
			for (var j=0;j<table_array[i]._rows.childNodes.length;j++) {
				var id = table_array[i]._rows.childNodes[j].getAttribute("row_number");
				row = table_array[i].rows[id];
				str = 'id="'+id+'"';
				if (row.pk) { /* primary key */
					str += ' pk="pk"';
				}
				if (row.fk) { /* foreign key */
					str += ' fk="fk"';
				}
				if (row.index) { /* index */
					str += ' index="index"';
				}
				if (row.nn) { /* primary key */
					str += ' nn="nn"';
				}
				if (SQL_TYPES_SPEC[row.type]) { /* spec */
					str += ' special="'+row.spec+'"';
				}
				data += '\t\t<row '+str+'>\n';
				data += '\t\t\t<title>'+row._title.innerHTML+'</title>\n';
				data += '\t\t\t<default>'+row.def+'</default>\n';
				data += '\t\t\t<type>'+SQL_TYPES_DEFAULT[row.type]+'</type>\n';
				
				input_attribute_str = "";

				if(row.forminput>=0)
				{
					input_attribute_str += ' input="'+INPUT_TYPES_DEFAULT[row.forminput]+'"';
					input_attribute_str += ' path="'+INPUT_TYPES_PATHS[row.forminput]+'"';
					if(row.fi_type)
						input_attribute_str += ' type="'+row.fi_type+'"';
					if(row.fi_name)
						input_attribute_str += ' name="'+row.fi_name+'"';
					if(row.fi_dbfield)
						input_attribute_str += ' dbfield="'+row.fi_dbfield+'"';
					if(row.fi_title)
						input_attribute_str += ' title="'+row.fi_title+'"';
					if(row.fi_default)
						input_attribute_str += ' value="'+row.fi_value+'"';
					if(row.fi_size)
						input_attribute_str += ' size="'+row.fi_size+'"';
					if(row.fi_maxlength)
						input_attribute_str += ' maxlength="'+row.fi_maxlength+'"';
					if(row.fi_mandatory=="on")
						input_attribute_str += ' mandatory="true"';
					if(row.fi_nolayout=="on")
						input_attribute_str += ' nolayout="true"';
					if(row.fi_bubble)
						input_attribute_str += ' bubble="'+row.fi_bubble+'"';
					if(row.fi_xplaintxt)
						input_attribute_str += ' xplaintxt="'+row.fi_xplaintxt+'"'; 
					if(row.fi_attribute)
						input_attribute_str += ' attribute="'+row.fi_attribute+'"';
					if(row.fi_optionVal)
						input_attribute_str += ' optionVal="'+row.fi_optionVal+'"';
					if(row.fi_optionLbl)
						input_attribute_str += ' optionLbl="'+row.fi_optionLbl+'"';
					if(row.fi_optionSel)
						input_attribute_str += ' optionSel="'+row.fi_optionSel+'"';
						 
					data += '\t\t\t<input'+input_attribute_str+'/>\n';
				}
				data += '\t\t</row>\n';
			} /* pro vsechny radky */
			data += '\t</table>\n';
		} /* pokud tabulka existuje */
	} /* pro vsechny tabulky */
	
	/* relace */
	var table_1, table_2, row_1, row_2;
	for (var k=0;k<relation_array.length;k++) {
		if (relation_array[k]) {
			table_1 = relation_array[k].parent_1.number;
			table_2 = relation_array[k].parent_2.number;
			row_1 = relation_array[k].row_1._div.getAttribute("row_number");
			row_2 = relation_array[k].row_2._div.getAttribute("row_number");
			data += '\t<relation>\n';
			data += '\t\t<table_1>'+table_1+'</table_1>\n';
			data += '\t\t<row_1>'+row_1+'</row_1>\n';
			data += '\t\t<table_2>'+table_2+'</table_2>\n';
			data += '\t\t<row_2>'+row_2+'</row_2>\n';
			data += '\t</relation>\n';
		}
	}
	
	/* paticka */
	data += '</sql>';
	return data;
}

function io_show(import_btn) {
	var btn = document.getElementById("import");
	if (import_btn) {
		btn.style.display = "block";
	} else {
		btn.style.display = "none";
	}
	var area = document.getElementById("area");
	area.parentNode.style.display = "block";
}
//Regular expression used to match any non-whitespace character
var notWhitespace = /\S/;

function Clean_Up(node){
  for (var x = 0; x < node.childNodes.length; x++) {
    var childNode = node.childNodes[x];
    if ((childNode.nodeType == 3)&&(!notWhitespace.test(childNode.nodeValue))) {
// that is, if it's a whitespace text node
      node.removeChild(node.childNodes[x]);
      x--;
    }
    if (childNode.nodeType == 1) {
// elements can have text child nodes of their own
      Clean_Up(childNode);
    }
  }
}

