/*  2008.03.31, AA 
	dataDisplay.js, arayüz için gereken değişkenler ve fonksiyonları içerir. 
	Fonksiyonlar genelde ExtJs konfigürasyonlarının yapılması ve gereken değişkenleri 
	doldurmak/güncellemekle yükümlüdür. 
*/

// son tıklanan objenin tabakası ile ilgili ilişki bilgilerini tutar 
var lastRelTables = null;

/* <<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
 *                                     Assigning Measurement Data  
 * <<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>> */

function fillMeasureDisplay( MeasureXmlDoc ){
	root = MeasureXmlDoc.getElementsByTagName("WMS_Measure");
	if (root!= null){
		root = root[0];
		for (i=0; i<root.childNodes.length; i=i+1){
			var num = Number(root.childNodes[i].childNodes[0].nodeValue);
			document.getElementById( root.childNodes[i].nodeName ).innerHTML = num.toFixed(3);
		} 
	}
}

/*
 *   AA, 24.01.2008, Graphics.js nin kullanılması ve çizim, canvas'ın clear edilmesi esnasında istemsiz 
 *	 getMap isteklerine sebep olduğu için *şimdilik* kaldırmak zorunda kaldım. Eğer canvas.clear'da 
 *	 istemsiz istek gitmesini engelleyebilirsek, o zaman graphics i kullanabiliriz, o da iyi olur.   
 *   konuyu "requests.js" de CC tagı ile arayıp kodları açıp ne olduğunu görebilirsin. 
*/

var canvasIsDirty = false;
function drawLine( x1, y1, x2, y2 ){
	pen.drawLine(x1, y1, x2, y2);
	pen.paint();	
	canvasIsDirty = true;
}

function clearCanvas(){
	if (canvasIsDirty){
		pen.clear();
		canvasIsDirty = false; 
		pen = null;
	}
}


/* <<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
 *                                          Loading the Grid 
 * <<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>> */
/*
	ColumnStruct dediğimiz şey, 
		xmlName:
		columnName:
		displayName:
		colType:
	fieldlerinden oluşan bir yapıdır.
	
	sonuçta dönen şey ise :- 
	result :
		id:
		columnStruct:
	
*/
function getColumnStruct( FeatureXmlDoc ) { 
	var id = ''; // bu xml tagını tutuyor,
	var idColName = ''; // bu veri tabanındaki ismini tutuyor. 
	var rowDefinition = null;

	if ( FeatureXmlDoc != null ){
		rowDefinition = FeatureXmlDoc.getElementsByTagName("RowDefinition")[0];
		if ((rowDefinition != null) && (rowDefinition.childNodes.length > 0)){
		
			// iki boyutlu dizimiz oluşturuluyor.
			var columnStruct = new Array(rowDefinition.childNodes.length); // her kolon için <Xml kodu>, <name>, <displayName> tutulacak.   
			for (i=0; i<columnStruct.length; i=i+1){
				columnStruct[i] = new Array (3);
			}
			
			for(i=0; i < rowDefinition.childNodes.length; i=i+1){
				var col = rowDefinition.childNodes[i];
				if (col != null){
					if ((col.attributes.getNamedItem("ID") != null) && (col.attributes.getNamedItem("ID").value == '1')){
						id        = col.nodeName; // id kolonunu buluyoruz...
						idColName = col.attributes.getNamedItem("colName").value; 
					}
					
					
					//alert(col.nodeName + " " + col.attributes.getNamedItem("colName").value + " " + col.attributes.getNamedItem("displayName").value);
					 
					var RecData = { xmlName: col.nodeName, columnName  : col.attributes.getNamedItem("colName").value, 
														   displayName : col.attributes.getNamedItem("displayName").value, 
														   colType	   : col.attributes.getNamedItem("colType").value,														   
														   colMimeType : col.attributes.getNamedItem("colMimeType").value };
					columnStruct[i] = RecData;
				}		
			}
		}     
	}
	return {id: id, idColName: idColName, columnStruct: columnStruct};
}

