extensions.push('query');


//addExtensionHTML(queryhtml);

function queryBegin() {
	commands['doQuery']='doQuery';
	commands['dettaglioQuery']='dettaglioQuery';
	commands['queryMappa']='queryMappa';
	commands['queryMappaExecute']='queryMappaExecute';
	commands['queryParamsOpen']='queryParamsOpen';
	commands['queryParamsClose']='queryParamsClose';
	commands['labelParamClose']='labelParamClose';
	commands['customFunction']='customFunction';
	commands['getTemaStyle']='getTemaStyle';
	commands['selectStyle']='selectStyle';

	//eventListeners.attachToEvent('queryOnMap','storeQueryResult');

	var popup=new Popup('queryparams',document.getElementById('queryParamsDiv'),null,null,document.getElementById('queryTitle'));
	popups.addPopup(popup);
	popup=new Popup('labelparam',document.getElementById('legendLabelDiv'),null,null,document.getElementById('legendLabelTitle'));
	popups.addPopup(popup);

	doQueryConfig();
}


function doTemaTorta() {
	//mapInfo.setProperty('queryName','temaProvinciaUnitaLocali');
	if(mapInfo.getProperty('editingFeature')) {
		queryMappaExecute();
	} else {
		document.getElementById('queryParamsDiv').style.visibility='hidden';
		document.getElementById('legendLabelDiv').style.visibility='visible';
		var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
		document.getElementById('labelChosen').value=queryDesc.description;
		actionEnd();
	}
}



function doTemaDistribuzione() {
	//mapInfo.setProperty('queryName','temaProvinciaUnitaLocali');
	if(mapInfo.getProperty('editingFeature')) {
		queryMappaExecute();
	} else {
		document.getElementById('queryParamsDiv').style.visibility='hidden';
		document.getElementById('legendLabelDiv').style.visibility='visible';
		var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
		document.getElementById('labelChosen').value=queryDesc.description;
		actionEnd();
	}
}

function doTemaIstogramma() {
	//mapInfo.setProperty('queryName','temaProvinciaUnitaLocali');
	if(mapInfo.getProperty('editingFeature')) {
		queryMappaExecute();
	} else {
		document.getElementById('queryParamsDiv').style.visibility='hidden';
		document.getElementById('legendLabelDiv').style.visibility='visible';
		var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
		document.getElementById('labelChosen').value=queryDesc.description;
		actionEnd();
	}
}

function doTema() {
	if(mapInfo.getProperty('editingFeature')) {
		queryMappaExecute();
	} else {
		document.getElementById('queryParamsDiv').style.visibility='hidden';
		document.getElementById('legendLabelDiv').style.visibility='visible';
		var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
		document.getElementById('labelChosen').value=queryDesc.description;
		actionEnd();
	}
}

