
function GWMSVGLayer_getInternalRange(SVGDocument) {
	var viewBox=SVGDocument.rootElement.getAttribute("viewBox").split(' ');
	var x=parseFloat(viewBox[0]);
	var y=parseFloat(viewBox[1]);
	var width=parseFloat(viewBox[2]);
	var height=parseFloat(viewBox[3]);

	return new Range(x,x+width,y,y+height);
}

function GWMSVGLayer_getBoundingBox(shapes,SVGDocument,win) {
	var shape=shapes[0];
	var viewBox=SVGDocument.rootElement.getAttribute("viewBox").split(' ');

	return new Array(viewBox,win.getBoundingBox(shape));
}

function GWMSVGLayer_newInstance(layer) {
	var instance=new GWMSVGLayer();
	instance.layer=layer;
	return instance;
	
}

function GWMSVGLayer_select(shape) {
	var SVGDocument=shape.getOwnerDocument();
	if(this.layer.featureType=='punctual') {
		/*var defId=shape.getAttribute('xlink:href').substring(1);
		var defGroup=SVGDocument.getElementById(defId);
		var ellipse=defGroup.getElementsByTagName('ellipse').item(0);*/
		var newShape=shape.cloneNode(true);
		newShape.setAttribute('xlink:href','#selectedPoint');
		var selectionGroup=SVGDocument.getElementById('_GWMSelection');
		var top=this.getTopElement(SVGDocument);
		selectionGroup.appendChild(newShape);
		selectionGroup.setAttribute('opacity',1);
		selectionGroup.setAttribute('transform',top.getAttribute('transform'));
		return newShape;
	} else {
		shape.setAttribute('stroke','#FF00FF');
		if(this.layer.renderingManager.hasManageableProperty('fill'))
			shape.setAttribute('fill','#FF00FF');
		return shape;
	}
}

function GWMSVGLayer_deselect(shape,color) {
	var SVGDocument=shape.getOwnerDocument();
	if(this.layer.featureType=='punctual') {
		var selectionGroup=SVGDocument.getElementById('_GWMSelection');
		selectionGroup.removeChild(shape);
	} else {
		if(!color)
			color='none';
		shape.setAttribute('stroke',color);
		if(this.layer.renderingManager.hasManageableProperty('fill'))
			shape.setAttribute('fill',color);
	}
}

function GWMSVGLayer_setColor(SVGDocument,color) {
	if(this.layer.featureType=='punctual') {
		
		var defId=SVGDocument.getElementsByTagName('use').item(0).getAttribute('xlink:href').substring(1);
		var defGroup=SVGDocument.getElementById(defId);
		defGroup.style.setProperty('stroke',color);
		defGroup.style.setProperty('fill',color);
		defGroup.style.setProperty('pointer-events','fill');
	} else {
		for(var count=0;count<SVGDocument.getElementById('gwmstyles').sheet.getCssRules().getLength();count++)
			SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(count).style.setProperty('stroke',color);					
	}
}

function GWMSVGLayer_setFill(SVGDocument,color) {
	for(var count=0;count<SVGDocument.getElementById('gwmstyles').sheet.getCssRules().getLength();count++)
		if(SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(count).style.getPropertyValue('fill')!='none')
			SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(count).style.setProperty('fill',color);				
}

function GWMSVGLayer_setFillPattern(SVGDocument,pattern,color) {
	var patternEl=SVGDocument.getElementById(pattern);
	var path=patternEl.getElementsByTagNameNS('*','path').item(0);
	path.style.setProperty('stroke',color);
	path.style.setProperty('fill',color);
	for(var count=0;count<SVGDocument.getElementById('gwmstyles').sheet.getCssRules().getLength();count++)
		SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(count).style.setProperty('fill','url(#'+pattern+')');
}

function GWMSVGLayer_getColor(SVGDocument) {
	var color=SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(0).style.getPropertyValue('stroke');
	if(color=='none')
		color=null;
	return color;
}

function GWMSVGLayer_getFill(SVGDocument) {
	var color=SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(0).style.getPropertyValue('fill');
	if(color=='none')
		color=null;
	return color;
}

function GWMSVGLayer_getStroke(SVGDocument) {
	return SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(0).style.getPropertyValue('stroke-width');
}

