/*********************************************************************************************/

var elementos = new Array();
var extenCapas = new Array();
//---------------- Convertir Objetos en formato Json -------------------------------------------
var jsonEncoder = function(obj)
{
	var jsonString = "";
	var separador  = "";
	for(i in obj)
	{ 
		if(i!="remove")
		{ 
			var type = typeof(obj[i]);
			var atributo = separador  + i + ":";
			if(type == "object") jsonString += atributo + jsonEncoder(obj[i]);
			else if(type == "string") jsonString += atributo + '\"' + obj[i] + '\"';
			else if(type == "number" || type == "boolean" ) jsonString += atributo + obj[i];
			separador = ","
		}
	}
	return "{" + jsonString + "}";
}
//---------------- Convertir una cadena en formato Json a Objetos Javascript --------------
var jsonDecoder = function(jsonString)
{
	if(jsonString)
	{
		var ArrayObj = eval("["+jsonString+"]");
		return ArrayObj[0];
	}
}
//-------------------- Captura el array enviado por el servidor ------------------------
var AjaxGet_Array = function(id, pluginOutput)
{
	var _L = eval ("pluginOutput.htmlCode."+id+"L");
	var X0 = eval ("pluginOutput.htmlCode."+id+"layerId");
	var X1 = eval ("pluginOutput.htmlCode."+id+"layerLabel");
	var X2 = eval ("pluginOutput.htmlCode."+id+"layerIcon");
	var X4 = eval ("pluginOutput.htmlCode."+id+"layerChecked");
	var X5 = eval ("pluginOutput.htmlCode."+id+"layerClassName");
	var X3 = new Array();
	if(parseInt(_L)>0)
		for(var i=0; i<parseInt(_L); i++)
			X3[i] = AjaxGet_Array(id+"C"+i.toString(), pluginOutput);
	var ListCapas = new Array(X0,X1,X2,X3,X4,X5);
	return ListCapas;
}
//------------------- Para CapasSeleccionables   -------------------------------------
var CapasSeleccionables = function(value, check)
{
	var registro = new Array();
	if(check)
	{
		var cadena = document.getElementById('capas_select').value;
		    registro[0]= value;
		if (cadena.search(value) != -1)
		   registro[1]= true;
		else
		   registro[1]= false;
		da[cont]= registro; 
		cont++;	 
	} 
	
}
//------------------- Para cuando se hace un dosubmit -------------------------------------
var EnviarDoSubmit = function(value, id)
{

	if(document.forms['carto_form'])
	{
		myMask.show();
		myform = document.forms['carto_form'];
		var input = document.createElement("input");
		input.setAttribute("name", "layers[]");
		input.setAttribute("type", "hidden");
		input.setAttribute("value", value);
		input.setAttribute("id", id+"_capa");
		myform.appendChild(input);
	}
}
//-------------------- Tree : Obtener listado de hijos --------------------------------
var Get_ChildOrder = function(node, list)
{
	var nodelist =  node.childNodes;
	for(i in nodelist)
		if(nodelist[i].attributes)
		{
			var id = nodelist[i].attributes.text;
			var ty = nodelist[i].attributes.type;
			var ch = nodelist[i].attributes.checked;
			if(ch != false && ty == 'Layer') 
				list.push(id);
			if(node.childNodes.length > 0)
				Get_ChildOrder(nodelist[i], list);
		}
}
//-------------------- Retorna el de nodos chekeados en el arbol -----------------------
var Get_NodeListChecked = function()
{
	var LayersList = new Array();
	Get_ChildOrder(rootcapas, LayersList);
	return LayersList;
}
//-------------------- Adicionar las capas activas al QueryString [envio POST]-----------
var Add_QueryStringLayers = function(_array)
{
	var queryString = "";
	var layers = Get_NodeListChecked();
	for(var i=0; i<layers.length; i++)
	{
		queryString += "layers[]=" + layers[i] + '&';	
	}	
	Gestionar_CapasSeleccionables(_array);
	return queryString;
}
//----------------------------------------------------------------------------------------
var Gestionar_CapasSeleccionables = function(_array, accion)
{
	if(_array)for(var i=0; i<_array.length; i++)
	{
		if(_array[i][5] == "LayerGroup")
			Gestionar_CapasSeleccionables(_array[i][3], accion);
		else if(_array[i][4] == 1 && _array[i][5] == "Layer")
		{
			if(accion == "dosubmit")
				EnviarDoSubmit(_array[i][1], _array[i][0]);
			if(accion == "vSeleccion")
			{
				if(_array[i][2].search('nap.png') == -1 && _array[i][2].search('nam.png') == -1)
					CapasSeleccionables(_array[i][1], _array[i][4]);
			}
			if(accion == "vExtenCapas" && _array[i][2].search('nap.png') == -1 
					&& _array[i][2].search('nam.png') == -1)
			{
				extenCapas.push(_array[i][1]);
			}
		}
	}
}
//--------------------- Evento check: Actualizar capas chequeadas ----------------------
var updateLayer = function(_array, _capa, valor)
{
	if(_array)for(var i=0; i<_array.length; i++)
		if(_capa.text == _array[i][1])
		{
			if(!valor) _array[i][4] = 0;
			else 	   _array[i][4] = 1;
			return 1;
		}
		else updateLayer(_array[i][3], _capa, valor);
};
//-------------------- Evento "check" para las capas seleccionables ---------------------
var eventoLayer = function(_array, _capa, valor)
{
	updateLayer(_array, _capa, valor);
	var parent = _capa.parentNode;
	if(valor) parent.attributes.NChildk++;
	else parent.attributes.NChildk--;
	if(parent.attributes.NChildk == 0) parent.getUI().toggleCheck(false);
	else parent.getUI().toggleCheck(true);
};
//--------------------- Evento check: Actualizar capas chequeadas ----------------------
var updateChild = function(_array, valor)
{
	if(_array)for(var i=0; i<_array.length; i++)
	{
		_array[i][4] = valor;
		updateChild(_array[i][3], valor);
	}
}
//--------------------- Evento check: Actualizar capas hijas de agrupaciones -----------
var ActualizarElementos = function(_array, _id, valor)
{
	if(_array)for(var i=0; i<_array.length; i++)
		if(_id == _array[i][1])
		{
			updateChild(_array[i][3], valor);
			return 1;
		}else ActualizarElementos(_array[i][3], _id, valor);
};
//--------------------- Evento check: Actualizar capas de tipo Agrupacion -------------
var ActualizarAgrupacion = function(node, checked)
{
	node.cascade(function(n)
	{
		if(n.attributes.id != node.attributes.id)
		{
			n.getUI().toggleCheck(checked);
			n.attributes.checked = checked;
		}
	});
	ActualizarElementos(elementos, node.text, checked);
	if(checked) node.attributes.NChildk = node.attributes.NChild; 
	else node.attributes.NChildk = 0;
}
//------------------- Cargar el arbol de capas --------------------------------------------
var load_arbol = function(_array, _root)
{
	var NChildCk = 0;
	var NChildC = 0;
	if(_array)for(var i=0; i<_array.length; i++)
	{
		if(_array[i]){
			var _capa; 
			var checked = false;
			if(_array[i][4] == "1") checked = true;  
			if(_array[i][5] == "LayerGroup")
			{
				_capa = new Ext.tree.TreeNode({
					id:   _array[i][0],
					text: _array[i][1],
					NChildk: 1,
					NChild: 1,
					type: 'LayerGroup',
					checked: checked,
					listeners:{checkchange: function(node, checked)
						  {ActualizarAgrupacion(node, checked);}}
				});
			}
			else if(_array[i][2].search('nap.png')==-1 && _array[i][2].search('nam.png')==-1 )
			{
				if(_array[i][5] == "Layer")
				{
					_capa = new Ext.tree.TreeNode({
						leaf: false,
						checked: checked,
						id:   _array[i][0],
						text: _array[i][1],
						icon: _array[i][2],
						type: 'Layer',
						listeners: {checkchange:function(_capa, valor)
							   {eventoLayer(elementos, _capa, valor);},
							   contextmenu:function(node,e)
							   {mostrarMenuCapas(node,e);}}
					});
					NChildC++;
					if(checked)NChildCk++;
				}
				else
					_capa = new Ext.tree.TreeNode({
						id:   _array[i][0],
						text: _array[i][1],
						icon: _array[i][2],
						type: 'LayerClass',
					});
			}else _capa = new Ext.tree.TreeNode({ id:_array[i][0],text:_array[i][1], type: 'Layer',});
			load_arbol(_array[i][3], _capa);
			_root.appendChild(_capa);
		}
	}
	var padre = _root.attributes;
	if(padre.NChild)
	{
		padre.NChild  = NChildC;
		padre.NChildk = NChildCk;
	}
};
//----------------- Actualizar el arbol de capas --------------------------------------------
var ActualizarCapas = function(TreeNodesJS) 
{
	if(rootcapas)
	{
		var l = jsonDecoder(TreeNodesJS);	
		while(rootcapas.hasChildNodes())
			rootcapas.removeChild(rootcapas.firstChild);
		load_arbol(elementos, rootcapas);
		rootcapas.expand();
		rootcapas.cascade(function(n)
		{
			if(n.attributes.id != rootcapas.attributes.id)
			{
				if(n.attributes.NChildk)
				{
					if(n.attributes.NChildk == 0)
						n.getUI().toggleCheck(false);
					else
						n.getUI().toggleCheck(true);
				}
					//----------- newssssss
				if(l) for(i in l)
					if(n.attributes.id == l[i])
					{
						n.expand();
						break;
					}
			}

		});
	} 
};
//----------------- Actualizar el arbol de capas con los nodos expandidos ------------------
var UpdateExpandTree = function(node, jsonString)
{
	var l = jsonDecoder(jsonString);	
	node.cascade(function(n)
	{
		if(n.attributes.id != node.attributes.id)
			for(i in l)
				if(n.attributes.id == l[i])
				{
					n.expand();
					break;
				}
	});
}
//----------------- Obtener la lista de nodos expandidos ------------------------------------
var getNodeExpanded = function(node, lista)
{
 	node.cascade(function(n)
	{
 		if(n.attributes.id != node.attributes.id)
		{
			if(n.isExpanded()) lista.push(n.attributes.id);
		}	
	});	
}
//----------------- Obtener la lista de nodos expandidos codificados en formato json ----------
var getNodeExpandedString = function()
{
	var NodesExpanded =  new Array();
	getNodeExpanded(rootcapas,NodesExpanded);
	var paramValue = jsonEncoder(NodesExpanded);
	return "nodesExpanded=" + paramValue;
}
/*********************************************************************************************/
function layersInit() {
  var layersroot = xGetElementById('layersroot');
  var layers = xGetElementsByTagName('input', layersroot);
  
  for (i=0; i<layers.length;i++) {
    if (layers[i].checked == false) {
      var pid = xGetElementById('id' + layers[i].id.substr(2));
      if (!pid) continue;
      layers[i].indeterminate = !isChildrenUnchecked(pid.id);
    }
  } 
}

