/**
 * All the necessary FieldStore
 */
function SLDEditorSources() {
	this._fieldList;
	this._operatorList;
	this._operatorLexiqueList;
	this._symboleNatureList;
	this._imageList;
	this._figureList;
	
	this._getValues = function(variable, dataUrl) {
		if (!variable) {
			variable = new dojo.data.ItemFileReadStore({url: dataUrl});
		}
		return variable;
	}
	
	this.getFieldList = function(catalogLayerId) {
		this._fieldList = this._getValues(this._fieldList,"./feature?method=getAttributesListJSON&layerId=" + catalogLayerId);
		return this._fieldList;
	}
	
	this.getFieldValueList = function(catalogLayerId,featureCode) {
		var values;
		return this._getValues(values,"./feature?method=getFeatureValues&layerId=" + catalogLayerId + "&featureCode=" + featureCode);
	}
	
	this.getOperatorList = function() {
		this._operatorList = this._getValues(this._operatorList,"./js/sld/operateurs.txt")
		return this._operatorList;
	}
	
	this.getOperatorLexiqueList = function() {
		this._operatorLexiqueList = this._getValues(this._operatorLexiqueList,"./js/sld/operateursLexique.txt")
		return this._operatorLexiqueList;
	}
	
	this.getSymboleNatureList = function() {
		this._symboleNatureList = this._getValues(this._symboleNatureList,"./js/sld/nature_symboles.txt");
		return this._symboleNatureList;
	}
	
	this.getImageList = function() {
		this._imagesList = this._getValues(this._imagesList,"./js/sld/images.txt");
		return this._imagesList;
	}

	this.getFigureList = function() {
		this._figureList = this._getValues(this._figureList,"./js/sld/figures.txt");
		return this._figureList;
	}
}

var SLDListSources;

/**
 * Add a new SLD to a layer
 * @param layerId Id of the layer associated with this service
 */
function addSLD(layerId) {
	launchEditSLD(layerId,'./js/sld/vide.sld');
	SldDoc.isNew= true;
}

/**
 * Edit a SLD to a layer
 * @param layerId Id of the layer associated with this service
 */
function editSLD(layerId) {
	var SLDselect = dijit.byId("SLDStyleSelect_" + layerId);
	if (SLDselect) {
		var sldFile = '';
		var selectedValue = SLDselect.item.value[0];	
		if (selectedValue.indexOf('|') > -1) {
			var values = selectedValue.split('|');
			sldFile = values[0];
			launchEditSLD(layerId,sldFile);
		}
	}
}

/**
 * Launch the SLD Editor
 */
function launchEditSLD(layerId,sldFile) {
	loadDojoSLDLibs();
	
	var SLDDialog = dijit.byId('SLDDialogBox');
    dojo.addClass('SLDDialogBox','SLDDialogBoxSmall');
	centerDijit(SLDDialog);
	
	document.getElementById('SLDLayerId').value = layerId;
	SLDDialog.show();

	parseSLD(sldFile);
}

/**
 * Fonction pour supprimer un sld selectionne dans la liste
 */
function delSLDButton(layerId) {
	var SLDselect = dijit.byId("SLDStyleSelect_" + layerId);
	var sldFile;
	var sldTitle;
	if (SLDselect) {
		var selectedValue = SLDselect.item.value[0];
		var selectedRow = SLDselect.item._0;
		if (selectedValue.indexOf('|') > -1) {
			var values = selectedValue.split('|');
			sldFile = values[0];
			var optId = sldFile.lastIndexOf('sld=') + 3;
			sldFile = sldFile.substring(optId+1);

			sldTitle = SLDselect.getDisplayedValue();
		
			var message = gMessages['js.message.sld.del.confirmation'] + " " + sldTitle + " ? ";
			if (confirm(message)) {
				delSLD(sldFile,layerId,selectedRow,true);
			}
		}
	}
	updateSLDBar(layerId);
}

/**
 * Supprime un SLD existant
 */
function delSLD(sldFile,layerId,selectedRow,delInMapbuilder) {
	var body = {
		method: "delete",
		sld: sldFile
	}
	dojo.xhrGet({
        url: "sldControler",
        content: body
	});

	if (delInMapbuilder) {
		//supprime le style de la couche
		var mbContext = config.objects.mainMap;
		mbContext.deleteStyle(mbContext,layerId,selectedRow);
	}

}

/***************************************************
/* Definit les fonctions pour le premier DialogBox *
/***************************************************/	

/**
 * Creation de l'interface et initialisation de l'objet SLD
 */