function GWMSVGLayer_setSize(SVGDocument,size) {
	
	if(this.layer.featureType=='punctual') {
		size=size*20;
		if(this.layer.type=='tiledsvg') {
			var scaleX=this.currRange.getScaleX(this.originalRange)/this.layer.ntilesX;
			size=size/scaleX*this.layer.resolution;
		} else {
			var scale=this.currRange.getScaleX(this.originalRange);
			size=size/scale*this.layer.resolution;
		}

		var resolution=this.layer.resolution;
		
		var defId=SVGDocument.getElementsByTagName('use').item(0).getAttribute('xlink:href').substring(1);
		var defGroup=SVGDocument.getElementById(defId);
		
		if(defGroup.getElementsByTagName('ellipse').getLength()>0) {
			defGroup.style.setProperty('stroke-width',0);
			var ellipse=defGroup.getElementsByTagName('ellipse').item(0);
			ellipse.setAttribute('rx',size*2);
			ellipse.setAttribute('ry',size*2);

			defGroup=SVGDocument.getElementById('selectedPoint');
			if(defGroup) {
				ellipse=defGroup.getElementsByTagName('ellipse').item(0);
				ellipse.setAttribute('rx',size*2);
				ellipse.setAttribute('ry',size*2);
			}
		} else if(defGroup.getElementsByTagName('path').getLength()>0) {
			var path=defGroup.getElementsByTagName('path').item(0);
			if(this.layer.type=='tiledsvg') {
				var scaleX=this.currRange.getScaleX(this.originalRange)/this.layer.ntilesX;
				path.setAttribute('transform','scale('+(1/scaleX)+','+(1/scaleX)+')');
			} else {
				var scale=this.currRange.getScaleX(this.originalRange);
				path.setAttribute('transform','scale('+(1/scale)+','+(1/scale)+')');
			}
			
		}
	}
}

function GWMSVGLayer_setStroke(SVGDocument,stroke) {
	stroke=stroke*20;
	
	if(this.layer.type=='tiledsvg') {
		var scaleX=this.currRange.getScaleX(this.originalRange)/this.layer.ntilesX;
		stroke=stroke/scaleX*this.layer.resolution;
	} else {
		
		var scale=this.currRange.getScaleX(this.originalRange);
		stroke=stroke/scale;
	}

	var resolution=this.layer.resolution;
	if(SVGDocument.getElementsByTagNameNS('*','defs').getLength()>0) {
		
		var defEl=SVGDocument.getElementsByTagNameNS('*','defs').item(0);
		if(defEl) {
			var gList=defEl.getElementsByTagNameNS('*','pattern');
			for(var pos=0;pos<gList.getLength();pos++) {
				var gEl=gList.item(pos);
				var pathList=gEl.getElementsByTagNameNS('*','path');
				for(var pos2=0;pos2<pathList.getLength();pos2++) {
					var pathEl=pathList.item(pos2);
					pathEl.style.setProperty('stroke-width',stroke*3.64);
					//alert(stroke+','+pathEl.style.getPropertyValue('stroke-width'));
				}

			}
		}
	}

	for(var count=0;count<SVGDocument.getElementById('gwmstyles').sheet.getCssRules().getLength();count++)
		SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(count).style.setProperty('stroke-width',stroke*resolution);
}

function GWMSVGLayer_setObjectColor(node,color) {	
	node.setAttribute('stroke',color);
}

function GWMSVGLayer_setObjectStroke(node,stroke) {	
	node.setAttribute('stroke-width',stroke);
}

function GWMSVGLayer_setObjectFill(node,fill) {	
	node.setAttribute('fill',fill);
	

}

function GWMSVGLayer_setObjectFillPattern(node,fillpattern,color,dynamicColor) {
	if(!dynamicColor) {
		var SVGDocument=node.getOwnerDocument();
		var patternEl=SVGDocument.getElementById(fillpattern);
		var path=patternEl.getElementsByTagNameNS('*','path').item(0);
		path.style.setProperty('stroke',color);
		path.style.setProperty('fill',color);
		node.setAttribute('fill','url(#'+fillpattern+')');
	} else {
		var id=node.getAttribute('id');
		/*var idArr=id.split(',');
		var tile=idArr[0];
		var realId=idArr[1];
		var realIdArr=realId.split('-');
		var counter=realIdArr[1];*/
		
		//var newPatternName='pattern'+tile+counter;
		var newPatternName='pattern'+id;
		var SVGDocument=node.getOwnerDocument();
		var patternEl=SVGDocument.getElementById(fillpattern);
		var newPatternEl=patternEl.cloneNode(true);
		newPatternEl.setAttribute('id',newPatternName);
		var defEl=SVGDocument.getElementsByTagNameNS('*','defs').item(0);
		defEl.appendChild(newPatternEl);
		var path=newPatternEl.getElementsByTagNameNS('*','path').item(0);
		path.style.setProperty('stroke',color);
		path.style.setProperty('stroke-width',5);
		path.style.setProperty('fill',color);
		node.setAttribute('fill','url(#'+newPatternName+')');
	}
}

