/*var colorsTableRow1=new Array('#000000','#FF0000','#00FF00','#0000FF','#FFFF00','#00FFFF','#FF00FF','#AAAAAA');
var colorsTableRow2=new Array('#808080','#800000','#008000','#000080','#808000','#008080','#800080','#333333');
var strokesTable=new Array(1,2,3,4);
var legendStyleTableRow=new Array('#000000','#FF0000','#00FF00','#0000FF','#FFFF00','#00FFFF','#FF00FF','#AAAAAA','#808080','#800000','#008000','#000080','#808000','#008080','#800080','#333333','#404040','#400000','#004000','#000040','#404000','#004040','#400040','#666666','#B0B0B0','#B00000','#00B000','#0000B0','#B0B000','#00B0B0','#B000B0','#BBBBBB','#D0D0D0','#D00000','#00D000','#0000D0','#D0D000','#00D0D0','#D000D0','#DDDDDD');*/

extensions.push('legend');
//addExtensionHTML(legendhtml);

function legendBegin() {
	//commands['legendClose']='legendClose';
	eventListeners.attachToEvent('allLayersLoaded','initLegend');
	eventListeners.attachToEvent('layerAdded','addLegendFeature');
	eventListeners.attachToEvent('layerChangeProperty','legendFeatureChangeProperty');
	eventListeners.attachToEvent('scaleChange','redrawLegend');
	//eventListeners.attachToEvent('scaleChange','tooltipVerify');
	eventListeners.attachToEvent('dynamicLayerAdded','redrawLegend');
	eventListeners.attachToEvent('dynamicLayerRemoved','redrawLegend');
	if(mapInfo.getProperty('legendDimensions')!='ServerSide') {
		initializeLegendDimensions();
	}
	legendConfigure();
} 





function getCurrentLegendFeature() {
	return mapInfo.getProperty('legendFeatures')[mapInfo.getProperty('legendFeature')];
}

function getLegendFeature(name) {
	return mapInfo.getProperty('legendFeatures')[name];
}

function updateLegendFeature(feature) {
	var legendFeatures=mapInfo.getProperty('legendFeatures');
	legendFeatures[feature.name]=feature;
	mapInfo.setProperty('legendFeatures',legendFeatures)
}


function selectLegendVoice(name) {
	var legendFeatures=mapInfo.getProperty('legendFeatures');
	for(var layerName in legendFeatures) {
		var feature=legendFeatures[layerName];
		if(layerName==name)
			document.getElementById('legendVoice'+layerName).style.backgroundColor='#9FA19E';
		else {
			if(document.getElementById('legendVoice'+layerName))
				document.getElementById('legendVoice'+layerName).style.backgroundColor='';
		}
	}
}

function truncTitle(title) {
	if(title.length>30)
		return title.substring(0,30)+'...';
	else
		return title;
}

function getRenderer(feature) {
	var mainLayer=feature.layers[0];
	if(mainLayer)
		return mainLayer.getRenderingManager(feature.subFeatureName);
	
	return null;
}

function toolbarClose() {
	var toolbarDiv=document.getElementById('toolbarTable');
	toolbarDiv.style.visibility = 'hidden';
}

function toolbarOpen(name) {
	
	selectLegendVoice(name);	
	mapInfo.setProperty('legendFeature',name);
	var toolbarDiv=document.getElementById('toolbarTable');
	toolbarDiv.style.visibility = 'visible';
	var feature=getLegendFeature(name);
	var renderer=getRenderer(feature);
	document.getElementById('toolbarControls1').innerHTML='&nbsp;';	
	document.getElementById('toolbarControls2').innerHTML='&nbsp;';	
	document.getElementById('toolbarControls3').innerHTML='&nbsp;';	
	document.getElementById('toolbarControls4').innerHTML='&nbsp;';	
	var pos=1;
	if(renderer) {
		
		var strokeControl=feature.getControl('stroke');
		if(strokeControl) {
			strokeControl.draw('toolbarControls1');
			pos++;
		}
		var sizeControl=feature.getControl('size');
		if(sizeControl) {
			sizeControl.draw('toolbarControls1');
			pos++;
		}
		var colorControl=feature.getControl('color');
		if(colorControl) {
			colorControl.draw('toolbarControls2');
			pos++;
		}
		var fillControl=feature.getControl('fill');
		if(fillControl) {
			fillControl.draw('toolbarControls4');
			pos++;
		}
		var opacityControl=feature.getControl('opacity');
		if(opacityControl) {
			opacityControl.draw('toolbarControls3');
			pos++;
		}
		
		
	}
	
	actionEnd();
}