function parseSLD(SldFile) {
	// initialisation de l'objet
	SLDListSources = new SLDEditorSources();
	SldDoc = new SLD(SldFile);

	var layerId = document.getElementById('SLDLayerId').value;

	// recuperation du type de couche
	SldDoc.layerType = getLayerType(layerId);

	// recuperation et affichage du nom de la couche
	var layer = config.objects.mainMap.getLayer(layerId);
	var layerTitle = layer.selectSingleNode("wmc:Title").firstChild.nodeValue;
	var catalogLayerId = layer.selectSingleNode("wmc:Extension/wmc:Infoterre/wmc:UnderlyingUUID").firstChild.nodeValue;

	SldDoc.setLayer(layer);
	createDivElement('SLDLabelLayer',gMessages['js.message.sld.couche.name']+" : "+layerTitle,'SLDgeneral');

	// recuperation et affichage du nom de la thematisation
	var themeName = SldDoc.getNameValueForNode('UserStyle');
	createDivElement('SLDLabelThm',gMessages['js.message.sld.theme.name']+" :",'SLDgeneral');
	var ieb = new dijit.InlineEditBox({ 
		title: gMessages['js.message.sld.theme.name'],
		onChange : changeHandler,
		name : 'SLDthemeName',
		id : 'SLDthemeName',
		width:'200px',
		left:'160px',
		top:'-15px',
		value: themeName
		}, dojo.byId(createDivElement('SLDthemeNameDIV',themeName, 'SLDgeneral')));

	// recuperation de l'attribut unique des thematisation
	// et construction de la liste a partir du webService

    var fs = new dijit.form.FilteringSelect({
		autoComplete:true,
		store: SLDListSources.getFieldList(catalogLayerId),
		searchAttr:"label",
		labelAttr:"label",
		labelType:"html",
		onChange:changeHandler
		}, dojo.byId(createDivElement('SLDfieldslist','fieldslist', 'SLDattribut')));
	var selectedField = SldDoc.getFirstPropertyName();
    if (selectedField != "") {
        fs.setValue(selectedField,true);
        drawRules();
    }

	// un peu risque le controle, mais c'est pour eviter que le onChange du controle de liste des champs ne soit interprete
	// lors de son chargement, qui se fait avec retard sur la fin de la fonction (recuperation distante des champs).
	window.setTimeout('SldDoc.parsed = true',1000);
	dojo.connect(dijit.byId('SLDDialogBox'), 'hide', "SLDDialogUnload");
}

/**
 * Affiche le tableau des regles
 */
function drawRules() {
	var fieldObj = document.getElementById('SLDexpression');
	if (fieldObj.style.display != 'block') {
		// ajout des boutons sur le cote :
		var buttonNew = new dijit.form.Button({
			id :'SLDNewButton',
			label :gMessages['js.message.sld.button.new'],
			onClick:newRule
			}, dojo.byId(createDivElement('SLDNewButtonDIV','', 'SLDexpression')));
		var buttonEdit = new dijit.form.Button({
			id :'SLDEditButton',
			label :gMessages['js.message.sld.button.modify'],
			onClick:editRule
			}, dojo.byId(createDivElement('SLDEditButtonDIV','', 'SLDexpression')));
		var buttonClone = new dijit.form.Button({
			id :'SLDCloneButton',
			label :gMessages['js.message.sld.button.duplicate'],
			onClick:cloneRule
			}, dojo.byId(createDivElement('SLDCloneButtonDIV','', 'SLDexpression')));
		var buttonDel = new dijit.form.Button({
			id :'SLDDelButton',
			label :gMessages['js.message.sld.button.delete'],
			onClick:deleteRule
			},dojo.byId(createDivElement('SLDDelButtonDIV','', 'SLDexpression')));

		//retaille le dialog
		dojo.removeClass('SLDDialogBox','SLDDialogBoxSmall');
		dojo.addClass('SLDDialogBox','SLDDialogBoxBig');
		centerDijit(dijit.byId('SLDDialogBox'));

		//affiche les fieldSet
		fieldObj.style.display = 'block';
		fieldObj = document.getElementById('SLDfiltre');
		fieldObj.style.display = 'block';
		fieldObj = document.getElementById('SLDvisuel');
		fieldObj.style.display = 'block';
		
		if (SldDoc.isNew) {
			var fl= dijit.byId('SLDfieldslist');
			var Pselected = fl.getValue();
			SldDoc.buildDefaultRules(Pselected);
		}
		
		drawRulesGrid('SLDgrid');
	}
}

/**
 * recuperation et affichage des Rules
 */  