// create the Data Store to display in the grid. 
function getDataStore( FeatureXmlDoc, colStruct ){	
	var a = Array(colStruct.columnStruct.length);
	for (i=0; i<colStruct.columnStruct.length; i=i+1){  	    
    	var newRecData = {};		
    	newRecData["name"]        = colStruct.columnStruct[i]["columnName"];
    	newRecData["displayName"] = colStruct.columnStruct[i]["displayName"]; 
    	newRecData["mapping"] 	  = colStruct.columnStruct[i]["xmlName"];
    	a[i] = newRecData;    		
	}
	
    var colValue = Ext.data.Record.create(a);
	
		
    var store = new Ext.data.Store({
        proxy : new Ext.data.MemoryProxy(FeatureXmlDoc),
        // the return will be XML, so lets set up a reader
        reader: new Ext.data.XmlReader({               
               							 record: 'Row',    // records will be in a "Row" tag
               							 id: colStruct.id
               							 //totalRecords: '@total'
           								}, 
        								colValue    // mapping into the xml doc
           							   )
    			});
	return store;
}

function getColModel( FeatureXmlDoc, colStruct ){
	var a = Array(colStruct.columnStruct.length);
	
	for (i=0; i<colStruct.columnStruct.length; i=i+1){
    	var newRecData = {};	
    	newRecData["id"]		  = colStruct.columnStruct[i]["columnName"];
    	newRecData["header"]      = colStruct.columnStruct[i]["displayName"];
    	newRecData["dataIndex"]   = colStruct.columnStruct[i]["columnName"];    	
    	newRecData["colType"]	  = colStruct.columnStruct[i]["colType"]; // misc.js nin içinde		
    	newRecData["colMimeType"] = colStruct.columnStruct[i]["colMimeType"];
    	//@UB: 25.04.2008
    	if (colStruct.columnStruct[i]["colType"] == "ftInteger") 
    	{
		  newRecData["width"] 	  = 60;    	
		}
		else
    	{
		  newRecData["width"] 	  = 120;    	
		}
		
    	newRecData["sortable"] 	  = true;
    	
    	var typ = getType(newRecData["colType"]);
    	 
    	// bir de renderer set etmek gerekir. 
    	if (typ == 3){
			newRecData["renderer"] = Ext.util.Format.dateRenderer('d/m/Y');			
    	}
    	else if (typ==4){
    		// burada bir buton konulmalı.. mime tipi de işin içine girmeli. 
    	}
    	
    	a[i] = newRecData;    		
	}	
	
   var _colModel = new Ext.grid.ColumnModel(a);	       	 
			       	 
   return _colModel;    
}

function getTableName( FeatureXmlDoc ){
	var table = null;
	var displayName = "";
	var name = "";
	
	if ( FeatureXmlDoc != null ) {
		table = FeatureXmlDoc.getElementsByTagName('Dataset');
		
		if ((table != null) || (table.length>0)){
			table = table[0];	
			if (table != null){
				name = table.attributes.getNamedItem('name').value;
				displayName = name;
				displayName = table.attributes.getNamedItem('displayName').value;
			} 
		} 	
	}
	return {displayName: displayName, name: name};
}
//@UB: 16.03.2008
function getRowCount( FeatureXmlDoc ){
	var table = null;
	var displayName = "";
	var name = "";
	
	if ( FeatureXmlDoc != null ) {
		table = FeatureXmlDoc.getElementsByTagName('Dataset');
		
		if ((table != null) || (table.length>0)){
			table = table[0];	
			if (table != null){
				return  table.attributes.getNamedItem('rowCount').value;
				
			} 
		} 	
	}
	 
}