function GWMSVGLayer_hasShapes(SVGDocument,name) {
	return SVGDocument.getElementById(name);
}

function GWMSVGLayer_preUpdate(SVGDocument,currRange,originalRange,realRange,maxRange) {
	this.currRange=currRange;
	this.originalRange=originalRange;
	this.realRange=realRange;
	this.maxRange=maxRange;
}


// TODO: rivedere
function GWMSVGLayer_updateTematism(SVGDocument,name) {
	var elName=name;
	
	var mainElement=SVGDocument.getElementById(elName);
	if(mainElement) {
		var parentElement=mainElement.getParentNode();
		var nodeList=parentElement.getChildNodes();
		
		for(var pos=0;pos<nodeList.getLength();pos++) {
			var group=nodeList.item(pos);
			
			if(group.getNodeType()==1) {
				if(group.getTagName().toLowerCase()=='g') {
					
					var id=group.getAttribute('id');
					if(id.substring(0,7)!='BGROUND') {
						var nodeList=group.getChildNodes();
	
						for(var pos=0;pos<nodeList.getLength();pos++) {
							var node=nodeList.item(pos);
							if(node.getNodeType()==1) {
								var newNode=null;
								
								var tooltip=node.getAttribute('gmwmsvg:tt');
								
								var tema=this.layer.implementationProperties;
								var temaStyle=tema[0];
								var color=temaStyle[tooltip];
								node.setAttribute('stroke',color);
								
							
							}
						}
					}
				}
			}
		}
	}

	
}

function GWMSVGLayer_getAttributes(shape) {
	var propAttr=shape.getAttribute('gmwmsvg:props');
	var props=new Array();
	var propArr=propAttr.split('~');
	for(var pos in propArr) {
		var prop=propArr[pos];
		var couple=prop.split('=');
		var propName=couple[0];
		var propValue=couple[1];
		props[propName]=propValue;
	}
	return props;
}

function GWMSVGLayer_processGroup(group,SVGDocument,name) {
	
	var nodeList=group.getChildNodes();
	
	for(var pos=0;pos<nodeList.getLength();pos++) {
		var node=nodeList.item(pos);
		if(node.getNodeType()==1) {
			
			if(node.getTagName().toLowerCase()=='g')
				this.processGroup(node,SVGDocument,name);
			else {
				var properties=node.getAttribute('gmwmsvg:props');
				
				if(properties) {
					var ttipArr=properties.split('~');		
					var propMap=new Array();
					for(var count in ttipArr) {
						var piece=ttipArr[count];
						var sepPos=piece.indexOf('=');
						var pieceName=piece.substring(0,sepPos);
						var pieceValue=piece.substring(sepPos+1);

										
						propMap[pieceName]=pieceValue;
					}				
					
					
					var renderer=this.layer.renderingManager;
					
					renderer.updateObject(new Renderable(node,propMap),this.layer);	
				}
			}
		}
	}
	
}