function drawRulesGrid(ID, idxSelected) {      
	if(arguments.length == 1)
		idxSelected = 0;
	// test de presence du controle de grille      
	var grid;
	if(!dijit.byId(ID)) {
		// creation
		grid = new dojox.Grid({
			id: ID
			},dojo.byId(createDivElement('SLDgrille','Grille', 'SLDexpression')));
	} else {
		// recuperation du widget
		grid = dijit.byId(ID);
	}

	// recuperation des donnees alimentant la grille
	var data = SldDoc.getRulesNamesWithIndex();

	// creation du modele   
	var model = new dojox.grid.data.Table(null, data);
	// grille non classable, mais dojo ne le prend pas en compte :-(
	model.clientSort = false;

	// determination de la structure. 
	var view = {cells: [[
		{name: gMessages['js.message.sld.grid.position'],width:"60px"},
		{name: gMessages['js.message.sld.grid.name'],width:"280px"}                
	]]};
   
	if (data.length < 10) {
		view.noscroll = true;
	}

	var layout = [view];
	// application de structure et modele a la grille
	grid.setStructure(layout);
	grid.setModel(model);

	// ajout de l'observateur sur le row click    
	dojo.connect(grid, "onRowClick", function(event) {
		displayContent(this,this.selection.getSelected());
	});

	// selection par defaut de la premiere ligne
	grid.selection.select(idxSelected);
	if (data.length > 0) {
	// appel de la fonction d'affichage des details car l'evenement n'est pas appele par la ligne precedente. 
		displayContent(grid,idxSelected);
	}
}

/**
 * Affiche l'expression et le rendu de la regle selectionnee
 */
function displayContent(g,idx){
	// interpretation de la selection
	var cell = g.views.views[0].getCellNode(idx, 0);
	var expId = parseInt(cell.innerHTML) - 1;

	// recuperation des valeurs a afficher dans l'objet XML
	SldDoc.selectedRule=expId;
	var ruleName = SldDoc.getRuleName(SldDoc.selectedRule);

	var PropertyName = SldDoc.getPropertyName(SldDoc.selectedRule);
	var Op = getOpValue(SldDoc.getOperator(SldDoc.selectedRule));
	var expValue = SldDoc.getFilterValue(SldDoc.selectedRule);
	
	// structuration de l'expression
	if (expValue != '')
		strExp = PropertyName + " " + Op + " " + expValue;
	else
		strExp = gMessages['js.message.sld.display.default'];

	 // preparation de l'emplacement d'affichage de l'expression
	if (!dojo.byId('SLDexpFiltre'))
		createDivElement('SLDexpFiltre','', 'SLDfiltre');

	// recuperation de l'emplacement d'affichage
	var cible = dojo.byId('SLDexpFiltre');
	// alimentation de l'emplacement d'affichage
	cible.innerHTML = strExp;

	// recuperation et alimentation de la legende
	updateRuleDisplay(dojo.byId('SLDlegend'));
}

/**
 * Copie une rule dans le SLD
 */
function cloneRule(){
	var grid;
	if(dijit.byId('SLDgrid'))
		grid = dijit.byId('SLDgrid');
	else
		return;
	var idx = SldDoc.duplicateRule(grid.selection.getSelected());
	drawRulesGrid('SLDgrid',idx);
}

/**
 * Supprime une rule dans le SLD
 */
function deleteRule(){
	var grid
	if(dijit.byId('SLDgrid'))
		grid = dijit.byId('SLDgrid');
	else
		return;

	var v = confirm (gMessages['js.message.sld.del.confirmation'] + " :\n" + SldDoc.getRuleName(grid.selection.getSelected()));
	if (!v)
		return;

	var idx = SldDoc.deleteRule(grid.selection.getSelected());
	drawRulesGrid('SLDgrid',0);
}

/**
 * Ajoute une nouvelle rule dans le SLD et ouvre la popup d'edition
 */
function newRule(){
	var nbRules= SldDoc.getRulesNamesWithIndex().length;
	var fl= dijit.byId('SLDfieldslist');
	var Pselected = fl.getValue();
	
	if (nbRules > 0) {
		// des Rules existent deja. Verification de leur PropertyName
		for (i=0; i<nbRules; i++) {
			PName= SldDoc.getPropertyName(i);
			if (PName != "" && Pselected != PName){
				//suppression des Rules existantes si validation du nouveau champ
				var v = confirm(gMessages['js.message.sld.field.change.confirm']);
				if (v)
					SldDoc.deleteRules();
				else
					return;
			}
		}
	}
    
	SldDoc.selectedRule = SldDoc.buildNewRule(gMessages['js.message.sld.newRule.label'], Pselected);
	if(dijit.byId('SLDRuleDialog')){
		dijit.byId('SLDRuleDialog').show();
		displayValuesInSLDRuleDialog(SldDoc.selectedRule);
	}
}

/**
 * Edite une rule du SLD
 */