function legendOpen(name) {
	document.getElementById('legendTitleText').innerHTML=truncTitle(name);
	selectLegendVoice(name);	
	mapInfo.setProperty('legendFeature',name);
	var legDiv=document.getElementById('legendaPopupDiv');
	legDiv.style.visibility = 'visible';
	var feature=mapInfo.getProperty('legendFeatures')[name];
	var renderer=getRenderer(feature);
	
	if(renderer) {
		var opacityControl=feature.getControl('opacity');
		opacityControl.draw('sliderDiv');
		
	}

	actionEnd();
	
}



/*function legendClose() {
	var legDiv=document.getElementById('legendaPopupDiv');
	legDiv.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('legendTemaStyle').style.visibility='hidden';
	document.getElementById('legendStyleTableDiv').style.visibility='hidden';
	//document.getElementById('dynamicRow').style.visibility='hidden';
	document.getElementById('strokeTableDiv').style.visibility='hidden';
	document.getElementById('colorTableDiv').style.visibility='hidden';
	mapInfo.setProperty('legendFeature','');
	redrawLegend();
	
	actionEnd();

}*/

function getReallyVisibleLayer(feature,layerFeature) {
	for(var pos in feature.layers) {
		var layer=feature.layers[pos];
		var scale=map.getScale();
		if(layer.visibleInScale(scale,layerFeature))
			return layer.name;
	}
	return null;
}

function getFeatureIcon(name) {
	var feature=mapInfo.getProperty('legendFeatures')[name];
	//var mainLayer=feature.layers[0];
	//var renderer=mainLayer.getRenderingManager(feature.subFeatureName);
	var renderer=feature.renderingManagers[0];
	var layerFeature=null;
	if(feature.layerFeatures.length>0)
		layerFeature=feature.layerFeatures[0];

	var ih=mapInfo.getProperty('iconHeight');
	var iw=mapInfo.getProperty('iconWidth');
	if(!renderer)
		return '&nbsp;';
	var html='<v:rect fillcolor="white" style="position:absolute;top:0px;left:0px;width:'+(iw+1)+'px;height:'+(ih+1)+'px"/>';
	html+=renderer.getSample('VML',ih,iw);
	if(!getReallyVisibleLayer(feature,layerFeature))
		html+='<div style="position:absolute;top:0px;left:0px"><v:rect fillcolor="white" style="position:absolute;top:0px;left:0px;width:'+(iw+1)+'px;height:'+(ih+1)+'px;filter:alpha(opacity=80)"/></div>';
		

	return html;
}

function getControl(name,type) {
	var feature=mapInfo.getProperty('legendFeatures')[name];
	return feature.getControl(type);
}

function redrawMap() {
	waitingOn();
	redrawLegend();
	map.update();
}