function writeOpenNodes(shortcut) {
  if (shortcut) {
    document.carto_form.elements.openNodes.value = openNodes;
    return;
  }
  
  var nodesList = new Array();
  for (var i = 0; i < openNodes.length; i++) {
    nodesList.push(openNodes[i]);
  }
  document.carto_form.elements.openNodes.value = nodesList;
}

function isInOpenNodes(id) {
  for (var i = 0; i < openNodes.length; i++) {
    if (openNodes[i] == id) return i + 1;
  }
  return false;
}

function updateOpenNodes(id, open) {
  var isModified = false;
  if (open) { 
    if (!isInOpenNodes(id)) {
      // adds node to list
      openNodes.push(id);
      isModified = true;
    }
  } else {
    var i = isInOpenNodes(id);
    if (i > 0) {
      // removes node from list
      delete(openNodes[i - 1]);
      isModified = true;
    }
  }
  if(isModified) writeOpenNodes();
}

function replacePic(obj, from, to) {
  var imgs = obj.getElementsByTagName('img');
  var pic = imgs[0].getAttribute('src');
  var re = new RegExp(from);
  pic = pic.replace(re, to);
  imgs[0].setAttribute('src', pic);
}

function shift(id) {
  var obj = document.getElementById(id);
  var key = document.getElementById('x' + id);
  var iid = id.substr(2);
  var visible;

  if (obj.style.display != '') {
    if (obj.style.display != 'none') visible = true;
    else visible = false;
  } else {
    if (obj.className == 'v') visible = true;
    else visible = false;
  }
  
  if (visible) { 
    replacePic(key, 'minus', 'plus');
    obj.style.display = 'none';
    updateOpenNodes(iid);
  }
  else {
    replacePic(key, 'plus', 'minus');
    obj.style.display = 'block';
    updateOpenNodes(iid,true);
  }
}

 function expandAll(id) {
  var mydiv = document.getElementById(id);
  var divs = mydiv.getElementsByTagName('div');
  var key;
  
  openNodes = new Array();
  
  for (var i = 0; i < divs.length; i++) {
    divs[i].style.display = 'block';
    var nid = divs[i].id;
    openNodes.push(nid.substr(2));
    key = document.getElementById('x' + nid);
    if (key) replacePic(key, 'plus', 'minus');
  }

  writeOpenNodes(true);
}