function editRule(){
	var grid;
	if(dijit.byId('SLDgrid'))
		grid = dijit.byId('SLDgrid');
	else
		return;

	SldDoc.selectedRule = grid.selection.getSelected();
	if(dijit.byId('SLDRuleDialog')){
		dijit.byId('SLDRuleDialog').show();
		displayValuesInSLDRuleDialog(SldDoc.selectedRule);
	}
}

/**
 * Supprime tous les objets cree a la fermeture du DialogBox
 */
function SLDDialogUnload(){
	//cache les fieldSet
	var fieldObj = document.getElementById('SLDexpression');
	fieldObj.style.display = 'none';
	fieldObj = document.getElementById('SLDfiltre');
	fieldObj.style.display = 'none';
	fieldObj = document.getElementById('SLDvisuel');
	fieldObj.style.display = 'none';

	//retaille le dialog
	dojo.addClass('SLDDialogBox','SLDDialogBoxSmall');
	dojo.removeClass('SLDDialogBox','SLDDialogBoxBig');
	centerDijit(dijit.byId('SLDDialogBox'));

	// destruction des objets crees dynamiquement :
	var lov = ['SLDthemeName','SLDfieldslist','SLDgrid','SLDNewButton','SLDEditButton','SLDCloneButton','SLDDelButton'];
	destroyDijits(lov);
	
	var father = 'SLDgeneral';
	lov = ['SLDNamedLayer','SLDUserStyle'];
	removeChildrenDijits(father,lov);
	
	lov = ['SLDgrille','SLDDelButtonDIV','SLDCloneButtonDIV','SLDEditButtonDIV','SLDNewButtonDIV','SLDfieldslist','SLDthemeNameDIV','SLDLabelThm','SLDLabelLayer'];
	deleteDivElement(lov);

	//initialise l'objet SldDoc pour eviter les events
    SldDoc.parsed = false;
}

/**
 * Masque le DialogBox
 */
function hideSLDBox() {
	if (SldDoc.isNew) {
		delSLD(SldDoc.url,"",-1,false);
	} else {
		SldDoc.restore(true);
	}
	
	dijit.byId('SLDDialogBox').hide();
}

/**
 * Valide le DialogBox
 */
function validSLD() {
	//verifie que le SLD contient au moins une re�gle
	if (SldDoc.getRulesNamesWithIndex().length > 0) {
		//sauve le sld
		SldDoc.save();
	
		//ajoute le sld a la couche
		var mbContext = config.objects.mainMap;
		mbContext.addSLD(mbContext,SldDoc);
	
		//met a jour la liste des styles
		var layerId = document.getElementById('SLDLayerId').value;
		updateSLDBar(layerId);
	}

	//cache le dialog
	dijit.byId('SLDDialogBox').hide();
}

/*******************************************************
/* Definit les fonctions pour le DialogBox d'une regle *
/*******************************************************/	

/**
 * Creation de l'interface d'edition d'une regle
 */