function redrawLegend() {
	
	var legCont=document.getElementById('legendContentDiv');
	var openCategories=mapInfo.getProperty('openCategories');
	var feature=getCurrentLegendFeature();
	var categories=mapInfo.getProperty('categories');
	
	var html='<table width="110" border="0" cellspacing="0" cellpadding="0">';
	var found=false;
	var ih=mapInfo.getProperty('iconHeight');
	var iw=mapInfo.getProperty('iconWidth');
	var ic=mapInfo.getProperty('itemClass');
	var cc=mapInfo.getProperty('categoryClass');
	var lw=mapInfo.getProperty('legendWidth');	
	
	var colspan=1+mapInfo.getProperty('LegendControlsCount');

	for(var catName in categories) {
			if(openCategories[catName]) {
			
			var actCat=mapInfo.getProperty('activableCategories');
			if(actCat[catName])
				html+='<tr><td class="'+cc+'"><span id="visibilityCat'+catName.replace(/\'/gi,'\\\'')+'Span">&nbsp;</span></td><td  class="'+cc+'" colspan="'+colspan+'" width="'+lw+'" height="18"  onClick="closeCategory(\''+catName.replace(/\'/gi,'\\\'')+'\')">'+catName+'</td></tr><tr><td colspan="2"><img src="immagini/spacer.gif" height="2"/></td></tr>';
			else
				html+='<tr><td  class="'+cc+'" colspan="'+colspan+'" width="'+lw+'" height="18"  onClick="closeCategory(\''+catName.replace(/\'/gi,'\\\'')+'\')">'+catName+'</td></tr><tr><td colspan="2"><img src="immagini/spacer.gif" height="2"/></td></tr>';
			
			var elements=categories[catName];
			
			for(var pos in elements) {
				var name=elements[pos];
				
				var legFeature=getLegendFeature(name);
				
				//if(hasLegend(legFeature)) {
					var desc=name;
					var clickableSpan='<span>';
					if(mapInfo.getProperty('ControlsToolbar'))
						clickableSpan='<span style="cursor:hand" onClick="toolbarOpen(\''+name+'\')">';
					var tooltipVoice='';
					if(legFeature.description)
						tooltipVoice=' onmouseover="viewTooltipMessage(\''+legFeature.description.replace(/\'/gi,'\\\'')+'\')" onmouseout="tooltipMessageOff()" onmousemove="tooltipMessageMove()" ';
					if(feature && feature.name==name) {
						found=true;
						
						html+='<tr><td><span id="visibility'+name+'Span">&nbsp;</span></td><td valign="midle" width=95" height="'+(ih+4)+'" id="legendVoice'+name+'" class="'+ic+'" style="background-color:#9FA19E;">'+clickableSpan+'<span style="position:relative;top:0px;left:0px">'+getFeatureIcon(name)+'</span><span '+tooltipVoice+' style="position:relative;left:'+(iw+5)+'px;top:'+(ih/2-4)+'px;">'+desc+'</span></span></td></tr>';
					} else
						html+='<tr><td><span id="visibility'+name+'Span">&nbsp;</span></td><td valign="midle" width="95" height="'+(ih+4)+'" id="legendVoice'+name+'" class="'+ic+'" style="">'+clickableSpan+'<span style="position:relative;top:0px;left:0px">'+getFeatureIcon(name)+'</span><span '+tooltipVoice+' style="position:relative;left:'+(iw+5)+'px;top:'+(ih/2-4)+'px">'+desc+'</span></span></td></tr>';
				//}
					
					
			}
	
		} else
			html+='<tr><td  colspan="'+colspan+'" width="'+lw+'" height="18" class="'+cc+'" style="cursor:hand" onClick="openCategory(\''+catName+'\')">'+catName+'</td></tr>';
	}
	/*html+='<tr><td align="center" colspan="3"  class="'+ic+'">&nbsp;</td></tr>';	
	html+='<tr><td align="center" colspan="3"  class="'+ic+'" style="cursor:hand" onClick="redrawMap()"><img src="images/aggiorna.gif"/></td></tr>';	*/
	html+='</table>';
	
	/*if(found)
		toolbarOpen(feature.name);
	else
		toolbarClose();*/
	legCont.innerHTML=html;
	for(var catName in categories) {
		
		if(openCategories[catName]) {
			
			var elements=categories[catName];
			var actCat=mapInfo.getProperty('activableCategories');
			
			for(var pos in elements) {
				var name=elements[pos];
				if(actCat[catName])	{
					
					getControl(name,'visibilityCategory').draw('visibilityCat'+catName+'Span');
				}
				var legFeature=getLegendFeature(name);
				//if(hasLegend(legFeature)) {
				if(!actCat[catName])	 {
					
					getControl(name,'visibility').draw('visibility'+name+'Span');
				}
					/*if(hasTooltip(legFeature))
						getControl(name,'tooltip').draw('tooltip'+name+'Span');*/
				//}
			}
		}
	}
	
}

function openCategory(name) {
	setCategory(name,true);
}

function setCategory(name,open) {
	var openCategories=mapInfo.getProperty('openCategories');
	openCategories[name]=open;
	mapInfo.setProperty('openCategories',openCategories);
	redrawLegend();
}

function closeCategory(name) {
	setCategory(name,false);
}