function closeAll(id) {
  var mydiv = document.getElementById(id);
  var divs = mydiv.getElementsByTagName('div');
  var key;
  
  for (var i = 0; i < divs.length; i++) {    
    key = document.getElementById('x' + divs[i].id);
    if (key) replacePic(key, 'minus', 'plus');
      
    if (divs[i].getAttribute('id')) {
        divs[i].style.display = 'none';    
    }
  }

  openNodes = new Array();
  writeOpenNodes(true);
}

function checkChildren(id,val) {
  var mydiv = document.getElementById(id);
  if (!mydiv) return;
  
  var divs = mydiv.getElementsByTagName('input');
  if (val != false) val = true;

  for (var i = 0; i < divs.length; i++) {
    if (divs[i].name.substring(0, 6) == 'layers')
      divs[i].checked = val;
  }
}

function isChildrenChecked(id) {
  var dparent = document.getElementById(id);
  var celts = dparent.getElementsByTagName('input');
  for (var i = 0; i < celts.length; i++) {
    if (!celts[i].checked) return false;
  }
  return true;
}

function isChildrenUnchecked(id) {
  var dparent = document.getElementById(id);
  var celts = dparent.getElementsByTagName('input');
  for (var i = 0; i < celts.length; i++) {
    if (celts[i].checked) return false;
  }
  return true;
}

