var zoomScale=new Array();
var zoomInterval=1;
var zoomFactor=0.5;

function mapOpenFromSummary(args) {
	var values=args.split(',');
	var mapName=values[0];
	var conf=parseInt(values[1]);

	mapInfo.setProperty('coordsType','geographic');
	automa=new Automa('MapOpen',6,'automa','actionEnd()');
	automa.setProperty('mapFromUser',true);
	automa.setProperty('mapName',mapName);
	automa.setProperty('mapConfiguration',conf);
	
	automa.start();
}

/**
 * Functions.
 */

function updateMapRange(range) {
	
	var currentZoom=0;
	if(range==null)
		range=map.realRange;
	
	range.normalizeToMaxRange(map.maxRealRange);

	var scale=map.maxRealRange.getDeltaX()/range.getDeltaX();
	
	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;
	}
		
		
	mapInfo.setProperty('currentZoom',currentZoom);
	map.zoomBox(range);
	map.zoomAbsolute(zoomScale[currentZoom]);	
	map.oldRange=map.currRange.copy();
}

function setZoomScaleFixed(valueslist) {
	
	zoomScale=new Array();
	var val=valueslist.split('*');
	for(i=0;i<val.length;i++)
		zoomScale.push(parseFloat(val[i]));

}		

function setZoomScale(maxScale) {
	zoomScale=new Array();
	var previousValue=0;
	var r1=1-zoomFactor;
	var r2=zoomFactor;
	for(var zoomVal=1;zoomVal<=maxScale;zoomVal+=zoomInterval) {
		if(previousValue==0) {
			previousValue=zoomVal;
			zoomScale.push(zoomVal);
		} else if(previousValue==1) {
			previousValue=r1;
			zoomScale.push(1/previousValue);
		} else {
			previousValue=previousValue-r2*previousValue;
			zoomScale.push(1/previousValue);
		}
	}
}

function automaMapOpenPhase1() {
	
	map.clear();
}

function automaMapOpenPhase2() {
	
	var mapName=automa.getProperty('mapName');
	var conf=automa.getProperty('mapConfiguration');
	var mantainConf=automa.getProperty('mantainPreferredConfiguration');
	
	mapInfo.setProperty('currentConfiguration',conf);
	
	map = mapArray[mapName];
	
	map.reset();
	
	if (map.zooms=='free')
		setZoomScale(map.maxScale);
	else
		setZoomScaleFixed(map.zooms);
	
//	engine.sendMsg("Info",null,'returnGetMapConfiguration',"getMapConfiguration",mapName,conf);

	
//}

//function returnGetMapConfiguration(retrow) {
	var retrow=mapInfo.getProperty('getMapConfigurationRetrow');
	
	var pos=retrow.indexOf(',');

	mapInfo.setProperty('currentConfiguration',retrow.substring(0,pos));

	eventListeners.fireEvent('configurationLoaded');
	
	automa.setProperty('layersOn',retrow.substring(pos+1));
	automa.goOn();
}


