// JavaScript Document

// JavaScript Document

//Data Set Class

var dSet={name:'dataSet',

	dTables:new Array(),

	dRelations:new Array(),	

	registry:new Array(),

	getTable:function(strTableName){

		for(var g=0;g<this.dTables.length;g++){

			if(this.dTables[g].tableName==strTableName){

				return this.dTables[g];

			}

		}

		return null;

	},

	//---------------

	addTable:function(objTable,overWrite){

		if(!objTable){alert('Fatal Error: Atemption to add an null datatable to the data set');return false;}

		var indTable=-1;

		if(overWrite){

			var t=this.getTable(objTable.tableName);

			if(t){

				t.dRows=new Array();

				for(var dx in objTable.dRows){

					objTable.dRows[dx].parent=t;

					objTable.dRows[dx].Events=new Events(objTable.dRows[dx]);

					objTable.dRows[dx].Events.append(new Event('DataRowChanged',null));

					objTable.dRows[dx].Events.append(new Event('DataRowDeleted',null));

					t.dRows.push(objTable.dRows[dx]);

				}

				t.recordsTotal=objTable.recordsTotal;

				t.tableTitle=objTable.tableTitle;

				t.recordsPerBlock=objTable.recordsPerBlock;

				t['parentKeyValue']=objTable['parentKeyValue'];

				t['parentKeyName']=objTable['parentKeyName'];

				t['condition']=objTable['condition'];

				 indTable=t.ordinal;

			}

			else{

				objTable.ordinal=this.dTables.length;

				indTable=objTable.ordinal;

				if(!objTable.linked){this.linkTable(objTable);}

				this.dTables.push(objTable);

			}

		}

		else	if(this.getTable(objTable.tableName)!==null){

			alert('Error DataSet:attempt to add an exist Table=('+objTable.tableName+')');

			return false;

		}

		else{

			objTable.ordinal=this.dTables.length;

			indTable=objTable.ordinal;

			if(!objTable.linked)this.linkTable(objTable);

			this.dTables.push(objTable);

		}

		return indTable;

	},

	//--------------

	getRelation:function(strRelationName){

		for(oR in this.dRelations){

			if(this.dRelations[oR].relationName==strRelationName) return this.dRelations[oR];

		}

		return null;

	},

	//--------------

	addRelation:function(objRelation,overWrite){

		if(!objRelation){alert('Fatal Error: Atemption to add an null relation to the data set');return false;}

		if(overWrite){

			var r=this.getRelation(objRelation.relationName);

			if(r){

				objRelation.ordinal=r.ordinal;

				this.dRelations[r.ordinal]=objRelation;

				r=null;

			}

			else{

				objRelation.ordinal=this.dRelations.length;

				if(!objRelation.linked)this.linkRelation(objRelation);

				this.dRelations.push(objRelation);

			}

		}

		else if(this.getRelation(objRelation.relationName)!==null){

			alert('Error DataSet:attempt to add an exist Relation=('+objRelation.relationName+')');

			return false;

		}

		else{

			objRelation.ordinal=this.dRelations.length;

			if(!objRelation.linked) this.linkRelation(objRelation);

			this.dRelations.push(objRelation);

		}

	},

	//--------------

	linkTable:function(dTable){

		if(dTable.linked) alert ('this table will be linked again');

		dTable.Events=new Events(dTable);

		dTable.Events.append(new Event('DataTableChanged',null));

		dTable.Events.append(new Event('DataRowInserted',null));

		dTable.Events.append(new Event('DataRowDeleted',null));

		dTable.Events.append(new Event('DataRowUpdated',null));

		for(var j=0;j<dTable.dCols.length;j++){

			dTable.dCols[j].table=dTable;

		}

		for(var dx in dTable.dRows){

			dTable.dRows[dx].parent=dTable;

			dTable.dRows[dx].Events=new Events(dTable.dRows[dx]);

			dTable.dRows[dx].Events.append(new Event('DataRowChanged',null));

			dTable.dRows[dx].Events.append(new Event('DataRowDeleted',null));

		}

		dTable.getRow=function (strKey){

			for(var c=0;c<this.dRows.length;c++){

				if(this.dRows[c].dItems[0].value==strKey){return this.dRows[c];}

			}

			return false;

		 };

		dTable.getCol=function(strColName){

			for(var i=0;i<this.dCols.length;i++){

				if(this.dCols[i].columnName==strColName)return this.dCols[i];

			}

			return null;

		};

		

		dTable.deleteRow=function (data){

			var tem=this.dRows[data.index].Events;

			this.dRows.splice(data.index,1);

			this.recordsTotal--;

			for(var i=data.index;i<this.dRows.length;i++){

				this.dRows[i].ordinal=i;

			}

			tem.dispatch('DataRowDeleted');

			this.Events.dispatch('DataRowDeleted');

		};

		dTable.updateRow=function(data){

			var dRow=data.hasOwnProperty('dRow')?data.dRow:data;

			if(!dRow){alert('No dRow '+dRow.ordinal); return false};

			for(var dx in this.dRows[dRow.ordinal].dItems){

				this.dRows[dRow.ordinal].dItems[dx].value=dRow.dItems[dx].value;

			}

			this.dRows[dRow.ordinal].Events.dispatch('DataRowChanged');

			this.Events.dispatch('DataRowUpdated');

			return true;

		};

		dTable.insertRow=function(data){

			var dRow=data.hasOwnProperty('dRow')?data.dRow:data;

			if(!dRow){alert('No dRow '+dRow.ordinal); return false};

			dRow.ordinal=this.dRows.length;

			this.dRows[dRow.ordinal]=dRow;

			this.dRows[dRow.ordinal].parent=this;

			this.dRows[dRow.ordinal].Events=new Events(this.dRows[dRow.ordinal]);

			this.dRows[dRow.ordinal].Events.append(new Event('DataRowChanged',null));

			this.dRows[dRow.ordinal].Events.append(new Event('DataRowDeleted',null));

			this.recordsTotal++;

			this.Events.dispatch('DataRowInserted');

			return true;

		};

		

		dTable.linked=true;

		return true;

	},

	//---------------------------	

	linkRelation:function(dRelation){

		//alert('Linking '+dRelation.relationName);

		if(dRelation.linked) alert("this relation is already linked and will be linked again");

		tmpChildTable			= this.getTable(dRelation.childTableName);

		tmpParentTable			= this.getTable(dRelation.parentTableName);

		

		dRelation.childTable	=	tmpChildTable;

		dRelation.parentTable	=	tmpParentTable;

		//view(dRelation);

		if(dRelation.child_parent){

			tmpChildTable.getCol(dRelation.targetChildColumnName).indParentRelation=tmpChildTable.parentRelations.length;

			tmpChildTable.getCol(dRelation.childColumnName).indParentRelation=tmpChildTable.parentRelations.length;

			tmpChildTable.parentRelations.push(dRelation);

			//alert('parentRelations added for table '+tmpChildTable.tableName+' Colomun: '+dRelation.childColumnName);

		}

		if(dRelation.parent_child){

			tmpParentTable.getCol(dRelation.targetParentColumnName).indChildRelation=tmpParentTable.childRelations.length;

			tmpParentTable.getCol(dRelation.parentColumnName).indChildRelation=tmpParentTable.childRelations.length;

			tmpParentTable.childRelations.push(dRelation);

			//alert('childRelations added for table '+tmpParentTable.tableName+' Colomun: '+dRelation.parentColumnName);

		}

		dRelation.linked=true;

	},

	//--------------------------------

	linkAllRelations:function(){

		for(var i=0;i<this.dRelations.length;i++){

			this.linkRelation(this.dRelations[i]);

		}

	},

	//--------------------------------

	linkAllTables:function(){

		for(var i=0;i<this.dTables.length;i++){

			this.linkTable(this.dTables[i]);

		}

	},

	//---------------------------------

	Update:function(subDataSet){
		document.Loader.hide();
		var  junk=new Array();

		for(var i=0; i<subDataSet.dTables.length;i++){

			var res=this.addTable(subDataSet.dTables[i],true)

			if(res !=-1){

				//alert(subDataSet.dTables[i].tableName;

				junk.push(res);

			}

			//alert(subDataSet.dTables[i].tableName+" Added");

		}

		for(var j=0;j<subDataSet.dRelations.length;j++){

			this.addRelation(subDataSet.dRelations[j],true);

		}

		for(var index in junk){

			//alert(this.dTables[junk[index]].tableName);

			this.dTables[junk[index]].Events.dispatch('DataTableChanged');

		}

	}

	

};

function view(object){

	var text='';

	for(var atribute in object){

		text+='Object['+atribute+']='+object[atribute]+'\n';

	}

	alert(text);

}


