function displayValuesInSLDRuleDialog(RuleIdx){
	//fait un point de restauration
	SldDoc.restorePoint();
	
	// recuperation et affichage du nom de la couche
	var layerTitle = SldDoc.layerObj.selectSingleNode("wmc:Title").firstChild.nodeValue;
	createDivElement('SLDLabelLayer2',gMessages['js.message.sld.couche.name']+" : "+layerTitle,'SLDRuleGeneral');
    
	// recuperation et affichage du nom de la thematisation
	var themeName = SldDoc.getNameValueForNode('UserStyle');
	createDivElement('SLDthemeName2',gMessages['js.message.sld.theme.name'] + " : " +themeName,'SLDRuleGeneral');
	
    // recuperation et affichage du nom de l'expression
	var RuleName = SldDoc.getRuleName(RuleIdx); 
	createDivElement('SLDRuleNameLabel',gMessages['js.message.sld.rule.expression'] + ' : ','SLDRuleGeneral');
    var ieb = new dijit.InlineEditBox({ 
    	title: gMessages['js.message.sld.rule.expression'] + ' : ',
    	onChange : changeHandler, 
    	name : 'SLDexpressionTitle', 
    	id : 'SLDexpressionTitle',
    	width:'200px',
    	left:'160px',
    	top:'-15px'}
    	, dojo.byId(createDivElement('SLDexpressionTitleDIV',RuleName, 'SLDRuleGeneral')));
     
	// Affichage du filtre
	var leChamp = SldDoc.getPropertyName(RuleIdx);
	var fieldList = SLDListSources.getFieldList();
	var selectedField = fieldList._getItemByIdentity(leChamp);
	var valueType = selectedField.type;

	createDivElement('SLDnomChamp',leChamp + " - " + gMessages['js.message.sld.type.' + valueType],'SLDRuleFiltre');

    makeOperatorBloc();

	// affichage du rendu visuel
	if (SldDoc.layerType == 'Point') {
		var naturesList = new dijit.form.FilteringSelect({
			autoComplete:true,
			id: 'SLDnatlist',
			store: SLDListSources.getSymboleNatureList(),
			searchAttr:"label",
			labelAttr:"label",
			labelType:"html",
			onChange:changeHandler
			}, dojo.byId(createDivElement('SLDnatlistDIV','natlist', 'SLDRuleSymbole')));
		createDivElement('SLDLbltaille',gMessages['js.message.sld.rule.size'] + ' : ','SLDRuleSymbole');
		var sp1 = new dijit.form.NumberSpinner({
			value:SldDoc.getGraphicSize(RuleIdx),
			id:'SLDtaille',
			smallDelta:1,
			constraints:{min:1,max:30},
			trim:true,
			onChange : changeHandler
			},dojo.byId(createDivElement('sp1','sp1', 'SLDRuleSymbole')));
    } else {
		var leVisuel = dojo.byId('SLDRuleSymbole');
		leVisuel.style.visibility = 'hidden';
		createDivElement('SLDepaisseurLbl',gMessages['js.message.sld.rule.width'] + ' : ','SLDRuleContour');
	    
		var sp = new dijit.form.NumberSpinner({
			value:SldDoc.getSymbolizer(RuleIdx,'Stroke','stroke-width'),
			id:'SLDepaisseur',
			smallDelta:1,
			constraints:{min:1,max:14},
			trim:true,
			onChange : changeHandler
			},dojo.byId(createDivElement('SLDepaisseurDIV','sp', 'SLDRuleContour')));
	}
	
	//contour
	createDivElement('SLDlblCouleurContour',gMessages['js.message.sld.rule.color'] + ' : ','SLDRuleContour');
	createDivElement('SLDimgColorContour' ,"&nbsp;",'SLDRuleContour',SldDoc.getSymbolizer(RuleIdx,'Stroke','stroke'));
	// fond
	createDivElement('SLDlblCouleurFond',gMessages['js.message.sld.rule.color'] + ' : ','SLDRuleFond');
	createDivElement('SLDimgColorFond' ,"&nbsp;",'SLDRuleFond',SldDoc.getSymbolizer(RuleIdx,'Fill','fill'));
    
	var buttonNew = new dijit.form.Button({
		id :'CancelRuleButton',
		label :gMessages['js.message.sld.button.cancel'],
		onClick:cancelRule
		}, dojo.byId(createDivElement('CancelRuleButton','', 'SLDRuleVisuel')));
	var buttonNew = new dijit.form.Button({
		id :'ValidRuleButton',
		label :gMessages['js.message.sld.button.valid'],
		onClick:ValidRule
		}, dojo.byId(createDivElement('ValidRuleButton','', 'SLDRuleVisuel')));
	dojo.connect(dijit.byId('SLDRuleDialog'), 'hide', "SLDRuleDialogUnload");

	if (SldDoc.layerType == 'Point') {
		var selectedNature = SldDoc.getPointGraphicType();
		if (selectedNature != "") {
			dijit.byId("SLDnatlist").setValue(selectedNature,true);
		}
	}

	SldDoc.selectedRule = RuleIdx;

	// mise a jour du visuel :
	updateRuleDisplay(dojo.byId('SLDRuleLegend'));
}

/**
 * Draw the Operator Bloc
 */