function initLegend(content,height) {
	var categories=mapInfo.getProperty('categories');
	
	var openCategories=new Array();
	if(mapInfo.getProperty('ExtraCategory'))
		categories[mapInfo.getProperty('ExtraCategory')]=new Array();
	mapInfo.setProperty('categories',categories);
	if(mapInfo.getProperty('initiallyOpen')) {
		for(var catName in categories)
		openCategories[catName]=true;
		
		
	}
	mapInfo.setProperty('openCategories',openCategories);
	
	redrawLegend();
	
}

function legendUpdated() {
	/*waitingOn();
	redrawLegend();
	map.update();*/
}

function addControls(feature,renderer,toCategory,categoryName) {
	
	if(renderer.hasManageableProperty('visibility',false))
		feature.addControl('visibility',new VisibilityControl(feature.name,feature,'legendUpdated'));
	if(toCategory) {
		var catRend=new CategoryRenderer(false,categoryName);
		
		feature.addControl('visibilityCategory',new VisibilityControl(categoryName,catRend,'legendUpdated'));
		
	}
	/*if(renderer.hasManageableProperty('opacity',false))
		feature.addControl('opacity',new OpacityControl(feature.name,renderer,'legendUpdated',null));	
	feature.addControl('tooltip',new TooltipControl(feature.name,renderer,'tooltipUpdated',feature.name));

	if(renderer.hasManageableProperty('stroke',false) && !renderer.hasManageableProperty('stroke',true))
		feature.addControl('stroke',new StrokeControl(feature.name+'stroke',renderer,'legendUpdated','stroke',120));
	
	if(renderer.hasManageableProperty('color',false) && !renderer.hasManageableProperty('color',true))
		feature.addControl('color',new ColorControl(feature.name+'color',renderer,'legendUpdated','color',120));
	
	if(renderer.hasManageableProperty('fill',false) && !renderer.hasManageableProperty('fill',true))
		feature.addControl('fill',new ColorControl(feature.name+'fill',renderer,'legendUpdated','fill',120));
	
	if(renderer.hasManageableProperty('size',false) && !renderer.hasManageableProperty('size',true))
		feature.addControl('size',new SizeControl(feature.name+'size',renderer,'legendUpdated','size',120));*/
	
	
}

function hasTooltip(feature) {
	
	for(var pos in feature.layers) {
		
		var layer=feature.layers[pos];
		if(layer.hasFunction('tooltip'))
			return true;
	}
	return false;
}

function hasLegend(feature) {
	
	for(var pos in feature.layers) {
		
		var layer=feature.layers[pos];
		if(layer.hasFunction('legend'))
			return true;
	}
	return false;
}

function tooltipVerify() {
	var tooltipFeature=mapInfo.getProperty('tooltipFeature');
	
	if(tooltipFeature) {
		var feature=getLegendFeature(mapInfo.getProperty('tooltipFeature'));
		var tooltipLayer=mapInfo.getProperty('tooltipLayer');
		var newTooltipLayer=getReallyVisibleLayer(feature);
		if(tooltipLayer!=newTooltipLayer+'Tooltip')
			tooltipUpdated(true);
	}
}

function tooltipUpdated(noUpdateMap) {
	waitingOn();
	if(mapInfo.getProperty('tooltipLayer')) {
		map.removeLayer(mapInfo.getProperty('tooltipLayer'));
		mapInfo.setProperty('tooltipLayer',null);
	}
	if(mapInfo.getProperty('tooltipFeature')) {
		var feature=getLegendFeature(mapInfo.getProperty('tooltipFeature'));
		var layerName=getReallyVisibleLayer(feature);
		if(layerName) {
			var layer=map.getLayer(layerName);
			var tooltipLayer=layer.clone();
			tooltipLayer.name=tooltipLayer.name+'Tooltip';
			mapInfo.setProperty('tooltipLayer',tooltipLayer.name);
			tooltipLayer.dynamic=true;
			tooltipLayer.dynamicPosition='top';
			tooltipLayer.noAlternativeLayer=true;
			tooltipLayer.featureType=layer.featureType;
			tooltipLayer.renderingManager=layer.renderingManager.clone();
			tooltipLayer.renderingManager.setProperty('visibility',true);
			tooltipLayer.renderingManager.setProperty('opacity',0);
			map.addDynamic(tooltipLayer);
		}
	}
	if(!noUpdateMap)
		map.update();
	
}