function updateChecked(id,skipChildren) {
  var refresh = xGetElementById("refresh");
  if (refresh != null && !CartoWeb.isAjaxMode())
    refresh.className = "form_button_hilight";

  var obj = document.getElementById('in' + id);
  if (!obj) return;
  var val = obj.checked;
  
  if (!skipChildren) checkChildren('id' + id, val);
  
  /* get the parent element of type DIV (in case table were used to format the tree, 
  hence the first parent will be a TD) */
  var objparent = obj.parentNode;
  while (objparent.nodeName.toLowerCase() != 'div'){
    objparent = objparent.parentNode;
  }
  var pid = objparent.getAttribute('id');
  if (!pid) return;
  var iid = pid.substr(2);
  var iparent = document.getElementById('in' + iid);
 
  if (!iparent) return;

  // if node has been unchecked, makes sure parents are unchecked too
  if (val == false) {
    iparent.checked = false;
    iparent.indeterminate = !isChildrenUnchecked(pid);
    updateChecked(iid, true);
  }
  // if all siblings are checked, makes sure parents are checked too
  else if (isChildrenChecked(pid)) {
    iparent.checked = true;
    iparent.indeterminate = false;
    updateChecked(iid, true);
  }
  else iparent.indeterminate = true;
}

function goToScale(scale) {
  document.carto_form.recenter_doit.value = 1;
  var newOpt = document.createElement('option');
  newOpt.value = scale;
  newOpt.selected = true;
  document.carto_form.recenter_scale.options.add(newOpt);
  if (typeof CartoWeb != 'null') {
    CartoWeb.trigger('Location.Zoom', "FormItemSelected()");
  } else {
    FormItemSelected();
  }
}

/**
 * activate/deactivate a swtich tab
 */
function switchSwitch(switchId) {
  // set switch id hidden input
  $('switch_id').value = switchId;
  // switch menu
  var sC = $('switchmenucontainer');
  var sList = xGetElementsByTagName('li', sC);
  for (var i = 0; i < sList.length; i++) {
    var classNames = sList[i].className.split(' ');
    var nClassNames = '';
    for (var j = 0; j < classNames.length; j++) {
      if (classNames[j] != 'switchmenuactiv') {
        nClassNames += classNames[j] + ' ';
      }
    }
    if (sList[i].id == ('switch_' + switchId)) {
      nClassNames += 'switchmenuactiv';
    }
    sList[i].className = nClassNames;
  }

}

EventManager.Add(window, 'load', layersInit, false);