function automaMapOpenPhase3() {
//	engine.sendMsg("Info",null,'returnGetLayers',"getLayers",map.mapName);
//}
	
//function returnGetLayers(retrow) {
	var retrow=mapInfo.getProperty('getLayersRetrow');	
	var categories=mapInfo.getProperty('categories');
	
	var layers=retrow.split(';');
	var nlayers = layers.length;
	var thematisms=mapInfo.getProperty('mapthematisms');
	var delta=map.maxRealRange.getDeltaX();

	var tooltiplayer=new DynamicSVGLayer('TooltipLayer','TooltipLayer','1000000',true,1,1000000,outFeature,onFeature,clickFeature,mouseMoveFeature,'','');	
	mapArray[map.mapName].addLayer(tooltiplayer);

	var rendererClass=Renderer.implementations['virtual'];
	
	if(rendererClass) {
		var renderer=eval('new '+rendererClass+'()');
		
		renderer.setProperty('opacity',0);
		renderer.setProperty('visibility',false);
		tooltiplayer.setRenderingManager(renderer);
		
	}
	
	for(var i=0;i<nlayers;i++)
	{
		
		var fields=layers[i].split(',');
		
		var layer;
		var name = fields[0];
		var description=fields[1];
		var type = fields[2];
		var priority = parseInt(fields[3]);
		var minDelta = parseFloat(fields[4]);
		var maxDelta = parseFloat(fields[5]);
		
		var maxScale=delta/minDelta;
		var minScale=delta/maxDelta;
		if(minScale<1)
			minScale=1;

		var category = fields[6];
		
		/*var catElements=categories[category];
		if(!catElements)
			catElements=new Array();
		var found=false;
		for(var pos in catElements) {
			if(catElements[pos]==description)
				found=true;
		}
		if(!found)
			catElements.push(description);
		categories[category]=catElements;*/
		
		var featureName;
		var withEvents;
		var nTilesX;
		var nTilesY;
		var style;
		var featureType;
		var interactiveFunctions;
		var rolloverEffect;
		var opacity=parseInt(fields[10]);
		
		var resolution=1;
		var rendererByFeature=false;
		var format;
		var quality=90;
		var longDescription='';
		if(fields[18])
			longDescription=fields[18];

		if (type=='raster')
		{	
			featureName = fields[7];
			
			interactiveFunctions = fields[9];
			layer=map.getLayer(name);
			format=fields[16];
			quality=90;
			
			if(fields[17])
				quality=parseInt(fields[17]);
			

			if(!format)
				format='png';
			
			if(!layer)
				layer=new RasterLayer(name,priority,minScale,maxScale,interactiveFunctions,format,quality);
			if(featureName)
				layer.addFeature(featureName,minScale,maxScale,interactiveFunctions);
			mapArray[map.mapName].addLayer(layer);
			style=fields[13];
			
			featureType=fields[14];
			
			if(featureName)
				rendererByFeature=true;
			//eventListeners.fireEvent('layerAdded',layer.name,description);
		}
		if (type=='svg')
		{	
			featureName = fields[7];
			withEvents = (fields[8] == 'true');
			interactiveFunctions = fields[9];
			rolloverEffect = fields[10];
			style=fields[13];
			if(featureName)
				layer=new SVGLayer(name,featureName,priority,withEvents,minScale,maxScale,outFeature,onFeature,clickFeature,mouseMoveFeature,interactiveFunctions,rolloverEffect);
			else
				layer=new SVGLayer(name,name,priority,withEvents,minScale,maxScale,outFeature,onFeature,clickFeature,mouseMoveFeature,interactiveFunctions,rolloverEffect);
			mapArray[map.mapName].addLayer(layer);
			//eventListeners.fireEvent('layerAdded',layer.name,description);
		}
		if (type=='tiledsvg')
		{	
			featureName = fields[7];
			
			withEvents = (fields[8] == 'true');
			interactiveFunctions = fields[9];
			rolloverEffect = fields[10];
			nTilesX = parseInt(fields[11]);
			nTilesY = parseInt(fields[12]);
			style=fields[13];
			featureType=fields[14];
			resolution=fields[15];
			layer=map.getLayer(name);
			if(!layer)
				layer=new TiledSVGLayer(name,name,priority,withEvents,nTilesX,nTilesY,minScale,maxScale,outFeature,onFeature,clickFeature,mouseMoveFeature,interactiveFunctions,rolloverEffect);
			if(featureName)
				layer.addFeature(featureName);
			/*if(featureName)
				layer=new TiledSVGLayer(name,featureName,priority,withEvents,nTilesX,nTilesY,minScale,maxScale,outFeature,onFeature,clickFeature,mouseMoveFeature,interactiveFunctions,rolloverEffect);
			else*/
			if(featureName)
				rendererByFeature=true;
			layer.resolution=resolution;
			layer.featureType=featureType;
			mapArray[map.mapName].addLayer(layer);
			//eventListeners.fireEvent('layerAdded',layer.name,description,style,featureType);
		}
		/*if (type=='dynamicsvg')
		{	
			featureName = fields[7];
			
			interactiveFunctions = fields[9];
			layer=map.getLayer(name);
			if(!layer)
			if(featureName)
				layer=new DynamicSVGLayer(name,featureName,priority,withEvents,minScale,maxScale,outFeature,onFeature,clickFeature,mouseMoveFeature,interactiveFunctions,rolloverEffect);
			else
				layer=new DynamicSVGLayer(name,name,priority,withEvents,minScale,maxScale,outFeature,onFeature,clickFeature,mouseMoveFeature,interactiveFunctions,rolloverEffect);	
			
			mapArray[map.mapName].addLayer(layer);
			style=fields[13];
			
			featureType=fields[14];
			opacity=0;
			if(featureName)
				rendererByFeature=true;
			//eventListeners.fireEvent('layerAdded',layer.name,description);
		}*/
		if(layer.hasFunction('tooltiplayer',featureName) && rendererByFeature) {
			tooltiplayer.addLayer(layer.name,featureName,style);
		} else if(layer.hasFunction('tooltiplayer')) {
			tooltiplayer.addLayer(layer.name,null,style);
		}

		
		var rendererClass=Renderer.implementations[featureType];
		
		if(rendererClass) {
			var renderer=eval('new '+rendererClass+'()');
			renderer.init(style);
			
			if(thematisms[layer.name])
				renderer.setThematism(thematisms[layer.name]);
			renderer.setProperty('opacity',opacity);
			renderer.setProperty('visibility',false);
			if(rendererByFeature)
				layer.setRenderingManager(renderer,featureName);
			else
				layer.setRenderingManager(renderer);
			
		}
		//longDescription=longDescription.replace(/\'/gi,'\\\'');
		
		eventListeners.fireEvent('layerAdded',layer.name,featureName,description,style,featureType,category,longDescription);
		
	}
	
	//mapInfo.setProperty('categories',categories);
	//eventListeners.fireEvent('categoriesLoaded');
	eventListeners.fireEvent('allLayersLoaded');
	map.init();
	var args=mapInfo.getProperty('applicationArguments');
	if (args['action'] && args['action']=='localizza') {
		doLocalizza(args['keyNames'],args['keyValues'],args['keyTypes'],args['feature']);	
	} else
		automa.goOn();
	//automa.goOn();
}