function GWMSVGLayer_postLoad(SVGDocument,name,pointerEvents) {	
	if(SVGDocument.getElementById('gwmbg'))
		SVGDocument.getElementById('gwmbg').getParentNode().removeChild(SVGDocument.getElementById('gwmbg'));
	
	if(SVGDocument.getElementById('gwmstyles')) {
		for(var count=0;count<SVGDocument.getElementById('gwmstyles').sheet.getCssRules().getLength();count++) {			
			SVGDocument.getElementById('gwmstyles').sheet.getCssRules().item(count).style.setProperty('pointer-events',pointerEvents);
		}
	}

	var top=this.getTopElement(SVGDocument);
	var selectionGroup=SVGDocument.createElement('g');
	selectionGroup.setAttribute('id','_GWMSelection');
	top.getParentNode().appendChild(selectionGroup);
	
	if(SVGDocument.getElementsByTagName('use').getLength()>0) {
		/*var defId=SVGDocument.getElementsByTagName('use').item(0).getAttribute('xlink:href').substring(1);
		var defGroup=SVGDocument.getElementById(defId);
		var newGroup=defGroup.cloneNode(true);
		newGroup.setAttribute('id','selectedPoint');
		newGroup.style.setProperty('stroke-width',0);
		var ellipse=newGroup.getElementsByTagName('ellipse').item(0);
		ellipse.style.setProperty('stroke','#FF00FF');
		ellipse.style.setProperty('fill','#FF00FF');
		selectionGroup.appendChild(newGroup);*/
	}

	var idList=new Array();
	var mainElement=SVGDocument.getElementById(name);
	
	if(mainElement) {
		var parentElement=mainElement.getParentNode();
		/*var selectionGroup=SVGDocument.createElement('g');
		selectionGroup.setAttribute("id","selectionGroup");
		parentElement.appendChild(selectionGroup);*/
		/*var commonDefsDocument=document.getElementById('commonSVGDefs').getSvgDocument();
		var commonDefsElement=commonDefsDocument.getElementById('commonDefs');*/
		/*var win=this.layer.getWindow(name);
		var imported=SVGDocument.importNode(commonDefsElement,false);
		
		parentElement.appendChild(imported);*/
		var sIdList=mainElement.getAttribute('gmwmsvg:idlist');
		if(sIdList.indexOf('=')!=-1) {
			var idArr=sIdList.split(',');
			for(var pos in idArr) {
				var sCouple=idArr[pos];
				var groupBy=sCouple.substring(0,sCouple.indexOf('='));
				var sRealIdList=sCouple.substring(sCouple.indexOf('=')+1);
				var realIdList=sRealIdList.split(';');
				for(var pos2 in realIdList) {
					var id=realIdList[pos2];
					var currId=idList[groupBy];
					if(!currId)
						currId=new Array();
					currId.push(id);
					idList[groupBy]=currId;
				}
			}
			
		} else {
			
			var idArr=sIdList.split(',');
			for(var pos in idArr)
				idList[idArr[pos]]=new Array(idArr[pos]);
		}
		
		var renderer=this.layer.renderingManager;
		if(renderer && renderer.dynamic) {
			var nodeList=parentElement.getChildNodes();
			for(var pos=0;pos<nodeList.getLength();pos++) {
				var node=nodeList.item(pos);
				
				if(node.getNodeType()==1) {
					if(node.getTagName().toLowerCase()=='g') {
						var id=node.getAttribute('id');
						
						if(id.substring(0,7)!='BGROUND')
							this.processGroup(node,SVGDocument,name);
					}
				}
			}
		}
		
		return idList;
	} else
		return '*ERROR*';
	
}

function GWMSVGLayer_postUpdate(SVGDocument,name) {	
	var mainElement=SVGDocument.getElementById(name);
	var oldClass=mainElement.getAttribute('class');
	mainElement.setAttribute('class',oldClass);
	var parentElement=mainElement.getParentNode();
	var nodeList=parentElement.getChildNodes();
	
	for(var pos=0;pos<nodeList.getLength();pos++) {
		var node=nodeList.item(pos);
		
		if(node.getNodeType()==1) {
			if(node.getTagName().toLowerCase()=='g') {
				var id=node.getAttribute('id');
									
				if(id!=name && id.substring(0,7)!='BGROUND') {
					var oldClass=node.getAttribute('class');
					node.setAttribute('class',oldClass);
					
				}
			}
		}
	}
	
	var found=true;
	var count=0;
	while(found) {
		var el=SVGDocument.getElementById('gwmg'+count);
		count++;
		if(el) {
			oldClass=el.getAttribute('class');
			el.setAttribute('class',oldClass);
		} else {
			found=false;
		}
	}
}

function GWMSVGLayer_getTopElement(SVGDocument) {
	return SVGDocument.getElementById('_GWMAll');
}

function GWMSVGLayer_getScaleFactor(SVGDocument) {
	return parseFloat(SVGDocument.getElementById('gwmmaskrect').getAttribute('width'))/mapWidth;
}

function GWMSVGLayer() {
	this.layer=null;
}