/**********************************Menu Contextual "capas"***************************************/
function mostrarMenuCapas(node,e)
{
cmenucapas = new Ext.menu.Menu({ 
    id:'cmenucapas', 
    items: [{text: 'Ver datos de la capa "'+node.text+'"',handler : function(){captarDatos(node.text);}} ,'-', {text: 'Eliminar WMS',},'-', {text: 'Etc.... ',}] 
});
	cmenucapas.showAt([e.xy[0],(e.xy[1]+10)]);
}
/***************Funcion para captar los datos de la capa seleccionada en el arbol****************/
function captarDatos(node)
{
var loadConn = new Ext.data.Connection({timeout: 300000});
myMask.show();
loadConn.request({method: 'POST', url: 'geoweb.php' , params: { nombrecapa: node,accion: 'campos',opcion:'paginar'}});
loadConn.on('requestcomplete', function(sender, param)
 {
	try 

    {           
        var response = eval(param.responseText);
	} 
	catch (e) 
	{
        alert('There was a problem loading the tasks for this job. (JSON.decode failed)');
        return;
    }
	creaVentanaDatosCapa(response,node);
});

}
/********************************/
function creaVentanaDatosCapa(response,node)
{
var arrdatosC=[];
var columnas=[];
var campos = [];
var res=response;
var i=0;
var v_header=null;
var filaSeleccionada;			 
for(i;i<res.length;i++)
{
	v_header=res[i];
	campos.push(v_header);
	arrdatosC.push({name:v_header});
	columnas.push({header: v_header,width: 70, sortable: true, dataIndex: v_header})
   
}
var cm = new Ext.grid.ColumnModel(columnas);
cm.defaultSortable = true;

Ext.data.JsonStore = function(c){
    Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {
        proxy: !c.data ? new Ext.data.HttpProxy(new Ext.data.Connection({url: c.url, timeout: c.timeout})) : undefined,
        reader: new Ext.data.JsonReader(c, c.fields)
    }));
};
Ext.extend(Ext.data.JsonStore, Ext.data.Store);
var myBigTimeout = 120000
    var datoscapa = new Ext.data.JsonStore({
		url: 'geoweb.php',
		remoteSort: true,
		baseParams:{nombrecapa : node,accion :'filas',opcion:'paginar'},
		proxy: new Ext.data.HttpProxy({url: 'geoweb.php', timeout: myBigTimeout}),
		fields: campos,
		totalProperty: 'totalCount',
		root: 'matches',
		id: 'pagina',
    });				
	
var pagingBar = new Ext.PagingToolbar({
		    pageSize: 16,
		    store: datoscapa,
		    displayInfo: true,
			doLoad : function(start){
		    var o = {}, pn = this.paramNames;
		    o[pn.start] = start;
		    o[pn.limit] = this.pageSize;
		    if(this.fireEvent('beforechange', this, o) !== false){
		        this.store.load({params:o});
		    }
			},
			changePage: function(page){
        	this.doLoad(((page-1) * this.pageSize).constrain(0, this.store.getTotalCount()));  
   			 },
			getPageData : function(){
		    var total = this.store.getTotalCount();
		    return {
		        total : total,
		        activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),
		        pages :  total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)
		    }},
		 });
var seleccion = new Ext.grid.RowSelectionModel({
    		singleSelect: true
});	var gridDatoscapa = new Ext.grid.GridPanel({       
								//columns: columnas,
								cm : cm,
								stripeRows: true,
								ds : datoscapa,
								store:datoscapa,		
								//width : 880,
								//height : 380,
								//autoShow: true,
								autoScroll:true,
								sm : seleccion,
								viewConfig: {enableRowBody:true,},
								bbar:pagingBar,
								pagingBarbodyStyle: 'text-align:center;width:600',
								autoScroll: true
								//viewConfig: {autoFill: true},
	
});
datoscapa.load({params: {start: 0,limit: 16}});
gridDatoscapa.on('headerclick',
	function()
	{
		datoscapa.baseParams = {nombrecapa : node,accion :'filas',opcion:'ordenar'};
	}
);

gridDatoscapa.on('sortchange',
	function()
	{
		if(datoscapa.reader.jsonData.pagina!="")
		{
			pagingBar.changePage(datoscapa.reader.jsonData.pagina);
		}
		datoscapa.baseParams = {nombrecapa : node,accion :'filas',opcion:'paginar'};
	}
);
var pdatoscapas = new Ext.Panel({
		frame : true,
		width : 600,
		height: 400,
		layout: 'fit',
		items : gridDatoscapa
});
var datoscapas = new Ext.Window(
	{
				title : 'Datos de las capas',  
               	width : 980,
                //autoHeight : true,
				height:490,
				autoScroll : true,				
				plain : true,
				resizable :false,
				modal :true,
				layout : 'fit',
               	closeAction :'hide',
				buttons: [
				{text : 'Ok',
				handler :
				function()
				{
					
				}},
				{text : 'Cancelar',
                   		 handler  : function()
									{
										Cancelar();
                    				}
                		}],
				items:pdatoscapas
				
            }); 
datoscapas.on("hide",function(){Cancelar();}); 
datoscapa.on("load",function(){datoscapas.show();myMask.hide();})

function Cancelar()
{
	var cerrar = new Ext.data.Connection({timeout: 300000});
	cerrar.request({method: 'POST', url: 'geoweb.php' , params: { nombrecapa: node,accion: 'cancelar',opcion:'paginar'}});
	datoscapas.hide();
}
};