function makeOperatorBloc() {
	var RuleIdx = SldDoc.selectedRule;
	// recuperation du type de donnee
	var fieldValue = SldDoc.getPropertyName(RuleIdx);
    var fieldList = SLDListSources.getFieldList();
	var selectedField = fieldList._getItemByIdentity(fieldValue);
	var valuesLength = selectedField.valuesLength;

	var opStore;
	if (valuesLength > 0) { //lexique
		opStore = SLDListSources.getOperatorLexiqueList();
	} else {
		opStore = SLDListSources.getOperatorList();
	}

	var currentOperator = SldDoc.getOperator(RuleIdx)

	// affichage de la liste des operateurs
	var fs = new dijit.form.FilteringSelect({
		autoComplete:false,
		store: opStore,
		id: "SLDoplist",
		name: "SLDoplist",
		searchAttr:"label",
		labelAttr:"label",
		labelType:"html",
		value:currentOperator,
		onChange:changeHandler
		}, dojo.byId(createDivElement('SLDoplistDIV','oplist', 'SLDRuleFiltre')));
	
	var FiltreValue = SldDoc.getFilterValue(RuleIdx,0);
	
	if (valuesLength > 0) { //lexique
		var layerId = SldDoc.layerObj.selectSingleNode("wmc:Extension/wmc:Infoterre/wmc:UnderlyingUUID").firstChild.nodeValue;
		var valueSelect = new dijit.form.FilteringSelect({
			autoComplete:false,
			store: SLDListSources.getFieldValueList(layerId,fieldValue),
			id: "SLDPropertyValue",
			name: "SLDPropertyValue",
			searchAttr:"label",
			labelAttr:"label",
			labelType:"html",
			value:FiltreValue,
			onChange:changeHandler
			}, dojo.byId(createDivElement('SLDPropertyValueDIV','PropertyValue', 'SLDRuleFiltre')));
	} else {
		var valueBox = new dijit.form.TextBox({
			required:"true",
			name:"valeur",
			value:FiltreValue,
			id:"SLDPropertyValue",
			onChange:changeHandler        
			}, dojo.byId(createDivElement('SLDPropertyValueDIV','PropertyValue','SLDRuleFiltre')));
		if (getOpValue(currentOperator) == "PropertyIsBetween") {
			var valueBoxUpper = new dijit.form.TextBox({
				required:"true",
				name:"valeur",
				id:"SLDPropertyUpperValue",
				onChange:changeHandler        
				}, dojo.byId(createDivElement('SLDPropertyUpperValueDIV','PropertyValue','SLDRuleFiltre')));
		}
	}
	
}

/**
 * Permet a l'utilisateur de changer l'image selectionnee
 */
function restoreImgList() {
	if (dojo.byId('SLDimgPicto'))
		dojo.byId('SLDRuleSymbole').removeChild(dojo.byId('SLDimgPicto'));
	
	var svalue = "";
	var theId = 'SLDimglist';
	var figures = new dijit.form.FilteringSelect({
		autoComplete:true,
		id:theId,
		store: SLDListSources.getImageList(),
		searchAttr:"label",
		labelAttr:"label",
		labelType:"html",
		onChange:changeHandler            
	}, dojo.byId(createDivElement('SLDfiglist','figlist', 'SLDRuleSymbole')));
}

/**
 * Affiche une palette associee a un div
 */
function showPalette(divId, containerId) {

	if (!dijit.byId('Palette' + divId)) {
		var palette1 = new dijit.ColorPalette({onChange : changeHandler}, dojo.byId(createDivElement('Palette' + divId,'Palette' + divId, containerId)));
		palette1.domNode.style.top = dojo.byId(divId).style.top;
	} else
		dijit.byId('Palette' + divId).destroy();
}

/**
 * Supprime tous les objets cree a la fermeture du DialogBox
 */
function SLDRuleDialogUnload(){
	// destruction des contenus crees dynamiquement :
	var lov = ['SLDexpressionTitle','SLDoplist','SLDPropertyValue','SLDPropertyUpperValue','SLDepaisseur','SLDtaille','CancelRuleButton','ValidRuleButton','SLDnatlist','SLDfiglist','SLDimglist'];
	destroyDijits(lov);
    
    var father = 'SLDRuleGeneral';
    lov = ['SLDLabelLayer2','SLDthemeName2','SLDRuleNameLabel'];
	removeChildrenDijits(father,lov);
    
    father = 'SLDRuleFiltre';
    lov = ['SLDnomChamp'];
	removeChildrenDijits(father,lov);
    
    father = 'SLDRuleContour';
    lov = ['SLDlblCouleurContour','SLDimgColorContour'];
	removeChildrenDijits(father,lov);
    
    father = 'SLDRuleSymbole';
    lov = ['SLDLbltaille','SLDimgPicto'];
	removeChildrenDijits(father,lov);
    
    father = 'SLDRuleFond';
    lov = ['SLDlblCouleurFond','SLDimgColorFond'];
	removeChildrenDijits(father,lov);
	
	lov = ['SLDfiglist','SLDPropertyUpperValueDIV','SLDPropertyValueDIV','SLDoplistDIV','ValidRuleButton','CancelRuleButton','SLDimgColorFond','SLDlblCouleurFond','SLDimgColorContour','SLDlblCouleurContour','SLDepaisseurDIV','SLDepaisseurLbl','sp1','SLDLbltaille','SLDnatlistDIV','SLDnomChamp','SLDexpressionTitleDIV','SLDRuleNameLabel','SLDthemeName2','SLDLabelLayer2'];
	deleteDivElement(lov);
}

/**
 * Masque le dialogBox
 */
function cancelRule() {
	SldDoc.restore(false);
	dijit.byId('SLDRuleDialog').hide();
}

/**
 * Valide l'edition de la regle
 */