function addLegendFeature(layerName,subFeatName,description,style,featureType,category,longDescription) {
	
	var legendFeaturesByLayer=mapInfo.getProperty('legendFeaturesByLayer');
	var legendFeatures=mapInfo.getProperty('legendFeatures');

	var feature;
	var categories=mapInfo.getProperty('categories');
	if(!categories)
		categories=new Array();
	
	var layer=map.getLayer(layerName);

	if(layer.hasFunction('legend',subFeatName)) {
		
		if(category!='null') {
			if(layer.hasFunction('activatefromcategory',subFeatName)) {
				
				var actCat=mapInfo.getProperty('activableCategories');
				actCat[category]=true;
				mapInfo.setProperty('activableCategories',actCat);
			}
			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;
		}
		
		if(legendFeatures[description])
			feature=legendFeatures[description];
		else {
			feature=new LegendFeature(description,subFeatName,longDescription);
			
			//addControls(feature,layer.getRenderingManager(subFeatName));
			addControls(feature,layer.getRenderingManager(subFeatName),layer.hasFunction('activatefromcategory',subFeatName),category);
		}
		
		feature.addLayer(layer,subFeatName);
		

		legendFeatures[feature.name]=feature;
		legendFeaturesByLayer[layerName]=feature.name;
		mapInfo.setProperty('legendFeatures',legendFeatures);
		mapInfo.setProperty('legendFeaturesByLayer',legendFeaturesByLayer);
	}
	mapInfo.setProperty('categories',categories);
	
}

function legendFeatureChangeProperty(layerName,property,value) {
	var legendFeaturesByLayer=mapInfo.getProperty('legendFeaturesByLayer');
	var featureName=legendFeaturesByLayer[layerName];
	
	if(featureName) {
		var legendFeatures=mapInfo.getProperty('legendFeatures');
		var feature=legendFeatures[featureName];
		
		var control=feature.getControl(property);
		if(control)
			control.setProperty(property,value);
		
	}
}


function LegendFeature_addLayer(layer,subFeatName) {
	this.layers.push(layer);
	this.renderingManagers.push(layer.getRenderingManager(subFeatName));
	if(subFeatName)
		this.layerFeatures.push(subFeatName);
}



function LegendFeature_addControl(property,control) {
	this.controls[property]=control;
}

function LegendFeature_getControl(property) {
	return this.controls[property];
}

function LegendFeature_setProperty(property,value) {
	for(var pos in this.renderingManagers)
		this.renderingManagers[pos].setProperty(property,value);
}

function LegendFeature_getProperty(property) {
	return this.renderingManagers[0].getProperty(property);
}

function LegendFeature(name,subFeatureName,description) {
	this.name=name;
	this.subFeatureName=subFeatureName;
	if(description)
		this.description=description;
	else
		this.description='';
	this.layers=new Array();
	this.controls=new Array();
	this.renderingManagers=new Array();
	this.layerFeatures=new Array();
}

LegendFeature.prototype.addLayer=LegendFeature_addLayer;
LegendFeature.prototype.addControl=LegendFeature_addControl;
LegendFeature.prototype.getControl=LegendFeature_getControl;
LegendFeature.prototype.setProperty=LegendFeature_setProperty;
LegendFeature.prototype.getProperty=LegendFeature_getProperty;

function CategoryRenderer(visibility,categoryName) {
	this.visibility=visibility;
	this.categoryName=categoryName;
}

function CategoryRenderer_setProperty(property,value) {
	
	this.visibility=value;
	var categories=mapInfo.getProperty('categories');
	var elements=categories[this.categoryName];
		
	for(var pos in elements) {
			
		var name=elements[pos];
		var legFeature=getLegendFeature(name);
		legFeature.setProperty('visibility',value);
	
	}
	
}

function CategoryRenderer_getProperty(property) {
	return this.visibility;
}

function CategoryRenderer_toString() {
	return "CategoryRender";
}

CategoryRenderer.prototype.setProperty=CategoryRenderer_setProperty;
CategoryRenderer.prototype.getProperty=CategoryRenderer_getProperty;
CategoryRenderer.prototype.toString=CategoryRenderer_toString;