function doTemaExecute() {
	var label=mapInfo.getProperty('editingFeature');
	if(!label) {
		label=document.getElementById('labelChosen').value;
		label=label.replace(/\'/gi,'');
		if(!checkLabel(label)) {
			alert('Il nome e\' gia\' stato usato. Sceglierne un altro');
			actionEnd();
	
		}
	}
	document.getElementById('legendLabelDiv').style.visibility='hidden';
	var queryName=mapInfo.getProperty('queryName');
	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')]
	var wmsFeature;
	var filter;
	var temaType='';
	var temaStyle=mapInfo.getProperty('temaStyle');
	var temaField=mapInfo.getProperty('temaField');
	var temaName=mapInfo.getProperty('temaName');
	if(queryName=='temaTratteVisualizzate') {
		temaType='lineartematism';
		wmsFeature='TRAT_WEBS';
		filter='<Within><PropertyName>Geometry</PropertyName><gml:Box><gml:coordinates>'+map.realRange.minX+','+map.realRange.minY+','+map.realRange.maxX+','+map.realRange.maxY+'</gml:coordinates></gml:Box></Within>';
	}
	if(queryName=='temaTratteLocalizzate') {
		temaType='lineartematism';
		wmsFeature='TRAT_WEBS';
		filter='';
		var ids=mapInfo.getProperty('storedTratte');
		for(var pos in ids) {
			var id=ids[pos];
			filter+='<FeatureId fid="\\\''+id+'\\\'"/>'
		}
	}
	if(queryName=='temaTratteSelezionate') {
		temaType='lineartematism';
		wmsFeature='TRAT_WEBS';
		filter='';
		var dataSet=mapInfo.getProperty('queryResult');
		var ids=mapInfo.getProperty('checkedList');
		var fids=dataSet.ids2Fids(ids,'TRAT_WEBS');
		for(var id in fids) {
			var idArr=id.split(',');
			var realId=idArr[1];
			
			filter+='<FeatureId fid="\\\''+realId+'\\\'"/>'
		}
	}
	if(queryName=='temaSubTratteVisualizzate') {
		temaType='lineartematism';
		wmsFeature='TRAT_WEBS';
		filter='<Within><PropertyName>Geometry</PropertyName><gml:Box><gml:coordinates>'+map.realRange.minX+','+map.realRange.minY+','+map.realRange.maxX+','+map.realRange.maxY+'</gml:coordinates></gml:Box></Within>';
	}
	if(queryName=='temaSubTratteLocalizzate') {
		temaType='lineartematism';
		wmsFeature='TRAT_WEBS';
		filter='';
		var ids=mapInfo.getProperty('storedTratte');
		for(var pos in ids) {
			var id=ids[pos];
			filter+='<FeatureId fid="\\\''+id+'\\\'"/>'
		}
	}
	if(queryName=='temaSubTratteSelezionate') {
		temaType='lineartematism';
		wmsFeature='TRAT_WEBS';
		filter='';
		var dataSet=mapInfo.getProperty('queryResult');
		var ids=mapInfo.getProperty('checkedList');
		var fids=dataSet.ids2Fids(ids,'TRAT_WEBS');
		for(var id in fids) {
			var idArr=id.split(',');
			var realId=idArr[1];
			
			filter+='<FeatureId fid="\\\''+realId+'\\\'"/>'
		}
	}
	if(queryName=='temaLocalitaVisualizzate') {
		temaType='punctualtematism';
		wmsFeature='LOCA_WEBS';
		filter='<Within><PropertyName>Geometry</PropertyName><gml:Box><gml:coordinates>'+map.realRange.minX+','+map.realRange.minY+','+map.realRange.maxX+','+map.realRange.maxY+'</gml:coordinates></gml:Box></Within>';
	}
	if(queryName=='temaLocalitaLocalizzate') {
		temaType='punctualtematism';
		wmsFeature='LOCA_WEBS';
		filter='';
		var ids=mapInfo.getProperty('storedLocalita');
		for(var pos in ids) {
			var id=ids[pos];
			filter+='<FeatureId fid="\\\''+id+'\\\'"/>'
		}
	}
	if(queryName=='temaLocalitaSelezionate') {
		temaType='punctualtematism';
		wmsFeature='LOCA_WEBS';
		filter='';
		var dataSet=mapInfo.getProperty('queryResult');
		var ids=mapInfo.getProperty('checkedList');
		var fids=dataSet.ids2Fids(ids,'LOCA_WEBS');
		for(var id in fids) {
			var idArr=id.split(',');
			var realId=idArr[1];
			
			filter+='<FeatureId fid="\\\''+realId+'\\\'"/>'
		}
	}

	var	filterCond;
	if(queryName=='temaSubTratteSelezionate' || queryName=='temaSubTratteLocalizzate' || queryName=='temaSubTratteVisualizzate')
		filterCond='<TsfDynSegmentationLayer>'+filter+'<Type>'+temaStyle+'</Type></TsfDynSegmentationLayer>';
	else
		filterCond='<NamedLayer><Name>'+tablePrefix(wmsFeature)+wmsFeature+'</Name><UserStyle><Name>Query'+analysisName+'</Name><FeatureTypeStyle><FeatureTypeName>'+tablePrefix(wmsFeature)+wmsFeature+'</FeatureTypeName><Rule><Name>RuleS1</Name><Filter>'+filter+'</Filter><Tooltip text="'+wmsFeature+'-%3C%.OR_ID%%3D,%3C%.'+temaField+'%%3D"></Tooltip>'+queryDesc.getStyle(wmsFeature)+'</Rule></FeatureTypeStyle></UserStyle></NamedLayer>';
			
	
	automa=new Automa('DoQueryMap',3,'automa','actionEnd()');
	automa.setProperty('queryName',queryName);
	automa.setProperty('arguments',filterCond);
	automa.setProperty('specialType',temaType);
	automa.setProperty('properties',new Array(temaStyle,temaName));
	automa.setProperty('legendLabel',label);
	automa.setProperty('featureType',queryDesc.featureType);
	automa.setProperty('style',queryDesc.getStyle(wmsFeature));
			
	automa.start();
	
}

function styleTableToggle(element) {
	var currentColor=element.style.backgroundColor;
	
	var div=document.getElementById('styleTableDiv');
	var oldElement=mapInfo.getProperty('styleElement');
	if(div.style.visibility=='visible' && element==oldElement) {
		mapInfo.setProperty('styleElement','none');
		div.style.visibility='hidden';
		element.style.border='#f3f1f1 solid 2px';
	} else {
		if(oldElement && oldElement!='none')
			oldElement.style.border='#f3f1f1 solid 2px';
		element.style.border='#404040 solid 2px';
		mapInfo.setProperty('styleElement',element);
		for(var count=0;count<2;count++) {
			
			for(var pos=0;pos<20;pos++) {
				var color=styleTableRow[pos+count*20];
				var colorCell=document.getElementById('styleCell'+(pos+count*20));
				
				if(color.toLowerCase()==currentColor.toLowerCase())
					colorCell.style.border='#404040 solid 2px';
				else
					colorCell.style.border='white solid 2px';
			}
			
		}
				
		/*div.style.pixelTop=element.offsetTop+105;
		div.style.pixelLeft=element.offsetLeft+25;*/
		div.style.visibility='visible';
	}
}

function selectStyle(color) {
	var element=mapInfo.getProperty('styleElement');
	element.style.border='#f3f1f1 solid 2px';
	element.style.backgroundColor=color;
	mapInfo.setProperty('styleElement','none');
	document.getElementById('styleTableDiv').style.visibility='hidden';
	var temaStyle=mapInfo.getProperty('temaStyle');
	var value=element.getAttribute('id').substring(11);
	
	temaStyle[value]=color;
	mapInfo.setProperty('temaStyle',temaStyle);
	actionEnd();
}

function getTemaStyle(args) {
	var argsArr=args.split(',');
	var feature=argsArr[0];
	var field=argsArr[1];
	mapInfo.setProperty('temaField',field);
	
	var temas=mapInfo.getProperty('temas');
	if(temas[args+',VALUES']) {
		mapInfo.setProperty('temaName',args+',VALUES');
		var temaStyle=new Array();
		var div=document.getElementById('temaStyleDiv');
		div.style.height='100px';
		var html='<table width="330">';
		var tema=temas[args+',VALUES'];
		for(var pos in tema) {
			var value=tema[pos];
			temaStyle[value]=styleTableRow[pos];

			html+='<tr><td width="315">'+value+'</td><td width="15" id="temaStyleTd'+value+'" style="border: #f3f1f1 solid 2px;cursor:hand;background-color:'+styleTableRow[pos]+'" onclick="styleTableToggle(this)"><img width="15" alt="cambia colore" height="15" src="immagini/spacer.gif"/></td></tr>';
		}
		html+='</table>';
		div.innerHTML=html;
		mapInfo.setProperty('temaStyle',temaStyle);
	}
	actionEnd();
}

function getTratteStyle(style) {
	if(style!='NONE') {
		
		doCommand('getTemaStyle','TRAT_WEBS,'+style)
	} else {
		mapInfo.setProperty('temaStyle',null);
		var div=document.getElementById('temaStyleDiv');
		div.style.height='20px';
		div.innerHTML='&nbsp;';
	}
}

function getSubTratteStyle(style) {
	if(style!='NONE') {
		
		mapInfo.setProperty('temaStyle',style);
	} else {
		mapInfo.setProperty('temaStyle',null);
		
	}
}



function customFunction() {
	var queryDesc=automa.getProperty('customQueryDescription');

	eval(queryDesc.customFunction+'()');
}

function getSediTecnicheArguments(queries,mainFeature,ids) {
	mapInfo.setProperty('mainQuery',null);
	var wfsQueries=new Array();
	for(var pos in queries) {
		var result='';
		var queryName=queries[pos];
		var conditions=0;
		
		var queryDesc=mapInfo.getProperty('queries')[queryName];
		
		var inputs=queryDesc.inputsList();
		var featureName=queryDesc.feature;
		
		var filter;
		
		var filterCond='';
		var idName=queryDesc.getIdName(featureName);
		if(idName)
			result+='<Query typeName="'+tablePrefix(featureName)+featureName+'" primarykey="'+idName+'">';
		else
			result+='<Query typeName="'+tablePrefix(featureName)+featureName+'">';
		var outputs=queryDesc.outputsList('list');
		var fieldsText='';
		//var assocs=new Array();
		for(var pos=0;pos<outputs.length;pos++) {
			var output=outputs[pos];
			fieldsText+='<PropertyName>'+output.name+'</PropertyName>';
		}
		
		//mapInfo.setProperty('queryLabels',assocs);
		result+=fieldsText;
		filterCond='<Overlaps><PropertyName>Geometry</PropertyName><Query typeName="'+tablePrefix('TRAT_WEBS')+'TRAT_WEBS" primarykey="OR_ID"><PropertyName>Geometry</PropertyName><Filter>';
		conditions++;
		var inputs=queryDesc.inputsList(mainFeature);
		
		for(var pos=0;pos<inputs.length;pos++) {
			var input=inputs[pos];
			
			var fieldName=input.name;
			
			var fieldComparison=input.comparison;
			var fieldInput=input.description.toLowerCase()+'Input';
			var fieldType=input.type;



			if(input.description=='ID') {
				//var idConditions=0;
				var internalFilter='';
				for(var id in ids) {

					var fieldValue=id.substring(id.indexOf(',')+1);
			
					//idConditions++;
					internalFilter+='<FeatureId fid="\''+fieldValue+'\'"/>';
					/*if(fieldComparison.toLowerCase()=='equals')
						internalFilter+='<PropertyIsEqualTo><PropertyName>'+fieldName+'</PropertyName><Literal>\''+fieldValue+'\'</Literal></PropertyIsEqualTo>';
					else if(fieldComparison.toLowerCase()=='islike')
						internalFilter+='<PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><PropertyName>'+fieldName+'</PropertyName><Literal>\'*'+fieldValue+'*\'</Literal></PropertyIsLike>';*/
				}
				/*if(idConditions>1) {
					conditions++;
					filterCond+='<Or>'+internalFilter+'</Or>';
				} else if(idConditions==1) {*/
					
					filterCond+=internalFilter;
				//}

			}
		}
		
		
		/*var spatialFilter=savedInputs['$SPATIALFILTER'];
		if(spatialFilter) {
			conditions++;
			filterCond=spatialFilter+filterCond;
		}*/
		/*if(conditions>1)
			filterCond='<And>'+filterCond+'</And>';*/
		/*else if(conditions==1)
			result+=filterCond;*/
		/*if(spatialFilter)
			filterCond='<And>'+spatialFilter+filterCond+'</And>';*/
		//result+=filterCond;
		//if(conditions==0 && !spatialFilter)
		if(conditions==0)
			return null;
		/*if(queryName=='localizzaTratta')
			return 'codice='+document.getElementById('codiceInput').value+',descrizione='+document.getElementById('descrizioneInput').value*/
		filterCond   +='</Filter></Query></Overlaps>';
		var savedInputs=mapInfo.getProperty('savedInputs');
		var daKm=savedInputs['DA_KM']*1000;
		var alKm=savedInputs['AL_KM']*1000;
		if(daKm) {
			conditions++;
			filterCond+='<PropertyIsGreaterThan><PropertyName>KM_INIZIO</PropertyName><Literal>'+daKm+'</Literal></PropertyIsGreaterThan>';
		}
		if(alKm) {
			conditions++;
			filterCond+='<PropertyIsLessThan><PropertyName>KM_FINE</PropertyName><Literal>'+alKm+'</Literal></PropertyIsLessThan>';
		}
		if(conditions>1)
			filterCond='<And>'+filterCond+'</And>';
		
		result   +='<Filter>'+filterCond+'</Filter></Query>';
		
		wfsQueries.push(result);
	}
	return wfsQueries;
}

function cercaSediTecniche() {
	var dataSet=mapInfo.getProperty('queryResult');
	
	var idList=mapInfo.getProperty('checkedList');
	mapInfo.setProperty('queryName','sediTecniche');
	var idCount=0;
	var myId=0;
	var idHash=new Array();
	for (var id in idList) {
		idHash[id]='on';
		idCount++;
	}
	
	var myIds;
	var hasFid=false;
	
	//idHash[myId]='on';
	//if(hasFid)
	myIds=dataSet.ids2Fids(idHash,'TRAT_WEBS');
	
	if(idCount==0) {
		alert('Selezionare almeno un elemento');
		actionEnd();
	} else {
		var tipi=mapInfo.getProperty('tipiSediTecniche');
		var queryNames=new Array();
		for(var pos in tipi) {
			var tipo=tipi[pos];
			var check=document.getElementById(tipo+'Input');
			if(check.checked)
				queryNames.push('sediTecniche'+tipo);
		}
		if(queryNames.length==0) {
			alert('Selezionare almeno un tipo di oggetto');
			actionEnd();
		} else {
			var wfsQueries=getSediTecnicheArguments(queryNames,'TRAT_WEBS',myIds);
			
			automa=new Automa('DoMultipleQuery',2,'automa','actionEnd()');
			automa.setProperty('queryCount',0);
			automa.setProperty('queryNames',queryNames);
			automa.setProperty('arguments',wfsQueries);
			automa.setProperty('mode','list');
			automa.setProperty('globalDataSet',null);
			automa.start();
		}
	}
}

/*function doNextQuery(pos,queryNames,wfsQueries) {
	var queryName=queryNames[pos];
	
	var queryDesc=mapInfo.getProperty('queries')[queryName];
	automa.setProperty('queryName',queryName);
	automa.setProperty('queryFeature',queryDesc.feature);
	var args=wfsQueries[pos];
	engine.sendMsg("query",null,'returnQuery',queryName,args,automa.getProperty('mode'));
}*/

function automaDoMultipleQueryPhase1() {
	if(automa.getProperty('mode')=='list')
		mapInfo.setProperty('checkedList',new Array());
	var queryNames=automa.getProperty('queryNames');
	var wfsQueries=automa.getProperty('arguments');
	doNextQuery(0,queryNames,wfsQueries);
	
	
}

function automaDoMultipleQueryPhase2() {
	var globalDataSet=automa.getProperty('globalDataSet');
	var dataSet=automa.getProperty('dataSet');
	if(!globalDataSet)
		globalDataSet=dataSet;
	else
		globalDataSet.append(dataSet);
	automa.setProperty('globalDataSet',globalDataSet);
	var queryDesc=mapInfo.getProperty('queries')[automa.getProperty('queryName')];
	
	var count=automa.getProperty('queryCount');
	count++;
	automa.setProperty('queryCount',count);
	var queryNames=automa.getProperty('queryNames');
	var wfsQueries=automa.getProperty('arguments');
	
	if(count==queryNames.length) {

		if(automa.getProperty('mode')=='list') {
			mapInfo.setProperty('rowTitle',null);
			mapInfo.setProperty('firstResult',0);
			mapInfo.setProperty('queryResult',globalDataSet);
			mapInfo.setProperty('queryTitle','RISULTATO RICERCA');
			mapInfo.setProperty('queryDescription',queryDesc);
			
			viewQueryResult(globalDataSet);
		}
		else {
			var rowTitle=(queryDesc.outputsList('title'))[0].description;
			mapInfo.setProperty('rowTitle',rowTitle);
			mapInfo.setProperty('detailResult',globalDataSet);
			mapInfo.setProperty('queryTitle',queryDesc.description);
			mapInfo.setProperty('queryDescription',queryDesc);
			viewQueryResult('detail');
		}
	
		automa.end();
	} else {
		automa.rewind();
		doNextQuery(count,queryNames,wfsQueries);
		
	}
}

function featureChosen(feature) {
	//var feature=select.options[select.selectedIndex].value;
	var dynAttrList=mapInfo.getProperty('dynamicLocAttributes')[feature];
	dynAttrList.draw(document.getElementById('attributiInput'));
	//document.getElementById('attributiSpan').innerHTML=dynamicLocAttributes;

}

function insertAtCaret (textEl, text) {
       if (textEl.createTextRange && textEl.caretPos) {
         var caretPos = textEl.caretPos;
		 
         caretPos.text =
           caretPos.text.charAt(caretPos.text.length - 1) == ' ' ?
             text + ' ' : text;
       }
       else
         textEl.value  += text;
}


function storeCaret (textEl) {
   if (textEl.createTextRange) 
     textEl.caretPos = document.selection.createRange().duplicate();
}

function addValue(textfield,nokey) {
	if(event.keyCode==13 || nokey)
		insertAtCaret(document.getElementById('criterioInput'),textfield.value);
}

function addOperator(button) {
	
	insertAtCaret(document.getElementById('criterioInput'),button.value);
}

function chooseAttribute(attribute) {
	
	insertAtCaret(document.getElementById('criterioInput'),attribute);
}

function deselectCurrentFunction() {
	UCTreeActionPanel1_TreeView1.SelectedNode=null;
	UCTreeActionPanel1_TreeView1.Render();
}

function queryParamsClose() {
	eventListeners.fireEvent('queryEnd');
	//deselectCurrentFunction();
	document.getElementById('queryParamsDiv').style.visibility='hidden';
	//document.getElementById('styleTableDiv').style.visibility='hidden';
	actionEnd();
}

function labelParamClose() {
	document.getElementById('legendLabelDiv').style.visibility='hidden';
	actionEnd();
}

function putToString(idList) {
	var result='';
	for(var id in idList) {
		result+=';'+id;
		

	}
	if(result.length>0)
		return result.substring(1);
	return result;
}

function decompose(idList) {
	var idByFeatures=new Array();
	for(var id in idList) {
		
		var idArr=id.split(',');
		var feature=idArr[0];
		var realId=idArr[1];
		var featureArr=idByFeatures[feature];
		if(!featureArr)
			featureArr=new Array();
		featureArr.push(realId);
		idByFeatures[feature]=featureArr;
	}
	return idByFeatures;
}

function getDetailArguments(queryName,idList) {
	
	var idByFeatures=decompose(idList);
	var conditions=0;	
	
	var queryDesc=mapInfo.getProperty('queries')[queryName];
	
	var result='';
	var resFeature;
	for (var feature in idByFeatures)
	{
		resFeature=feature;
		var filterCond='';
		var ids=idByFeatures[feature];
		var idName=queryDesc.getIdName(feature);
		if(idName)
			result+='<Query typeName="'+tablePrefix(feature)+feature+'" primarykey="'+idName+'">';
		else
			result+='<Query typeName="'+tablePrefix(feature)+feature+'">';
		
		var fieldsText='';
		var outputs=queryDesc.outputsList('detail',feature);
		
		var idName='';
		var idQuote='';
		var idType=queryDesc.getIdType(feature);
		if(idType=='STRING')
			idQuote='\'';
		for(var pos=0;pos<outputs.length;pos++) {
			var output=outputs[pos];
			fieldsText+='<PropertyName>'+output.name+'</PropertyName>';
			
		}
		if(queryDesc.realGroupBy)
			fieldsText+='<PropertyName>'+queryDesc.realGroupBy+'</PropertyName>';
		result+=fieldsText+'<Filter>';

		for(var pos in ids) {
			var id=ids[pos];
			conditions++;
			if(queryDesc.realGroupBy) {
				var idQuoteGroup='';
				if(queryDesc.realGroupByType=='STRING')
					idQuoteGroup='\'';
				filterCond+='<PropertyIsEqualTo><PropertyName>'+queryDesc.realGroupBy+'</PropertyName><Literal>'+idQuoteGroup+id.replace(/\'/gi,'\'\'')+idQuoteGroup+'</Literal></PropertyIsEqualTo>';

			} else
				filterCond+='<FeatureId fid="'+idQuote+id.replace(/\'/gi,'\'\'')+idQuote+'"/>';
		}
		if(queryDesc.realGroupBy) {
			if(conditions>1)
				result+='<Or>'+filterCond+'</Or>';
			else if(conditions==1)
				result+=filterCond;
			else return null;
		} else {
			if(conditions>0)
				result+=filterCond;
			else return null;
		}
		result   +='</Filter></Query>';
	}
	
	return new Array(resFeature,result);
}

function getFieldValue(fieldInput,fieldType) {
	
	var fieldValue;
	if(fieldType.toLowerCase()=='text')
		fieldValue=document.getElementById(fieldInput).value;
	if(fieldType.toLowerCase()=='select') {
		var select=document.getElementById(fieldInput);
		fieldValue=select.options[select.selectedIndex].value;
	}
	return fieldValue.replace(/\'/gi,'\'\'');

}

function getSpatialFilter(spatialArea,specifier,spatialOperator,queryDesc) {
	var spatialFilter;
	
	if(spatialArea!='NONE') {
		
		var geometry='';
		if(spatialArea=='BOUNDINGBOX') {
			
			geometry='<gml:Box><gml:coordinates>'+map.realRange.minX+','+map.realRange.minY+','+map.realRange.maxX+','+map.realRange.maxY+'</gml:coordinates></gml:Box>';
		} else if(spatialArea.substring(0,2).toLowerCase()=='bz') {
			
			var bufferZones=mapInfo.getProperty('bufferZones');
			var bufferZone=bufferZones[spatialArea.substring(2)];
			var id=bufferZone[0];
			var idArr=id.split(',');
			id=idArr[1];
			var feature=idArr[0];
			var dimension=bufferZone[1];
			var idName=queryDesc.getIdName(feature);
			if(idName)
				geometry='<Query typeName="'+tablePrefix(feature)+feature+'" primarykey="'+idName+'">';
			else
				geometry='<Query typeName="'+tablePrefix(feature)+feature+'">';
			geometry+='<PropertyName>Geometry</PropertyName><Filter><FeatureId fid="\''+id+'\'"/></Filter></Query>';
			if(spatialOperator=='Overlaps')
				spatialFilter='<Not><Beyond><Distance>'+dimension+'</Distance><PropertyName>Geometry</PropertyName>'+geometry+'</Beyond></Not>';
			else if(spatialOperator=='Within')
				spatialFilter='<DWithin><Distance>'+dimension+'</Distance><PropertyName>Geometry</PropertyName>'+geometry+'</DWithin>';
		} else {
			var idName=queryDesc.getIdName(spatialArea);
			if(idName)
				geometry='<Query typeName="'+tablePrefix(spatialArea)+spatialArea+'" primarykey="'+idName+'">';
			else
				geometry='<Query typeName="'+tablePrefix(spatialArea)+spatialArea+'">';
			geometry+='<PropertyName>Geometry</PropertyName><Filter><PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><PropertyName>POLYGON_NM</PropertyName><Literal>\'%'+specifier.toUpperCase()+'%\'</Literal></PropertyIsLike></Filter></Query>';
		}

		
			

		if(spatialArea.substring(0,2).toLowerCase()!='bz')
			spatialFilter='<'+spatialOperator+'><PropertyName>Geometry</PropertyName>'+geometry+'</'+spatialOperator+'>';
	}

	return spatialFilter;
}

function getQueryArguments(queryName) {

	mapInfo.setProperty('mainQuery',queryName);
	var queryDesc=mapInfo.getProperty('queries')[queryName];
	var inputs=queryDesc.inputsList();
	var feature=queryDesc.feature;
	
	var filter;
	var spatialFilter=null;
	for(var pos=0;pos<inputs.length;pos++) {
		var input=inputs[pos];
		
		var fieldName=input.name;
		var fieldInput=input.description.toLowerCase()+'Input';
		var fieldType=input.type;
		
		if(fieldName.toUpperCase()=='$FEATURE') {
			feature=getFieldValue(fieldInput,fieldType);
			
			if(queryDesc.wmsFeature=='$FEATURE')
				queryDesc.realWmsFeature=feature;
		}
		
		if(fieldName.toUpperCase()=='$FILTER') {
			var value=getFieldValue(fieldInput,fieldType);
			if(value!='') {
				try	{
					
					var dynamicLocAttributes=mapInfo.getProperty('dynamicLocAttributes');
					
					var dynAttr=dynamicLocAttributes[feature];
					
					var tokens=str2tree(getFieldValue(fieldInput,fieldType),dynAttr);
					filter=tree2str(tokens);	
				} catch (e)	{
					alert(e.message);
					alert('Criterio errato');
					return null;
				}
			} else
				filter='EMPTY';
		}
		if(fieldName.toUpperCase()=='$SPATIALFILTER') {
			
			var spatialArea=getFieldValue('featureFiltroInput','TEXT');
			var specifier=getFieldValue('areaFiltroSpecifierInput','TEXT');
			var spatialOperator=getFieldValue('tipoFiltroInput','TEXT');
			
			spatialFilter=getSpatialFilter(spatialArea,specifier,spatialOperator,queryDesc);
		}
	}
	
	var savedInputs=queryDesc.savedInputsList();
	if(savedInputs.length>0) {
		var savedValues=new Array();
		for(var pos in savedInputs) {
			var input=savedInputs[pos];
			var fieldName=input.name;
			var fieldInput=input.description.toLowerCase()+'Input';
			var fieldType=input.type;
			
			if(fieldName=='$SPATIALFILTER') {
				

				var spatialArea=getFieldValue('featureFiltroInput','TEXT');
				var specifier=getFieldValue('areaFiltroSpecifierInput','TEXT');
				var spatialOperator=getFieldValue('tipoFiltroInput','TEXT');
				
				var savedSpatial=getSpatialFilter(spatialArea,specifier,spatialOperator,queryDesc);
				savedValues[fieldName]=savedSpatial;
			} else {
				var fieldValue=getFieldValue(fieldInput,fieldType);
				savedValues[fieldName]=fieldValue;
			}
		}
		mapInfo.setProperty('savedInputs',savedValues);
	} else {
		mapInfo.setProperty('savedInputs',null);
	}
	
	var dynamicFeature=(feature!=queryDesc.feature);
	var features;
	if(typeof feature=='object')
		features=feature;
	else
		features=new Array(feature);
	var result='';
	for(var pos in features) {
		var featureName=features[pos];
		if(queryDesc.getSubQuery(featureName)) {
			mapInfo.setProperty('oldQueryName',queryName);
			var queryName=queryDesc.getSubQuery(featureName);
			
			queryDesc=mapInfo.getProperty('queries')[queryName];
			
			mapInfo.setProperty('queryName',queryName);
			featureName=queryDesc.feature;
			dynamicFeature=false;
		}

		var conditions=0;
		

		var filterCond='';
		//var featureName=feature;
		var idName=queryDesc.getIdName(featureName);
		if(idName)
			result+='<Query typeName="'+featureName+'" primarykey="'+idName+'" crs="gauss">';
		else
			result+='<Query typeName="'+featureName+'" crs="gauss">';
		var outputs;
		if(dynamicFeature)
			outputs=queryDesc.outputsList('list',featureName);
		else
			outputs=queryDesc.outputsList('list');
		var fieldsText='';
		//var assocs=new Array();
		for(var pos=0;pos<outputs.length;pos++) {
			var output=outputs[pos];
			fieldsText+='<PropertyName>'+output.name+'</PropertyName>';
		}
		
		for (var pos in  queryDesc.fids) {
			var fidDesc=queryDesc.fids[pos];
			fieldsText+='<PropertyName>'+fidDesc[0]+'</PropertyName>';
		}
		var groupBy=queryDesc.groupBy;

		if(!groupBy && dynamicFeature && queryDesc.groupBys[featureName])
			groupBy=queryDesc.groupBys[featureName];
		if(groupBy && groupBy.indexOf('.')!=-1) {
			var groupByArr=groupBy.split('.');
			queryDesc.realGroupByFeature=groupByArr[0];
			queryDesc.realGroupBy=groupByArr[1];
			queryDesc.realGroupByType='STRING';
			if(groupByArr.length==3)
				queryDesc.realGroupByType=groupByArr[2];
		} else {
			queryDesc.realGroupByFeature=null;
			queryDesc.realGroupBy=groupBy;
			queryDesc.realGroupByType='STRING';
		}
		if(queryDesc.realGroupBy)
			fieldsText+='<PropertyName>'+queryDesc.realGroupBy+'</PropertyName>';
		//mapInfo.setProperty('queryLabels',assocs);
		result+=fieldsText+'<Filter>';
		var inputs;
		
		if(dynamicFeature)
			inputs=queryDesc.inputsList(featureName);
		else
			inputs=queryDesc.inputsList();
		
		if(filter && filter!='EMPTY') {
			filterCond=filter;
			conditions=1;
		} else if(filter=='EMPTY') {
			filterCond='';
			condtions=0;
		} else {
			for(var pos=0;pos<inputs.length;pos++) {
				var input=inputs[pos];
				
				var fieldName=input.name;
				
				if(fieldName.substring(0,1)!='$') {
					
					var fieldComparison=input.comparison;
					var fieldInput=input.description.toLowerCase()+'Input';
					var fieldType=input.type;
					var fieldValue='';
					fieldValue=getFieldValue(fieldInput,fieldType);
					if(fieldValue!='') {
						conditions++;
						if(fieldComparison.toLowerCase()=='equals')
							filterCond+='<PropertyIsEqualTo><PropertyName>'+fieldName+'</PropertyName><Literal>\''+fieldValue+'\'</Literal></PropertyIsEqualTo>';
						else if(fieldComparison.toLowerCase()=='islike')
							filterCond+='<PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><PropertyName>'+fieldName+'</PropertyName><Literal>\'%'+fieldValue+'%\'</Literal></PropertyIsLike>';
						
					}
				}
			}
		}
		
		if(spatialFilter) {
			if(filterCond=='' || !filterCond) {
				filterCond=spatialFilter;
				conditions=1;
			} else {
				conditions++;
				filterCond=filterCond+spatialFilter;
			}
		}
		
		if(conditions>1)
			result+='<And>'+filterCond+'</And>';
		else if(conditions==1)
			result+=filterCond;
		else return null;
		
		result   +='</Filter></Query>';
		
	}
	
	return new Array(features,result);
}

function bufferZone() {
	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
	document.getElementById('legendLabelDiv').style.visibility='hidden';
	var idList=mapInfo.getProperty('checkedList');
	var idCount=0;
	var myId=0;
	for (var id in idList) {
		myId=id;
		idCount++;
	}
	
	if(idCount!=1) {
		alert('Selezionare uno ed un solo elemento');
		actionEnd();
	} else {
		var myIdArr=myId.split(',');
		var wmsFeature=myIdArr[0];
		id=myIdArr[1];
		var description='';
		var dataSet=mapInfo.getProperty('queryResult');
		for(rowNum in dataSet.rows) {
			var row=dataSet.rows[rowNum];
			if(row.id==myId) {
				var fields=row.fields;
				
				description=fields['Descrizione'];
				
			}
		}
		
		
		var label=document.getElementById('labelChosen').value;
		label=label.replace(/\'/gi,'');
		var savedInputs=mapInfo.getProperty('savedInputs');
		var dimension=savedInputs['BZ_DIM'];	
		var bzArray=new Array(myId,dimension*1000);
		var bufferZones=mapInfo.getProperty('bufferZones');
		bufferZones[label]=bzArray;
		mapInfo.setProperty('bufferZones',bufferZones);
		
		var tooltip='<Tooltip text="Buffer Zone su '+description+' - '+dimension+' km"></Tooltip>';

		var filterCond='<VirtualLayer><Name>'+tablePrefix(wmsFeature)+wmsFeature+'</Name>';
		var idName=queryDesc.getIdName(wmsFeature);
		if(idName)
			filterCond+='<Query typeName="'+tablePrefix(wmsFeature)+wmsFeature+'" primarykey="'+idName+'">';
		else
			filterCond+='<Query typeName="'+tablePrefix(wmsFeature)+wmsFeature+'">';


		filterCond   +='<PropertyName>GEOMETRY</PropertyName><Filter><FeatureId fid="\\\''+id+'\\\'" /></Filter></Query>';
		filterCond   +='<UserStyle><Name>Query'+analysisName+'</Name><FeatureTypeStyle><Rule><Name>RuleS1</Name><Filter>';
		filterCond   +='<Bufferzone outputGeometryFieldName="Geometry2" outputDistanceFieldName="d"><Distance>'+(dimension*1000)+'</Distance></Bufferzone>';
		filterCond   +='</Filter>'+tooltip+queryDesc.getStyle(wmsFeature)+'</Rule></FeatureTypeStyle></UserStyle></VirtualLayer>';
		automa=new Automa('DoQueryMap',3,'automa','actionEnd()');
		automa.setProperty('queryName',mapInfo.getProperty('queryName'));
		automa.setProperty('arguments',filterCond);
		automa.setProperty('legendLabel',label);
		automa.setProperty('featureType',queryDesc.featureType);
		automa.setProperty('style',queryDesc.getStyle(wmsFeature));
		automa.start();
		
	}
}

function automaBufferZonePhase1() {

	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	analysisNumber++;
	mapInfo.setProperty('analysisCount',analysisNumber);
	var layer=new SVGLayer(analysisName,analysisName,analysisNumber,true,1,1000000,outFeature,onFeature,clickFeature,mouseMoveFeature,'','');
	//layer.specialType='bufferZone';
	layer.dynamicCall='bufferZone';
	layer.dynamicCallArgs='\''+automa.getProperty('arguments')+'\',\''+analysisName+'\'';
	
	layer.dynamic=true;
	layer.dynamicPosition='over';
	layer.visible=true;
	map.addLayer(layer);
	addLegendFeature(layer.name,automa.getProperty('legendLabel'),automa.getProperty('style'),automa.getProperty('featureType'),'dynamic',mapInfo.getProperty('queryName'));
	legendFeatureChangeProperty(layer.name,'visibility','true')
	var categories=mapInfo.getProperty('categories');
	var els=categories['Query-Analisi'];
	els.push(automa.getProperty('legendLabel'));
	categories['Query-Analisi']=els;
	mapInfo.setProperty('categories',categories);
	mapInfo.setProperty('legendCategory','Query-Analisi');
	redrawLegend();
	automa.setProperty('newLayer',layer);
	map.update();
	//engine.sendMsg('areaBacino',null,'returnAreaBacino');
	//actionEnd();
}

function automaBufferZonePhase2() {
	centerOnLayer(automa.getProperty('newLayer'),true);
	map.update();
}

function automaBufferZonePhase3() {
	document.getElementById('queryResultDiv').style.visibility='hidden';
	automa.end();
}


function areaBacino() {

	document.getElementById('legendLabelDiv').style.visibility='hidden';
	var idList=mapInfo.getProperty('checkedList');
	var idCount=0;
	var myId=0;
	for (var id in idList) {
		myId=id.substring(id.indexOf(',')+1);
		idCount++;
	}
	if(idCount!=1) {
		alert('Selezionare uno ed un solo elemento');
		actionEnd();
	} else {
		var label=document.getElementById('labelChosen').value;
		label=label.replace(/\'/gi,'');
		var savedInputs=mapInfo.getProperty('savedInputs');
		var numIntervalli=savedInputs['AB_NUMERO'];
		var ampIntervalli=savedInputs['AB_AMPIEZZA'];
		
		automa=new Automa('AreaBacino',3,'automa','actionEnd()');
		automa.setProperty('arguments',myId+','+numIntervalli+','+ampIntervalli);
		automa.setProperty('legendLabel',label);
		automa.setProperty('style','<PolygonSymbolizer><Stroke><CssParameter name="stroke">#FFFF00</CssParameter><CssParameter name="stroke-width">1</CssParameter></Stroke></PolygonSymbolizer>');
		automa.setProperty('featureType','areabacino');
		automa.start();
	}
}

function automaAreaBacinoPhase1() {

	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	analysisNumber++;
	mapInfo.setProperty('analysisCount',analysisNumber);
	var layer=new SVGLayer(analysisName,analysisName,analysisNumber,true,1,1000000,outFeature,onFeature,clickFeature,mouseMoveFeature,'','');
	layer.specialType='areaBacino';
	layer.dynamicCall='areaBacino';
	layer.dynamicCallArgs='\''+automa.getProperty('arguments')+'\',\''+analysisName+'\'';
	
	layer.dynamic=true;
	layer.dynamicPosition='over';
	layer.visible=true;
	map.addLayer(layer);
	addLegendFeature(layer.name,automa.getProperty('legendLabel'),automa.getProperty('style'),automa.getProperty('featureType'),'dynamic',mapInfo.getProperty('queryName'));
	legendFeatureChangeProperty(layer.name,'visibility','true')
	var categories=mapInfo.getProperty('categories');
	var els=categories['Query-Analisi'];
	els.push(automa.getProperty('legendLabel'));
	categories['Query-Analisi']=els;
	mapInfo.setProperty('categories',categories);
	mapInfo.setProperty('legendCategory','Query-Analisi');
	redrawLegend();
	automa.setProperty('newLayer',layer);
	map.update();
	//engine.sendMsg('areaBacino',null,'returnAreaBacino');
	//actionEnd();
}

function automaAreaBacinoPhase2() {
	centerOnLayer(automa.getProperty('newLayer'),true);
	map.update();
}

function automaAreaBacinoPhase3() {
	document.getElementById('queryResultDiv').style.visibility='hidden';
	automa.end();
}

function instradamentoFerroviarioMappa() {
	document.getElementById('legendLabelDiv').style.visibility='hidden';
	var label=document.getElementById('labelChosen').value;
	label=label.replace(/\'/gi,'');
	var startLoc=mapInfo.getProperty('startId').substring(mapInfo.getProperty('startId').indexOf(',')+1);
	var endLoc=mapInfo.getProperty('endId').substring(mapInfo.getProperty('endId').indexOf(',')+1);
	var ilsCall='<ls:operation xmlns:ls="LSSchema"><operationName>OrdbyDist</operationName><parameters><orderByDistParams><sourceLocation><featureQuery><featureName>LOCA_RETE</featureName><whereClause>where OR_ID=\\\''+startLoc+'\\\'</whereClause></featureQuery> </sourceLocation>';
	ilsCall   +='<targetLocations><featureQuery><featureName>LOCA_RETE</featureName><whereClause>where OR_ID=\\\''+endLoc+'\\\'</whereClause></featureQuery></targetLocations>';
	ilsCall   +='<mapSpecifications><mapSpecification><mapID>GNDemo</mapID><mapOutputFormat><deviceCharacteristics><height>'+mapHeight+'</height><width>'+mapWidth+'</width><colorDepth>0</colorDepth><format>SVG</format></deviceCharacteristics></mapOutputFormat>';
	
    ilsCall   +='<mapDefinitionFilename>RFI.cmdf</mapDefinitionFilename><sourceLocFormat><textFormat><textStyle><color>006400</color> <font>ARIAL</font><textSize>2.5%</textSize> </textStyle><textGeometry><alignment>4</alignment> </textGeometry></textFormat><featureStyle><color>FF0000</color><font /> <fontChar /> <weight>5</weight> </featureStyle></sourceLocFormat><destinationLocFormat>';
    ilsCall   +='<textFormat><textStyle><color>990000</color><font>ARIAL</font> <textSize>3%</textSize> </textStyle><textGeometry><alignment>8</alignment></textGeometry></textFormat><featureStyle><color>0000FF</color> <font /> <fontChar /> <weight>2</weight> </featureStyle></destinationLocFormat>';
	ilsCall   +='<showRoute>true</showRoute> <routeStyle> <color>FF0000</color> <lineStyle>0</lineStyle> <weight>4</weight> </routeStyle>';
	ilsCall   +='<mapWindow><windowCenter> <center> <point> <x>0.0</x><y>0.0</y> </point> <coordSystem> <coordSystemFilename>rfi2.csf</coordSystemFilename> </coordSystem> </center><mapWidth> <value>3</value> <unitID>63</unitID> <unitTypeID>1</unitTypeID> </mapWidth></windowCenter> <windowExtent> <minimum> <point> <x>'+map.maxRealRange.minX+'</x> <y>'+map.maxRealRange.minY+'</y> </point> <coordSystem> <coordSystemFilename>rfi2.csf</coordSystemFilename> </coordSystem> </minimum><maximum> <point> <x>'+map.maxRealRange.maxX+'</x> <y>'+map.maxRealRange.maxY+'</y> </point> <coordSystem> <coordSystemFilename>rfi2.csf</coordSystemFilename> </coordSystem> </maximum> </windowExtent> </mapWindow>';
	ilsCall   +='</mapSpecification></mapSpecifications><showDirections>true</showDirections> <routeSpecification>	<network>NETRETE</network> <journeyType>closestOnly</journeyType> <returnToStart>false</returnToStart> </routeSpecification></orderByDistParams></parameters></ls:operation>';
	automa=new Automa('InstradamentoFerroviario',3,'automa','actionEnd()');
	automa.setProperty('arguments',ilsCall);
	automa.setProperty('legendLabel',label);
	automa.setProperty('style','<PolygonSymbolizer><Stroke><CssParameter name="stroke">#FFFF00</CssParameter><CssParameter name="stroke-width">1</CssParameter></Stroke></PolygonSymbolizer>');
	automa.setProperty('featureType','linear');
	automa.start();
	
}

function automaInstradamentoFerroviarioPhase1() {

	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	analysisNumber++;
	mapInfo.setProperty('analysisCount',analysisNumber);
	var layer=new SVGLayer(analysisName,analysisName,analysisNumber,true,1,1000000,outFeature,onFeature,clickFeature,mouseMoveFeature,'','');
	//layer.specialType='areaBacino';
	layer.dynamicCall='route';
	layer.dynamicCallArgs='\''+automa.getProperty('arguments')+'\',\''+analysisName+'\'';
	
	layer.dynamic=true;
	layer.dynamicPosition='over';
	layer.visible=true;
	map.addLayer(layer);
	addLegendFeature(layer.name,automa.getProperty('legendLabel'),automa.getProperty('style'),automa.getProperty('featureType'),'dynamic',mapInfo.getProperty('queryName'));
	legendFeatureChangeProperty(layer.name,'visibility','true')
	var categories=mapInfo.getProperty('categories');
	var els=categories['Query-Analisi'];
	els.push(automa.getProperty('legendLabel'));
	categories['Query-Analisi']=els;
	mapInfo.setProperty('categories',categories);
	mapInfo.setProperty('legendCategory','Query-Analisi');
	redrawLegend();
	automa.setProperty('newLayer',layer);
	map.update();
	//engine.sendMsg('areaBacino',null,'returnAreaBacino');
	//actionEnd();
}

function automaInstradamentoFerroviarioPhase2() {
	centerOnLayer(automa.getProperty('newLayer'),true);
	map.update();
}

function automaInstradamentoFerroviarioPhase3() {
	document.getElementById('queryResultDiv').style.visibility='hidden';
	automa.end();
}

function instradamentoFerroviarioArrivo() {
	var idList=mapInfo.getProperty('checkedList');
	var idCount=0;	
	var myId=0;
	for (var id in idList) {
		myId=id;
		idCount++;
	}

	if(myId==0) {
		alert('Selezionare un elemento');
		actionEnd();
		return;
	}
	
	if(idCount!=1) {
		alert('Selezionare uno ed un solo elemento');
		actionEnd();
		return;
	}
	var position=mapInfo.getProperty('routePosition');
	if(position=='start') {
		mapInfo.setProperty('startId',myId);
		mapInfo.setProperty('routePosition','finish');
		
		var wfsquery='<Query typeName="'+tablePrefix('LOCA_WEBS')+'LOCA_WEBS" primarykey="OR_ID"><PropertyName>LO_DESCRIZIONE</PropertyName><Filter><PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><PropertyName>LO_DESCRIZIONE</PropertyName><Literal>\'%'+document.getElementById('arrivoInput').value+'%\'</Literal></PropertyIsLike></Filter></Query>';
		
		automa=new Automa('DoQuery',2,'automa','actionEnd()');
		automa.setProperty('queryName',mapInfo.getProperty('queryName'));
		automa.setProperty('arguments',wfsquery);
		//automa.setProperty('queryFeature',feature);
		automa.setProperty('mode','list');
		automa.start();
	} else {
		mapInfo.setProperty('endId',myId);
		document.getElementById('legendLabelDiv').style.visibility='visible';
		document.getElementById('labelChosen').value='instradamento FERROVIARIO';
		actionEnd();
		
		
	}
	
}

function getStradeArguments(areaId) {
	
	var queryDesc=mapInfo.getProperty('queries')['localizzaStradaComune'];
	var inputs=queryDesc.inputsList();
	var feature=queryDesc.feature;
	
	var result='';
	
	var features=new Array(feature);
	
	for(var pos in features) {
		var featureName=features[pos];
		

		var conditions=0;
		

		var filterCond='';
		//var featureName=feature;
		var idName=queryDesc.getIdName(featureName);
		if(idName)
			result+='<Query typeName="'+tablePrefix(featureName)+featureName+'" primarykey="'+idName+'">';
		else
			result+='<Query typeName="'+tablePrefix(featureName)+featureName+'">';
		var outputs;
		outputs=queryDesc.outputsList('list');
		var fieldsText='';
		//var assocs=new Array();
		for(var pos=0;pos<outputs.length;pos++) {
			var output=outputs[pos];
			fieldsText+='<PropertyName>'+output.name+'</PropertyName>';
		}
		for (var pos in  queryDesc.fids) {
			var fidDesc=queryDesc.fids[pos];
			fieldsText+='<PropertyName>'+fidDesc[0]+'</PropertyName>';
		}
		
		var groupBy=queryDesc.groupBy;

		if(!groupBy && dynamicFeature && queryDesc.groupBys[featureName])
			groupBy=queryDesc.groupBys[featureName];
		if(groupBy && groupBy.indexOf('.')!=-1) {
			var groupByArr=groupBy.split('.');
			queryDesc.realGroupByFeature=groupByArr[0];
			queryDesc.realGroupBy=groupByArr[1];
			queryDesc.realGroupByType='STRING';
			if(groupByArr.length==3)
				queryDesc.realGroupByType=groupByArr[2];
		} else {
			queryDesc.realGroupByFeature=null;
			queryDesc.realGroupBy=groupBy;
			queryDesc.realGroupByType='STRING';
		}
		if(queryDesc.realGroupBy)
			fieldsText+='<PropertyName>'+queryDesc.realGroupBy+'</PropertyName>';
		//mapInfo.setProperty('queryLabels',assocs);
		result+=fieldsText+'<Filter>';
		var inputs;
		
		inputs=queryDesc.inputsList();
		
		
		for(var pos=0;pos<inputs.length;pos++) {
			var input=inputs[pos];
			
			var fieldName=input.name;
			
			if(fieldName.substring(0,1)!='$') {
				
				var fieldComparison=input.comparison;
				var fieldInput=input.description.toLowerCase()+'Input';
				var fieldType=input.type;
				var fieldValue='';
				fieldValue=getFieldValue(fieldInput,fieldType);
				if(fieldValue!='') {
					conditions++;
					if(fieldComparison.toLowerCase()=='equals')
						filterCond+='<PropertyIsEqualTo><PropertyName>'+fieldName+'</PropertyName><Literal>\''+fieldValue+'\'</Literal></PropertyIsEqualTo>';
					else if(fieldComparison.toLowerCase()=='islike')
						filterCond+='<PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><PropertyName>'+fieldName+'</PropertyName><Literal>\'%'+fieldValue+'%\'</Literal></PropertyIsLike>';
					
				}
			}
		}
		filterCond+='<PropertyIsEqualTo><PropertyName>L_AREA_ID</PropertyName><Literal>'+areaId+'</Literal></PropertyIsEqualTo>';
		conditions++;
		
		
		if(conditions>1)
			result+='<And>'+filterCond+'</And>';
		else if(conditions==1)
			result+=filterCond;
		else return null;
		
		result   +='</Filter></Query>';
		
	}
	
	return result;
}

function localizzaStrade() {
	
	var dataSet=mapInfo.getProperty('queryResult');
	
	var idList=mapInfo.getProperty('checkedList');
	mapInfo.setProperty('queryName','localizzaStradaComune');
	var idCount=0;
	var myId=0;
	
	for (var id in idList) {
		myId=id;
		
		idCount++;
	}
	
	
	
	if(idCount!=1) {
		alert('Selezionare uno ed un solo elemento');
		actionEnd();
	} else {
		var id=myId.substring(myId.indexOf(',')+1);
		var wfsquery=getStradeArguments(id);
		if(wfsquery==null) {
			actionEnd();
			alert('Specificare almeno un criterio di ricerca');
		} else {
			
			
					
			
			automa=new Automa('DoQuery',2,'automa','actionEnd()');
			automa.setProperty('queryName',mapInfo.getProperty('queryName'));
			automa.setProperty('arguments',wfsquery);
			//automa.setProperty('queryFeature',feature);
			automa.setProperty('mode','list');
			automa.start();
		}
	}
	
	
	
}

function instradamentoFerroviario() {
	mapInfo.setProperty('routePosition','start');
	var wfsquery='<Query typeName="'+tablePrefix('LOCA_WEBS')+'LOCA_WEBS" primarykey="OR_ID"><PropertyName>LO_DESCRIZIONE</PropertyName><Filter><PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><PropertyName>LO_DESCRIZIONE</PropertyName><Literal>\'%'+document.getElementById('partenzaInput').value+'%\'</Literal></PropertyIsLike></Filter></Query>';
	
	document.getElementById('queryParamsDiv').style.visibility='hidden';
	automa=new Automa('DoQuery',2,'automa','actionEnd()');
	automa.setProperty('queryName',mapInfo.getProperty('queryName'));
	automa.setProperty('arguments',wfsquery);
	//automa.setProperty('queryFeature',feature);
	automa.setProperty('mode','list');
	automa.start();
	
	
}



function doQuery() {
	//document.getElementById('styleTableDiv').style.visibility='hidden';
	if(!checkParameters(mapInfo.getProperty('queryName'))) {
		eventListeners.fireEvent('queryEnd');
		actionEnd();
		return;
	}
	
	var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
	
	if(queryDesc.queryHandlerFunction)
		eval(queryDesc.queryHandlerFunction+'()');
	else {
		
		var result=getQueryArguments(mapInfo.getProperty('queryName'));
		if(result==null) {
			mapInfo.setProperty('queryName',mapInfo.getProperty('oldQueryName'));
			mapInfo.setProperty('oldQueryName',null);
			eventListeners.fireEvent('queryEnd');
			actionEnd();
			alert('Specificare almeno un criterio di ricerca');
		} else {
			mapInfo.setProperty('oldQueryName',null);
			var feature=result[0];
			var wfsquery=result[1];
			var featuresToNodes=mapInfo.getProperty('featuresToNodes');	
			var node='';
			
			document.getElementById('queryParamsDiv').style.visibility='hidden';
			automa=new Automa('DoQuery',2,'automa','actionEnd()');
			automa.setProperty('queryName',mapInfo.getProperty('queryName'));
			automa.setProperty('arguments',wfsquery);
			automa.setProperty('node',node);
			//automa.setProperty('queryFeature',feature);
			automa.setProperty('mode','list');
			automa.start();
		}
	}
}



function queryParamsOpen(queryName) {
	//document.getElementById('styleTableDiv').style.visibility='hidden';
	if(!checkQuery(queryName)) {
		actionEnd();
		return;
	}
	mapInfo.setProperty('queryName',queryName);
	var queryDesc=mapInfo.getProperty('queries')[queryName];
	var inputs=queryDesc.inputsList();
	document.getElementById('paramWindowTitle').innerHTML=queryDesc.description;
		
	var html=mapInfo.getProperty('queryParamsTexts')[queryName];
	document.getElementById('queryParamsText').innerHTML=html;
	
	eval('initQuery(\''+queryName+'\')');
	document.getElementById('queryParamsDiv').style.visibility='visible';
	var realWidth=document.getElementById('queryParamsText').offsetWidth;
	
	/*if(realWidth>402) {
		
		document.getElementById('queryTitleImg').width=(realWidth-30);
		document.getElementById('queryTitle').style.width=(realWidth-30)+'px';
	} else {
		document.getElementById('queryTitleImg').width=370;
		document.getElementById('queryTitle').style.width='370px';
	}*/
	actionEnd();
}

function automaDoQueryPhase1() {
		
	if(automa.getProperty('mode')=='list')
		mapInfo.setProperty('checkedList',new Array());
	//engine.sendMsg("query",null,'returnQuery',automa.getProperty('queryName'),automa.getProperty('arguments'),automa.getProperty('mode'));
	engine.sendMsg("query",null,'returnQuery',automa.getProperty('queryName'),automa.getProperty('arguments'),automa.getProperty('node'));
}

function automaDoQueryPhase2() {
	var dataSet=automa.getProperty('dataSet');
	
	var callSomeone=null;
	if(dataSet.rows.length==0) {
		alert('Nessun risultato');
	} else {
		var queryDesc=mapInfo.getProperty('queries')[automa.getProperty('queryName')];
		
		if(automa.getProperty('mode')=='list') {
			mapInfo.setProperty('rowTitle',null);
			mapInfo.setProperty('firstResult',0);
			mapInfo.setProperty('queryResult',dataSet);
			mapInfo.setProperty('queryTitle','RISULTATO RICERCA');
			mapInfo.setProperty('queryDescription',queryDesc);
			automa.setProperty('center',true);
			callSomeone=viewQueryResult(dataSet);
			
		} else if(automa.getProperty('mode')=='detail') {
			var rowTitle=(queryDesc.outputsList('title'))[0].description;
			mapInfo.setProperty('rowTitle',rowTitle);
			mapInfo.setProperty('detailResult',dataSet);
			mapInfo.setProperty('queryTitle',queryDesc.description);
			mapInfo.setProperty('queryDescription',queryDesc);
			viewQueryResult('detail');
		} else if(automa.getProperty('mode')=='scheda') {
			var rowTitle=(queryDesc.outputsList('title'))[0].description;
			mapInfo.setProperty('rowTitle',rowTitle);
			mapInfo.setProperty('schedaResult',dataSet);
			mapInfo.setProperty('queryTitle',queryDesc.description);
			mapInfo.setProperty('queryDescription',queryDesc);
			viewQueryResult('scheda');
		}
	}	
	
	
	automa.end();
	if(callSomeone)
		eval('doCommand('+callSomeone+')');
}

function deselectAll() {
	mapInfo.setProperty('checkedList',new Array());
	viewQueryResult('list');
}

function selectAll() {
	
	var dataSet=mapInfo.getProperty('queryResult');
	var rows=dataSet.rows;
	var checkedList=new Array();
	for(var rowNum=0;rowNum<rows.length;rowNum++) {
		
		var row=rows[rowNum];
		var fields=row.fields;
		checkedList[row.id]='on';
	}

	mapInfo.setProperty('checkedList',checkedList);
	viewQueryResult('list');
}

function deselectAllInPage() {
	var max=mapInfo.getProperty('maxResultsPerPage');
	var first=mapInfo.getProperty('firstResult');
	var dataSet=mapInfo.getProperty('queryResult');
	
	var checkedList=mapInfo.getProperty('checkedList');
	var rows=dataSet.rows;
	for(var rowNum=first;rowNum<rows.length && rowNum<first+max;rowNum++) {
		var row=rows[rowNum];
		delete checkedList[row.id];
	}

	mapInfo.setProperty('checkedList',checkedList);
	viewQueryResult('list');
	
}

function selectAllInPage() {
	var max=mapInfo.getProperty('maxResultsPerPage');
	var first=mapInfo.getProperty('firstResult');
	var dataSet=mapInfo.getProperty('queryResult');
	
	var checkedList=mapInfo.getProperty('checkedList');
	var rows=dataSet.rows;

	for(var rowNum=first;rowNum<rows.length && rowNum<first+max;rowNum++) {
		var row=rows[rowNum];
		checkedList[row.id]='on';
		
		
	}

	mapInfo.setProperty('checkedList',checkedList);
	viewQueryResult('list');
	
}

function getReportDataSet() {
	
	return mapInfo.getProperty('detailResult');
}

function getPrintHtml(dataSet) {
	var queryDesc=dataSet.queryDesc;
	var firstRow=true;
	var first=0;
	var max=1000;
	var html='<table width="100%">';
	html+='<tr>';
	html+='			<td>';
	html+=queryDesc.description;
	html+='				</td> ';
	html+='			</tr>';
	var recNum=0;
	var rows=dataSet.rows;
	
	for(var rowNum=first;rowNum<rows.length && rowNum<first+max;rowNum++) {
		var fieldsCount=0;
		var row=rows[rowNum];
		var fields=row.fields;
		recNum++;
		
		var rowTitleField=(queryDesc.outputsList('title'))[0].description;;
		
		var rowTitle;
		for(var fieldName in fields) {
			var fieldValue=fields[fieldName];
			if(fieldName==rowTitleField)
				rowTitle=fieldValue;
		}

		html+='		<tr>';
		html+='			<td  >';
		html+='				<span style="font-weight:bold">'+rowTitle+'</span>';
		html+='		</td>';
		html+='		</tr><tr><td><table style="border:black solid 1px">';
		for(var fieldName in fields) {
			
				var fieldValue=fields[fieldName];
							
				
				fieldsCount++;
					
				html+='<tr><td width="10%" bgcolor="#FFFFCC" >'+fieldName+':</td><td width="90%">'+fieldValue+'</td></tr>';
				
							
			//}
			
		}
		html+='</table></td></tr>';
		
			
			
	}
	html +='</table>';
	return html;
	
}



function goToFollowingPage() {
	var max=mapInfo.getProperty('maxResultsPerPage');
	var first=mapInfo.getProperty('firstResult');
	first+=max;
	mapInfo.setProperty('firstResult',first);
	viewQueryResult('list');
}

function printPdf(dataSet) {
	var pdfWin=window.open('report.html','print','WIDTH=660,HEIGHT=620,RESIZABLE=YES,SCROLLBARS=YES,STATUS=YES');
	mapInfo.setProperty('pdfWindow',pdfWin);
	var html='<html><body>';
	html+=getPrintHtml(dataSet);
	html   +='</body></html>';
	automa=new Automa('PrintReport',2,'automa','actionEnd()');
	
	automa.setProperty('html',html);
	
	automa.start();

}

function automaPrintReportPhase1() {
	engine.sendMsg("printPdf",null,'returnPrintPdf',automa.getProperty('html'));
}

function returnPrintPdf(retrow) {
	
	automa.goOn();
}

function automaPrintReportPhase2() {
	automa.end();
}

function goToPreviousPage() {
	var max=mapInfo.getProperty('maxResultsPerPage');
	var first=mapInfo.getProperty('firstResult');
	first-=max;
	if(first<0)
		first=0;
	mapInfo.setProperty('firstResult',first);
	viewQueryResult('list');
}

function returnQuery(retrow) {
	
	if(retrow=='*ERROR*') {
		alert('Errore di esecuzione della query');
		annullaQuery();
		automa.end();
	} else {
		var dataSet=new DataSet();
		var queryDesc=mapInfo.getProperty('queries')[automa.getProperty('queryName')];
		dataSet.loadFromQueryResult(retrow,queryDesc);
		automa.setProperty('dataSet',dataSet);

		automa.goOn();
	}
}

function dettaglioQuery() {
	var checkedList=mapInfo.getProperty('checkedList');
	var result=getDetailArguments(mapInfo.getProperty('queryName'),checkedList);
	var feature=result[0];
	var wfsquery=result[1];
	
	if(wfsquery) {
		var report=window.open('report.html','report','WIDTH=660,HEIGHT=620,RESIZABLE=YES,SCROLLBARS=YES,STATUS=YES');
		report.document.write('<html>');
		report.document.write('<head>');
		report.document.write('<link rel="stylesheet" href="rfi.css">');
		report.document.write('<link rel="stylesheet" href="fsi.css">');
		report.document.write('<title>Report</title>');
		report.document.write('<script language="JavaScript">var dataSet=null;  function stampaReport() { opener.window.reportprint.document.body.innerHTML=document.body.innerHTML;opener.window.reportprint.focus();setTimeout(\'reallyPrint()\',10) } function reallyPrint() {opener.window.reportprint.print();}</script>');
		//report.document.write('<script language="JavaScript">var dataSet=null;  function stampaReport() { window.print(); } function reallyPrint() {opener.window.reportprint.print();}</script>');
		report.document.write('</head>');
		report.document.write('<body >');
		report.document.write('<table cellspacing="0" cellpadding="0" width="624">');
		report.document.write('<tr><td colspan="2"><img src="immagini/report_header.gif"/></td></tr>');
		report.document.write('<tr><td><img src="images/spacer.gif" width="1" height="500"/></td><td valign="top">');
		
		var featuresToNodes=mapInfo.getProperty('featuresToNodes');	
		var node=(featuresToNodes[feature])[0];

		automa=new Automa('DoQuery',2,'automa','actionEnd()');
		automa.setProperty('queryName',mapInfo.getProperty('queryName'));
		automa.setProperty('arguments',wfsquery);
		automa.setProperty('node',node);
		automa.setProperty('mode','detail');
		
		mapInfo.setProperty('reportPopup',report);
		automa.start();
	} else {
		actionEnd();
		alert('Selezionare almeno un elemento della lista');
		
	}
}

function queryMappa() {
	if(mapInfo.getProperty('editingFeature')) {
		queryMappaExecute();
	} else {
		document.getElementById('legendLabelDiv').style.visibility='visible';
		var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
		document.getElementById('labelChosen').value=queryDesc.description;
		actionEnd();
	}
}

function checkLabel(label) {
	return !existsLegendFeature(label);
}

function mappaTorta() {
	var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
	var label=mapInfo.getProperty('editingFeature');
	if(!label) {
		label=mapInfo.getProperty('featureLabel');
		if(!label) {
			label=document.getElementById('labelChosen').value;
			label=label.replace(/\'/gi,'');
			
			//label=getFieldValue('labelChosen','text');
			if(!checkLabel(label)) {
				alert('Il nome e\' gia\' stato usato. Sceglierne un altro');
				actionEnd();
				return;
			}
		} else
			mapInfo.setProperty('featureLabel',null);
	}
	document.getElementById('legendLabelDiv').style.visibility='hidden';
	var wmsFeature=queryDesc.wmsFeature;
	var featuresToNodes=mapInfo.getProperty('featuresToNodes');	
	var node=(featuresToNodes[wmsFeature])[0];
	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	var filterCond='<NamedLayer><Name>'+tablePrefix(wmsFeature)+wmsFeature+'</Name><UserStyle><Name>Query'+analysisName+'</Name><FeatureTypeStyle><FeatureTypeName>'+tablePrefix(wmsFeature)+wmsFeature+'</FeatureTypeName><Rule><Name>RuleS1</Name>'+queryDesc.getStyle(wmsFeature)+'</Rule></FeatureTypeStyle></UserStyle></NamedLayer>';
	automa=new Automa('DoQueryMap',3,'automa','actionEnd()');
	automa.setProperty('queryName',mapInfo.getProperty('queryName'));
	automa.setProperty('arguments',filterCond);
	automa.setProperty('node',node);
	automa.setProperty('legendLabel',label);
	automa.setProperty('specialType','pie');
	automa.setProperty('featureType',queryDesc.featureType);
	automa.setProperty('style',queryDesc.getStyle());
			
	automa.start();
}

function mappaDistribuzione() {
	var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
	var label=mapInfo.getProperty('editingFeature');
	if(!label) {
		label=mapInfo.getProperty('featureLabel');
		if(!label) {
			label=document.getElementById('labelChosen').value;
			label=label.replace(/\'/gi,'');
			
			//label=getFieldValue('labelChosen','text');
			if(!checkLabel(label)) {
				alert('Il nome e\' gia\' stato usato. Sceglierne un altro');
				actionEnd();
				return;
			}
		} else
			mapInfo.setProperty('featureLabel',null);
	}
	document.getElementById('legendLabelDiv').style.visibility='hidden';
	var wmsFeature=queryDesc.wmsFeature;
	var featuresToNodes=mapInfo.getProperty('featuresToNodes');	
	var node=(featuresToNodes[wmsFeature])[0];
	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	var filterCond='<NamedLayer><Name>'+tablePrefix(wmsFeature)+wmsFeature+'</Name><UserStyle><Name>Query'+analysisName+'</Name><FeatureTypeStyle><FeatureTypeName>'+tablePrefix(wmsFeature)+wmsFeature+'</FeatureTypeName><Rule><Name>RuleS1</Name>'+queryDesc.getStyle(wmsFeature)+'</Rule></FeatureTypeStyle></UserStyle></NamedLayer>';
	automa=new Automa('DoQueryMap',3,'automa','actionEnd()');
	automa.setProperty('queryName',mapInfo.getProperty('queryName'));
	automa.setProperty('arguments',filterCond);
	automa.setProperty('node',node);
	automa.setProperty('legendLabel',label);
	automa.setProperty('specialType','arearangetematism');
	automa.setProperty('featureType',queryDesc.featureType);
	automa.setProperty('style',queryDesc.getStyle());
			
	automa.start();
}

function mappaIstogramma() {
	var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
	var label=mapInfo.getProperty('editingFeature');
	if(!label) {
		label=mapInfo.getProperty('featureLabel');
		if(!label) {
			label=document.getElementById('labelChosen').value;
			label=label.replace(/\'/gi,'');
			
			//label=getFieldValue('labelChosen','text');
			if(!checkLabel(label)) {
				alert('Il nome e\' gia\' stato usato. Sceglierne un altro');
				actionEnd();
				return;
			}
		} else
			mapInfo.setProperty('featureLabel',null);
	}
	document.getElementById('legendLabelDiv').style.visibility='hidden';
	var wmsFeature=queryDesc.wmsFeature;
	var featuresToNodes=mapInfo.getProperty('featuresToNodes');	
	var node=(featuresToNodes[wmsFeature])[0];
	var analysisNumber=mapInfo.getProperty('analysisCount');
	var analysisName='analysis'+analysisNumber;
	var filterCond='<NamedLayer><Name>'+tablePrefix(wmsFeature)+wmsFeature+'</Name><UserStyle><Name>Query'+analysisName+'</Name><FeatureTypeStyle><FeatureTypeName>'+tablePrefix(wmsFeature)+wmsFeature+'</FeatureTypeName><Rule><Name>RuleS1</Name>'+queryDesc.getStyle(wmsFeature)+'</Rule></FeatureTypeStyle></UserStyle></NamedLayer>';
	automa=new Automa('DoQueryMap',3,'automa','actionEnd()');
	automa.setProperty('queryName',mapInfo.getProperty('queryName'));
	automa.setProperty('arguments',filterCond);
	automa.setProperty('node',node);
	automa.setProperty('legendLabel',label);
	automa.setProperty('specialType','hystogram');
	automa.setProperty('featureType',queryDesc.featureType);
	automa.setProperty('style',queryDesc.getStyle());
			
	automa.start();
}

function queryMappaExecute() {
	
	var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
	
	if(queryDesc.mapHandlerFunction)
		eval(queryDesc.mapHandlerFunction+'()');
	else {
		var label=mapInfo.getProperty('editingFeature');
		if(!label) {
			label=mapInfo.getProperty('featureLabel');
			if(!label) {
				label=document.getElementById('labelChosen').value;
				label=label.replace(/\'/gi,'');
				
				//label=getFieldValue('labelChosen','text');
				if(!checkLabel(label)) {
					alert('Il nome e\' gia\' stato usato. Sceglierne un altro');
					actionEnd();
					return;
				}
			} else
				mapInfo.setProperty('featureLabel',null);
		}
		
		document.getElementById('legendLabelDiv').style.visibility='hidden';
		var checkedList=mapInfo.getProperty('checkedList');
		var conditions=0;
		//var queryDesc=mapInfo.getProperty('queries')[mapInfo.getProperty('queryName')];
		var idName='';
		
		var outputs=queryDesc.outputsList('detail');
		var hasFid=false;	
		
		for(var pos=0;pos<outputs.length;pos++) {
			var output=outputs[pos];
			
			if(output.description.toUpperCase()=='FID') {
				
				hasFid=true;
			}
		
		}
		if(queryDesc.fids.length>0)
			hasFid=true;
		var dataSet=mapInfo.getProperty('queryResult');

		
		var idList=checkedList;
		var filterCond='';
		if(hasFid)
			idList=dataSet.ids2Fids(checkedList);
		var idByFeatures=decompose(idList);
		eventListeners.fireEvent('queryOnMap',putToString(idList));
		var analysisNumber=mapInfo.getProperty('analysisCount');
		var analysisName='analysis'+analysisNumber;
		var node;

		for (var feature in idByFeatures) {
						
			var wmsFeature=queryDesc.realWmsFeature;
			if(typeof wmsFeature=='object')
				wmsFeature=wmsFeature[feature];
			var idQuote='';
			if(queryDesc.getIdType(wmsFeature)=='STRING')
				idQuote='\\\'';
			
			var featuresToNodes=mapInfo.getProperty('featuresToNodes');	
			node=(featuresToNodes[wmsFeature])[0];

			filterCond+='<NamedLayer><Name>'+tablePrefix(wmsFeature)+wmsFeature+'</Name><UserStyle><Name>Query'+analysisName+'</Name><FeatureTypeStyle><FeatureTypeName>'+tablePrefix(wmsFeature)+wmsFeature+'</FeatureTypeName><Rule><Name>RuleS1</Name><Filter>';
			var ids=idByFeatures[feature];
			var fields='';
			for (var pos in ids) {
				var id=ids[pos];
				
				conditions++;
				fields+='<FeatureId fid="'+idQuote+id.replace(/\'/gi,'\'\'')+idQuote+'"/>';
				//fields+='<PropertyIsEqualTo><PropertyName>'+idName+'</PropertyName><Literal>'+idQuote+id+idQuote+'</Literal></PropertyIsEqualTo>';
			}
			
			if(conditions>=1)
				//filterCond='<Filter><Or>'+fields+'</Or></Filter>';
				filterCond+=fields+'</Filter>'+queryDesc.getStyle(wmsFeature)+'</Rule></FeatureTypeStyle></UserStyle></NamedLayer>';
			else {
				actionEnd();
				alert('Selezionare almeno un elemento');
				return;
			}
		}
			
		

		automa=new Automa('DoQueryMap',3,'automa','actionEnd()');
		automa.setProperty('queryName',mapInfo.getProperty('queryName'));
		automa.setProperty('arguments',filterCond);
		automa.setProperty('node',node);
		automa.setProperty('legendLabel',label);
		automa.setProperty('featureType',queryDesc.featureType);
		automa.setProperty('style',queryDesc.getStyle());
			
		automa.start();
		
	}
}

function automaDoQueryMapPhase1() {
	
	if(mapInfo.getProperty('editingFeature')) {
		
		var featureName=mapInfo.getProperty('editingFeature');
		
		var feature=mapInfo.getProperty('legendFeatures')[featureName];

	
		var bufferZones=mapInfo.getProperty('bufferZones');
		if(bufferZones[feature.name])
			delete bufferZones[feature.name];
		mapInfo.setProperty('bufferZones',bufferZones);
		var categories=mapInfo.getProperty('categories');
		var category=categories['Query-Analisi'];
		for(var pos in category) {
			var legendEl=category[pos];
			
			if(legendEl==feature.name)
				delete category[pos];
		}
		categories['Query-Analisi']=category;
		mapInfo.setProperty('categories',categories);
		mapInfo.setProperty('legendFeature','');
		var legendFeatures=mapInfo.getProperty('legendFeatures');
		var legendFeaturesByLayer=mapInfo.getProperty('legendFeaturesByLayer');
		delete legendFeatures[feature.name];
		for(var pos in feature.layers) {
			var layer=feature.layers[pos];
			delete legendFeaturesByLayer[layer.name];
			map.removeLayer(layer.name);
		}
		mapInfo.setProperty('legendFeatures',legendFeatures);
		mapInfo.setProperty('legendFeaturesByLayer',legendFeaturesByLayer);
		document.getElementById('legendaPopupDiv').style.visibility='hidden';
		document.getElementById('colorRow').style.visibility='hidden';
		document.getElementById('strokeRow').style.visibility='hidden';
		document.getElementById('fillRow').style.visibility='hidden';
		document.getElementById('inquadraRow').style.visibility='hidden';
		//document.getElementById('dynamicRow').style.visibility='hidden';
		document.getElementById('strokeTableDiv').style.visibility='hidden';
		document.getElementById('colorTableDiv').style.visibility='hidden';
		redrawLegend();
		mapInfo.setProperty('editingFeature',null);
		automa.rewind();
		map.update();
	} else {

		var analysisNumber=mapInfo.getProperty('analysisCount');
		var analysisName='analysis'+analysisNumber;
		
		analysisNumber++;
		mapInfo.setProperty('analysisCount',analysisNumber);
		var layer=new SVGLayer(analysisName,analysisName,analysisNumber,true,1,1000000,outFeature,onFeature,clickFeature,mouseMoveFeature,'','');
		if(automa.getProperty('specialType'))
			layer.specialType=automa.getProperty('specialType');
		if(automa.getProperty('properties'))
			layer.implementationProperties=automa.getProperty('properties');
		layer.dynamicCall='mapQuery';
		layer.dynamicCallArgs='\''+automa.getProperty('queryName')+'\',\''+automa.getProperty('arguments')+'\',\''+analysisName+'\',\''+automa.getProperty('node')+'\'';
		
		layer.dynamic=true;
		layer.dynamicPosition='over';
		layer.visible=true;
		map.addLayer(layer);
		addLegendFeature(layer.name,automa.getProperty('legendLabel'),automa.getProperty('style'),automa.getProperty('featureType'),'dynamic',mapInfo.getProperty('queryName'),mapInfo.getProperty('queryResult'),mapInfo.getProperty('checkedList'));
		legendFeatureChangeProperty(layer.name,'visibility','true')
		var categories=mapInfo.getProperty('categories');
		var els=categories['Query-Analisi'];
		els.push(automa.getProperty('legendLabel'));
		categories['Query-Analisi']=els;
		mapInfo.setProperty('categories',categories);
		mapInfo.setProperty('legendCategory','Query-Analisi');
		redrawLegend();
		automa.setProperty('newLayer',layer);
		map.update();
	}
}

function centerOnRange(range,zoom) {
	
	range.inverseAdjustAspectRatio(mapWidth,mapHeight);
	
	if(mapInfo.getProperty('lastBounding')) {
		
		range=range.union(mapInfo.getProperty('lastBounding'));
		
		range.inverseAdjustAspectRatio(mapWidth,mapHeight);
		
	}
	if(mapInfo.getProperty('saveBounding')) {
		mapInfo.setProperty('saveBounding',false);
		mapInfo.setProperty('lastBounding',range);

	} else
		mapInfo.setProperty('lastBounding',null);
		
	if(zoom)
		range.zoom(mapInfo.getProperty('queryZoom'));
	var scale=map.maxRealRange.getDeltaX()/range.getDeltaX();
//	alert(scale);
	i=-1;
	if(scale<=1)
		currentZoom=0;
	else if(scale>=zoomScale[zoomScale.length-1])
		currentZoom=zoomScale.length-1;
	else {
		for(var count=zoomScale.length-1;count>=0;count--) {
			if (scale<=zoomScale[count]) {
				currentZoom=count;
			}
		}
	}
	
	if(currentZoom>0) {
		
		var d1=Math.abs(scale-zoomScale[currentZoom]);
		
		var d2=Math.abs(scale-zoomScale[currentZoom-1]);
		
		if(d2<d1)
			currentZoom=currentZoom-1;
	}

	map.zoomBox(range);
	map.zoomAbsolute(zoomScale[currentZoom]);	
	
	mapInfo.setProperty('currentZoom',currentZoom);
	
	eventListeners.fireEvent('scaleChange');
}

function centerOnLayer(layer,zoom) {
	
	var range=layer.boundingRange;
	range.inverseAdjustAspectRatio(mapWidth,mapHeight);
	
	if(mapInfo.getProperty('lastBounding')) {
		
		range=range.union(mapInfo.getProperty('lastBounding'));
		
		range.inverseAdjustAspectRatio(mapWidth,mapHeight);
		
	}
	if(mapInfo.getProperty('saveBounding')) {
		mapInfo.setProperty('saveBounding',false);
		mapInfo.setProperty('lastBounding',range);

	} else
		mapInfo.setProperty('lastBounding',null);
		
	if(zoom)
		range.zoom(mapInfo.getProperty('queryZoom'));
	var scale=map.maxRealRange.getDeltaX()/range.getDeltaX();
//	alert(scale);
	i=-1;
	if(scale<=1)
		currentZoom=0;
	else if(scale>=zoomScale[zoomScale.length-1])
		currentZoom=zoomScale.length-1;
	else {
		for(var count=zoomScale.length-1;count>=0;count--) {
			if (scale<=zoomScale[count]) {
				currentZoom=count;
			}
		}
	}
	
	if(currentZoom>0) {
		
		var d1=Math.abs(scale-zoomScale[currentZoom]);
		
		var d2=Math.abs(scale-zoomScale[currentZoom-1]);
		
		if(d2<d1)
			currentZoom=currentZoom-1;
	}

	map.zoomBox(range);
	map.zoomAbsolute(zoomScale[currentZoom]);	
	
	mapInfo.setProperty('currentZoom',currentZoom);
	
	eventListeners.fireEvent('scaleChange');
}

function automaDoQueryMapPhase2() {
	var layer=automa.getProperty('newLayer');
	if(layer.invalid) {
		var legendFeatures=mapInfo.getProperty('legendFeatures');
		var legendFeaturesByLayer=mapInfo.getProperty('legendFeaturesByLayer');
		var featureName=legendFeaturesByLayer[layer.name];
		var feature=legendFeatures[featureName];
		reallyDeleteFromLegend(feature);
		redrawLegend();

	} else {
		centerOnLayer(layer,true);
		
	}
	map.update();
}

function automaDoQueryMapPhase3() {
	eventListeners.fireEvent('queryEnd');
	//deselectCurrentFunction();
	var div=document.getElementById('queryResultDiv');
	div.style.visibility='hidden';
	
	automa.end();
	
	if(mapInfo.getProperty('nextCheckArgument'))
		checkArguments(applicationArguments,mapInfo.getProperty('nextCheckArgument'));
}

function annullaQuery() {
	eventListeners.fireEvent('queryEnd');
	//deselectCurrentFunction();
	/*mapInfo.setProperty('editingFeature',null);
	var div=document.getElementById('queryResultDiv');
	div.style.visibility='hidden';*/
}

function checkElement(check,id) {
	var checkedList=mapInfo.getProperty('checkedList');
	if(check.checked) 
		checkedList[id]='on';
	else
		delete checkedList[id];
	mapInfo.setProperty('checkedList',checkedList);
	
}

/**
 * L'oggetto QueryDescription descrive una query in tutti i suoi aspetti.
 * Guida l'applicazione nel flusso di esecuzione della query stessa.
 */
function QueryDescription_addGroupBy(feature,field,type) {
	this.groupBys[feature]=field;
	this.groupBysType[feature]=type;
}

function QueryDescription_addInput(input,save,feature) {
	if(save)
		this.savedInputs.push(input);
	else {
		if(!feature)
			feature='ALL';
		var byFeat=this.inputsByFeature[feature];
		if(!byFeat)
			byFeat=new Array();
		byFeat.push(input.name);
		this.inputsByFeature[feature]=byFeat;
		this.inputs.push(input);
	}
	this.inputsByName[input.name]=input;

}

function QueryDescription_addOutput(output,feature) {
	this.outputs.push(output);
	this.outputsByName[output.name]=output;
	if(!feature)
		feature='ALL';

	var byFeat=this.outputsByFeature[feature];
	if(!byFeat)
		byFeat=new Array();
	byFeat.push(output.name);
	this.outputsByFeature[feature]=byFeat;
	 
}

function QueryDescription_getInput(name) {
	return this.inputsByName[name];
}

function QueryDescription_getOutput(name) {
	return this.outputsByName[name];
}

function QueryDescription_inputsList(feature) {
	if(!feature)
		return this.inputs;
	var inputs=new Array();
	var inputNames=new Array();
	for(var pos in this.inputs) {
		var input=this.inputs[pos];
		
		if(this.isInputAvailableInFeature(input.name,feature)) {
			if(!arrayContains(inputNames,input.name)) {
				inputNames.push(input.name);
				inputs.push(input);
			}
		}
	}
	return inputs;

}

function QueryDescription_savedInputsList() {
	return this.savedInputs;
}

function QueryDescription_hasFid() {
	if(this.fids.length>0)
		return true;
	var hasFid=false;
	for(var pos in this.outputs) {
		var output=this.outputs[pos];
		if(output.description.toUpperCase()=='FID')
			hasFid=true;
	}
	return hasFid;
}

function QueryDescription_outputsList(mode,feature) {
	var outputNames=new Array();
	if(mode && feature) {
		var outputs=new Array();
		for(var pos in this.outputs) {
			var output=this.outputs[pos];
			if(output.isAvailableInMode(mode) && this.isAvailableInFeature(output.name,feature)) {
				if(!arrayContains(outputNames,output.name)) {
					outputNames.push(output.name);
					outputs.push(output);
				}
			}
		}
		return outputs;

	} else if(mode) {
		var outputs=new Array();
		for(var pos in this.outputs) {
			var output=this.outputs[pos];
			if(output.isAvailableInMode(mode)) {
				if(!arrayContains(outputNames,output.name)) {
					outputNames.push(output.name);
					outputs.push(output);
				}
			}
		}
		return outputs;
	} else
		return this.outputs;
}

function QueryDescription_isAvailableInFeature(outputName,feature) {
	var outputs=this.outputsByFeature[feature];
	
	for(var pos in outputs) {
		if(outputs[pos]==outputName)
			return true;
	}
	outputs=this.outputsByFeature['ALL'];
	
	for(var pos in outputs) {
		if(outputs[pos]==outputName)
			return true;
	}

	return false;
}

function QueryDescription_isInputAvailableInFeature(inputName,feature) {
	var inputs=this.inputsByFeature[feature];
	
	for(var pos in inputs) {
		if(inputs[pos]==inputName)
			return true;
	}
	inputs=this.inputsByFeature['ALL'];
	
	for(var pos in inputs) {
		if(inputs[pos]==inputName)
			return true;
	}

	return false;
}

function QueryDescription_addIdType(feature,type) {
	this.idTypes[feature]=type;
}

function QueryDescription_getIdType(feature) {
	if(!feature || !this.idTypes[feature])
		return this.idTypes['ALL'];
	else
		return this.idTypes[feature];
}

function QueryDescription_addFid(field,feature) {
	this.fids.push(new Array(field,feature));
}

function QueryDescription_isFid(field) {
	var found=false;
	for(var pos in this.fids) {
		var fidArr=this.fids[pos];
		if(fidArr[0]==field)
			found=true;
	}
	return found;
}

function QueryDescription_getFidFeature(field) {
	var feature=null;
	for(var pos in this.fids) {
		var fidArr=this.fids[pos];
		if(fidArr[0]==field)
			feature=fidArr[1];
	}
	return feature;
}

function QueryDescription_addSubQuery(name,queryName) {
	this.subQueries[name]=queryName;
}

function QueryDescription_getSubQuery(name) {
	return this.subQueries[name];
}

function QueryDescription_addStyle(feature,style) {
	this.styles[feature]=style;
}

function QueryDescription_getStyle(feature) {
	if(feature && this.styles[feature])
		return this.styles[feature];
	return this.style;
}

function QueryDescription_addIdName(feature,idName) {
	this.idNames[feature]=idName;
}

function QueryDescription_getIdName(feature) {
	return this.idNames[feature];
}

function QueryDescription_getGroupBy(feature) {
	if(this.groupBys[feature])
		return this.groupBys[feature];
	else
		return null;
}

function QueryDescription_getGroupByType(feature) {
	if(this.groupBysType[feature])
		return this.groupBysType[feature];
	else
		return null;
}

function QueryDescription(name,description,feature,wmsFeature,idType,report,map,selections,forward,featureType,style,mapHandlerFunction,customFunction,queryHandlerFunction) {
	this.name=name;
	this.description=description;
	this.feature=feature;
	this.wmsFeature=wmsFeature;
	this.idTypes=new Array();
	if(idType)
		this.idTypes['ALL']=idType;
	this.realWmsFeature=wmsFeature;
	this.hasReport=report;
	this.hasMap=map;
	this.hasSelections=selections;
	this.hasForward=forward;
	this.featureType=featureType;
	this.style=style;
	this.outputs=new Array();
	this.inputs=new Array();
	this.savedInputs=new Array();
	this.outputsByName=new Array();
	this.inputsByName=new Array();
	this.outputsByFeature=new Array();
	this.inputsByFeature=new Array();
	this.groupBys=new Array(); 
	this.groupBysType=new Array(); 
	this.fids=new Array();
	
	if(mapHandlerFunction)
		this.mapHandlerFunction=mapHandlerFunction;
	else
		this.mapHandlerFunction=null;
	if(queryHandlerFunction)
		this.queryHandlerFunction=queryHandlerFunction;
	else
		this.queryHandlerFunction=null;
	if(customFunction)
		this.customFunction=customFunction;
	else
		this.customFunction=null;
	this.subQueries=new Array();
	this.useSubQueryForAll=true;
	this.styles=new Array();
	this.idNames=new Array();
}

QueryDescription.prototype.addInput=QueryDescription_addInput;
QueryDescription.prototype.addIdName=QueryDescription_addIdName;
QueryDescription.prototype.getIdName=QueryDescription_getIdName;
QueryDescription.prototype.addOutput=QueryDescription_addOutput;
QueryDescription.prototype.addGroupBy=QueryDescription_addGroupBy;
QueryDescription.prototype.getGroupBy=QueryDescription_getGroupBy;
QueryDescription.prototype.getGroupByType=QueryDescription_getGroupByType;
QueryDescription.prototype.getInput=QueryDescription_getInput;
QueryDescription.prototype.getOutput=QueryDescription_getOutput;
QueryDescription.prototype.inputsList=QueryDescription_inputsList;
QueryDescription.prototype.savedInputsList=QueryDescription_savedInputsList;
QueryDescription.prototype.outputsList=QueryDescription_outputsList;
QueryDescription.prototype.hasFid=QueryDescription_hasFid;
QueryDescription.prototype.isAvailableInFeature=QueryDescription_isAvailableInFeature;
QueryDescription.prototype.isInputAvailableInFeature=QueryDescription_isInputAvailableInFeature;
QueryDescription.prototype.getIdType=QueryDescription_getIdType;
QueryDescription.prototype.addIdType=QueryDescription_addIdType;
QueryDescription.prototype.addFid=QueryDescription_addFid;
QueryDescription.prototype.isFid=QueryDescription_isFid;
QueryDescription.prototype.getFidFeature=QueryDescription_getFidFeature;
QueryDescription.prototype.addSubQuery=QueryDescription_addSubQuery;
QueryDescription.prototype.getSubQuery=QueryDescription_getSubQuery;
QueryDescription.prototype.addStyle=QueryDescription_addStyle;
QueryDescription.prototype.getStyle=QueryDescription_getStyle;

function QueryOutput_isAvailableInMode(mode) {
	for(var pos in this.modes) {
		if(this.modes[pos]==mode)
			return true;
	}
	return false;
}

function QueryOutput(name,description,modes,dataType) {
	this.name=name;
	this.description=description;
	this.modes=modes;
	this.dataType='STRING';
	if(dataType)
		this.dataType=dataType;
}

QueryOutput.prototype.isAvailableInMode=QueryOutput_isAvailableInMode;

function QueryInput(name,description,comparison,type) {
	this.name=name;
	this.description=description;
	this.comparison=comparison;
	this.type=type;
}

/**
 * Un oggetto DataSet rappresenta il risultato di una query.
 */
function DataSet_ids2Fids(inList,feature) {
	
	var result=new Array();
	for(var id in inList) {
		
		var ids=this.rowsById[id];
		if(ids.fids.length>0) {
			for(var pos in ids.fids) {
				if(feature) {
					var fid=ids.fids[pos];
					
					var fidFeature=fid.substring(0,fid.indexOf(','));
					if(fidFeature==feature)
						result[ids.fids[pos]]='on';
				}
				else
					result[ids.fids[pos]]='on';
			}
		} else {
			
			if(feature) {
				var fidFeature=id.substring(0,fid.indexOf(','));
				if(fidFeature==feature)
					result[id]='on';
			} else
					result[id]='on';
		}
	}
	return result;
}

function DataSet_loadFromQueryResult(retrow,queryDesc) {
	
	this.queryDesc=queryDesc;
	this.rowTitle=mapInfo.getProperty('rowTitle');
	
	retrow=retrow.replace(/\&lt\;/gi,'<');
	retrow=retrow.replace(/\&gt\;/gi,'>');
	
	var rexp=new RegExp("<gml:featureMember>(.*?)</gml:featureMember>","gi");
	this.rows=new Array();
	this.rowsById=new Array();
	var result;
		
	while((result=rexp.exec(retrow))!=null) {
		var feature=automa.getProperty('queryFeature');
		
		var row=result[1];
		var currentRow=null;
		var rexp2=new RegExp("<ingr:([a-zA-Z_0-9\\\.]*)[^>]*fid=\"(.*?)\"[^>]*>(.*)</ingr:[^>]*>","gi");
		var rowRes=rexp2.exec(row);
		if(!feature)
			feature=rowRes[1];
		
		if(feature.indexOf('.')!=-1)
			feature=feature.substring(feature.indexOf('.')+1);
		
		var id;
		if(queryDesc.getGroupBy(feature)) {
			var rexp4=new RegExp("<ingr:"+queryDesc.getGroupBy(feature)+">(.*?)</ingr:[^>]*>","gi");
			id=feature+'.'+(rexp4.exec(row))[1];
		} else {
			id=rowRes[2];
			id=feature+'.'+id;
			
		}
		currentRow=this.rowsById[id];
		if(!currentRow)
			currentRow=new DataRow();
		if(!queryDesc.hasFid())
			currentRow.addFid(id);
	
		currentRow.setId(id);
		currentRow.setFeature(feature);
		row=rowRes[3];
		var rexp3=new RegExp("<ingr:([^>]*)>(.*?)</ingr:[^>]*>","gi");
		var resField;
		
		while((resField=rexp3.exec(row))!=null) {
			var fieldName=resField[1];
			
			//if(!queryDesc.realGroupBy || queryDesc.realGroupBy!=fieldName) {
			
				var fieldValue=resField[2];
				
				var label='';
				if(queryDesc.getOutput(fieldName))
					label=queryDesc.getOutput(fieldName).description;
				
				
				if(label && label.toUpperCase()=='FID' && currentRow) {
					
					currentRow.addFid(feature+','+fieldValue);
					
				} else if(queryDesc.isFid(fieldName)) {
					
					currentRow.addFid(queryDesc.getFidFeature(fieldName)+','+fieldValue);
				} else if(label && currentRow) {
					currentRow.setField(label,fieldValue);
				} else if(currentRow) {
					currentRow.setField(fieldName,fieldValue);
				}
				if(id && currentRow)
					this.rowsById[id]=currentRow;
			//}
		}
		
	}

	for(var id in this.rowsById) {
		this.rows.push(this.rowsById[id]);
	}
	
	
}

function DataSet_append(dataSet) {
	for(var pos in dataSet.rows) {
		var row=dataSet.rows[pos];
		this.rows.push(row);
		this.rowsById[row.id]=row;
	}
}

function DataSet() {
	this.rows=new Array();
	this.rowsById=new Array();
}

DataSet.prototype.loadFromQueryResult=DataSet_loadFromQueryResult;
DataSet.prototype.ids2Fids=DataSet_ids2Fids;
DataSet.prototype.append=DataSet_append;

/**
 * Un oggetto DataRow Rapprensenta una riga di risultato di una query.
 */
function DataRow_setId(id) {
	this.id=id;
}

function DataRow_setFeature(feature) {
	this.feature=feature;
}

function DataRow_setField(label,value) {
	this.fields[label]=value;
}

function DataRow_addFid(fid) {
	this.fids.push(fid);
}

function DataRow() {
	this.fields=new Array();
	this.id=null;
	this.fids=new Array();
	this.feature=null;
}

DataRow.prototype.setId=DataRow_setId;
DataRow.prototype.setFeature=DataRow_setFeature;
DataRow.prototype.setField=DataRow_setField;
DataRow.prototype.addFid=DataRow_addFid;