function ValidRule() {
	dijit.byId('SLDRuleDialog').hide();
	drawRulesGrid('SLDgrid',SldDoc.selectedRule);
}

/************************************
/* Definit les fonctions generiques *
/************************************/	

/**
 * traduction des valeurs de comparaison du fichier SLD en operateurs
 */
function getOpValue(OpName) {
	switch (OpName) {
		case "PropertyIsEqualTo":
			op = " = ";
			break;
		case "PropertyIsNotEqualTo":
			op = " <> ";
			break;
		case "PropertyIsLessThan":
			op = " < ";
			break;
		case "PropertyIsGreaterThan":
			op = " > ";
			break;
		case "PropertyIsLessThanOrEqualTo":
			op = " <= ";
			break;
		case "PropertyIsGreaterThanOrEqualTo":
			op = " >= ";
			break;
		case "PropertyIsBetween":
			op = " <= x <= ";
			break;
		default:
			op = " = ";
	}
	return op;
}

/**
 * Fonction de creation d'un bloc DIV dans le doc HTML
 * divId : id du nouveau DIV
 * divHTML : contenu HTML du nouveau DIV
 * parentID : noeud parent dans le DOM HTML
 * bgColor : coulour du fond en HEX
 */
function createDivElement(divId, divHtml, parentId, bgColor){
	var divObj = document.getElementById(divId);
	if (!divObj) {
		var divElement = document.createElement("div");
		divElement.id = divId;

		if (divHtml != '')
			divElement.innerHTML = divHtml;

		if (arguments.length == 4) {
			divElement.style.backgroundColor = bgColor;
			divElement.style.width = '24px';
			divElement.innerHTML = "<img src='./style/default/images/1pixel.gif' border='0' style='height:20px;' onClick='showPalette(\""+divId+"\",\"" + parentId + "\")' />";
		}

		var parentElement = document.getElementById(parentId);
		if (parentElement)
			parentElement.appendChild(divElement);
	}
	// renvoi de l'id du nouveau DIV   
	return divId;
}

function deleteDivElement(lov) {
	for (var i=0; i<lov.length; i++) {
		var divId = lov[i];
		var divObj = document.getElementById(divId);
		if (divObj) {
			divObj.parentNode.removeChild(divObj);
		}
	}
}

/**
 * Affiche l'apercu de la rule courante
 */
function updateRuleDisplay(cible){
	var WMSServer = SldDoc.layerObj.selectSingleNode("wmc:Server/wmc:OnlineResource").getAttribute("xlink:href");
	if (WMSServer.indexOf('?') < 0)
		WMSServer += "?";
	else
		WMSServer += "&";

	var d = new Date();
	var layerName = SldDoc.getNameValueForNode('NamedLayer');
	url = WMSServer+'SERVICE=WMS&VERSION=1.1.1&REQUEST=getlegendgraphic&LAYER='+escape(layerName)+'&SLD='+SldDoc.save()+'&RULE='+SldDoc.getRuleName(SldDoc.selectedRule)+'&WIDTH=40&HEIGHT=20&FORMAT=image/png&T='+d.getTime();

	cible.src = url;
}

/**
 * Retourne le type de Layer 'Point', 'Line' ou 'Polygon'
 */
function getLayerType(layerId) {
	return document.getElementById('SLDGeomType_' + layerId).value;
}

/**
 * fonctions de gestion des evenements sur les controles utilisateur :
 */