// Son yapılan FeatureInfo isteminden sonra, Dökümanda tutulan o anki pencere kordinatları, 
// client hesaplarında netlik için server'dan tekrar alınır. 
function getLastBoundingBOX( FeatureXmlDoc ){
	if (FeatureXmlDoc!=null){
	
		var BBox = FeatureXmlDoc.getElementsByTagName("BoundingBox");
		
		
		if ((BBox != null) && (BBox.length == 1)){
			curMinX = Number( BBox[0].attributes.getNamedItem("minx").value );				
			curMinY = Number( BBox[0].attributes.getNamedItem("miny").value );
			curMaxX = Number( BBox[0].attributes.getNamedItem("maxx").value );
			curMaxY = Number( BBox[0].attributes.getNamedItem("maxy").value );	
		}
	}

	forDebug();
	 
}

// layerArray kullanılacağı malum, parametre geçirmiyorum.
function fillLayers(){
 
	var sm = new Ext.grid.CheckboxSelectionModel({multiSelect:true});
 
    
	var colModel = new Ext.grid.ColumnModel([ sm, 
					 						  {header: "Tabaka İsmi", dataIndex: "title", width: 120, sortable: true} ]);
 
    
	var temp = Array();
 
	for (i=0; i<layerArray.length; i=i+1){
		temp[i] = [ layerArray[i]["name"], layerArray[i]["title"] ];
	}
 

	var ds = new Ext.data.SimpleStore({
    					fields : ["name", "title"],
    					data   : temp 
    		 });	

  	 
	var renderToObj = document.getElementById("getMap_Layers");
   	layerGrid = new Ext.grid.GridPanel({
        			ds          : ds,
        			cm   		: colModel,
        			sm			: sm,        			
        			renderTo    : 'getMap_Layers',
        			autoExpandColumn : '1',        			
        			layout		: 'fit'
    			});    	
 
    layerGrid.selModel.selectAll();	//@UB: 03.03.2008 tüm tabakaların seçili (açık) gelmesi için			    	    			
 
}

function cellDoubleClick (grid, rowIndex, columnIndex, e) {
	if (grid != null){
		var colModel = grid.getColumnModel();
		var mimeType = colModel.getColumnById(colModel.getColumnId(columnIndex)).colMimeType;
		
		if ( mimeType == "1"){  // bir dosya içeriği varsa...
			var record 	  = grid.getStore().getAt(rowIndex);  // Get the Record for the row
        	var fieldName = colModel.getDataIndex(columnIndex); // Get field name for the column
        	var url 	  = new String( record.get(fieldName) );
			url 		  = url.replace(/\\/g, "/");
			url 	  	  = InternetAddress + "/WebGISServer/" + url;
			var title 	  = grid.title + " tablosu, " + fieldName + " kolonu"; 
			window.open( url, '', '' );
		}
    }
}
function cellClick (grid, rowIndex, columnIndex, e) {

	if (grid != null){
		var record 	  = grid.getStore().getAt(rowIndex);
		var colModel = grid.getColumnModel();		
		fieldName = colModel.getDataIndex(colModel.findColumnIndex("UID"));
		var uidData = new String( record.get(fieldName) );		
		 
		var responseXML = getFeatureInfoByColumnValue(grid.title, 'UID = '+uidData);
		if(!IsItException(responseXML, 'Ömemli Yer Sorgusu : '))
		{		

			getLastBoundingBOX( responseXML );	
			if ( assignImagePath(responseXML) ) { 
		   	  map.style.display="block";
			} 
			else
			{
				alert(onemliYerAdi.value + " bulunamadı");
			}
	 	}
		
		
    }
}
 