function returnBox(retrow) {
	if(retrow=='*ERROR*') {
		alert('Errore di esecuzione della query');
		
		
	} else {
		retrow=retrow.replace(/\&lt\;/gi,'<');
		retrow=retrow.replace(/\&gt\;/gi,'>');
		
		var rexp=new RegExp("<gml:boundedBy><gml:Box.*?><gml:coordinates>(.*?)</gml:coordinates></gml:Box></gml:boundedBy>","gi");
		if((result=rexp.exec(retrow))!=null) {
			var coords=result[1];
			var coordsCouple=coords.split(' ');
			var coordsMin=coordsCouple[0].split(',');
			var coordsMax=coordsCouple[1].split(',');
			var minX=parseFloat(coordsMin[0]);
			var minY=parseFloat(coordsMin[1]);
			var maxX=parseFloat(coordsMax[0]);
			var maxY=parseFloat(coordsMax[1]);
			automa.setProperty('localizzaRange',new Range(minX,maxX,minY,maxY));
		}
	
		
	}
	automa.goOn();
}

function getSchedaWfsQuery(queryDesc,keyNames,keyValues,keyTypes) {
	var wfsFeature=queryDesc.feature;
	var wfsQuery='';
	
	
	var idName=queryDesc.getIdName(wfsFeature);
	wfsQuery='<Query typeName="'+wfsFeature+'" primarykey="'+idName+'" crs="gauss"><PropertyName>Geometry</PropertyName><Filter>';

	var filterCount=0;
	var filterCond='';
	var keyNamesArr=keyNames.split(',');
	var keyValuesArr=keyValues.split(',');
	var keyTypesArr=keyTypes.split(',');
	for(filterCount=0;filterCount<keyNamesArr.length;filterCount++) {
		if(!keyValuesArr[filterCount])
			return null;
		var idQuote='';
		if(keyTypesArr[filterCount]=='STRING')
			idQuote='\'';
		
		filterCond+='<PropertyIsEqualTo><PropertyName>'+keyNamesArr[filterCount]+'</PropertyName><Literal>'+idQuote+keyValuesArr[filterCount]+idQuote+'</Literal></PropertyIsEqualTo>';
	}
	if(filterCount==1)
		wfsQuery+=filterCond+'</Filter></Query>';
	else
		wfsQuery+='<And>'+filterCond+'</And></Filter></Query>';
	
	return wfsQuery;
}