GWMSVGLayer.prototype.updateTematism=GWMSVGLayer_updateTematism;
GWMSVGLayer.prototype.newInstance=GWMSVGLayer_newInstance;
GWMSVGLayer.prototype.getTopElement=GWMSVGLayer_getTopElement;
GWMSVGLayer.prototype.getScaleFactor=GWMSVGLayer_getScaleFactor;
GWMSVGLayer.prototype.preUpdate=GWMSVGLayer_preUpdate;
GWMSVGLayer.prototype.postUpdate=GWMSVGLayer_postUpdate;
GWMSVGLayer.prototype.postLoad=GWMSVGLayer_postLoad;
GWMSVGLayer.prototype.processGroup=GWMSVGLayer_processGroup;
GWMSVGLayer.prototype.hasShapes=GWMSVGLayer_hasShapes;
GWMSVGLayer.prototype.setColor=GWMSVGLayer_setColor;
GWMSVGLayer.prototype.setObjectColor=GWMSVGLayer_setObjectColor;
GWMSVGLayer.prototype.setObjectStroke=GWMSVGLayer_setObjectStroke;
GWMSVGLayer.prototype.setObjectFill=GWMSVGLayer_setObjectFill;
GWMSVGLayer.prototype.setObjectFillPattern=GWMSVGLayer_setObjectFillPattern;
GWMSVGLayer.prototype.setFill=GWMSVGLayer_setFill;
GWMSVGLayer.prototype.setFillPattern=GWMSVGLayer_setFillPattern;
GWMSVGLayer.prototype.setStroke=GWMSVGLayer_setStroke;
GWMSVGLayer.prototype.setSize=GWMSVGLayer_setSize;
GWMSVGLayer.prototype.getColor=GWMSVGLayer_getColor;
GWMSVGLayer.prototype.getFill=GWMSVGLayer_getFill;
GWMSVGLayer.prototype.getStroke=GWMSVGLayer_getStroke;
GWMSVGLayer.prototype.getBoundingBox=GWMSVGLayer_getBoundingBox;
GWMSVGLayer.prototype.getInternalRange=GWMSVGLayer_getInternalRange;
GWMSVGLayer.prototype.select=GWMSVGLayer_select;
GWMSVGLayer.prototype.deselect=GWMSVGLayer_deselect;
GWMSVGLayer.prototype.getAttributes=GWMSVGLayer_getAttributes;

function PDFEngine_clearCommunication() {
	pdfcommunication.document.write('<html><head></head><body><form id="ilsform" name="pdfform" action="'+this.url+'" method="POST"><input type="hidden" name="data" value=""/></form></body></html>');
	
}
/*
 * Invia una richiesta al motore java. Il metodo è asincrono. Ciò significa che
 * non viene attesa la risposta. Tale risposta verrà inviata alla funzione <responseHandler>,
 * oppure al metodo <responseHandler> di <responseHandlerObject>.
 * Il tipo di richiesta viene indicata dal parametro <msgAction>. Ogni tipo di richiesta 
 * può prevedere una serie di parametri aggiuntivi.
 */
function PDFEngine_handleMsg(msgAction,otherArgs) {
	
	var html=otherArgs[0];
	var pdfWin=mapInfo.getProperty('pdfWindow');
	pdfWin.document.write('<html><head></head><body><form id="ilsform" name="pdfform" action="'+this.url+'" method="POST"><input type="hidden" name="data" value=""/></form></body></html>');
	var ogcform=pdfWin.document.getElementById('pdfform');
	
	ogcform.data.value=encodeBase64(html);
	ogcform.submit();
	return null;
}

/**
 * Costruttore. Viene passato come parametro la <DIV> usata per la comunicazione con il motore.
 */
function PDFEngine(url) {
	this.url=url;
	this.clearCommunication();
}


PDFEngine.prototype.handleMsg=PDFEngine_handleMsg;
PDFEngine.prototype.clearCommunication=PDFEngine_clearCommunication;

function CATEngine_clearCommunication() {
	catcommunication.document.write('<html><head></head><body><form id="catform" name="catform" action="'+this.url+'" method="POST"><input type="hidden" name="cataction" value=""/><input type="hidden" name="modelName" value=""/><input type="hidden" name="nodeName" value=""/><input type="hidden" name="taxonomyName" value=""/></form></body></html>');
	
}
/*
 * Invia una richiesta al motore java. Il metodo è asincrono. Ciò significa che
 * non viene attesa la risposta. Tale risposta verrà inviata alla funzione <responseHandler>,
 * oppure al metodo <responseHandler> di <responseHandlerObject>.
 * Il tipo di richiesta viene indicata dal parametro <msgAction>. Ogni tipo di richiesta 
 * può prevedere una serie di parametri aggiuntivi.
 */
function CATEngine_handleMsg(msgAction,otherArgs) {
	var action=otherArgs[0];
	var modelName=otherArgs[1];
	var nodeName=otherArgs[2];
	var taxonomyName=otherArgs[3];
	
	var ogcform=window.catcommunication.document.getElementById('catform');
	
	ogcform.cataction.value=action;
	if(modelName)
		ogcform.modelName.value=modelName;
	if(nodeName)
		ogcform.nodeName.value=nodeName;
	if(taxonomyName)
		ogcform.taxonomyName.value=taxonomyName;
	ogcform.submit();
	return catcommunication;
}

/**
 * Costruttore. Viene passato come parametro la <DIV> usata per la comunicazione con il motore.
 */
function CATEngine(url) {
	this.url=url;
	this.clearCommunication();
}


CATEngine.prototype.handleMsg=CATEngine_handleMsg;
CATEngine.prototype.clearCommunication=CATEngine_clearCommunication;