function fillRelationGrids( RelationXmlDoc ){
	
	// bir önceki istekten kalan tablar temizlenir.   
	for (j=dataTabPanel.items.length-1;j>0;j=j-1){
		if (dataTabPanel.getComponent(j).cm)
			dataTabPanel.remove(j, true);
		else
			dataTabPanel.remove(j, false);		
		
	}
	
	if (RelationXmlDoc){
		var lastRelTables = RelationXmlDoc.getElementsByTagName('RelTable');
		if (lastRelTables){
			for(i=0;i<lastRelTables.length;i=i+1){
				var reltabl = lastRelTables[i].attributes;
				// kaç tane tablo varsa o kadar sekme yaratılacak. 
				// sekmeler, kendi içlerinde, o ilişkiye ait parametreleri tutacaklar.
				// her tab panelin içinde, ilişkileri tutan bir record olacak. Record, ilişkili tablo sayısı kadar, 
				// 'thisCol' ve 'relCol' tutmalı.

				var rels = lastRelTables[i].getElementsByTagName('RelCol');
				
				var relDefs = Array;
				
				for (j=0;j<rels.length;j=j+1){
					var newRecData = {};					
    				newRecData["thisColName"] = rels[j].attributes.getNamedItem('thisColName').value;
    				newRecData["relColName"]  = rels[j].attributes.getNamedItem('relColName').value;
    				relDefs[j] = newRecData;					
				}

				var relGrid = new Ext.grid.GridPanel(
					{
			   		no			: i+1,  // çünkü 0'da orjinal tablo var. 
					header 		: false,
					title       : reltabl.getNamedItem('displayName').value,
					realName	: reltabl.getNamedItem('name').value,
					relDefs		: relDefs,					
					closable	: false,
					layout		: 'fit',
					autoscroll  : true,
					everLoaded  : false,  // keeps if the data is ever filled from the		
					view		: new Ext.grid.GridView({
									emptyText : "Veri yok."									
								  })
				});
					
				dataTabPanel.add( relGrid );																	
			}		
		}
	}
}
   
 
//@UB: 08.03.2008 parametre olarak geçilen parentElement'e (_renderTo) grid'i ekler. 
//(fillGrids dataTabPanel ariyordu, bu yuzden yazdim) 

function fillGrid(InfoGrid, FeatureXmlDoc, _renderTo, _title, _w, _h ){
   	if (! IsItException(FeatureXmlDoc, 'Sorgu Hata :')){
		var colStruct = getColumnStruct( FeatureXmlDoc );
		if ((colStruct.columnStruct != null) && (colStruct.columnStruct.length > 0)){
			var tableName = getTableName( FeatureXmlDoc ); 	
			var colModel  = getColModel( FeatureXmlDoc, colStruct );	
			var store 	  = getDataStore( FeatureXmlDoc, colStruct );
			
			if (InfoGrid == null){
     
				InfoGrid  =   new Ext.grid.GridPanel({
			    			renderTo    : _renderTo,
				        	ds          : store,
				        	cm   		: colModel,
				        	header 		: true,
				        	title       : _title,
				        	layout		: 'fit',
				        	autoscroll  : true,
				     		width : _w,
				     		height : _h		        	
				    	});
			}
			else
			{
					if ((colModel) && (store)){
						InfoGrid.setTitle( tableName.displayName );
						InfoGrid.realName = tableName.name;								
						InfoGrid.reconfigure( store, colModel );
				}
				
			}
			    	
			 
			store.load();
			return InfoGrid;
			
		}    				
   	}
}
   