function doLocalizza(keyNames,keyValues,keyTypes,feature)
{
	
	var featureToQuery=mapInfo.getProperty('featureToQuery');
	var queryName=featureToQuery[feature];
	
	var queryDesc=mapInfo.getProperty('queries')[queryName];
	var wfsQuery=getSchedaWfsQuery(queryDesc,keyNames,keyValues,keyTypes);
	if(wfsQuery!=null)
		engine.sendMsg("query",null,'returnBox','localizza',wfsQuery,null);
	else
		automa.goOn();
	/*automa=new Automa('AddSelection',3,'automa','actionEnd()');
	automa.setProperty('queryName',queryName);
	automa.setProperty('arguments',wmsQuery);
	automa.setProperty('legendLabel','SELEZIONE');
	automa.setProperty('featureType',queryDesc.featureType);
	automa.setProperty('style',encodeBase64(queryDesc.getStyle()));
	automa.setProperty('center',true);
	automa.start();*/
}

function automaMapOpenPhase4() {
	var args=mapInfo.getProperty('applicationArguments');
	var range=null;
	if (args['action'] && args['action']=='localizza') {
		range=automa.getProperty('localizzaRange');
		if(!range)
			range=map.maxRealRange;
		else {
			range.zoom(0.8);
			range.inverseAdjustAspectRatio(mapWidth,mapHeight);
		}
	} else {
		var minx=getCookie('realRangeMinX');
		
		var miny=getCookie('realRangeMinY');
		var maxx=getCookie('realRangeMaxX');
		var maxy=getCookie('realRangeMaxY');

		var args=mapInfo.getProperty('applicationArguments');

		if(args['minX'] && args['maxX'] && args['minY'] && args['maxY']) {
			try{
				minx=parseFloat(args['minX']);
				maxx=parseFloat(args['maxX']);
				miny=parseFloat(args['minY']);
				maxy=parseFloat(args['maxY']);
			} catch(e) {
				minx=null;
			}
		}
		if (minx!=null)
		{
			range=new Range(minx,maxx,miny,maxy)
		}
	}
	
	
	
	updateMapRange(range);
	automa.goOn();		
}



function automaMapOpenPhase5() {
	
	var newRange=automa.getProperty('range');
	var layersOn=automa.getProperty('layersOn');
	
	
	var layersArr=layersOn.split(',');
	
	for(var pos in layersArr) {
		var layerName=layersArr[pos];
		var featureName;
		if(layerName.indexOf('.')!=-1) {
			var layerNameArr=layerName.split('.');
			layerName=layerNameArr[0];
			featureName=layerNameArr[1];
			
		}
		var layer=map.getLayer(layerName);
		if(layer.renderingManager)
			layer.renderingManager.setProperty('visibility',true);
		else if(layer.renderingManagers) {
			for(var feature in layer.renderingManagers) {
				
				if(!featureName || featureName==feature) {
					
					layer.renderingManagers[feature].setProperty('visibility',true);
					
				}
			}
		}
		eventListeners.fireEvent('layerChangeProperty',layerName,'visibility','true');
		
	}
	
	/*if(layersOn.length>0)
		map.showLayers(layersOn);
	else
		automa.goOn();*/
	map.update();
	
}

function automaMapOpenPhase6() {	
	initMapGui();
	
	eventListeners.fireEvent('mapLoaded');	
	eventListeners.fireEvent('scaleChange');
	map.endOpening();
	var args=mapInfo.getProperty('applicationArguments');
	automa.end();
	if(args['command'])
		doCommand(args['command'],args['commandArgs']);
}