function changeHandler(value) {
	// on bloque la detection d'event se faisant au chargement :
	if (SldDoc.parsed == false)
    	return;

	// differenciation des traitements en fonction de la valeur modifiee
	if (this.id == 'SLDthemeName') {
		//definition du nom du theme
		SldDoc.setThemeName(value);
	}
	if (this.id == 'SLDfieldslist') {
		//Affiche les fieldset si ils ne le sont pas deja
		if (SldDoc.isNew)
			drawRules();
		// Le changement de champ va reinitialiser toutes les Rules deja definies.
		// Il faut en prevenir l'utilisateur
		// test de presence d'une thematisation deja definie.
		if (SldDoc.getRulesNamesWithIndex().length > 0 && SldDoc.getFirstPropertyName() != value) {
			if (confirm(gMessages['js.message.sld.delete.theme'])) {
				SldDoc.deleteRules();
				SldDoc.buildDefaultRules(value);
				drawRulesGrid('SLDgrid');
			}
		}
            
	}
	if (this.id == 'SLDoplist') {
		//Definit l'operateur de la regle
		var operator = this.getValue();
		if (operator != 'PropertyIsBetween') {
			SldDoc.setOperator(SldDoc.selectedRule,0,operator);
		} else {
			var valueBox = new dijit.form.TextBox({
				required:"true",
				name:"valeur",
				id:"SLDPropertyUpperValue",
				onChange:changeHandler        
				}, dojo.byId(createDivElement('SLDPropertyUpperValueDIV','PropertyValue','SLDRuleFiltre')));
		}
	}
	if (this.id == 'SLDPropertyUpperValue') {
		//Definit la valeur pour le filtre 'PropertyIsBetween'
		SldDoc.setOperator(SldDoc.selectedRule,0,'PropertyIsBetween',this.getValue());
	}
	if(this.id == 'SLDnatlist') {
		//Definit la nature de la symbologie point
		
		//Suppprime les differents widgets concernes
		if(dijit.byId('SLDimglist'))
			dijit.byId('SLDimglist').destroy();
		if(dijit.byId('SLDfiglist'))
			dijit.byId('SLDfiglist').destroy();
		if (dojo.byId('SLDimgPicto'))
			dojo.byId('SLDRuleSymbole').removeChild(dojo.byId('SLDimgPicto'));
		//puis remets en place ceux qu'il faut
		var s;
		var svalue;
		if(value == 'WellKnownName') {
			s = SLDListSources.getFigureList();
			svalue = SldDoc.getPointGraphic(SldDoc.selectedRule);
			theId='SLDfiglist';
			
			var leVisuel = dojo.byId('SLDRuleContour');
			leVisuel.style.visibility = 'visible';
			leVisuel = dojo.byId('SLDRuleFond');
			leVisuel.style.visibility = 'visible';
		} else {
			s = SLDListSources.getImageList();
			svalue = "";
			theId = 'SLDimglist';

			var leVisuel = dojo.byId('SLDRuleContour');
			leVisuel.style.visibility = 'hidden';
			leVisuel = dojo.byId('SLDRuleFond');
			leVisuel.style.visibility = 'hidden';
		}
            
		var figures = new dijit.form.FilteringSelect({
			autoComplete:true,
			id:theId,
			store: s,
			searchAttr:"label",
			labelAttr:"label",
			labelType:"html",
			onChange:changeHandler,
			value:svalue
			}, dojo.byId(createDivElement(theId,theId, 'SLDRuleSymbole')));
	}
	if (this.id == 'SLDimglist') {
		//Affiche l'image selectionnee par l'utilisateur
		var image = this.getValue();
		createDivElement('SLDimgPicto',"<img src='images/"+image+".png' border=0 onClick='restoreImgList()'/>",'SLDRuleSymbole');
		dijit.byId(this.id).destroy();
		//Met a jour le SLD et l'apercu de la regle
		SldDoc.setImageGraphic(SldDoc.selectedRule,image);
		updateRuleDisplay(dojo.byId('SLDRuleLegend'));
	}
	if (this.id == 'SLDfiglist') {
		//definit la figure selectionnee par l'utilisateur
		SldDoc.changePointGraphic(SldDoc.selectedRule,this.getValue());
		updateRuleDisplay(dojo.byId('SLDRuleLegend'));
	}
	if (this.id == 'SLDexpressionTitle'){
		//definit le titre de la regle en cours
		SldDoc.setRuleName(SldDoc.selectedRule,this.value);
	}
	if (this.id.substring(0,7) == 'Palette') {
		//gestion des palettes pour definir les couleurs de fond ou de contour
		var leDiv = dojo.byId(this.id.substring(7,this.id.length));
		leDiv.style.backgroundColor = value;

		if (this.id.substring(this.id.length - 4, this.id.length) == 'SLDRuleFond')
			SldDoc.updateSymbolizer(SldDoc.selectedRule,'Fill','fill',this.value);
		else if (this.id.substring(this.id.length - 7, this.id.length) == 'SLDRuleContour')
			SldDoc.updateSymbolizer(SldDoc.selectedRule,'Stroke','stroke',this.value);
            
		dijit.byId(this.id).destroy();
		updateRuleDisplay(dojo.byId('SLDRuleLegend'));
	}
	if(this.id == 'SLDepaisseur') {
		//definit l'epaisseur
		SldDoc.updateSymbolizer(SldDoc.selectedRule,'Stroke','stroke-width',this.getValue());
		updateRuleDisplay(dojo.byId('SLDRuleLegend'));
	}
	if (this.id == 'SLDtaille') {
		//definit la taille
		SldDoc.updateGraphicSize(SldDoc.selectedRule,this.getValue());
		updateRuleDisplay(dojo.byId('SLDRuleLegend'));
	}
    if (this.id == "SLDPropertyValue") {
    	//definit la valeur de comparaison du filtre
		SldDoc.setFilterValue(SldDoc.selectedRule,0,this.getValue());
	}
}