// xmlDoc : getFeature sonucunda dönen xml object.
// fonksiyon sonuç olarak, parse ettiği tablo / tabaka ismini döndürür. 
function fillGrids( FeatureXmlDoc ){
   	if (! IsItException(FeatureXmlDoc, 'Nesne Sorgulama Hata :')){
	    // objeye ait bilgi döndü ise.
		var colStruct = getColumnStruct( FeatureXmlDoc );
		if ((colStruct.columnStruct != null) && (colStruct.columnStruct.length > 0)){
			var tableName = getTableName( FeatureXmlDoc ); 	
			var colModel  = getColModel( FeatureXmlDoc, colStruct );	
			var store 	  = getDataStore( FeatureXmlDoc, colStruct );
			 			
			if (featureInfoGrid == null){
		    	featureInfoGrid = new Ext.grid.GridPanel({
		    			no			: 0,
		    			header 		: false,
		    			title       : tableName.displayName,
		    			realName	: tableName.name,
		    			closable	: false,
			        	ds          : store,
			        	cm   		: colModel,
						id			: colStruct.idColName,		
			        	layout		: 'fit',
			        	autoscroll  : true,
			        	everLoaded  : true  // keeps if the data is ever filled from the					        	
			    	});
			    		    				  
				featureInfoGrid.on( 'celldblclick', function(g, r, c, e) { cellDoubleClick(g, r, c, e); } );
				featureInfoGrid.on( 'cellclick', function(g, r, c, e) { cellClick(g, r, c, e); } );
				dataTabPanel.add(featureInfoGrid);		   
			}
			else{				
				if ((colModel) && (store)){
					featureInfoGrid.setTitle( tableName.displayName );
					featureInfoGrid.realName = tableName.name;
								
					featureInfoGrid.reconfigure( store, colModel );
				}
			}	    	  
			dataTabPanel.activate('0');		
			store.load();
			
			// bu yüklemeden sonra, gridin yanında gelecek olan ekstra tablarda, bu tabakaya ait ikişkili tabloların 
			// sıralanması gerekmektedir. 
			fillRelationGrids( getMetadata( 'relTables', tableName.name ) );
		}    				
   	}
}

function fillComboColumnValues(selectedColumn, responseXML){
	// dönen kolon yapısı alınır.			
	var colStruct = getColumnStruct( responseXML );
	// şu anda gelen bilgiyi sadece combobox'a dolduracağımız için ilk değer yeterli.     
    			
    if ((colStruct.columnStruct != null) && (colStruct.columnStruct.length > 0)){    			
		var colModel  = getColModel( responseXML, colStruct );	
		dataStoreColumnValues = getDataStore( responseXML, colStruct );

		dataStoreColumnValues.load();
		
		comboColumnValues.setVisible(true);
		
	    if (comboColumnValues.store == null){
			// seçilen kolonun ismini vereceğiz.				    
	    	comboColumnValues.displayField  = selectedColumn;
    		comboColumnValues.valueField	= selectedColumn;
	    	comboColumnValues.store 		= dataStoreColumnValues;
	    }
	    else{	        
	    	comboColumnValues.reset();
	    	comboColumnValues.store 		= dataStoreColumnValues;
	    	comboColumnValues.displayField  = selectedColumn;
 			comboColumnValues.valueField	= selectedColumn;	
 			//comboColumnValues.view.setStore(comboColumnValues.store);
 			if (comboColumnValues.view){	 			
				comboColumnValues.view.tpl = new Ext.XTemplate('<tpl for="."><div class="x-combo-list-item">{' + selectedColumn + '}</div></tpl>'); //this is not very good
				comboColumnValues.view.setStore(dataStoreColumnValues);			
			}
	    }					    	    				    	    	
	}			   
}

function fillComboLayerColumns(responseXML){
	var Cols = responseXML.getElementsByTagName("Item");
				
	var temp = Array();
	for (i=0;i<Cols.length;i=i+1){
		var Col = Cols[i];		
		temp[i] = [ Col.attributes.getNamedItem("colName").value, Col.attributes.getNamedItem("displayName").value, Col.attributes.getNamedItem("colType").value ];
	}
				
    dataStoreLayerColumns = new Ext.data.SimpleStore({ fields : ["colName","displayName", "colType"], data : temp });
	
	comboLayerColumns.setVisible(true); 		    
    if (comboLayerColumns.store == null){
    	comboLayerColumns.store = dataStoreLayerColumns;
    }
    else{
    	comboLayerColumns.reset();
    	comboLayerColumns.store = dataStoreLayerColumns;
    	if (comboLayerColumns.view){     	
			comboLayerColumns.view.setStore(comboLayerColumns.store);
		}
    }	
}




